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>
    
  • 相关阅读:
    多继承
    NavigationController的使用
    WebService概述
    IOS block 教程
    多测师肖老师__项目讲解(12.3)
    跨平台跨服务器跨网站SSO(单点登录)方案的DEMO
    使用SQL Server Profiler
    asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式
    SQL优化实例:从运行30分钟到运行只要30秒
    测试工具的选择和使用
  • 原文地址:https://www.cnblogs.com/cainame/p/10346613.html
Copyright © 2011-2022 走看看