zoukankan      html  css  js  c++  java
  • ssm+mysql+jsp打造在线考试系统WeKnow-学生端

    一.登陆模块

    前台提交账号和密码传到后台处理控制层

    1.1 首先是控制器

    @RequestMapping(value="/studentLogin", method=RequestMethod.POST)
    	public ModelAndView studentLogin(StudentInfo student, HttpServletRequest request) {
    		ModelAndView model = new ModelAndView();
    		StudentInfo loginStudent = studentInfoService.getStudentByAccountAndPwd(student.getStudentAccount());
    		if(loginStudent == null || !student.getStudentPwd().equals(loginStudent.getStudentPwd())){
    			model.setViewName("home/suc");
    			return model;
    		}
    		request.getSession().setAttribute("loginStudent", loginStudent);
    		System.out.println(request.getSession().getAttribute("loginStudent"));
    		model.setViewName("home/suc");
    		System.out.println("执行完毕");
    		return model;
    	}
    }
    

    1.2 在这里会调用服务层

    StudentInfo loginStudent = studentInfoService.getStudentByAccountAndPwd(student.getStudentAccount());
    

     1.3 服务层接口

    public StudentInfo getStudentByAccountAndPwd(String studentAccount);
    

     1.4 服务层实现

    public StudentInfo getStudentByAccountAndPwd(String studentAccount) {
    return studentInfoMapper.getStudentByAccountAndPwd(studentAccount);//调用dao接口
    }

     1.5 数据层接口

    public StudentInfo getStudentByAccountAndPwd(String studentAccount);
    

     1.6  数据层实现

    <mapper namespace="com.caizhen.weknow.dao.StudentInfoMapper">
    	<!-- 定义resultMap -->
    	<resultMap type="com.caizhen.weknow.domain.StudentInfo" id="queryStudent">
    		<!-- 学号 -->
    		<id column="studentId" property="studentId"/>
    		<!-- 学生姓名 -->
    		<result column="studentName" property="studentName"/>
    		<!-- 学生账号 -->
    		<result column="studentAccount" property="studentAccount"/>
    		<!-- 学生账号密码 -->
    		<result column="studentPwd" property="studentPwd"/>
    		<!-- 班级 -->
    		<!-- 班级自身的属性与数据库字段的映射 --> 
    		<association property="classInfo" javaType="com.caizhen.weknow.domain.ClassInfo">
    			<id column="classId" property="classId"/>
    			<result column="className" property="className"/>
    		</association>
    		<!-- 年级 -->
    		<!-- 年级自身的属性与数据库字段的映射 --> 
    		<association property="grade" javaType="com.caizhen.weknow.domain.GradeInfo">
    			<id column="gradeId" property="gradeId"/>
    			<result column="gradeName" property="gradeName"/>
    		</association>
    	</resultMap>
    	<select id="getStudentByAccountAndPwd" parameterType="java.lang.String" resultMap="queryStudent">
    		SELECT a.*,b.className,c.gradeId,c.gradeName FROM StudentInfo a
    		INNER JOIN ClassInfo b ON a.classId=b.classId
    		INNER JOIN GradeInfo c ON b.gradeId=c.gradeId
    		WHERE studentAccount=#{studentAccount}
    	</select>
    </mapper>
    

     二:考试中心模块

    <li><a id="examCenter-link" target="home" style="cursor: pointer;" 
    href="willexams?
    classId=${sessionScope.loginStudent.classInfo.classId }&
    gradeId=${sessionScope.loginStudent.grade.gradeId }&
    studentId=${sessionScope.loginStudent.studentId }"
    >考试中心</a></li>

     向url:willexams传入三个参数:classId,gradeId,studentId

    2.1进入控制器

    @RequestMapping("/willexams")
    	public ModelAndView getStudentWillExam(
    			@RequestParam("classId") Integer classId,
    			@RequestParam("gradeId") Integer gradeId,
    			@RequestParam(value="studentId", required=false) Integer studentId) {
    		ModelAndView model = new ModelAndView();
    		model.setViewName("/home/examCenter");
    //将classId和gradeId存入map集合中 Map<String, Object> map = new HashMap<String, Object>(); map.put("classId", classId); map.put("gradeId", gradeId); List<ExamPlanInfo> examPlans = examPlanInfoService.getStudentWillExam(map); model.addObject("examPlans", examPlans); model.addObject("gradeId", gradeId); return model; }

     2.2 进入服务层接口

    public List<ExamPlanInfo> getStudentWillExam(Map<String, Object> map);
    

     2.3进入服务层实现层

    public List<ExamPlanInfo> getStudentWillExam(Map<String, Object> map) {
    		return examPlanInfoMapper.getStudentWillExam(map);
    }
    

     2.4 进入数据协议层

    public List<ExamPlanInfo> getStudentWillExam(Map<String, Object> map);
    

     2.5 进入数据实现层

    <mapper namespace="com.caizhen.weknow.dao.ExamPlanInfoMapper">
    	
    	<resultMap type="com.caizhen.weknow.domain.ExamPlanInfo" id="queryWillExam">
    		<id column="examPlanId" property="examPlanId"/>
    		<result column="beginTime" property="beginTime"/>
    		<!-- 科目 -->
    		<association property="course" javaType="com.caizhen.weknow.domain.CourseInfo">
    			<id column="courseId" property="courseId"/>
    			<result column="courseName" property="courseName"/>
    		</association>
    		<!-- 班级 -->
    		<association property="clazz" javaType="com.caizhen.weknow.domain.ClassInfo">
    			<id column="classId" property="classId"/>
    		</association>
    		<!-- 试卷 -->
    		<association property="examPaper" javaType="com.caizhen.weknow.domain.ExamPaperInfo">
    			<id column="examPaperId" property="examPaperId"/>
    			<result column="examPaperName" property="examPaperName"/>
    			<result column="subjectNum" property="subjectNum"/>
    			<result column="examPaperScore" property="examPaperScore"/>
    			<result column="examPaperEasy" property="examPaperEasy"/>
    			<result column="examPaperTime" property="examPaperTime"/>
    		</association>
    	</resultMap>
    
    	<!-- 查询学生待考信息 -->
    	<!-- 考试安排表  examplaninfo a-->
    	<!-- 班级信息表 classinfo  b-->
    	<!-- 年级表 gradeinfo c -->
    	<!-- 试卷表 exampaperinfo d -->
    	<!-- 课程表 courseinfo e -->
    	<!-- 需要的参数
    	 1.a.* 考试安排表所有字段
    	 2.d.examPaperName 试卷名称
    	 3.d.subjectNum 试题号
    	 4.d.examPaperScore 试卷分数
    	 5.d.examPaperEasy 试卷难易度
    	 6.d.examPaperTime  考试时长
    	 5.e.coure.name  课程名称
    	 -->
    	<select id="getStudentWillExam" parameterType="java.util.Map" resultMap="queryWillExam">
    		SELECT a.*,d.examPaperName,d.subjectNum,d.examPaperScore,d.examPaperEasy,d.examPaperTime,e.courseName FROM ExamPlanInfo a
    		INNER JOIN ClassInfo b ON a.classId=b.classId
    		INNER JOIN GradeInfo c ON b.gradeId=c.gradeId
    		INNER JOIN ExamPaperInfo d ON a.examPaperId=d.examPaperId
    		INNER JOIN CourseInfo e ON a.courseId=e.courseId
    		WHERE a.classId=#{classId} AND b.gradeId=#{gradeId}
    	</select>
    </mapper>
    

     2.6 定向到考试中心界面判断exPlans中的条数是否大于0

    <c:when test="${fn:length(examPlans) > 0 }">
    

     如果不是则输出页面

    <c:otherwise>
    <div class="jumbotron">
    <h1>暂无待考信息</h1>
    <p>请等待教师分配</p>
    </div>
    </c:otherwise>

     三:历史考试模块

    1.前台

    <!-- 考试历史 -->
    <li><a id="mineCenter-link" target="home" style="cursor: pointer;" href="history/${sessionScope.loginStudent.studentId }" studentId="${sessionScope.loginStudent.studentId }">考试历史</a></li>
    

     1.1 前台状态校验

    <script type="text/javascript">
    	$(function() {
    	//考试中心状态判断
    	$("#examCenter-link, #mineCenter-link").click(function() {
    	//判断是否登录
    	var studetnId = $(this).attr("studentId");
    	//如果学生号为空
    	if(studetnId.trim() == "" || studetnId == null) {
    	zeroModal.show({
    	title: "提示",
    	content: "登录后才能查看",
    	width : '200px',
    	height : '130px',
    	overlay : false,
    	ok : true,
    	onClosed : function() {
    	location.reload();
    			}
    			});
    		return false;
    		}
    			});
    

    2.后台

    2.1 如果学生成功登陆后点击历史考试(控制层)

    @Controller
    public class ExamHistoryInfoHandler {
    	@Autowired
    	private ExamHistoryPaperService examHistoryPaperService;
    	@RequestMapping("/historys")
    	public ModelAndView examHistorys() {
    		List<ExamHistoryInfo> historys = examHistoryPaperService.getExamHistoryToTeacher();
    		ModelAndView model = new ModelAndView("admin/examHistorys");
    		model.addObject("historys", historys);
    		return model;
    	}
    }
    

    2.2 服务层

    private ExamHistoryPaperService examHistoryPaperService;
    

     服务层

    public interface ExamHistoryPaperService {
           //查询考试历史信息,针对前台学生查询
    	public List<ExamHistoryPaper> getExamHistoryToStudent(int studentId);
    	
    	public int isAddExamHistory(Map<String, Object> map);
    	
    	public int getHistoryInfoWithIds(Map<String, Object> map);
    	
    	public List<ExamHistoryInfo> getExamHistoryToTeacher();
    }
    

     2.3 服务实现层

    @Service
    public class ExamHistoryPaperServiceImpl implements ExamHistoryPaperService {
    
    	@Autowired
    	private ExamHistoryPaperMapper examHistoryPaperMapper;
    	public List<ExamHistoryPaper> getExamHistoryToStudent(int studentId) {
    		return examHistoryPaperMapper.getExamHistoryToStudent(studentId);
    	}
    	public int isAddExamHistory(Map<String, Object> map) {
    		return examHistoryPaperMapper.isAddExamHistory(map);
    	}
    	public int getHistoryInfoWithIds(Map<String, Object> map) {
    		return examHistoryPaperMapper.getHistoryInfoWithIds(map);
    	}
    	public List<ExamHistoryInfo> getExamHistoryToTeacher() {
    		return examHistoryPaperMapper.getExamHistoryToTeacher();
    	}
    }
    

     2.4 数据接口层

    public interface ExamHistoryPaperMapper {
    
    	//查询考试历史信息,针对前台学生查询
    	public List<ExamHistoryPaper> getExamHistoryToStudent(int studentId);
    	
    	public int isAddExamHistory(Map<String, Object> map);
    	
    	public int getHistoryInfoWithIds(Map<String, Object> map);
    	
    	//查询考试历史信息,针对后台教师查询
    	public List<ExamHistoryInfo> getExamHistoryToTeacher();
    }
    

     2.5 数据实现层

    <mapper namespace="com.caizhen.weknow.dao.ExamHistoryPaperMapper">
    	
    	<resultMap type="com.caizhen.weknow.domain.ExamHistoryInfo" id="queryExamHistoryToStudentResultMap">
    		<id column="historyId" property="historyId"/>
    		<result column="examScore" property="examScore"/>
    		<association property="examPaper" javaType="com.caizhen.weknow.domain.ExamPaperInfo">
    			<id column="examPaperId" property="examPaperId"/>
    			<result column="examPaperName" property="examPaperName"/>
    			<result column="examPaperScore" property="examPaperScore"/>
    			<result column="subjectNum" property="subjectNum"/>
    		</association>
    	</resultMap>
    	
    	<!-- 查询考试历史信息,针对前台学生查询 -->
    	<select id="getExamHistoryToStudent" parameterType="int" resultType="ExamHistoryPaper">
    		SELECT
    		a.historyId,a.examScore,b.examPaperId,b.examPaperName,b.examPaperScore,b.subjectNum,c.beginTime
    		FROM ExamHistoryInfo a
    		LEFT JOIN examPaperInfo b ON a.examPaperId=b.exampaperId
    		LEFT JOIN examPlanInfo c ON b.examPaperId=c.examPaperId
    		WHERE studentId=#{studentId}
    	</select>
    	
    	
    	<!-- 新增历史记录 -->
    	<insert id="isAddExamHistory" parameterType="java.util.Map">
    		INSERT INTO ExamHistoryInfo VALUES(NULL, #{studentId}, #{examPaperId}, #{examScore});
    	</insert>
    	
    	<select id="getHistoryInfoWithIds" parameterType="java.util.Map" resultType="int">
    		SELECT COUNT(*) FROM ExamHistoryInfo WHERE studentId=#{studentId} AND examPaperId=#{examPaperId}
    	</select>
    	
    	
    	
    	<resultMap type="com.caizhen.weknow.domain.ExamHistoryInfo" id="queryExamHistoryToTeacherResultMap">
    		<id column="historyId" property="historyId"/>
    		<result column="examScore" property="examScore"/>
    		<association property="examPaper" javaType="com.caizhen.weknow.domain.ExamPaperInfo">
    			<id column="examPaperId" property="examPaperId"/>
    			<result column="examPaperName" property="examPaperName"/>
    			<result column="examPaperScore" property="examPaperScore"/>
    			<result column="subjectNum" property="subjectNum"/>
    		</association>
    		<association property="student" javaType="com.caizhen.weknow.domain.StudentInfo">
    			<id column="studentId" property="studentId"/>
    			<result column="studentName" property="studentName"/>
    		</association>
    	</resultMap>
    	<!-- 查询考试历史信息,针对后台教师查询 -->
    	<select id="getExamHistoryToTeacher" resultMap="queryExamHistoryToTeacherResultMap">
    		SELECT
    		a.historyId,a.examScore,b.examPaperId,b.examPaperName,b.examPaperScore,b.subjectNum,d.studentId,d.studentName
    		FROM ExamHistoryInfo a
    		INNER JOIN examPaperInfo b ON a.examPaperId=b.exampaperId
    		LEFT JOIN StudentInfo d ON a.studentId=d.studentId;
    	</select>
    </mapper>
    
  • 相关阅读:
    免费的视频、音频转文本
    Errors are values
    Codebase Refactoring (with help from Go)
    Golang中的坑二
    Cleaner, more elegant, and wrong(msdn blog)
    Cleaner, more elegant, and wrong(翻译)
    Cleaner, more elegant, and harder to recognize(翻译)
    vue控制父子组件渲染顺序
    computed 和 watch 组合使用,监听数据全局数据状态
    webstorm破解方法
  • 原文地址:https://www.cnblogs.com/cainame/p/10346613.html
Copyright © 2011-2022 走看看