- 系统实现
- 用户功能模块
登录关键代码如下。
@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 != 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, "账号或密码不正确");
}
}
用户注册关键代码如下。
@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
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer userId;
@Basic
@Column(name = "state")
private Integer state;
@Basic
@Column(name = "user_group")
private String userGroup;
@Basic
@Column(name = "login_time")
private Timestamp loginTime;
@Basic
@Column(name = "phone")
private String phone;
@Basic
@Column(name = "phone_state")
private Integer phoneState;
@Basic
@Column(name = "username")
private String username;
@Basic
@Column(name = "nickname")
private String nickname;
@Basic
@Column(name = "password")
private String password;
@Basic
@Column(name = "email")
private String email;
@Basic
@Column(name = "email_state")
private Integer emailState;
@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;
}
用户可以获取所有申请快递员的列表并对其进行搜索。包括申请快递员基本信息,如姓名、现住地址、是否有车、身份证、备注、联系电话、性别、驾驶证、用户,有申请快递员的描述以及展示图片等。
用户可以获取所有生活资讯的列表并对其进行搜索。包括生活资讯基本信息,如点赞、收藏、发表评论,有生活资讯的描述以及展示图片等。
用户在进我的账户课查询个人资料、修改密码,有我的账户的描述以及展示图片等。
-
- 管理员功能模块的实现
管理员界面要尽量简洁大方,使用户能够方便找到需要的功能首页、公共管理、用户管理、系统内容、系统模块、帖子分类、论坛帖子、资源中心,且要易于修改和维护,同时还要保证用户合法和系统安全。
用户管理关键代码如下所示。
@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());
}
管理员对系统用户的管理,在yhzhgl.jsp实现管理员用户的管理,包括录入、删除、修改,修改密码通过SESSION获取用户名,然后输入新密码,提交到mod.jsp中,使用sql命令更新密码。
用户管理关键代码如下所示。
public String encryption(String plainText) {
String re_md5 = new String();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
re_md5 = buf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return re_md5;
}
该功能包括对快递员进行添加、删除、修改,编辑。首先管理员进入后台主页,在左边菜单栏选择相应的功能操作。
首先管理员点击进入快递员shangcheng_list.jsp,可以选择删除、或者修改,如果管理员点击删除,则将通过js提示管理员是否删除onClick="return confirm('真的要删除?')",如果删除后将请求sh.jsp进行数据库数据删除,如果管理员选择修改快递员,将跳转至shangjia_updt2.jsp,然后管理员修改后,页面请求shangjia_updt2_list.jsp来操作数据库完成快递员的修改。
该功能包括对快递代取进行添加、删除、修改,编辑。首先管理员进入后台主页,在左边菜单栏选择相应的功能操作。
首先管理员点击进入快递代取shangcheng_list.jsp,可以选择删除、或者修改,如果管理员点击删除,则将通过js提示管理员是否删除onClick="return confirm('真的要删除?')",如果删除后将请求sh.jsp进行数据库数据删除,如果管理员选择修改快递代取,将跳转至shangjia_updt2.jsp,然后管理员修改后,页面请求shangjia_updt2_list.jsp来操作数据库完成快递代取的修改。
快递代取关键代码如下所示。
@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()
- 测试
在对该系统进行完详细设计和编码之后,就要对社区快递代取服务系统程序进行测试,检测程序是否运行无误,反复进行测试和修改,使之最后成为完整的软件,满足用户的需求,实现预期的功能。
6.2测试过程
在软件的测试过程中,通常测试人员需要针对不同的功能模块设计多种测试用例。通过测试用例能够及时发现代码业务逻辑上是否与真实的业务逻辑相对应,及时发现代码上或逻辑上的缺陷,以此来来完善系统,提高软件产品的质量,使软件具有良好的用户体验。
注册测试用例表如下所示。
表6-1注册测试用例
测试性能
新用户注册
用例目的
测试系统新用户个人信息注册功能的功能和安全性
前提条件
进入注册页面填写个人信息
输入条件
预期输出
实际情况
各项基本信息输入不完整
不允许注册,无法点击注册按钮
一致
填写已存在的用户名
系统显示出提示信息,要求重新填写
一致
两次密码输入不一致
系统显示出提示信息,要求重新填写
一致
填写的各项信息没有符合提示的长度和字符要求
系统显示出提示信息,要求重新填写
一致
胡乱填写电话号码
收不到验证码
一致
填写验证码与收到的不一致
系统显示提示信息告知用户验证码错误,不予注册
一致
登录测试用例表如下所示。
表6-2登录测试用例
测试性能
用户或操作员登录系统
用例目的
测试用户或操作员登录系统时功能是否正常
前提条件
进入用户登录页面或操作员登录页面
输入条件
预期输出
实际情况
各项信息不予填写,直接点击登陆按钮
不允许登录,提示填写账号相关信息
一致
填写错误的登录名或密码后点击登录系统
提示用户名或密码错误,要求重新填写进行登录
一致
填写与验证码信息不一致的信息
系统显示出提示信息,表明验证码错误,要求重新填写
一致
快递状态管理测试用例表如下所示。
表6-3快递状态管理测试用例
测试性能
用户进行快递状态管理的操作
用例目的
测试用户进行快递状态管理操作时,该功能是否正常
前提条件
用户进入快递状态详情页,该快递状态能够被受理
输入条件
预期输出
实际情况
对着某快递状态点击“受理”按钮
界面跳转至受理界面
一致
在受理界面,输入必填项,点击“提交”按钮
提示“受理成功”,并返回上一级界面
一致
在受理界面,填写受理表单的时候未输入完整,点击“提交”按钮
提示“受理失败”
一致
优秀快递员测试用例表如下所示。
表6-4优秀快递员测试用例
测试性能
发布技术相关信息管理功能
用例目的
测试系统操作者对优秀快递员相关信息进行管理的功能是否正常
前提条件
登录系统进入相关管理页面
输入条件
预期输出
实际情况
进入优秀快递员界面,点击“录入”按钮,填写所有必填项,点击提交
提示“录入成功”,并返回查询界面
一致
进入优秀快递员界面,点击“录入”按钮,未填写一个或者多个必填项,点击提交
提示“录入失败”,请填写必填项
一致
进入优秀快递员界面,选择要修改的一条数据,点击该条数据后面的“修改”按钮
节目跳转至修改界面
一致
在修改界面,修改可修改项后,点击“提交”按钮
提示“修改成功”,并返回查询界面
一致
进入优秀快递员界面,点击某条数据后面的删除按钮
提示“是否要删除该数据”,如果用户点击“确定”按钮,则成功删除该条数据,并提示“删除成功”,之后返回查询界面
一致