第五章 系统实现
5.1 基本任务
本章节详细介绍了系统各大功能模块的实现过程和实现方法,对每个功能进行实现,设计详细的根本目标是确定应该具体实现所要求的系统,每个模块都对应着相应的界面和显示的配图。主要从主页面的实现、登录模块的实现、课程信息管理模块的实现、选课信息管理模块的实现、课程成绩管理模块的实现、课程评价信息管理模块的实现等方面来描述。
5.2 主页面
系统呈现出一种简洁大方的首页:界面简约、鳞次栉比,用户能轻车熟路的使用。出于对系统使用群体广泛的顾虑,应有良好性能的后台。管理员登录进入图书管理系统可以查看首页、个人中心、用户管理(管理员管理)、更多管理(学生、教师、专业、学院、课程、学生选课、课程成绩、课程评价)等内容进行详细操作,如图5-1所示。如下图所示为系统的首页界面。
图5-1系统首页界面
5.3 登录模块的实现
系统的登录窗口是用户的入口,用户只有在登录成功后才可以进入访问。通过在登录提交表单,后台处理判断是否为合法用户,进行页面跳转,进入系统中去。
登录合法性判断过程:用户输入账号和密码后,系统首先确定输入输入数据合法性,然后在login.jsp页面发送登录请求,调用src下的mainctrl类的dopost方法来验证。
用户登录模块的IPO如下所示:
输入:用户名和密码。
处理:
1)检测用户输入的账号、密码是否正确及在数据库已对应存在。
2)从数据库中提取记录,并储存在本地的session中(timeout默认=30min)。
3)根据用户名,将其显示在系统首页上。
输出:是否成功的信息。
系统登录界面如下所示。
图5-2系统登录界面
登陆拦截管理器,在config文件夹下的WebAppConfig.java文件,代码如下:
@Configuration
@Slf4j
public class WebAppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//登录拦截的管理器
InterceptorRegistration registration = registry.addInterceptor(loginInterceptor());
//拦截的地址
registration.addPathPatterns("/**");
//方行的地址
//registration.excludePathPatterns("/**");
//根据需要拦截,一般设置所有地址拦截,放行公共连接
}
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
}
登陆接受管理器,在interceptor文件夹下的LoginInterceptor.java文件,控制请求头代码如下:
private void setHeader(HttpServletRequest request, HttpServletResponse response) {
//跨域的header设置
response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
response.setHeader("Access-Control-Max-Age", "1800");
//防止乱码,适用于传输JSON数据
response.setHeader("Content-Type", "application/json;charset=UTF-8");
response.setStatus(HttpStatus.OK.value());
5.4 课程选课模块
课程选课过程中,通过课程ID得到课程数据,将课程数据赋值给课程选课,将选课数据插入选课表中,最后查看个人历史课程选课记录,可以销毁历史选课数据。
课程选课流程图如下所示。
图5-3课程选课流程图
课程选课界面如图所示。
图5-4课程选课界面
选课管理界面如图所示。
图5-5选课管理界面
选课添加关键代码如下所示。新增一条数据,通过post传入一个json对象,然后经过request.getReader(),最后经过readBody()转成一个Map,含有String和Object,key用的是字段名,Object存放数据,最终得到Map,insert用拼装sql,读取body,组装成一个insert对象,runCountSql()语句,代码如下:
@PostMapping("/add")
@Transactional
public Map
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map
service.insert(map);
return success(1);
}
public Map
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try{
br = reader;
String str;
while ((str = br.readLine()) != null){
sb.append(str);
}
br.close();
String json = sb.toString();
return JSONObject.parseObject(json, Map.class);
}catch (IOException e){
e.printStackTrace();
}finally{
if (null != br){
try{
br.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return null;
}
public void insert(Map
StringBuffer sql = new StringBuffer("INSERT INTO ");
sql.append("`").append(table).append("`").append(" (");
for (Map.Entry
sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
}
sql.deleteCharAt(sql.length()-1);
sql.append(") VALUES (");
for (Map.Entry
Object value = entry.getValue();
if (value instanceof String){
sql.append("'").append(entry.getValue()).append("'").append(",");
}else {
sql.append(entry.getValue()).append(",");
}
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
log.info("[{}] - 插入操作:{}",table,sql);
Query query = runCountSql(sql.toString());
query.executeUpdate();
}
5.5 课程成绩模块
课程成绩录入过程中,首先使用getmap(id,"xinxi"),通过学生ID得到学生数据,将学生数据赋值给课程成绩,调用CommDAO的insert方法将成绩数据插入课程成绩表中,最后查看个人课程成绩记录,可以销毁课程成绩数据。
课程成绩流程图如下所示。
图5-6课程成绩流程图
课程成绩界面如图所示。
图5-7课程成绩界面
课程成绩管理界面如图所示。
图5-8课程成绩界面
5.6 课程管理模块
添加课程信息时,输入必填字段后,表现层接受传过来的课程信息参数,再调用add方法,经过业务层到持久层的处理,完成对整个添加课程信息的操作。add方法也和用户管理中方法类似,同时做添加和修改工作。
修改一个数据,原理与add基本一致,不同点在于通过readConfig()读取关键字,以及通过readQuery()获取URL后面?指定位置的标识,转成Map对象后,执行update操作,同样通过拼接的sql语句执行,执行过程读取query,toWhereSql()语句完成数据库操作,body为修改对象的值。
课程管理流程图如下所示。
图5-9课程管理流程图
课程添加界面如下图所示。
图5-10课程添加界面
课程查询界面如下图所示。
图5-11课程查询界面
通过请求的参数获取列表数据,代码如下:
@RequestMapping("/get_list")
public Map
Map
return success(map);
}
5.7 公告管理模块
删除一条数据,通过readQuery(),获取URL后面的对象地址,删除FROM具体的table,query删除查询FindConfig语句。
查找公告时,输入需要查找的公告名,调用getData方法获取所有数据并且进行分页,把获取到的所有数据显示到视图上,这时候只需要用脚本方法便能快速查找,不涉及对数据库操作。
公告管理流程图如下所示。
图5-12公告管理流程图
公告添加界面如下图所示。
图5-13公告添加界面
公告查询界面如下图所示。
图5-14公告查询界面
删除代码如下:
@RequestMapping(value = "/del")
@Transactional
public Map
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
@Transactional
public void delete(Map
StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");
sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));
log.info("[{}] - 删除操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
第六章 系统测试
6.1 测试目的
在对该系统进行完详细设计和编码之后,就要对学生选课系统的程序进行测试,检测程序是否运行无误,反复进行测试和修改,使之最后成为完整的软件,满足用户的需求,实现预期的功能。
6.2 测试概述
软件测试是软件开发完成后必须经过的一道程序,它在软件开发过程中地位十分重要,需要由专业的测试工程师来对软件进行各方面的测试,大到功能模块测试,小到代码的单元测试,这对测试工程师来说需要有足够的耐心和专业的测试方案,软件测试归根结底就是对软件的结构和功能的综合测评,需要做到结构稳定和功能正确,二者兼顾。软件测试也叫寻找系统bug的过程,世界上没有完美无缺、不存在bug的软件,只能将软件的bug降到最低最小,来追求极致。
6.3 单元测试
在软件的测试过程中,通常测试人员需要针对不同的功能模块设计多种测试用例。通过测试用例能够及时发现代码业务逻辑上是否与真实的业务逻辑相对应,及时发现代码上或逻辑上的缺陷,以此来来完善系统,提高软件产品的质量,使软件具有良好的用户体验。
6.3.1 登录功能测试
登录测试用例表如下所示。
表6-1登录测试用例
测试性能
用户或操作员登录系统
用例目的
测试用户或操作员登录系统时功能是否正常
前提条件
进入用户登录页面或操作员登录页面
输入条件
预期输出
实际情况
各项信息不予填写,直接点击登陆按钮
不允许登录,提示填写账号相关信息
一致
填写错误的登录名或密码后点击登录系统
提示用户名或密码错误,要求重新填写进行登录
一致
填写与验证码信息不一致的信息
系统显示出提示信息,表明验证码错误,要求重新填写
一致
6.3.2 选课功能测试
课程选课测试用例表如下所示。
表6-3课程选课测试用例
测试性能
用户进行选课课程的操作
用例目的
测试用户进行选课课程操作时,系统的功能是否正常
前提条件
用户进入课程详情页,该课程能够被选课
输入条件
预期输出
实际情况
用户未登录,点击选课按钮
跳转至登录页面,提示用户先进性登录
一致
正常的登录用户,点击选课按钮
系统弹出提示框,提示用户选课成功,同时该课程的状态更改为已选课状态
一致
6.3.3
课程功能测试
课程管理测试用例表如下所示。
表6-4课程管理测试用例
测试性能
课程相关信息管理功能
用例目的
测试系统后台操作员对课程相关信息进行管理的功能是否正常
前提条件
登录系统后台进入相关管理页面
输入条件
预期输出
实际情况
普通操作员登录,点击进入课程相关信息管理的页面
提示非超级用户,权限不够,无法进入相关页面
一致
超级操作员登入,删除某个已被选课的课程
提示该课程删除失败
一致
点击增加课程按钮
页面正常跳转
一致
增加课程是,填写已存在的课程编号
提示该编号已存在
一致
6.4 集成测试
经过对此系统的测试,得出该系统足以满足用户日常需求,在功能项目和操作等方面也能满足操作员对于其他用户的管理。但是,还有很多功能有待添加,这个系统仅能满足大部分的需求,还需要对此系统的功能更进一步的完善,这样使用起来才能更加的完美。