大学生心理健康管理系统
时间匆忙,,,,测试做的很水。。。见谅
目录
一、实验内容... 2
二、源程序... 2
2.1软硬件环境... 2
2.1.1软件环境... 2
2.1.2硬件环境... 2
2.2主要程序代码及其解释... 2
2.2.1学生端... 2
2.2.2管理端... 9
三、测试方案设计.. 9
3.1白盒测试... 9
3.1.1测试策略... 10
3.1.2测试数据... 10
3.1.3预期结果... 10
3.1.4实际测试结果.. 10
3.2黑盒测试... 12
3.2.1测试策略... 12
3.2.2测试数据... 12
3.2.3预期结果... 12
3.2.4实际测试结果.. 13
四、测试结果分析.. 15
4.1白盒测试结果分析... 15
4.2黑盒测试结果分析... 15
五、实验小结... 16
华北水利水电大学 __软件工程 __ 实验报告
20 20****~****20 21****学年******第**** __二 学期2018级计算机科学与技术 __******专业
一、实验内容
题目:大学生心理健康管理系统
二、源程序
2.1软硬件环境
2.1.1软件环境
编译器:IntelliJ IDEA 2020.2.4;JDK:jdk8;电脑系统:win10家庭版;数据库:SQL sever;数据库管理:SSMS
2.1.2硬件环境
八代酷睿i7-8750H六核十二线程处理器;GTX 1050Ti 4GBGDDR5显存独显;
2.2主要程序代码及其解释
2.2.1学生端
前端:
1、创建面板,只贴出创建面板的必要部分,该代码段主要实现了整个布局。
f.setLayout(new BorderLayout());
f.setSize(800,750); //设置窗口大小
f.setLocation(497,50); //设置窗口在屏幕显示位置
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); //设置关闭窗口时的默认操作
f.setVisible(true); //展示容器窗口
//-----------------------------------------------
JPanel panel=CreateLINE_START(); //接收学生功能面板
panel.setPreferredSize(new Dimension(130,0)); //设置功能面板所占区域
f.add(panel,BorderLayout.LINE_START);
JLabel label=CreateNorth(); //面板顶部区域
label.setPreferredSize(new Dimension(0,170)); //设置功能面板所占区域
f.add(label,BorderLayout.PAGE_START);
JPanel panel1=new JPanel(new BorderLayout()); //创建一个面板
panel1.setPreferredSize(new Dimension(150,580)); //设置面板大小
JPanel panel2=new JPanel(new FlowLayout());
panel2.setPreferredSize(new Dimension(150,50));
JButton btn=new JButton("刷新");
JLabel jLabel=new JLabel("心灵鸡汤文章 ");
panel2.add(jLabel);
panel2.add(btn);
panel1.add(panel2,BorderLayout.PAGE_START);
2、考试界面的主要代码段如下,并未将监听器内容选取到该代码段中:
JDialog h=new JDialog(student.f,"考试记录",true);
h.setSize(625,505); //设置窗口大小
h.setLocation(629,251); //设置窗口在屏幕显示位置
int n=studentDao.jiluts();
JPanel panel=new JPanel(new GridLayout(n,1));
panel.setPreferredSize(new Dimension(625,n*70)); //设置每个网格的大小
JButton btn[]=new JButton[n]; //按钮数组
JPanel panel1[]=new JPanel[n];
int i;
for(i=0;i<n;i++){
JLabel label=new JLabel("第"+(i+1)+"次考试");
btn[i]=new JButton("查看"+(i+1));
panel1[i]=new JPanel(new FlowLayout(FlowLayout.LEFT,20,30));
panel1[i].add(label);
panel1[i].add(btn[i]); //将按钮组件加入到panel面板中
int j=i;
panel.add(panel1[i]);
}
JScrollPane scrollPane=new JScrollPane(); //创建JScrollPane滚动面板组件
//设置水平滚动条策略--滚动条需要时显示
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
//设置垂直滚动条策略--滚动条需要时显示
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setViewportView(panel);
h.add(scrollPane);
h.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); //设置关闭窗口时的默认操作
h.setVisible(true); //展示容器窗口
3、个人信息展示:
JDialog h=new JDialog(student.f,"个人信息",true);
h.setSize(625,505); //设置窗口大小
h.setLocation(629,251); //设置窗口在屏幕显示位置
int n=7,i;
JPanel panel=new JPanel(new GridLayout(n,1));
JPanel panel1[]=new JPanel[n];
JLabel label[][]=new JLabel[7][2]; //创建n*2个标签组件
label[0][0]=new JLabel("学号:");
label[1][0]=new JLabel("姓名:");
label[2][0]=new JLabel("性别:");
label[3][0]=new JLabel("出生日期:");
label[4][0]=new JLabel("年级:");
label[5][0]=new JLabel("专业:");
label[6][0]=new JLabel("电话:");
String[] grxx=new String[7];
try {
grxx=studentDao.gerenxinxi().split(";");
}catch (Exception eeeee){
eeeee.printStackTrace();
}
for(i=0;i<n;i++){
label[i][1]=new JLabel(grxx[i]);
panel1[i]=new JPanel(new FlowLayout(FlowLayout.LEFT,10,30)); //
panel1[i].add(label[i][0]);
panel1[i].add(label[i][1]);
panel.add(panel1[i]);
}
panel.setPreferredSize(new Dimension(625,11111)); //设置panel面板大小
h.add(panel);
h.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); //设置关闭窗口时的默认操作
h.setVisible(true); //展示容器窗口
4、在线答题代码端如下:
JDialog h=new JDialog(student.f,"在线答题",true);
h.setSize(625,505); //设置窗口大小
h.setLocation(629,251); //设置窗口在屏幕显示位置
ButtonGroup []group=new ButtonGroup[20]; //创建一个ButtonGroup按钮组组件
JRadioButton btn[][]=new JRadioButton[20][4]; //创建单选按钮组件数组
JPanel panel1=new JPanel(new GridLayout(21,1)); //将面板设置为网格布局管理器用于存放问题
panel1.setPreferredSize(new Dimension(625,7000)); //设置panel面板大小
//JScrollPane scrollPane[]=new JScrollPane[20]; //创建JScrollPane滚动面板组件数组 用于存放每题的内容
int i;
ActionListener[] listener=new ActionListener[20];
for(i=0;i<20;i++){
JPanel panel=new JPanel(new GridLayout(5,1));
//panel.setPreferredSize(new Dimension(625,0)); //设置panel面板大小
JPanel panel2=new JPanel(new FlowLayout(FlowLayout.LEFT));
panel2.setPreferredSize(new Dimension(625,200)); //设置panel面板大小
studentDao.aa.exam();
//String text=(""11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
JTextArea label=new JTextArea(5,58);
label.setEditable(false); //设置文本域不可编辑
label.append(studentDao.aa.exam_1[i][0]);
label.setLineWrap(true); //使文本域可以换行
panel2.add(label);
btn[i][0]=new JRadioButton("A"+studentDao.aa.exam_1[i][1]);
btn[i][1]=new JRadioButton("B"+studentDao.aa.exam_1[i][2]);
btn[i][2]=new JRadioButton("C"+studentDao.aa.exam_1[i][3]);
btn[i][3]=new JRadioButton("D"+studentDao.aa.exam_1[i][4]);
group[i]=new ButtonGroup();
group[i].add(btn[i][0]);
group[i].add(btn[i][1]);
group[i].add(btn[i][2]);
group[i].add(btn[i][3]);
panel.add(panel2);
panel.add(btn[i][0]);
panel.add(btn[i][1]);
panel.add(btn[i][2]);
panel.add(btn[i][3]);
panel1.add(panel);
}
JPanel xxxx=new JPanel(new FlowLayout());
JButton one=new JButton("提交"); //创建一个提交按钮
xxxx.add(one);
panel1.add(xxxx); //将提交按钮组件加入到panel1面板中
JScrollPane scrollPane1=new JScrollPane(); //创建一个滑轮面板组件
scrollPane1.getVerticalScrollBar().setUnitIncrement(15);
scrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
//设置垂直滚动条策略--滚动条需要时显示
scrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane1.setViewportView(panel1); //将创建的panel1面板加入到滑轮面板中
h.add(scrollPane1); //将创建的滑轮面板加入到JDialog中
h.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); //设置关闭窗口时的默认操作
h.setVisible(true); //展示容器窗口
5、留言聊天
JDialog h=new JDialog(f,"聊天室",true);
h.setLayout(new BorderLayout()); //设置面板布局管理器
h.setSize(625,505); //设置窗口大小
h.setLocation(629,251); //设置窗口在屏幕显示位置
JScrollPane scrollPane=new JScrollPane();
scrollPane.setPreferredSize(new Dimension(625,350));
JTextArea show=new JTextArea(dialogueDao.xueshengduihuadu());
show.setPreferredSize(new Dimension(625,111111111)); //设置文本框大小
show.setLineWrap(true); //让文本框自动换行
show.setEditable(false); //设置文本域不可编辑
scrollPane.setViewportView(show);
JTextArea input=new JTextArea();
input.setPreferredSize(new Dimension(625,111111111)); //设置文本框大小
input.setLineWrap(true); //让文本框自动换行
JScrollPane scrollPane1=new JScrollPane();
scrollPane1.setPreferredSize(new Dimension(625,100));
scrollPane1.setViewportView(input);
JPanel panel=new JPanel(new FlowLayout());
panel.setPreferredSize(new Dimension(625,50));
JButton button=new JButton("发送");
panel.add(button);
h.add(panel,BorderLayout.PAGE_END);
h.add(scrollPane,BorderLayout.PAGE_START);
h.add(scrollPane1,BorderLayout.CENTER);
h.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); //设置关闭窗口时的默认操作
h.setVisible(true); //展示容器窗口
后端:
后端描述主要以连接数据库为主,这里给出数据库调用语句进行分析阐述:
- 查看考试记录时调用的存储过程语句:{call place_mine(?,?)}
存储过程的创建语句如下:
create procedure place_mine
@ssid nchar(10),
@n int
as
declare stuCur cursor scroll
local for
select * from sgrade
where sid in(
select sid from sgrade
where sid=@ssid
group by sid
)
--打开游标
open stuCur
--读取数据
fetch absolute @n from stuCur
--关闭游标
close stuCur
--销毁游标
deallocate stuCur
go
对筛选出来的所有满足条件的集合,然后使用固定游标开始的起点,找出需要的第n个试卷
- 统计出题目总条数select count(*) as totalCount from exam,然后随机生成20个数字,作为一份试卷出现,再使用select * from exam " + " where eui=?筛选出指定题目
- 调用insert into sgrade values(?,?,?,?,?)对成绩进行插入
- select count(*) as num from soul_soother统计出心灵鸡汤数目
- 筛选出对应老师的心灵鸡汤:select * from soul_soother where tid in(select tid from teacher where tgrade=?)
- 找出个人信息:select * from student where sid=?
2.2.2管理端
后端:
- 学生添加:insert into student values(?,?,?,?,?,?,?,?)
- 学生删除:delete from student where sid = ?
- 通过先删后增来实现更改操作
- 查询指定信息的学生select count(*) as num from student where sid like ?
- 统计所有的学生信息,并返回至前端:select * from student where sid like ?
- 教师端与学生端几乎没有太多差异不再赘述
三、测试方案设计
3.1白盒测试
通过debug来观察过程出数据的变化,来了解每个模块是否正确运行,这里只给出登录时的debug测试过程。
3.1.1测试策略
输入账号、密码、选择类型,然后在程序入口打上断点,一步一步debug观察运行结果。
3.1.2测试数据
账号:201816407
密码:123456
类型:学生
3.1.3预期结果
能正常进入界面,组件依次添加,并且在debug中能看到各种正确信息
3.1.4实际测试结果
打开时的界面:

输入对应账号密码

点击登录对比信息


3.2黑盒测试
直接对输入输出进行测试,不考虑中间过程,观察对应输入输出即可
3.2.1测试策略
使用学生账户进行测试,选取各种功能看是否能正常运行
3.2.2测试数据
账号:201816407
密码:123456
类别:学生
功能点击:
- 查看个人信息
- 查看考试记录
- 查看教师留言
- 在线答题
3.2.3预期结果
能正常运行,并且能正常显示出个人信息、考试记录、教师留言、在线答题页面,以及能提交到数据库。
3.2.4实际测试结果
鸡汤:

个人信息:

查看考试信息

在线答题:

数据库验证:

四、测试结果分析
4.1白盒测试结果分析
通过一系列的对程序debug逐条分析语句,对比程序中的运行结果和自己人脑运行没有差异证明白盒测试结果正确。时间上会稍有问题,这个是格式处理问题,通过审核指定区域代码很快能得到错误的地方,只需要对日期格式进行格式化输入即可
4.2黑盒测试结果分析
黑盒测试时,出现页面不更新的问题,这个是由于缓存的出现,两种解决方式——要么清空缓存,要么自动点击按钮进行手动刷新。也可以直接在程序中点击刷新(doClick)即可
五、实验小结
**** 这次实验主要的任务是编写代码,在整个实验过程中使用了java和sql两种高级语言。通过这次实验可以很有效的再次学习java和sql语句。在使用这两种高级语言的时候,会出现一系列的问题。Java中出现的问题比较容易解决,可以通过debug来找到错误点,而sql语句的提示不是很全面且sql是面向结果的,不容易控制和调试。但高频度的使用还是能很有效的提高代码的正确率。实验过程中,我遇到了很多数据库访问失败的问题,首先是没有开启本地网络服务无法连接到数据库,这个发现的比较快。后来是账户密码不匹配问题,这个调试了很久才找到,最后遇到的连接数据库问题是权限问题,最后改用sa即可获得所有的数据库权限,进而成功的访问数据库。Java gui使用也遇到了很大问题,gui属于比较老套的页面设计,再增添组件的便利性上不如其他语言,所以在实现时选用弹窗的模式来避免反复增删组件带来的一系列问题。代码实现的过程整体来说很顺利,没有什么实质性的建议。
