- 系统实现
5.1学生功能模块
5.1.1 前台首页界面
当进入全省中小学师生共建习题交流与指导平台的时候,系统以上中下的布局进行展示,首先映入眼帘的是系统的导航栏,下面是轮播图,再往下是各种各样的系统信息,其主界面展示如下图5-1所示。

图5-1 前台首页界面图
5.1.2 学生注册界面
不是全省中小学师生共建习题交流与指导平台中正式会员的是可以在线进行注册的,当用户右上角“注册”按钮的时候,当填写上自己的账号+密码+确认密码+昵称+邮箱+手机号等信息后再点击“注册”按钮后将会先验证输入的有没有空数据,再次验证密码和确认密码是否是一样的,最后验证输入的账户名和数据库表中已经注册的账户名是否重复,只有都验证没问题后即可学生注册成功。其用学生注册界面展示如下图5-2所示。

图5-2 学生注册界面图
注册逻辑关键代码如下所示。
/
* 注册
* @param user
* @return
*/
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
// 查询用户
Map<String, String> query = new HashMap<>();
query.put("username",user.getUsername());
List list = service.select(query, new HashMap<>()).getResultList();
if (list.size()>0){
return error(30000, "用户已存在");
}
user.setUserId(null);
user.setPassword(service.encryption(user.getPassword()));
service.save(user);
return success(1);
}
/
* 用户ID:[0,]用户获取其他与用户相关的数据
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer userId;
/
* 账户状态:[0,10](1可用|2异常|3已冻结|4已注销)
*/
@Basic
@Column(name = "state")
private Integer state;
/
* 所在用户组:[0,32767]决定用户身份和权限
*/
@Basic
@Column(name = "user_group")
private String userGroup;
/
* 上次登录时间:
*/
@Basic
@Column(name = "login_time")
private Timestamp loginTime;
/
* 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时
*/
@Basic
@Column(name = "phone")
private String phone;
/
* 手机认证:[0,1](0未认证|1审核中|2已认证)
*/
@Basic
@Column(name = "phone_state")
private Integer phoneState;
/
* 用户名:[0,16]用户登录时所用的账户名称
*/
@Basic
@Column(name = "username")
private String username;
/
* 昵称:[0,16]
*/
@Basic
@Column(name = "nickname")
private String nickname;
/
* 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成
*/
@Basic
@Column(name = "password")
private String password;
/
* 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时
*/
@Basic
@Column(name = "email")
private String email;
/
* 邮箱认证:[0,1](0未认证|1审核中|2已认证)
*/
@Basic
@Column(name = "email_state")
private Integer emailState;
/
* 头像地址:[0,255]
*/
@Basic
@Column(name = "avatar")
private String avatar;
/
* 创建时间:
*/
@Basic
@Column(name = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Timestamp createTime;
@Basic
@Transient
private String code;
}
5.1.3 学生登录界面
全省中小学师生共建习题交流与指导平台中的前台上注册后的会员是可以通过自己的账户名和密码进行登录的,当学生输入完整的自己的账户名和密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的账户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到全省中小学师生共建习题交流与指导平台的首页中;否则将会提示相应错误信息,学生登录界面如下图5-3所示。

图5-3学生登录界面图
登录系统主要代码如下。
/
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(email java基础教程陈国君!= null && "".equals(email) == false){
map.put("email", email);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.select(map, new HashMap<>()).getResultList();
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
String res = String.valueOf(service.runCountSql(sql).getSingleResult());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
tokenService.save(accessToken);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
5.1.4留言板界面
当点击导航栏上的“留言板”的时候,就会进入对应的界面查看留言信息,留言板界面如下图4-4所示。

图5-4留言板界面图
5.1.5 习题库列表界面
当访客点击全省中小学师生共建习题交流与指导平台中导航栏上的“习题库列表”后将会进入到该“习题库列表”列表的界面,然后选择想要看的习题库列表,点击进入到详细界面,在详细界面可以习题名称+学科等操作,习题库列表界面如下图5-5所示。

图5-5习题库列表界面图
5.2教师功能模块
5.2.1 我的留言界面
教师在后台菜单栏点击“我的留言”,可以增删改查我的留言信息,管理员进行审核回复,其界面如下图5-6所示。

图5-6我的留言界面图
5.2.2 我的笔记界面
教师在“我的笔记”界面能够对我的笔记信息进行管理,可以进行增删改查操作,我的笔记界面如下图5-7所示。

图5-7我的笔记界面图
5.2.3 测试习题界面
教师在“测试习题”这一界面能够查看自己提交的测试习题信息,可以进行增删改查操作,也可以对前台用户提交的测试习题评分进行管控,测试习题界面如下图5-8所示。

图5-8测试习题界面图
5.3管理员功能模块
5.3.1 站点内容界面
全省中小学师生共建习题交流与指导平台中的管理人员在“站点内容”这一菜单中是可以对前台显示的轮播图以及公告栏进行管控。界面如下图5-9所示。

图5-9站点内容界面图
站点内容关键代码如下所示。
@RequestMapping(value = {"/count_group", "/count"})
public Map<String, Object> count(HttpServletRequest request) {
Query count = service.count(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
5.3.2 用户管理界面
全省中小学师生共建习题交流与指导平台中的管理人员在“用户管理”这一菜单是中可以对学生的用户、教师以及管理员进行管控,这里以用户管理为例。界面如下图5-10所示。

图5-10用户管理界面图
用户管理关键代码如下所示。
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
public Map<String,Object> readBody(BufferedReader reader){
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<String,Object> body){
StringBuffer sql = new StringBuffer("INSERT INTO ");
sql.append("`").append(table).append("`").append(" (");
for (Map.Entry<String,Object> entry:body.entrySet()){
sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
}
sql.deleteCharAt(sql.length()-1);
sql.append(") VALUES (");
for (Map.Entry<String,Object> entry:body.entrySet()){
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.3.3 公共内容管理界面
全省中小学师生共建习题交流与指导平台中的管理人员在“公共内容”这一菜单中是可以对全省中小学师生共建习题交流与指导平台内的留言板管理、利与弊分类、动态管理、动态分类、测试习题进行维护和管理的,界面如下图5-11所示。

图5-11公共内容管理界面图
公共内容管理关键代码如下所示。
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
@Transactional
public void delete(Map<String,String> query,Map<String,String> config){
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();
}
5.3.4 模块管理界面
全省中小学师生共建习题交流与指导平台中的管理人员在“模块管理”这一菜单下是可以对全省中小学师生共建习题交流与指导平台内的习题管理、年级管理、学科管理、教师联系我们、学生联系我们进行管控的,其管理界面如下图5-12所示。

图5-12社团介绍界面图
模块管理关键代码如下所示。
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
return success(1);
}
public Map<String,String> readConfig(HttpServletRequest request){
Map<String,String> map = new HashMap<>();
map.put(FindConfig.PAGE,request.getParameter(FindConfig.PAGE));
map.put(FindConfig.SIZE,request.getParameter(FindConfig.SIZE));
map.put(FindConfig.LIKE,request.getParameter(FindConfig.LIKE));
map.put(FindConfig.ORDER_BY,request.getParameter(FindConfig.ORDER_BY));
map.put(FindConfig.FIELD,request.getParameter(FindConfig.FIELD));
map.put(FindConfig.GROUP_BY,request.getParameter(FindConfig.GROUP_BY));
map.put(FindConfig.MAX_,request.getParameter(FindConfig.MAX_));
map.put(FindConfig.MIN_,request.getParameter(FindConfig.MIN_));
return map;
}
public Map<String,String> readQuery(HttpServletRequest request){
String queryString = request.getQueryString();
if (queryString != null && !"".equals(queryString)) {
String[] querys = queryString.split("&");
Map<String, String> map = new HashMap<>();
for (String query : querys) {
String[] q = query.split("=");
map.put(q[0], q[1]);
}
map.remove(FindConfig.PAGE);
map.remove(FindConfig.SIZE);
map.remove(FindConfig.LIKE);
map.remove(FindConfig.ORDER_BY);
map.remove(FindConfig.FIELD);
map.remove(FindConfig.GROUP_BY);
map.remove(FindConfig.MAX_);
map.remove(FindConfig.MIN_);
return map;
}else {
return new HashMap<>();
}
}
@Transactional
public void update(Map<String,String> query,Map<String,String> config,Map<String,Object> body){
StringBuffer sql = new StringBuffer("UPDATE ").append("`").append(table).append("`").append(" SET ");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append("'").append(value).append("'").append(",");
}else {
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append(value).append(",");
}
}
sql.deleteCharAt(sql.length()-1);
sql.append(toWhereSql(query,"0".equals(config.get(FindConfig.LIKE))));
log.info("[{}] - 更新操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
public String toWhereSql(Map<String,String> query, Boolean like) {
if (query.size() > 0) {
try {
StringBuilder sql = new StringBuilder(" WHERE ");
for (Map.Entry<String, String> entry : query.entrySet()) {
if (entry.getKey().contains(FindConfig.MIN_)) {
String min = humpToLine(entry.getKey()).replace("_min", "");
sql.append("`"+min+"`").append(" >= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (entry.getKey().contains(FindConfig.MAX_)) {
String max = humpToLine(entry.getKey()).replace("_max", "");
sql.append("`"+max+"`").append(" <= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (like == true) {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" LIKE '%").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("%'").append(" and ");
} else {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" = '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("'").append(" and ");
}
}
sql.delete(sql.length() - 4, sql.length());
sql.append(" ");
return sql.toString();
} catch (UnsupportedEncodingException e) {
log.info("拼接sql 失败:{}", e.getMessage());
}
}
return "";
}
- 测试
6.1测试目的
在对该系统进行完详细设计和编码之后,就要对全省中小学师生共建习题交流与指导平台进行测试,检测程序是否运行无误,反复进行测试和修改,使之最后成为完整的软件,满足用户的需求,实现预期的功能。
6.2测试过程
在软件的测试过程中,通常测试人员需要针对不同的功能模块设计多种测试用例。通过测试用例能够及时发现代码业务逻辑上是否与真实的业务逻辑相对应,及时发现代码上或逻辑上的缺陷,以此来来完善系统,提高软件产品的质量,使软件具有良好的用户体验。
注册测试用例表如下所示。
表6-1注册测试用例
测试性能
新用户注册
用例目的
测试系统新用户个人信息注册功能的功能和安全性
前提条件
进入注册页面填写个人信息
输入条件
预期输出
实际情况
各项基本信息输入不完整
不允许注册,无法点击注册按钮
一致
填写已存在的用户名
系统显示出提示信息,要求重新填写
一致
两次密码输入不一致
系统显示出提示信息,要求重新填写
一致
填写的各项信息没有符合提示的长度和字符要求
系统显示出提示信息,要求重新填写
一致
胡乱填写电话号码
收不到验证码
一致
填写验证码与收到的不一致
系统显示提示信息告知用户验证码错误,不予注册
一致
登录测试用例表如下所示。
表6-2登录测试用例
测试性能
用户或操作员登录系统
用例目的
测试用户或操作员登录系统时功能是否正常
前提条件
进入用户登录页面或操作员登录页面
输入条件
预期输出
实际情况
各项信息不予填写,直接点击登陆按钮
不允许登录,提示填写账号相关信息
一致
填写错误的登录名或密码后点击登录系统
提示用户名或密码错误,要求重新填写进行登录
一致
填写与验证码信息不一致的信息
系统显示出提示信息,表明验证码错误,要求重新填写
一致
学生管理测试用例表如下所示。
表6-3学生管理测试用例
测试性能
用户进行学生用户的操作
用例目的
测试用户进行员工用户操作时,该功能是否正常
前提条件
用户进入订单详情页,该学生用户能够被受理
输入条件
预期输出
实际情况
对着某订单点击“受理”按钮
界面跳转至受理界面
一致
在受理界面,输入必填项,点击“提交”按钮
提示“受理成功”,并返回上一级界面
一致
在受理界面,填写受理表单的时候未输入完整,点击“提交”按钮
提示“受理失败”
一致
习题测试用例表如下所示。
表6-4习题测试用例
测试性能
事故相关信息管理功能
用例目的
测试系统操作者对习题相关信息进行管理的功能是否正常
前提条件
登录系统进入相关管理页面
输入条件
预期输出
实际情况
进入习题界面,点击“录入”按钮,填写所有必填项,点击提交
提示“录入成功”,并返回查询界面
一致
进入习题界面,点击“录入”按钮,未填写一个或者多个必填项,点击提交
提示“录入失败”,请填写必填项
一致
进入习题界面,选择要修改的一条数据,点击该条数据后面的“修改”按钮
节目跳转至修改界面
一致
在修改界面,修改可修改项后,点击“提交”按钮
提示“修改成功”,并返回查询界面
一致
进入习题界面,点击某条数据后面的删除按钮
提示“是否要删除该数据”,如果用户点击“确定”按钮,则成功删除该条数据,并提示“删除成功”,之后返回查询界面
一致
6.3测试结果
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/25070.html