数据库课程设计-题库管理系统

## 数据库课程设计-题库管理系统*

这里写我的思路及其功能展示,希望帮到你,如果想要全部的源代码及其课程设计报告,请来我的主页下载

三大界面图展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

目录
1.需求分析. 3
2.数据库设计以及E-R分析. 4
3.结构设计. 4
(1)表结构设计
(2)相关约束
(3)视图
(4)存储过程
(5)触发器
4.JAVA应用程序端. 9
(1)功能设计
(2)界面设计
5.JAVA应用程序端具体实现. 28
6.总结. 35

一、 需求分析

l  实现题型,题目等基本信息的管理

l  实现章节的管理

l  实现题型的管理

l  能按题型或章节录入课程的习题

l  能够按照题目编号删除题目

l  创建存储过程查询某种题型和各章节的习题数量

l  创建视图查询各题型的数量详细信息

l  创建视图查询各章节的题目数量详细信息

l  创建视图查看套题汇总详细信息

l  习题题号由系统自动生成,从1开始编号

l  可以自动抽题组成套题,习题每抽取一次,要使习题的抽取次数加1(触发器)

l  当题目插入删除时,自动更改题型和各章节题目数量(触发器)

l  实现学生答题系统,并为其录入成绩信息

l  可以查看学生详细信息

l  可以查看已经抽取的套题详细信息

l  建立数据库相关表之间的参照完整性约束。

二、 数据库设计以及E-R分析(E-R图下载包里面有)

为了实现学生和老师分别登录,注册,多创建了,学生信息和老师信息表

为了实现对题目、题型、章节的管理,分别创建了题目、题型、章节表

为了记录已经抽取的套题信息,创建了套题表

为了实现当前的抽取的为哪个套题,创建了套题抽取表用于记录当前已经为第几套题了(如:A,B,C,D卷)

JAVA应用程序端

(1) 
功能设计

l  学生和老师登录、注册(及其容错)设计

l  教师工作服务界面设计

查看学生成绩

实现插入题目

实现删除题目

实现题目查询

实现题目信息

实现题型管理

实现章节管理

查看套题信息

l 学生答题界面设计

查看自己的成绩

开始答题

l Java界面细节设计

有“<”小按钮,当鼠标进入和离开时,会发生颜色的变化并且当鼠标点击时可以返回上一级界面;

各按钮当鼠标进入和离开时,会发生图片和颜色的变化;

各种功能JLabel,当鼠标进入要选择和离开时会发生明显的颜色变化;

当进行登录的时候,密码框用*表示,从而保护信息;

每个界面都有与主题相匹配的背景图

界面

1初始程序界面:
在这里插入图片描述

2如果这个学生和老师从来没有进入过这个程序,需要进行注册:

进入注册界面:里面有一个下拉列表框可以进行学生和老师注册身份的选择

在这里插入图片描述

注册操作(这里以学生注册的为例,其中学生学号为计科1 2 班学生的,教工号为我自己随便输入的一些):像右边如图一样输入要注册的用户和密码,然后点击注册按钮或者在密码框直接回车即可

当注册成功时出现如图右一样的结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

看上面两个运行结果:

容错处理:当你输入的用户名不是数据库表student或user_teacher中提前录入的学号或者教工号时,会发生提示错误,用户名不存在(即这个学生或者老师不存在);

当你输入的用户名已经注册时,则也会提出错误信息

进入学生答题界面:
在这里插入图片描述

查看学生成绩:

在这里插入图片描述

开始答题(我们这里调用的是数据库中的抽取套题存储过程,所以有5道题):

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200710203535135.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NhaW5pYW8xXw==,size_16,color_FFFFFF,t_70在这里插入图片描述教师服务工作界面
在这里插入图片描述

JAVA应用程序端具体实现

初始界面:在类subject_system 中,窗体JFrame

先设置整体面板为绝对布局,然后设置三个按钮:学生登录、教师登录,注册(button1,button2,button3),为他们加入颜色图片,设置布局,并添加监听(从而达到当鼠标进入时设置一种颜色图片,鼠标退出时设置一种颜色图片),当点击各自按钮时弹出对应按钮功能的弹窗(并为其传递一个信息:是哪个按钮点击我了,用于判断是学生登陆还是教师登录),最后为我们的主JFrame添加背景图片

学生教师注册:在类Rigeister中:

这里我们设置的为一个弹窗,依然也是为其设置绝对布局,其中设置一个下拉列表框用于选择学生注册和教师注册;三个label:“用户:”、“密码:”、“<”;两个文本框JTextField 用于输入用户名和密码,和一个注册JButton,然后为这个注册按钮和“<”设置监听(从而达到当鼠标进入时设置一种颜色图片,鼠标退出时设置一种颜色图片),当点击按钮时连接数据库查看这个用户名是否存在,是否已经注册,如果注册成功弹出注册成功的提示对话框,如果注册失败则弹出出错啦的提示对话框;当点击“<”时返回上一级,最后为这些组件设置布局,并为这个弹窗添加两个背景图片

应用数据库代码实现:

String type = register_JBox_type.getSelectedItem().toString();  //获取下拉列表框中选中的对象的信息

       String user = register_field_user.getText();

       String passwd = register_field_passwd.getText();

       String sql;

       if(type.equals("学生")) {

           sql ="select * from student";

           try {

               int flag = 0;  //用于标识判断输入的用户名是否存在

               rs = st.executeQuery(sql);

               while(rs.next()) {

                   if(rs.getString("sno").equals(user))

                   {

                       flag = 1;

                       if(rs.getString("passwd") != null) {

                           JOptionPane.showMessageDialog(register_login_button, "用户已注册","【出错啦】",JOptionPane.ERROR_MESSAGE);   

                       }

                       else {         

                       String   sql2 = "update student set passwd=? where sno=?";

                       pst = con.prepareStatement(sql2);

                       pst.setString(2,user);

                       pst.setString(1,passwd);

                       pst.executeUpdate();

                       JOptionPane.showMessageDialog(register_login_button, "注册成功","OK",JOptionPane.INFORMATION_MESSAGE);

                       }

                       break;

                   }

               }

               if(flag == 0) {

                   JOptionPane.showMessageDialog(register_login_button, "用户名不存在","【出错啦】",JOptionPane.ERROR_MESSAGE); 

               }

           } catch (SQLException e1) {

               e1.printStackTrace();

           }

       }

       if(type.equals("教师")) {

           sql ="select * from user_teacher";

           try {

               int flag = 0;  //用于标识判断输入的用户名是否存在

               rs = st.executeQuery(sql);

               while(rs.next()) {

                   if(rs.getString("id").equals(user))

                   {

                       flag = 1;

                       if(rs.getString("passwd") != null) {

                           JOptionPane.showMessageDialog(register_login_button, "用户已注册","【出错啦】",JOptionPane.ERROR_MESSAGE);   

                       }

                       else {         

                       String
                 sql2 = "update user_teacher set passwd=? where id=?";
                       pst = con.prepareStatement(sql2);

                       pst.setString(2,user);

                       pst.setString(1,passwd);

                       pst.executeUpdate();

                       JOptionPane.showMessageDialog(register_login_button, "注册","OK",JOptionPane.INFORMATION_MESSAGE);

                       }

                       break;

                   }

               }

               if(flag == 0) {

                   JOptionPane.showMessageDialog(register_login_button, "用户名不存在","【出错啦】",JOptionPane.ERROR_MESSAGE); 

               }

           } catch (SQLException e1) {

               e1.printStackTrace();

           }                  

       }

学生、教师登录:在类Login中:

我们设置的为一个弹窗,依然也是为其设置绝对布局,其中设置三个label:“用户:”、“密码:”、“<”;两个文本框JTextField 用于输入用户名和密码,和一个登录JButton,然后为这个登录按钮和“<”设置监听(从而达到当鼠标进入时设置一种颜色图片,鼠标退出时设置一种颜色图片),当点击按钮时弹出对应按钮功能的弹窗(并为其传递这个用户名信息,以便为学生登录后可以查看自己的答题成绩),然后连接数据库查看这个用户名是否存在,是否注册,密码是否正确;当点击“<”时返回上一级,最后为这些组件设置布局,并为这个弹窗添加两个背景图片

应用数据库代码实现:

String user = field_user.getText();

       String passwd = field_passwd.getText();

       String sql;

       if(button_text.equals("学生登录")) {

           sql ="select * from student";

           try {

               int flag = 0;  //用于标识判断输入的用户名是否存在

               rs = st.executeQuery(sql);

               while(rs.next()) {

                   if(rs.getString("sno").equals(user))

                   {

                       flag = 1;

                       if(rs.getString("passwd") == null) {

                           JOptionPane.showOptionDialog(login_button, "用户未注册","警告",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE,null,null,"OK");

                       }

                      else if(!rs.getString("passwd").equals(passwd)) {

                       JOptionPane.showMessageDialog(login_button, "用户名密码错误","【出错啦】",JOptionPane.ERROR_MESSAGE);

                           }

                       else {

                         JOptionPane.showMessageDialog(login_button, "登录成功","OK",JOptionPane.INFORMATION_MESSAGE);

                         new student(field_user.getText()).init();

                       }

                   break;

                   }

               }

               if(flag == 0) {

                   JOptionPane.showMessageDialog(login_button, "用户名不存在","【出错啦】",JOptionPane.ERROR_MESSAGE); 

               }

           } catch (SQLException e1) {

               e1.printStackTrace();

           }          

       }

       

       if(button_text.equals("教师登录")) {

           sql ="select * from user_teacher";

           try {

               int flag = 0;  //用于标识判断输入的用户名是否存在

               rs = st.executeQuery(sql);

               while(rs.next()) {

                   if(rs.getString("id").equals(user))

                   {

                       flag = 1;

                       if(rs.getString("passwd") == null) {

                           JOptionPane.showOptionDialog(login_button, "用户未注册","警告",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE,null,null,"OK");

                       }

                       else if(!rs.getString("passwd").equals(passwd)) {

                       JOptionPane.showMessageDialog(login_button, "用户名密码错误","【出错啦】",JOptionPane.ERROR_MESSAGE);

                           }

                       else

                       {

                           JOptionPane.showMessageDialog(login_button, "登录成功","OK",JOptionPane.INFORMATION_MESSAGE);

                           new
teacher().init();

                       }

                   break;

                   }

               }

               if(flag == 0) {

                   JOptionPane.showMessageDialog(login_button, "【出错啦】","用户名不存在",JOptionPane.ERROR_MESSAGE);      

               }

           } catch (SQLException e1) {

               e1.printStackTrace();

           }          

       }

以下代码太多就不一一放出来了,用文字逻辑代理

学生答题界面:在类student中:

这里也是弹窗、同理的布局;

其中当点击学生成绩的时候查看学生成绩,也就是把从登录传递过来的学号连接数据库表student查询该学生的成绩;

这里最重要的就是那个学生然后进行答题的,我先在该弹窗,也就是类student中定义了几个静态常量

public static String []content;  //题目内容

public static String []type;    //题目类型


public static String []answer;  //题目答案


public static String []answer_; //因为选择题只需要填A B C D 所以这个为 将选中的单选框的内容的第一个字符作为该选择题的答案


public static float []g;   //该题的分值

处理方法:当我们点击开始答题的按钮标签时,给它添加一个监听事件(里面连接数据库,并调用抽取套题的存储过程,然后将得到的套题储存在上面的5个静态数组中,然后初始值传入参数为第1题,并在此时new出第一个题目)

如果此时是选择题,则把数组content[n]中的内容按照空格进行分割(因为为了得出A B C D选项我提前在数据库表中录入内容的时候特意在其中设置了空格),第一个为题目,其余四个为单选框中的文本

如果是判断题,直接在单选框中设置两个选项,对、错

如果是计算题或者填空题,则直接设置一个文本框,让学生把答案填入其中即可

接着在点击下一题时,我们先连接数据库,把学生选择的答案与正确答案想比较,如果正确就为学生加相应的分值,否则则不做操作,接着我们再new 出下一道题

如果是已经到了第五题,则判断完正确后,直接退出

数据库代码实现:

if(student.type[n].equals("判断题")||student.type[n].equals("选择题")) {

               String a = group.getSelectedCheckbox().getLabel().substring(0,1);


               if(a.equals(student.answer_[n])) {

                   sql = "update student set total_score = total_score + ? where sno = ?";


                   try {

                       pst = con.prepareStatement(sql);

                       pst.setFloat(1,student.g[n]);

                       pst.setString(2,student_user);

                       pst.executeUpdate();           

                   }
catch (SQLException e1) {

                       e1.printStackTrace();

                   }   

               }

           }

           if(student.type[n].equals("计算题")||student.type[n].equals("填空题")) {

               String
a = huida.getText();

               if(a.equals(student.answer[n])) {

                   sql = "update student set total_score = total_score + ?  where sno = ?";
                   try {

                       pst = con.prepareStatement(sql);

                       pst.setFloat(1,student.g[n]);

                       pst.setString(2,student_user);

                       pst.executeUpdate();           

                   }
catch (SQLException e1) {

                       e1.printStackTrace();

                   }   

               }   

               

           }

           if(n<4)        
new start_promble(student_user,n+1).init();

教师工作服务界面在:teacher类中:

一样这里也是弹窗、同样的布局,只是实现的功能不一样而已:

查看学生成绩 :这个我就是自己用JTabel、DefaultTableModel,然后连接数据库查询student表,最后把信息用弹窗显示出来

插入题目:这个我设置了四个输入框:题目内容、题目答案、题目类型、题目章节。而题目编号因为为自增列,所以不用教师输入;题目被抽取的次数用默认值0,因为他还没有被抽取。当点击确定时insert into进problem表中

删除题目:这个我直接设置了一个输入题目编号的输入框,因为题目编号在problem表中为主键。当点击确定时delete这个problem表中这条数据

题目查询:这里分为题型查询和章节查询,这次连接数据库后分别调用的两个存储过程find_type_promble、find_chapter_promble,当回车时,信息显示在题目数量那个文本框中

题型管理:这里分为题型信息表查询和插入题型,题型查询直接select promble_type表;插入题型有两个数输入框分别为:题目类型、题目分数,然后insert into promble_type表

章节管理:这里分为章节信息表查询和插入题型,题型查询直接select chapter表;插入题型有两个数输入框分别为:题目类型、题目分数,然后insert into chapter表

套题信息:这里分为套题信息表查询和套题汇总查询,套题汇总查询是直接select question表 ; 套题汇总查询是直接 select question_view 视图

评论 7 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

cainiao1_

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值