资源描述
网上测试系统
西南财经大学
Southwestern University of Finance and Economics
课程实验报告
课程名称: 数据库
学生姓名: 周小钰、李佳颖
学 院: 经济信息工程学院
专 业: 计算机科学与技术
指导教师: 李 玉 荣 .
2016年 12月
1. 课程设计题目与要求
1.1数据库设计题目
设计和实现一个网上在线考试系统,系统应完成以下基本的业务:
a. 至少两个教师,每个教一门课程
b. 每个班至少包含十名学生。
c. 教师能够修改试卷的题目并模仿一名同学参加一门考试
d. 教师可提取一份试卷查卷
e. 教师可检查其所教班级的成绩、任一学生的成绩以及查询全班的平均成绩和总成绩。
f. 每一套题至少包括十道选择题
g. 选择题自动阅卷,书写题人工阅卷
以上很粗略描述了网上考试系统的基本要求,你们可以根据实际问题的需要,补充和细化系统的要求。
本课程设计包括两个部分:数据库和用户界面(用户图形化界面基本要求就是登录加试卷内容的提取)
1.2数据库设计要求
a.使用java/c语言,源程序要有适当的注释,使程序易于阅读
b.建议作出用户界面
c.学生可自动增加新功能模块
2. 数据库设计过程
2.1需求分析
2.1.1业务范围
a.增加、删除、维护学生账号,老师账号,课程信息和选课信息
b.在线出题、出题过程可修改试题、答题、分数
c.学生若有疑问可以由老师提出自己的答卷查卷
d.统计一个班的学生的成绩情况供老师分析
e.提取试题
2.1.2业务流程
a.进入在线考试系统
b.通过输入账号密码判断身份,分别进入不同界面:
(1)进入管理员界面后获取管理员身份。管理员具有对整个系统的管理权限,可以管理所有账户,管理课程,以及对选课过程控制。
(2)进入教师界面后获取教师身份。教师有权自出题、对题库进行管理以及对学生试卷进行查询。
进入出题模块后,教师可自主命题,命题内容分为单选题和填空题。
进入改题模块后,首先判断是否已有人做题,若已存在完成题目的记录,则执行修改题目功能;若无学生完成题目的记录,则执行修改题目和答案两项功能。
进入查询模块后,教师可执行试卷、答卷以学生成绩的查询功能。
(3)进入学生考试界面后,学生可选择参加考试或成绩查询。
c.结束所有操作,退出界面。
2.1.3业务流程图
图1 业务流程图
2.2概念结构设计
2.2.1步骤
a.抽象数据并设计局部视图
b.集成局部视图,得到全局概念结构
2.2.2原则
a.忠实性(设计忠实于应用的具体要求,恰当地反映现实)
b.尽可能减少冗余
c.简单性考虑
2.2.3具体实现
图2-1 总ER图
图2-2 管理员
图2-3 选课表
图2-4 课程信息
图2-5 填空题库
图2-6 学生
图2-7 答卷
图2-8 试卷
2.3逻辑结构设计
2.3.1设计目的
把概念结构设计阶段设计好的概念模型转换为逻辑模型,即将基本E-R图通过转换规则转换为关系模型,然后根据优化方法得到优化的数据模型。
2.3.2具体实现
将上述E-R图转换优化后得到的关系模式为:
Admin(ID,password);
Teacher(tID,password);
Student(sno,sname,password);
Course(cno,cname);
Sc(cno,sno,grade);
Paper(cno,sno,titleno,sanswer,getscore);
Title(cno,titleno,titlecontent,answear,score);
Title1(cno,titleno,titlecontent,A,B,C,D,answear,score);
Testpaper(cno,testpaperno,titleno,titlecontent);
后期title1删去,统一使用了title0题库表表
图2-9 ER图转关系模式
2.4数据库实施和维护
针对数据库维护部分,我们小组将及时对该系统数据库进行备份,将各用户信息保存在文件中,保证用户信息的安全性。
3. 运行结果
登入(以管理员为例):
管理员管理相关表信息:
登入老师后出题:
老师修改题目:
老师查卷(生成的视图):
运行结果:
试卷提取:
查看相关成绩信息:
学生答题后生成的数据
学生查询自己的成绩(后两门暂时没有考试):
登陆界面:
4. 源代码
4.1建表
//课程表
CREATE TABLE COURSE
(
CNO CHAR(4) NOT NULL
, CNAME VARCHAR2(20) NOT NULL
, CONSTRAINT COURSE_PK PRIMARY KEY
(
CNO
)
ENABLE
);
//创建学生信息表
CREATE TABLE STUDENT
(
SNO CHAR(9) NOT NULL
, SNAME CHAR(20) NOT NULL
, PASSWORD VARCHAR2(20) NOT NULL
, CONSTRAINT STUDENT_PK PRIMARY KEY
(
SNO
)
ENABLE
);
//创建选课表
CREATE TABLE SC
(
CNO CHAR(4) NOT NULL
, SNO CHAR(9) NOT NULL
, GRADE CHAR(4)
, CONSTRAINT SC_PK PRIMARY KEY
(
CNO
, SNO
)
ENABLE
);
ALTER TABLE SC
ADD CONSTRAINT SC_FK1 FOREIGN KEY
(
CNO
)
REFERENCES COURSE
(
CNO
)
ENABLE;
ALTER TABLE SC
ADD CONSTRAINT SC_FK2 FOREIGN KEY
(
SNO
)
REFERENCES STUDENT
(
SNO
)
ENABLE;
//老师信息表
CREATE TABLE TEACHER
(
TID CHAR(9) NOT NULL
, PASSWORD VARCHAR2(20)
, CONSTRAINT TEACHER_PK PRIMARY KEY
(
TID
)
ENABLE
);
//试题信息表
CREATE TABLE TITLE
(
CNO CHAR(4) NOT NULL
, TITLENO CHAR(4) NOT NULL
, TITLECONTENT VARCHAR2(40)
, ANSWER VARCHAR2(10)
, SCORE CHAR(4)
, CONSTRAINT TITLE_PK PRIMARY KEY
(
CNO
, TITLENO
)
ENABLE
);
ALTER TABLE TITLE
ADD CONSTRAINT TITLE_FK1 FOREIGN KEY
(
CNO
)
REFERENCES COURSE
(
CNO
)
ON DELETE CASCADE ENABLE;
//创建学生答题表
CREATE TABLE PAPER
(
CNO CHAR(4) NOT NULL
, SNO CHAR(9) NOT NULL
, TITLENO CHAR(4) NOT NULL
, SANSWER VARCHAR2(10)
, GETSCORE CHAR(4)
, CONSTRAINT PAPER_PK PRIMARY KEY
(
CNO
, SNO
, TITLENO
)
ENABLE
);
ALTER TABLE PAPER
ADD CONSTRAINT PAPER_FK1 FOREIGN KEY
(
CNO
)
REFERENCES COURSE
(
CNO
)
ON DELETE CASCADE ENABLE;
ALTER TABLE PAPER
ADD CONSTRAINT PAPER_FK2 FOREIGN KEY
(
SNO
)
REFERENCES STUDENT
(
SNO
)
ON DELETE CASCADE ENABLE;
ALTER TABLE PAPER
ADD CONSTRAINT PAPER_FK3 FOREIGN KEY
(
CNO
, TITLENO
)
REFERENCES TITLE
(
CNO
, TITLENO
)
ON DELETE CASCADE ENABLE;
CREATE USER teacer1 IDENTIFIED BY 123456 ;
4.2存储过程
//管理员存储过程
Create or replace procedure manastu(
sno in CHAR,
sname in char,
password in varchar2
)
Is
Begin
Insert into student
Values(SNO, SNAME, PASSWORD);
Commit;
End;
CALL MANASTU ('4141051','赵日天','123456');
Create or replace procedure manatea(
tid in CHAR,
password in varchar2
)
Is
Begin
Insert into teacher
Values(TID, PASSWORD);
Commit;
End;
CALL MANATEA ('teacher1','123456');
Create or replace procedure manacou(
cno in CHAR,
cname in varchar2
)
Is
Begin
Insert into course
Values(CNO, cname);
Commit;
End;
CALL MANACOU ('0001','课程1');
Create or replace procedure manasc(
cno in CHAR,
sno in char
)
Is
Begin
Insert into SC
Values(cno, sno,NULL);
Commit;
End;
CALL MANASC ('0001','41410051');
//出题存储过程
Create or replace procedure ks(
Cno_input in CHAR,
Sno_input in char,
Titleno_input in char,
Sanswer_input in varchar2
)
Is
answer1 varchar2(10);
score1 char(4);
Cno1 char(4);
Sno1 char(9);
Begin
Select cno,sno INTO cno1,sno1 from sc
WHERE o=cno_input and sc.sno = sno_input;
exception
when no_data_found
then dbms_output.put_line('没有选课不能考试!');
select answer,score INTO answer1,score1 FROM title
WHERE o=cno_input AND title.titleno=Titleno_input;
if
Sanswer_input = answer1 THEN
Insert into paper
Values(cno_input,sno_input,titleno_input,sanswer_inut,score1);
else
Insert into paper
Values(cno_input,sno_input,titleno_input,sanswer_inut,'0');
END IF;
Commit;
End;
Call KS('0001','41410051','01','B');
//修改题目存储过程
//修改题目
create or replace procedure XGTM(
cno_input in char,
titleno_input in char,
titlecontent_input in varchar2
)
is
begin
update title set
title.titlecontent = titlecontent_input
WHERE o = cno_input AND title.titleno = titleno_input;
commit;
end;
//修改答案
create or replace procedure XGDA(
cno_input in char,
titleno_input in char,
answer_input in varchar2
)
is
begin
update title set
title.answer = answer_input
WHERE o = cno_input AND title.titleno = titleno_input;
commit;
end;
//修改分数
create or replace procedure XGFS(
cno_input in char,
titleno_input in char,
score_input in char
)
is
begin
update title set
title.score = score_input
WHERE o = cno_input AND title.titleno = titleno_input;
commit;
end;
//学生查卷过程
create or replace procedure CJ (
cno_input in char,
sno_input in char
)
is
v_sql varchar2(1024);
begin
v_sql := 'create or replace VIEW PAPER_VIEW(titleno,titlecontent,answer,sanswer,gerscore)
AS
SELECT
title.titleno,title.titlecontent,title.answer,paper.sanswer,paper.getscore
FROM
title,paper
WHERE
o=o AND title.titleno=paper.titleno AND
paper.sno=sno_input AND o=cno_input
order by titleno';
EXECUTE IMMEDIATE v_sql using cno_input,sno_input;
end;
//成绩统计过程(学生考试完成点击提交时)
create or replace procedure TJ(
cno_input in char,
sno_input in char)
is
totle number(10,0);
begin
select SUM(GETSCORE) into totle from paper
WHERE paper.CNO = cno_input AND paper.SNO = sno_input;
update sc set sc.grade = totle
WHERE sc.CNO = cno_input AND SC.SNO = sno_input;
commit;
end;
call TJ ('0001','41410050');
4.3 查询
//查卷(视图)
CREATE or replace VIEW PAPER_VIEW_41410051(titleno,titlecontent,answer,sanswer,gerscore)
AS SELECT
title.titleno,title.titlecontent,title.answer,paper.sanswer,paper.getscore
FROM
title,paper
WHERE
o=o AND title.titleno=paper.titleno AND
paper.sno='41410051'
order by titleno;
//查卷(sqlplus)
set linesize 200 pagesize 999 newpage;
Col answer format a47;
SELECT
title.titleno,title.titlecontent,'正确答案是',title.answer,'你的答案是',paper.sanswer,'得分',paper.getscore
FROM
title,paper
WHERE
o=o AND title.titleno=paper.titleno AND
paper.sno='41410051'
order by titleno;
//查看试题
SELECT
title.titleno,title.titlecontent
FROM
title
WHERE
o='0001'
order by titleno;
//查看课程考试成绩情况
Select
student.sno,student.sname,sc.grade
from student,sc
where o='0001' ANDsc.sno = student.sno;
//查看课程平均分
Select avg(grade) from sc
Where o='0001';
4.4 登陆设计
由于做登陆的时候分表查询用户信息一直出bug,经过搜索解决办法后决定建立一个教师学生用户表来解决问题
create table P_USER
(
username CHAR(9),
password VARCHAR2(20),
)
从此表中只判断登陆是否成功。
4.4.1 jsp页面部分
login.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<form action="http://localhost:8080/loginServlet/LoginServlet" method="post">
欢迎使用在线考试系统
用户名:<input type="text" name="username" /><br/>
密码:<input type="password" name="password" /><br/>
<input type="submit" value="登录" />
</form>
</body>
</html>
Welcome.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<form action="http://localhost:8080/loginServlet/LoginServlet" method="post">
欢迎使用在线考试系统
欢迎登陆!
</form>
</body>
</html>
4.4.2 servlet编写
UserServlet.java
package com.baosight.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.baosight.bean.UserBean;
/**
* <p>Title:UserServlet </p>
* <p>Description:TODO </p>
* <p>Company: </p>
* @author zxy
* @date 2016-12-26 下午10:50:57*/
public class UserServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String method = request.getParameter("method");
if("login".equals(method)){//登录
String username = request.getParameter("username");
String password = request.getParameter("password");
if(username==null||"".equals(username.trim())||password==null||"".equals(password.trim())){
System.out.println("用户名或密码不能为空!");
response.sendRedirect("login.jsp");
return;
}
UserBean userBean = new UserBean();
boolean isValid = userBean.valid(username,password);
if(isValid){
System.out.println("登录成功!");
request.getSession().setAttribute("username", username);
response.sendRedirect("welcome.jsp");
return;
}else{
System.out.println("用户名或密码错误!");
response.sendRedirect("login.jsp");
return;
}
}else if("logout".equals(method)){//退出登录
System.out.println("退出登录!");
request.getSession().removeAttribute("username");
response.sendRedirect("login.jsp");
return;
}
}
}
}
4.4.3 javabeans编写
DBAcess.java
package com.baosight.bean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**数据库操作类
* <p>Title:DBAcess </p>
* <p>Description:TODO </p>
* <p>Company: </p>
* @author zxy
* @date 2016-12-25 下午12:40:24*/
public class DBAcess {
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:" + "thin:@10.53.75.125:1158:orcl";
private String username = "system";
private String password = "123456";
private Connection conn;
private Statement stm;
private ResultSet rs;
//创建连接
public boolean createConn() {
boolean b = false;
try {
Class.forName(driver);// 加载Oracle驱动程序
conn = DriverManager.getConnection(url, username, password);
b = true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 获取连接
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
//查询
public void query(String sql){
try {
stm = conn.createStatement();
rs = stm.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//判断有无数据
public boolean next(){
boolean b = false;
try {
if(rs.next()){
b = true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
//获取表字段值
public String getValue(String field) {
String value = null;
try {
if (rs != null) {
value = rs.getString(field);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return value;
}
//关闭连接
public void closeConn() {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭statement
public void closeStm() {
try {
if (stm != null) {
stm.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//关闭ResultSet
public void closeRs() {
try {
if (rs != null) {
rs.close();
展开阅读全文