-
系统设计
-
系统架构设计
目前B/S体系的系统主要的数据访问方式是:通过浏览器页面用户可以进入系统,系统可以自动对用户向服务器发送的请求进行处理,处理请求是在系统后台中进行的,用户在浏览器页面上进行相应操作,就能够看到服务端传递的处理结果。大学生创新创业管理主要分为视图-模型-控制三层架构设计。在视图层中,主要是操作在服务器端向客户端反馈并显示的数据,在模型层中,主要处理相关的业务逻辑、数据整合等,最后的控制层它介于视图和模型之间,主要是调整两层之间的关系,最终落实数据的传递。
系统架构图如下图所示。
![](https://img-blog.csdnimg.cn/f9eb0b9cdb6c4bf5bdf3e6785c4b3d73.png)
图4-1系统架构图
-
-
系统功能结构
系统设计的目的是分析系统包括的所有功能结构,为开发人员设计开发和实现系统做好准备工作。经过前期的需求调查、分析和整理之后,确定的总体需求主要包括多个模块,分别是:首页、用户管理(管理员、注册用户)更多管理(项目分类、项目申报、经费管理、中期检查、结题申请、通知公告、问题反馈)。系统整体角色分为两个部分,一是用户、最后是管理员。权限分布也是很明显,用户是在除去浏览信息之外还具有查询和管理自己项目申报、经费管理、中期检查、结题申请、通知公告、问题反馈等权限;管理员是最高权限拥有者。
系统功能结构图如下图所示。
图4-2系统功能结构图
-
-
表单字段校验处理设计
1.出错信息类型
出错信息类型包括:
A 未输入必填项;
B 应输入合法字符或数字却输入非法字符或数字;
C 对空数据表进行更改或删除操作;
D 向要求唯一值的关键字段添加重复值。
2.出错处理对策
对于错误A,系统要求用户输入非空值。
对于错误B,系统要求用户输入合法字符。
对于错误C,系统提示数据表无记录可更改或删除。
对于错误D,系统要求用户输入非重复值。
-
-
系统维护设计
大学生创新创业管理是个现代化的高度集成的综合信息系统,系统主要服务对象为用户,最大化在页面中提供多的信息,因此在系统维护上,数据量较大,整体的维护设计如下:
(1)代码的维护:部署在云服务器上或本地服务器,通过SVN或FTP保持版本更新迭代。
(2)功能增加:功能升级在必要的前提下。
(3)数据维护:根据安全性等需求,定期对数据库进行人工备份。
-
-
数据库设计
-
概念模型
对于一个要开发的系统来说,E-R图可以让别人能更快更轻松的了解此系统的事务及它们之间的关系。根据系统分析阶段所得出的结论确定了在大学生创新创业管理中存在着多个实体分别是用用户、管理员、项目、申报。
系统总体ER图如下图所示。
![](https://img-blog.csdnimg.cn/595af0a8b8284afbaa5d94d6041cfb48.png)
图4-4系统总体ER图
-
-
-
数据表
数据库逻辑结构就是将E-R图在数据库中用具体的字段进行描述。用字段和数据类型描述来使对象特征实体化,最后形成具有一定逻辑关系的数据库表结构。大学生创新创业管理所需要的部分数据结构表如下表所示。
|
|
|
|
|
closing_application |
|
|
|
|
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
closing_application_id |
int |
11 |
否 |
主键 |
结题申请ID |
entry_name |
varchar |
64 |
是 |
|
项目名称 |
project_type |
varchar |
64 |
是 |
|
项目类型 |
team_leader |
varchar |
64 |
是 |
|
团队负责人 |
user_name |
int |
11 |
是 |
|
用户名 |
application_date |
varchar |
64 |
是 |
|
申请日期 |
closing_document |
varchar |
255 |
是 |
|
结题文档 |
project_results |
text |
0 |
是 |
|
项目成果 |
examine_state |
varchar |
16 |
否 |
|
审核状态 |
examine_reply |
varchar |
16 |
是 |
|
审核回复 |
recommend |
int |
11 |
否 |
|
智能推荐 |
create_time |
datetime |
0 |
否 |
|
创建时间 |
update_time |
timestamp |
0 |
否 |
|
更新时间 |
|
|
|
|
|
fund_management |
|
|
|
|
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
fund_management_id |
int |
11 |
否 |
主键 |
经费管理ID |
entry_name |
varchar |
64 |
是 |
|
项目名称 |
project_type |
varchar |
64 |
是 |
|
项目类型 |
team_leader |
varchar |
64 |
是 |
|
团队负责人 |
user_name |
int |
11 |
是 |
|
用户名 |
application_amount |
int |
11 |
是 |
|
申请金额 |
purpose_of_funds |
text |
0 |
是 |
|
经费用途 |
examine_state |
varchar |
16 |
否 |
|
审核状态 |
examine_reply |
varchar |
16 |
是 |
|
审核回复 |
recommend |
int |
11 |
否 |
|
智能推荐 |
create_time |
datetime |
0 |
否 |
|
创建时间 |
update_time |
timestamp |
0 |
否 |
|
更新时间 |
|
|
|
|
|
interim_inspection |
|
|
|
|
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
interim_inspection_id |
int |
11 |
否 |
主键 |
中期检查ID |
entry_name |
varchar |
64 |
是 |
|
项目名称 |
project_type |
varchar |
64 |
是 |
|
项目类型 |
team_leader |
varchar |
64 |
是 |
|
团队负责人 |
user_name |
int |
11 |
是 |
|
用户名 |
project_schedule |
varchar |
64 |
是 |
|
项目进度 |
situation_report |
varchar |
255 |
是 |
|
情况汇报 |
problems_encountered |
text |
0 |
是 |
|
遇到问题 |
solution |
text |
0 |
是 |
|
解决方案 |
recommend |
int |
11 |
否 |
|
智能推荐 |
create_time |
datetime |
0 |
否 |
|
创建时间 |
update_time |
timestamp |
0 |
否 |
|
更新时间 |
|
|
|
|
|
item_classification |
|
|
|
|
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
item_classification_id |
int |
11 |
否 |
主键 |
项目分类ID |
project_type |
varchar |
64 |
是 |
|
项目类型 |
recommend |
int |
11 |
否 |
|
智能推荐 |
create_time |
datetime |
0 |
否 |
|
创建时间 |
update_time |
timestamp |
0 |
否 |
|
更新时间 |
|
|
|
|
|
notice_announcement |
|
|
|
|
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
notice_announcement_id |
int |
11 |
否 |
主键 |
通知公告ID |
title |
varchar |
64 |
是 |
|
标题 |
relevant_attachments |
varchar |
255 |
是 |
|
相关附件 |
publisher |
varchar |
64 |
是 |
|
发布人 |
release_date |
date |
0 |
是 |
|
发布日期 |
content |
text |
0 |
是 |
|
内容 |
recommend |
int |
11 |
否 |
|
智能推荐 |
create_time |
datetime |
0 |
否 |
|
创建时间 |
update_time |
timestamp |
0 |
否 |
|
更新时间 |
|
|
|
|
|
problem_feedback |
|
|
|
|
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
problem_feedback_id |
int |
11 |
否 |
主键 |
问题反馈ID |
theme |
varchar |
64 |
是 |
|
主题 |
relevant_vouchers |
varchar |
255 |
是 |
|
相关凭证 |
user_name |
int |
11 |
是 |
|
用户名 |
content |
text |
0 |
是 |
|
内容 |
administrator_reply |
text |
0 |
是 |
|
管理员回复 |
recommend |
int |
11 |
否 |
|
智能推荐 |
create_time |
datetime |
0 |
否 |
|
创建时间 |
update_time |
timestamp |
0 |
否 |
|
更新时间 |
|
|
|
|
|
project_declaration |
|
|
|
|
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
project_declaration_id |
int |
11 |
否 |
主键 |
项目申报ID |
entry_name |
varchar |
64 |
是 |
|
项目名称 |
project_type |
varchar |
64 |
是 |
|
项目类型 |
budget |
varchar |
64 |
是 |
|
经费预算 |
team_leader |
varchar |
64 |
是 |
|
团队负责人 |
number_of_members |
int |
11 |
是 |
|
成员人数 |
relevant_attachments |
varchar |
255 |
是 |
|
相关附件 |
user_name |
int |
11 |
是 |
|
用户名 |
class_name |
varchar |
64 |
是 |
|
班级名称 |
instructor |
varchar |
64 |
是 |
|
指导教师 |
team_introduction |
text |
0 |
是 |
|
团队介绍 |
team_members |
text |
0 |
是 |
|
团队成员 |
project_basis |
text |
0 |
是 |
|
立项依据 |
research_contents_ |
text |
0 |
是 |
|
研究内容 |
research_basis |
text |
0 |
是 |
|
研究基础 |
condition_guarantee |
text |
0 |
是 |
|
条件保障 |
details |
longtext |
0 |
是 |
|
详情 |
examine_state |
varchar |
16 |
否 |
|
审核状态 |
examine_reply |
varchar |
16 |
是 |
|
审核回复 |
recommend |
int |
11 |
否 |
|
智能推荐 |
create_time |
datetime |
0 |
否 |
|
创建时间 |
update_time |
timestamp |
0 |
否 |
|
更新时间 |
|
|
|
|
|
registered_user |
|
|
|
|
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
registered_user_id |
int |
11 |
否 |
主键 |
注册用户ID |
user_name |
varchar |
64 |
否 |
|
用户名 |
category |
varchar |
64 |
是 |
|
类别 |
examine_state |
varchar |
16 |
否 |
|
审核状态 |
recommend |
int |
11 |
否 |
|
智能推荐 |
user_id |
int |
11 |
否 |
|
用户ID |
create_time |
datetime |
0 |
否 |
|
创建时间 |
update_time |
timestamp |
0 |
否 |
|
更新时间 |
-
系统实现
-
登录模块的实现
系统的登录窗口是用户的入口,用户只有在登录成功后才可以进入访问。通过在登录提交表单,后台处理判断是否为合法用户,进行页面跳转,进入系统中去。
登录合法性判断过程:用户输入账号和密码后,系统首先确定输入输入数据合法性,然后在login.jsp页面发送登录请求,调用src下的mainctrl类的dopost方法来验证。
用户登录模块的IPO如下所示:
输入:用户名和密码。
处理:
1)检测用户输入的账号、密码是否正确及在数据库已对应存在。
2)从数据库中提取记录,并储存在本地的session中(timeout默认=30min)。
3)根据用户名,将其显示在系统首页上。
输出:是否成功的信息。
登录流程图如下所示。
![](https://img-blog.csdnimg.cn/00927fed68ec4577baca13b04fbf52ae.png)
图5-1登录流程图
系统登录界面如下所示。
图5-2系统登录界面
用户登录的逻辑代码如下。
/**
* 登录
* @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 != 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, "账号或密码不正确");
}
}
-
-
用户子系统模块的实现
-
用户首页模块
系统呈现出一种简洁大方的首页:界面简约、鳞次栉比,用户能轻车熟路的使用。出于对系统使用群体广泛的顾虑,应有良好性能的后台。
如下图所示为系统的首页界面。
![](https://img-blog.csdnimg.cn/75fcc9ee8b60451f94c96e0e1489649c.png)
图5-3系统首页界面
其中载入前台页面的主要代码如下。
@RequestMapping(value = {"/sum_group", "/sum"})
public Map<String, Object> sum(HttpServletRequest request) {
Query count = service.sum(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
-
-
-
注册模块
此页面实现学生的注册,必须注册登录后才能使用系统大部分功能,用户名不允许重复如果重复将会注册失败,并弹出相应的提示,通过js实现对输入的验证。
用户注册流程图如下所示。
![](https://img-blog.csdnimg.cn/867902b03d9c428486e45c4a3e1df6ae.png)
图5-4用户注册流程图
用户注册界面如下图所示。
![](https://img-blog.csdnimg.cn/ce745a7cb9a04805a3cdcbe7d393027c.png)
图5-5用户注册界面
用户注册关键代码如下所示。
/**
* 注册
* @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,8388607]用户获取其他与用户相关的数据
*/
@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;
}
-
-
-
项目申报模块
项目申报过程中,首先使用getmap(id,"xinxi"),通过项目ID得到项目数据,将项目数据赋值给项目申报,调用CommDAO的insert方法将申报数据插入申报表中,最后查看个人历史项目申报记录,可以销毁历史申报数据。
项目申报流程图如下所示。
![](https://img-blog.csdnimg.cn/1148153ea8b443bebe6b7075ed71be6a.png)
图5-6项目申报流程图
项目申报界面如图所示。
![](https://img-blog.csdnimg.cn/d4fd91abfa6e4099a5cf6cf1bb279db5.png)
图5-7项目申报界面
申报管理界面如图所示。
![](https://img-blog.csdnimg.cn/80ab56b377ac44ada11923013b37a35b.png)
图5-8申报管理界面
项目申报关键代码如下所示。
@PostMapping("/upload")
public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {
log.info("进入方法");
if (file.isEmpty()) {
return error(30000, "没有选择文件");
}
try {
//判断有没路径,没有则创建
String filePath = System.getProperty("user.dir") + "\\target\\classes\\static\\upload\\";
File targetDir = new File(filePath);
if (!targetDir.exists() && !targetDir.isDirectory()) {
if (targetDir.mkdirs()) {
log.info("创建目录成功");
} else {
log.error("创建目录失败");
}
}
String fileName = file.getOriginalFilename();
File dest = new File(filePath + fileName);
log.info("文件路径:{}", dest.getPath());
log.info("文件名:{}", dest.getName());
file.transferTo(dest);
JSONObject jsonObject = new JSONObject();
jsonObject.put("url", "/api/upload/" + fileName);
return success(jsonObject);
} catch (IOException e) {
log.info("上传失败:{}", e.getMessage());
}
return error(30000, "上传失败");
}
-
-
管理员子系统模块的实现
-
用户管理模块
用户在yhzhgl查看用户信息,先使用sql语句查询出所有用户表的数据,然后调用PageManager.getPages(url,4,sql, request ),返回一个ArrayList的对象,在for循环里,使用jsp得到每个ArrayList对象的数据,在jsp页面中解析ArrayList对象,得到其各个键值对的值。
用户管理界面如下图所示。
![](https://img-blog.csdnimg.cn/2b0a067095be497d8308785121658112.png)
图5-9用户管理界面
系统用户管理关键代码如下所示。
@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();
}
-
-
-
个人资料管理模块
用户点击登录填写账号信息登录后,会切换内容为“某某用户欢迎您”和历史订单,并给出注销链接。当用户登录成功后会将个人信息保存在session作用域中,点击自己的用户名时,会跳转到个人详细信息页面,由后台通过Freemarker取出session作用域中的用户信息进行动态渲染,例如,邮箱、电话号码、用户名等等。同时页面上会显示修改个人信息和修改密码的按钮,这时客户可以修改自己的登录密码以保障账号的安全性,防止被人窃取账号,通过UserController.java的updatePassword()实现,同时也可以根据自己的个人信息是否变动做出相应的修改,通过updateUserInfo()实现。
密码修改流程图如下所示。
![](https://img-blog.csdnimg.cn/6ed137969253448099fe0c17086e383a.png)
图5-10密码修改流程图
密码修改关键代码如下所示。
/**
* 修改密码
* @param data
* @param request
* @return
*/
@PostMapping("change_password")
public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){
// 根据Token获取UserId
String token = request.getHeader("x-auth-token");
Integer userId = tokenGetUserId(token);
// 根据UserId和旧密码获取用户
Map<String, String> query = new HashMap<>();
String o_password = data.get("o_password");
query.put("user_id" ,String.valueOf(userId));
query.put("password" ,service.encryption(o_password));
Query ret = service.count(query, service.readConfig(request));
List list = ret.getResultList();
Object s = list.get(0);
int count = Integer.parseInt(list.get(0).toString());
if(count > 0){
// 修改密码
Map<String,Object> form = new HashMap<>();
form.put("password",service.encryption(data.get("password")));
service.update(query,service.readConfig(request),form);
return success(1);
}
return error(10000,"密码修改失败!");
}
-
-
-
项目申报模块
添加项目信息时,输入必填字段后,表现层的XiangmuController接受传过来的项目信息参数,再调用XiangmuController类的addXiangmu方法,经过XiangmuService业务层到XiangmuMapper持久层的处理,完成对整个添加项目信息的操作。addXiangmu方法也和用户管理中的addUser方法类似,同时做添加和修改工作。
修改项目信息时,选择需要修改的项目进行修改,调用XiangmuController控制器的editXiangmu方法,拿到该项目原本的信息并显示到页面,管理员再对需要修改的项目信息字段进行修改,完成后调用addXiangmu方法,调用业务层的updateByKey方法,更新数据库的项目信息表的数据。
项目申报流程图如下所示。
![](https://img-blog.csdnimg.cn/3d54e3a2fc1f49358c8e3c559d20c54c.png)
图5-11项目申报流程图
项目添加界面如下图所示。
![](https://img-blog.csdnimg.cn/a26a21860ab24279876437c2b31c953b.png)
图5-12项目添加界面
项目查询界面如下图所示。
![](https://img-blog.csdnimg.cn/af8ab02531bb483f9bf94010fb3a4852.png)
图5-13项目查询界面
项目信息添加关键代码如下所示。
Connection conn = this.getConn();
try {
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from "+tablename);
ResultSetMetaData rsmd = rs.getMetaData();
int i = rsmd.getColumnCount();
for(int j=1;j<=i;j++)
{
if(rsmd.getColumnName(j).equals("id"))continue;
if(rsmd.getColumnName(j).equals("ID"))continue;
if(rsmd.getColumnName(j).equals("iD"))continue;
if(rsmd.getColumnName(j).equals("Id"))continue;
typemap.put(rsmd.getColumnName(j)+"---", rsmd.getColumnTypeName(j));
collist.add(rsmd.getColumnName(j));
sql+=rsmd.getColumnName(j)+",";
}
sql = sql.substring(0,sql.length()-1);
sql+=") values(";
rs.close();
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
-
-
-
中期检查模块
删除检查时,选择需要删除的检查进行删除,把主键的uId传到ZhengceController控制器,再调用控制器的deleteZhengce方法,数据经过ZhengceService业务层解析和处理,请求ZhengceMapper持久层调用deleteByPrimaryKey方法操作数据库将检查数据从数据库中删除。
查找检查时,输入需要查找的检查名,调用getData方法获取所有数据并且进行分页,把获取到的所有数据显示到视图上,这时候只需要用脚本方法便能快速查找,不涉及对数据库操作。
中期检查流程图如下所示。
![](https://img-blog.csdnimg.cn/c142eb3cf79e49c9b7acf56489ef8634.png)
图5-14中期检查流程图
检查添加界面如下图所示。
![](https://img-blog.csdnimg.cn/efa1e73b87ca4de69f29420616cb50ef.png)
图5-15检查添加界面
检查查询界面如下图所示。
![](https://img-blog.csdnimg.cn/5ecc8f2ebcd549618e941ed83dc63769.png)
图5-16检查查询界面
检查信息添加关键代码如下所示。
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
Query select = service.select(service.readQuery(request), service.readConfig(request));
List resultList = select.getResultList();
if (resultList.size() > 0) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("obj",resultList.get(0));
return success(jsonObject);
} else {
return success(null);
}
}
public Query 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 runEntitySql(sql.toString());
}
-
系统测试
-
测试目的
在对该系统进行完详细设计和编码之后,就要对大学生创新创业管理的程序进行测试,检测程序是否运行无误,反复进行测试和修改,使之最后成为完整的软件,满足用户的需求,实现预期的功能。
-
-
测试过程
在软件的测试过程中,通常测试人员需要针对不同的功能模块设计多种测试用例。通过测试用例能够及时发现代码业务逻辑上是否与真实的业务逻辑相对应,及时发现代码上或逻辑上的缺陷,以此来来完善系统,提高软件产品的质量,使软件具有良好的用户体验。
注册测试用例表如下所示。
表6-1注册测试用例
测试性能 |
新用户注册 |
用例目的 |
测试系统新用户个人信息注册功能的功能和安全性 |
前提条件 |
进入注册页面填写个人信息 |
输入条件 |
预期输出 |
实际情况 |
各项基本信息输入不完整 |
不允许注册,无法点击注册按钮 |
一致 |
填写已存在的用户名 |
系统显示出提示信息,要求重新填写 |
一致 |
两次密码输入不一致 |
系统显示出提示信息,要求重新填写 |
一致 |
填写的各项信息没有符合提示的长度和字符要求 |
系统显示出提示信息,要求重新填写 |
一致 |
胡乱填写电话号码 |
收不到验证码 |
一致 |
填写验证码与收到的不一致 |
系统显示提示信息告知用户验证码错误,不予注册 |
一致 |
登录测试用例表如下所示。
表6-2登录测试用例
测试性能 |
用户或操作员登录系统 |
用例目的 |
测试用户或操作员登录系统时功能是否正常 |
前提条件 |
进入用户登录页面或操作员登录页面 |
输入条件 |
预期输出 |
实际情况 |
各项信息不予填写,直接点击登陆按钮 |
不允许登录,提示填写账号相关信息 |
一致 |
填写错误的登录名或密码后点击登录系统 |
提示用户名或密码错误,要求重新填写进行登录 |
一致 |
填写与验证码信息不一致的信息 |
系统显示出提示信息,表明验证码错误,要求重新填写 |
一致 |
项目申报测试用例表如下所示。
表6-3项目申报测试用例
测试性能 |
用户进行项目申报的操作 |
用例目的 |
测试用户进行项目申报操作时,该功能是否正常 |
前提条件 |
用户进入项目详情页,该项目能够被申报 |
输入条件 |
预期输出 |
实际情况 |
对着某项目点击“申报”按钮 |
界面跳转至申报界面 |
一致 |
在申报界面,输入必填项,点击“提交”按钮 |
提示“申报成功”,并返回上一级界面 |
一致 |
在申报界面,填写申报表单的时候未输入完整,点击“提交”按钮 |
提示“申报失败” |
一致 |
项目申报测试用例表如下所示。
表6-4项目申报测试用例
测试性能 |
项目相关信息管理功能 |
用例目的 |
测试系统操作者对项目相关信息进行管理的功能是否正常 |
前提条件 |
登录系统进入相关管理页面 |
输入条件 |
预期输出 |
实际情况 |
进入项目申报界面,点击“录入”按钮,填写所有必填项,点击提交 |
提示“录入成功”,并返回查询界面 |
一致 |
进入项目申报界面,点击“录入”按钮,未填写一个或者多个必填项,点击提交 |
提示“录入失败”,请填写必填项 |
一致 |
进入项目申报界面,选择要修改的一条数据,点击该条数据后面的“修改”按钮 |
节目跳转至修改界面 |
一致 |
在修改界面,修改可修改项后,点击“提交”按钮 |
提示“修改成功”,并返回查询界面 |
一致 |
进入项目申报界面,点击某条数据后面的删除按钮 |
提示“是否要删除该数据”,如果用户点击“确定”按钮,则成功删除该条数据,并提示“删除成功”,之后返回查询界面 |
一致 |
-
-
测试结果
经过对此系统的测试,得出该系统足以满足用户日常需求,在功能项目和操作等方面也能满足操作员对于其他用户的管理。但是,还有很多功能有待添加,这个系统仅能满足大部分的需求,还需要对此系统的功能更进一步的完善,这样使用起来才能更加的完美。
[1]徐佩.新时期计算机软件开发技术的应用及发展趋势[J].农家参谋,2019(08):167.
[2]张帅,崔婀娜,魏立波.互联网+健康在线服务平台的设计与实现[J].科技创新与应用,2019(10):91-92.
[3]谷利国,陈存田,张甲瑞.基于B/S模式的人事教育信息管理系统的分析与设计[J].电脑知识与技术,2019,15(10):58-59.
[4]胥新政,强毅.基于JSP的常用金属材料标准检索平台开发设计[J].制造业自动化,2019,41(03):41-43+69.
[5]王祖维,南淮耀,张英.“互联网+”视域下的高校学生公寓管理系统设计与实现——以沈阳师范大学为例[J].现代商贸工业,2019,40(08):187-188.
[6]廖明华,齐攀.学生职业能力测评管理系统的设计与实现[J].广东交通职业技术学院学报,2019,18(01):48-52.
[7]李冬冬,刘华明,毕学慧,王秀友.旧衣申领系统的设计与实现[J].电脑知识与技术,2019,15(08):47-50.
[8]李庆年.“互联网+”视域下的人才招聘管理系统设计与实现[J].国际公关,2019(03):164-165.
[9]刘婷,彭焕峰,邵淑婷.基于云平台的高校监考管理系统[J].电脑知识与技术,2019,15(07):91-92.
[10]赵丙秀.基于百度AI平台的Web人脸注册和登录系统的实现[J].电脑知识与技术,2019,15(07):114-115.
[11]戴昭颖,尹涛.钢铁行业成本预算系统开发应用实践[J].电子技术与软件工程,2019(04):29-30.
[12]曹灿,刘志刚.基于SSH和Layui的工程科学前沿与实践系统[J].工业控制计算机,2019,32(02):91-92+96.
[13]谢路.基于Web的考务管理系统设计与实现[J].福建电脑,2019,35(01):136-137.
[14]张继东.MySQL数据库基于JSP的访问技术[J/OL].电子技术与软件工程,2017,(15):169(2017-08-03).
[15]韩思凡.Web开发中的JSP与HTML的基础应用[J].科学技术创新,2020(14):71-72.
[16]NastitiAndini,DaehaKim,JongAhnChun.Operationalsoilmoisturemodelingusingamulti-stageapproachbasedonthegeneralizedcomplementaryprinciple[J].AgriculturalWaterManagement,2020,231.
[17]A.D.Titisari,D.Phillips,I.W.Warmada,Hartono,A.Idrus.40Ar/39ArgeochronologyofthePongkorlowsulfidationepithermalgoldmineralisation,WestJava,Indonesia[J].OreGeologyReviews,2020,119.
[18]FranciscoOrtin,OscarRodriguez-Prieto,NicolasPascual,MiguelGarcia.HeterogeneoustreestructureclassificationtolabelJavaprogrammersaccordingtotheirexpertiselevel[J].FutureGenerationComputerSystems,2020,105.
[19]SatyaKrismatama,IndahRiyantini,IwangGumilar,LantunParadhitaDewanti.SelectivityofFishingGearforScomberomorusguttatus(Bloch&Schneider,1801)CommoditiesinPangandaranFishingGround,WestJava[J].AsianJournalofFisheriesandAquaticResearch,2020.
[20]ZhongXiangfu,PlaAlbert,RaynerSimon.Jasmine:aJavapipelineforisomiRcharacterizationinmiRNA-Seqdata[J].Bioinformatics,2020,36(6).
伴随着设计的完成,大学生涯也随之即将结束。大学期间是我最珍惜的时光,大学时光中学会了很多,也成长了很多,这段时光中每一段回忆都刻在脑海中。感谢一起学习,一起成长同学们,和成长过程悉心教导的老师们,非常感激有你们的陪伴。
首先感谢我的指导老师,设计的完成离不开老师的一系列指导。在毕业设计的完成过程中,老师给出了很多中肯的建议,正是由于老师一丝不苟的工作态度,我的设计才能顺利的完成。