文章目录
第一章 开发工具
项目运行环境:IntelliJ IDEA
服务器:Tomcat
数据库:MySQL
数据库可视化工具:Navicat Premium 12
第二章 数据库组成
将功能细化,降低数据冗余,表达到三范式
2.1 考生表
考生表的主要信息包括学生Id(Sid)、姓名(Sname)、密码(Spwd)、报考状态(Sstatus:0为未报考,1为已报考)、成绩(Grade)
这里的Sid设为自动递增,后续注册时自动为用户生成一个唯一标识,用户用此id进行登录
2.2 管理员表
仅包括管理员的用户名和密码。因为经过分析,管理员与考生之间无直接联系,仅是考场分配和成绩录入的操作。
2.3 考试科目表
这是张固定表,用来标识科目号和科目名称
2.4 考场表
固定表,标识考场和监考老师
第三章 功能分析、实现
功能主要分为管理员功能和考生功能,简单的数据库增删改查操作即可实现。
3.1 登录、注册功能
涉及到的数据库操作为表的查询和增加。
用户登录功能关键代码
int flag = -1; //-1:系统异常 0:用户名或密码异常 1:登陆成功
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testproject", "root", "123456");
String sql = "select count(*) from student where Sid =? and Spwd =?";
pstmt = connection.prepareStatement(sql);
pstmt.setString(1, login.getSid());
pstmt.setString(2, login.getSpwd());
rs = pstmt.executeQuery();
if (rs.next()) {
result = rs.getInt(1);
}
if (result > 0) {
return 1;
} else {
return 0;//登陆失败(用户名或密码有误!)
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
return -1; //登陆失败(系统异常!)
} catch (SQLException e) {
e.printStackTrace();
return -1;
} catch (Exception e) {
e.printStackTrace();
return -1;
} finally {
{
try {
if (pstmt != null) pstmt.close();
if (rs != null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
查询数据库中有没有发过来的指定字段,如果ResultSet rs 查到值,则 result = rs.getInt(1); 并给servlet返回1,servlet借此判断登陆成功,跳转至登录成功界面
用户注册功能关键代码
public int registerUser(Register register){
String sql = "insert into Student(Sname,Spwd,Ssex,Sphone) values(?,?,?,?)";
PreparedStatement pstmt = DButils.getPreparedStatement(sql,register.getSname(),register.getSpwd(),register.getSsex(),register.getSphone());
try {
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
这里只是简单的插入数据 操作,就不赘述了
注册并登录成功后,跳转至用户首页:
3.2 报名功能
- 由于用户登陆进来我们已经对其信息进行获取,所以这里看到的文字都是只读文字,仅供用户审核。唯一能操作的就是报考的科目。
- 代码实现同上注册功能,只是简单的插入数据。这里就不进行代码演示了。
3.3 生成准考证
这里是对数据库的多表查询,稍有些复杂。此外,用户的考场号需要等待管理员分派后才可以显示,默认为0.
select student.Sname,student.Ssex,student.Sid,exam.Ename,student.Rid from student,exam where student.Sid=18130 and(select Ename from exam where student.Eid in(select student.Eid from student where student.Sid=18130))
3.4 成绩查询
管理员给用户成绩赋值后,用户方可查询成绩。这里涉及的sql操作也比较简单。
第四章 总结
- 数据库
1.数据操作使用增删改查以及增删改查即可实现所有功能
2.由于功能比较简单,没有用到数据库的触发器 - 前端
1.界面中用到了layUI和bootstrap,这两个组件库使用简单、优化了界面、简化了jsp代码的冗余
2.像如下这种“骚操作”(html代码中嵌jsp代码使用if判断语句)一定一定少用。虽然实现功能很方便,但是很容易出现谜之错误
<%
String statue = "0";
String id = String.valueOf(request.getAttribute("id"));
statue = String.valueOf(request.getAttribute("statue"));
if (statue == "1") {
%>
<script src="layer.js"></script>
<script>
layer.open({
title: '注册成功,您的用户名为'
, content: <%=id%>
});
</script>
<%
} else {
%>
<script src="layer.js"></script>
<script>
layer.msg('请选择登录或注册');
</script>
<%
}
%>