医院挂号预约管理系统的详细设计与实现主要是根据前面的医院挂号预约管理系统的需求分析和医院挂号预约管理系统的总体设计来设计页面并实现业务逻辑。主要从医院挂号预约管理系统界面实现、业务逻辑实现这两部分进行介绍。
4.1用户功能模块
4.1.1 前台首页界面
当进入医院挂号预约管理系统的时候,首先映入眼帘的是系统的导航栏,下面是轮播图以及系统内容,其主界面展示如下图4-1所示。
图4-1 前台首页界面图
4.1.2用户登录界面
医院挂号预约管理系统中的前台上注册后的用户是可以通过自己的账户名和密码进行登录的,当用户输入完整的自己的账户名和密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的账户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到医院挂号预约管理系统的首页中;否则将会提示相应错误信息,用户登录界面如下图4-2所示。
图4-2用户登录界面图
登录关键代码如下所示。
@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;
QueryWrapper wrapper = new QueryWrapper<User>();
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}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.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());
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, "账号或密码不正确");
}
}
public String select(Map<String,String> query,Map<String,String> config){
StringBuffer sql = new StringBuffer("select ");
sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");
sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));
if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){
sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");
}
if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){
sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");
}
if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){
int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;
int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;
sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);
}
log.info("[{}] - 查询操作,sql: {}",table,sql);
return sql.toString();
}
public List selectBaseList(String select) {
List<Map<String,Object>> mapList = baseMapper.selectBaseList(select);
List<E> list = new ArrayList<>();
for (Map<String,Object> map:mapList) {
list.add(JSON.parseObject(JSON.toJSONString(map),eClass));
}
return list;
}
4.1.3用户注册界面
不是医院挂号预约管理系统中正式用户的是可以在线进行注册的,如果你没有本医院挂号预约管理系统的账号的话,添加“注册”,当填写上自己的账号+密码+确认密码+昵称+邮箱+手机号等后再点击“注册”按钮后将会先验证输入的有没有空数据,再次验证密码和确认密码是否是一样的,最后验证输入的账户名和数据库表中已经注册的账户名是否重复,只有都验证没问题后即可用户注册成功。其用用户注册界面展示如下图4-3所示。
图4-2用户注册界面图
注册关键代码如下所示。
@PostMapping("register")
public Map<String, Object> signUp(HttpServletRequest request) throws IOException {
// 查询用户
Map<String, String> query = new HashMap<>();
Map<String,Object> map = service.readBody(request.getReader());
query.put("username",String.valueOf(map.get("username")));
List list = service.selectBaseList(service.select(query, new HashMap<>()));
if (list.size()>0){
return error(30000, "用户已存在");
}
map.put("password",service.encryption(String.valueOf(map.get("password"))));
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){
E entity = JSON.parseObject(JSON.toJSONString(body),eClass);
baseMapper.insert(entity);
log.info("[{}] - 插入操作:{}",entity);
}
4.1.4医疗新闻界面
用户点击“医疗新闻”菜单显示所有的医疗新闻信息,可以按照条件进行医疗新闻的筛选或者输入关键词进行局部搜索,点击可以进入医疗新闻详细展示界面,在此界面用户可以收藏、点赞和评论。界面如图4-4所示。
图4-4医疗新闻界面图
4.1.5医生出诊详情界面
用户可以查看医生出诊,在查询到自己想要了解的医生出诊的时候,可以进入查看详细的介绍,点击“挂号预约”这一按钮以后会跳转到挂号预约信息填写的界面,根据提示填写好挂号预约的信息,点击“提交”以后挂号预约就完成了,在医生出诊详情这个界面,同时支持用户对喜欢的医生出诊进行评论的功能,医生出诊详情展示页面如图4-5所示。
图4-5医生出诊详情界面图
4.1.6 科室介绍详情界面
用户可以查看科室介绍信息,在查询到自己想要了解的科室介绍的时候,可以进入查看详细的介绍。界面如下图4-6所示。
图4-6 科室介绍详情界面图
4.1.7我的账户界面
当用户点击右上角“我的”这个按钮,会出现子菜单,点击“我的账户”可以对个人的资料、登录系统的密码以及自己收藏的信息进行设置管理,我的账户界面如下图4-7所示。
图4-7我的账户界面图
4.2管理员功能模块
医院挂号预约管理系统的理员拥有最高的权限,可以对用户信息、系统信息以及医院挂号预约管理系统相关信息进行管控。
4.2.1登录界面
管理员在后台可以通过账号和密码进行登录,管理员的账号和密码是在数据库中直接设定的。界面展示如下图4-8所示。
图4-8登录界面图
4.2.2系统用户管理界面
管理员点击“系统用户”这一菜单会显示管理员、医生用户、普通用户这三个子菜单,管理员可以对这三个角色的信息进行增删改查操作。界面如下图4-9所示。
图4-9系统用户管理界面图
系统用户管理管理关键代码如下所示。
public List selectBaseList(String select) {
List<Map<String,Object>> mapList = baseMapper.selectBaseList(select);
List<E> list = new ArrayList<>();
for (Map<String,Object> map:mapList) {
list.add(JSON.parseObject(JSON.toJSONString(map),eClass));
}
return list;
}
4.2.3系统公告管理界面
管理员点击“系统公告管理”菜单可以查看到系统中的所有系统公告,对已经存在的系统公告,管理员可以修改,也可以添加新的系统公告或者删除系统公告。界面如下图4-10所示。
图4-10系统公告管理界面图
4.2.4资源管理界面
管理员点击“资源管理”菜单能够对其下子菜单医疗新闻和新闻的分类进行增删改查。界面如下图4-11所示。
图4-11资源管理界面图
4.2.5模块管理界面
医院挂号预约管理系统中的管理人员在“模块管理”这一菜单下是可以对医院挂号预约管理系统内的医生出诊、科室、挂号信息、科室介绍进行管控的,其管理界面如下图4-12所示。
图4-12模块管理界面图
模块管理关键代码如下所示。
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));
if (resultList.size() > 0) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("obj",resultList.get(0));
return success(jsonObject);
} else {
return success(null);
}
}
5.1系统测试的目的
系统开发到了最后一个阶段那就是系统测试,系统测试对软件的开发其实是非常有必要的。因为没什么系统一经开发出来就可能会尽善尽美,再厉害的系统开发工程师也会在系统开发的时候出现纰漏,系统测试能够较好的改正一些bug,为后期系统的维护性提供很好的支持。通过系统测试,开发人员也可以建立自己对系统的信心,为后期的系统版本的跟新提供支持。
5.2 系统测试用例
系统测试包括:用户登录功能测试、医生出诊展示功能测试、医生出诊添加、医生出诊搜索、密码修改功能测试,如表5-1、5-2、5-3、5-4、5-5所示:
用户登录功能测试:
表5-1 用户登录功能测试表
用例名称
用户登录系统
目的
测试用户通过正确的用户名和密码可否登录功能
前提
未登录的情况下
测试流程
1) 进入登录页面
2) 输入正确的用户名和密码
预期结果
用户名和密码正确的时候,跳转到登录成功界面,反之则显示错误信息,提示重新输入
实际结果
实际结果与预期结果一致
医生出诊查看功能测试:
表5-2 医生出诊查看功能测试表
用例名称
医生出诊查看
目的
测试医生出诊查看功能
前提
用户登录
测试流程
点击医生出诊列表
预期结果
可以查看到所有医生出诊
实际结果
实际结果与预期结果一致
管理员添加医生出诊界面测试:
表5-3 管理员添加医生出诊界面测试表
用例名称
医生出诊发布测试用例
目的
测试医生出诊发布功能
前提
用户正常登录情况下
测试流程
1)点击医生出诊管理就,然后点击添加后并填写信息。
2)点击进行提交。
预期结果
提交以后,页面首页会显示新的医生出诊
实际结果
实际结果与预期结果一致
医生出诊搜索功能测试:
表5-4医生出诊搜索功能测试表
用例名称
医生出诊搜索测试
目的
测试医生出诊搜索功能
前提
无
测试流程
1)在搜索框填入搜索关键字。
2)点击搜索按钮。
预期结果
页面显示包含有搜索关键字的医生出诊
实际结果
实际结果与预期结果一致
密码修改功能测试:
表5-5 密码修改功能测试表
用例名称
密码修改测试用例
目的
测试管理员密码修改功能
前提
管理员用户正常登录情况下
测试流程
1)管理员密码修改并完成填写。
2)点击进行提交。
预期结果
使用新的密码可以登录
实际结果
实际结果与预期结果一致
5.3 系统测试结果
通过编写医院挂号预约管理系统的测试用例,已经检测完毕用户登录模块、医生出诊查看模块、医生出诊添加模块、医生出诊搜索模块、密码修改功能测试,通过这5大模块为医院挂号预约管理系统的后期推广运营提供了强力的技术支撑。