从web系统查询数据的根本的查询步骤:
Step1: 进行检查并且过滤来自用户的系统数据;
Step2: 成立起一个合适的数据库进行连接;
Step3: 进行查询系统数据库;
Step4: 获得查询的结构;
Step5: 把查询的结果展示给用户。
Step6: 数据库连接断开,释放资源。
数据库连接原理如下图所示。
图5-1数据库连接原理
为确保系统安全性,系统操作员只有在登录界面输入正确的用户名、密码、权限以及验证码,单击“登录”按钮后才能够进入本系统的主界面。
用户登录流程图如下所示。
图5-2用户登录流程图
登录界面如下图所示。
图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;
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;
}
用户输入用户名、密码、电话、姓名等必填信息后,点击注册按钮完成用户的注册。
用户注册流程图如下所示。
图5-5用户注册流程图
用户注册界面如下图所示。
图5-5用户注册界面
用户注册关键代码如下所示。
HashMap ext = new HashMap();
ext.put("issh","否");
new CommDAO().insert(request,response,"yonghuzhuce",ext,true,false,"index.jsp");
%>
-
-
- 文化资讯模块的实现
-
用户点击某个资讯进入资讯详细页,点击搜索按钮进入资讯页,提交搜索信息后,管理员管理用户的搜索信息。
文化资讯流程图如下所示。
图5-12文化资讯流程图
文化资讯界面如图所示。
图5-13文化资讯界面
文化资讯关键代码如下所示。
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
系统用户管理主要是对新用户的添加和旧用户的删除。新用户的添加主要是指添加用户名称并确定其密码;旧用户的删除也是从下拉菜单中找到对应的用户名称将其删除。不论是新用户添加还是旧用户的删除,这个权限只有管理员具有。
用户管理流程图如下所示。
图5-15用户管理流程图
用户管理界面如下图所示。
图5-16用户管理界面
系统用户管理关键代码如下所示。
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);
}
}
-
-
- 视频中心管理模块的实现
-
如果视频中心数据的信息需要修改,管理员可以通过查询视频中心数据的基本信息来查询视频中心数据,查询视频中心数据是通过ajax技术来进行查询的,需要传递视频中心数据的标题、编号等参数然后在返回到该页面中,可以选中要修改或删除的那条信息,如果选中了超过一条数据,页面会挑一个窗口提醒只能选择一条数,如果没有选中数据会挑一个窗口题型必须选择一条数据。当选择确认修改的时候,后台会根据传过来的id到数据库查询,并将结果返回到修改页面中,可以在修改页面中修改刚刚选中的信息当点击确认的时候from表单会将修改的数据提交到后台并保存到数据库中,就是说如果提交的数据数据库中存在就修改,否则就保存。
视频中心数据添加展示界面如下图所示。
图5-6视频中心数据添加展示界面
视频中心数据管理界面如下图所示。
图5-7视频中心数据管理界面
视频中心数据发布的关键代码如下:
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
-
-
- 特色分类管理模块的实现
-
特色分类添加功能主要指对其编号、内容、详情等一些基本信息的添加、删除和修改。分类查询能根据特色分类名称、分类简介、编号等多种条件对特色分类进行查询。
特色分类流程图如下所示。
图5-19特色分类流程图
特色分类如下图所示。
图5-20特色分类界面
特色分类添加关键代码如下所示。
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
this.addMap(paramMap);
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
-
-
- 壮族特色管理模块的实现
-
用户选择壮族特色查询,(广西壮族美食文化、建筑文化、壮族特色产品、等详细信息,管理员发布特色信息,有关的建筑、美食、文化、特产等。
壮族特色管理流程图如下所示。
图5-25壮族特色管理流程图
壮族特色管理界面如下所示。
图5-27壮族特色管理界面
壮族特色管理关键代码如下所示。
public Map<String, Object> success(Object o) {
Map<String, Object> map = new HashMap<>();
if (o == null) {
map.put("result", null);
return map;
}
if (o instanceof List) {
if (((List) o).size() == 1) {
o = ((List) o).get(0);
map.put("result", o);
}else {
String jsonString = JSONObject.toJSONString(o);
JSONArray objects service.covertArray(JSONObject.parseArray(jsonString));
map.put("result", objects);
}
} else if (o instanceof Integer || o instanceof String) {
map.put("result", o);
} else {
String jsonString = JSONObject.toJSONString(o);
JSONObject jsonObject = JSONObject.parseObject(jsonString);
JSONObject j = service.covertObject(jsonObject);
map.put("result", j);
}
return map;
}
系统测试是用于检查软件的质量、性能、可靠性等是否符合用户需求。一套严谨的、规范的、完善的测试过程将大大提高软件的质量、可信度、可靠性,降低软件的出错率,降低用户风险系数。通过在计算机上对系统进行测试试验并从中发现此系统中存在的问题和错误然后加以修改,使之更加符合用户需求。
1.测试的目的是通过测试来发现程序在执行过程中的错误的过程。
2.好的测试方案是可以检验出还未被发现的错误的方案。
3.好的测试是发现了到目前为止还未被发现的错误的测试。
4.该系统能够完成个人订单、景点维护、景点攻略维护、用户维护、系统维护等功能,做到所开发的系统操作简单,尽量使系统操作不受用户对电脑知识水平的限制。
下表是系统登录功能测试用例,检测了用户名和密码的不同的输入情况,观察系统的响应情况。得出该功能达到了设计目标。
表6-1 系统登录功能测试用例
功能描述 | 用于系统登录 | |
测试目的 | 检测登录时的合法性检查 | |
测试数据以及操作 | 预期结果 | 实际结果 |
输入的用户名和密码带有非法字符 | 提示用户名或者密码错误 | 与预期结果一致 |
输入的用户名或者密码为空 | 提示用户名或者密码错误 | 与预期结果一致 |
输入的用户名和密码不存在 | 提示用户名或者密码错误 | 与预期结果一致 |
输入正确的用户名和密码 | 登录成功 | 与预期结果一致 |
下表是注册功能测试用例,检测了各种数据的输入情况,观察系统的响应情况。得出该功能达到了设计目标。
表6-2 注册功能测试用例
功能描述 | 用于用户注册 | |
测试目的 | 检测用户注册时的合法性检查 | |
测试数据以及操作 | 预期结果 | 实际结果 |
输入的手机号不合法 | 提示请输入正确的手机号码 | 与预期结果一致 |
输入的字段为空 | 提示必填项不能为空 | 与预期结果一致 |
输入的密码少于6位 | 提示密码必须为6-12位 | 与预期结果一致 |
输入的密码大于12位 | 提示密码必须为6-12位 | 与预期结果一致 |
下表是视频管理功能的测试用例,检测了视频管理中对视频信息的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表6-3 视频管理的测试用例
功能描述 | 用于视频管理 | |
测试目的 | 检测视频管理时的各种操作的运行情况 | |
测试数据以及操作 | 预期结果 | 实际结果 |
点击添加视频,必填项合法输入,点击保存 | 提示添加成功 | 与预期结果一致 |
点击添加视频,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改视频,必填项修改为空,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改视频,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击删除视频,选择视频删除 | 提示删除成功 | 与预期结果一致 |
点击搜索视频,输入存在的视频名 | 查找出视频 | 与预期结果一致 |
点击搜索视频,输入不存在的视频名 | 不显示视频 | 与预期结果一致 |
下表是特色分类管理功能的测试用例,检测了特色分类管理中对特色分类信息的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表6-4 特色分类管理的测试用例
功能描述 | 用于特色分类管理 | |
测试目的 | 检测特色分类管理时的各种操作的运行情况 | |
测试数据以及操作 | 预期结果 | 实际结果 |
点击添加特色分类,必填项合法输入,点击保存 | 提示添加成功 | 与预期结果一致 |
点击添加特色分类,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改特色分类,必填项修改为空,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改特色分类,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击删除特色分类,选择特色分类删除 | 提示删除成功 | 与预期结果一致 |
点击搜索特色分类,输入存在的特色分类名 | 查找出特色分类 | 与预期结果一致 |
点击搜索特色分类,输入不存在的特色分类名 | 不显示特色分类 | 与预期结果一致 |
下表是壮族特色功能的测试用例,检测了壮族特色中购票单的操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表6-5 壮族特色的测试用例
功能描述 | 用于壮族特色 | |
测试目的 | 检测壮族特色时各种操作的情况 | |
测试数据以及操作 | 预期结果 | 实际结果 |
未选择壮族特色,点击提交 | 提示请选择壮族特色 | 与预期结果一致 |
未上传购买数量,点击提交 | 提示请选择购买数量 | 与预期结果一致 |
未选择时间,点击提交 | 提示请选择时间 | 与预期结果一致 |
根据以上测试情况,测试结果如下表所示。
表6-1测试结果表
测试项目 | 测试结果 |
登录测试 | 成功 |
修改密码测试 | 成功 |
视频管理测试 | 成功 |
特色分类管理测试 | 成功 |
壮族特色测试 | 成功 |
文化资讯管理测试 | 成功 |
个人中心测试 | 成功 |