摘 要
21世纪时信息化的时代,几乎任何一个行业都离不开计算机,将计算机运用于社团管理也是十分常见的。过去使用手工的管理方式对社团进行管理,造成了管理繁琐、难以维护等问题,如今使用计算机对社团的各项基本信息进行管理,比起手工管理来说既方便又简单,而且具有易于管理、搜索速度快、存储量大等多个优点。将其使用在社团管理中,不仅能够提高社团管理中管理员的工作效率,而且可以使社团管理更加科学与规范。在信息化时代的不断冲击下,学生社团大数据监控与管理平台与计算机技术的结合,将会是一条提高学生社团大数据监控与管理平台水平的捷径。
经过本人的综合考虑,学生社团大数据监控与管理平台的设计是基于Java技术、Mysql数据库、Tomcat服务器的方式设计,以Myeclipse和IDEA为开发工具,在Myeclipse集成环境下调试并允许,并运用SSM技术美化网页,辅之以CSS技术。
该系统实现了学生社团大数据监控与管理平台内部的各种工作流程计算机管理化,其中包括管理员的社团信息、加入申请、社团成员、社团留言等功能。
关键词:社团管理;Java技术;Mysql数据库;
图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-4用户注册流程
用户注册界面如下图所示。
图5-5用户注册界面
用户注册代码如下:
/**
* 注册
* @return
*/
@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);
}
-
- 社团信息模块的实现
用户执行社团信息,并可以操作相关内容,例如查看,编辑。申请加入的添加操作是建立在社团信息的列表基础上,单击查看社团信息下的申请加入链接;然后单击“申请加入”进行添加,添加成功后的信息会载入到社团信息查询列表中。
社团信息流程如下图所示。
图5-6社团信息流程
社团信息界面如下图所示。
图5-7社团信息界面
-
- 密码修改模块的实现
用户使用该学生社团大数据监控与管理平台注册完成后,用户对登录密码有修改需求时,系统也可以提供用户修改密码权限。系统中所有的操作者能够变更自己的密码信息,执行该功能首先必须要登入系统,然后选择密码变更选项以后在给定的文本框中填写初始密码和新密码来完成修改密码的操作。在填写的时候,假如两次密码填写存在差异,那么此次密码变更操作失败,下面的图片展示的就是该板块对应的工作面。
密码修改流程图如下所示。
图5-8 密码修改流程图
密码修改界面如图所示。
图5-9密码修改界面
- 管理员模块的实现
- 用户管理模块的实现
用户通过注册了方可获得登录使用权限,此时选择注册用户选项,系统就会自动转到用户注册工作面,在注册该部分信息时系统会自动调用add函数,然后在给定的文本框中填写有关该用户的基础信息后选择确认即可完成注册。检索用户信息,在新增用户信息以后,在检索工具栏中填写对应的用户信息,系统就会将该用户有关的所有信息展示出来。
用户管理流程图如下所示。
图5-11 用户管理流程图
用户管理界面如下图所示。
图5-12用户管理界面
-
- 公告管理模块的实现
在主页左侧菜单栏中点击“公告管理”按钮,再从二级目录中点击“新增公告”按钮,进入到新增公告界面。在此处公告可以添加公告的标题方式。
在主页左侧菜单栏中点击“公告管理”按钮,再从二级目录中点击“查询公告”按钮,进入到查询公告界面。在此处公告可以查询当前所有公告记录。
公告展示界面如下图所示。
图5-13公告展示界面
图5-14公告管理界面
公告管理逻辑代码如下:
@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);
}
-
- 社团信息管理模块的实现
管理员执行社团信息管理,并可以操作相关内容,例如添加,查看,编辑和删除。通过单击“添加社团信息”,可以通过社团信息添加界面添加详细信息并添加社团信息注释。单击查看字段级别链接以查看有关所选字段级别的信息。然后单击“提交”跳转重返到添加页面。添加成功后的信息会载入到社团信息查询列表中,管理员可进行编辑以及修改。
社团信息管理流程如下图所示。
图5-15 社团信息管理流程
社团信息管理界面如下图所示。
图5-16社团管理界面
-
- 加入申请管理模块的实现
管理员执行加入申请管理,并可以操作相关内容,例如添加,查看,编辑和删除。通过单击“添加加入申请”,可以通过加入申请添加界面添加详细信息并添加加入申请注释。单击查看字段级别链接以查看有关所选字段级别的信息。然后单击“提交”跳转重返到添加页面。添加成功后的信息会载入到加入申请查询列表中,管理员可进行编辑以及修改。
加入申请管理流程如下图所示。
图5-17 加入申请管理流程
加入申请管理界面如下图所示。
图5-18加入申请界面
加入申请管理逻辑代码如下所示。
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
-
- 社团留言管理模块的实现
管理员执行社团留言管理,并可以操作相关内容,例如添加,查看,编辑和删除。通过单击“添加社团留言”,可以通过社团留言添加界面添加详细信息。单击查看字段级别链接以查看有关所选字段级别的信息。然后单击“提交”跳转重返到添加页面。添加成功后的信息会载入到社团留言查询列表中,管理员可进行编辑以及修改。
社团留言添加流程图如下所示。
图5-19 社团留言添加流程图
社团留言管理如下图所示。
图5-20社团留言管理界面
社团留言管理逻辑代码如下所示。
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
- 系统测试
- 测试环境
1、服务器端
操作系统:Windows 7
Web服务器:Tomcat7.0
数据库:Mysql
开发语言:Java
2、客户端
浏览器:Internet Explorer10
界面布局:DIV+CSS
分辨率:最佳效果1027*768以上像素
3、开发工具
Visual Studio Code
Myeclipse
- 测试目标
系统测试是用于检查软件的质量、性能、可靠性等是否符合用户需求。一套严谨的、规范的、完善的测试过程将大大提高软件的质量、可信度、可靠性,降低软件的出错率,降低用户风险系数。通过在计算机上对系统进行测试试验并从中发现此系统中存在的问题和错误然后加以修改,使之更加符合用户需求。
1.测试的目的是通过测试来发现程序在执行过程中的错误的过程。
2.好的测试方案是可以检验出还未被发现的错误的方案。
3.好的测试是发现了到目前为止还未被发现的错误的测试。
4.该系统能够完成社团活动/经费申请、社团维护、活动/经费申请维护、用户维护、系统维护等功能,做到所开发的系统操作简单,尽量使系统操作不受用户对电脑知识水平的限制。
- 功能测试
下表是社团信息管理功能的测试用例,检测了社团信息管理中对社团信息的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表6-1 社团信息管理的测试用例
功能描述 | 用于社团信息管理 | |
测试目的 | 检测社团信息管理时的各种操作的运行情况 | |
测试数据以及操作 | 预期结果 | 实际结果 |
点击添加社团信息,必填项合法输入,点击保存 | 提示添加成功 | 与预期结果一致 |
点击添加社团信息,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改社团信息,必填项修改为空,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改社团信息,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击删除社团信息,选择社团信息删除 | 提示删除成功 | 与预期结果一致 |
点击搜索社团信息,输入存在的社团信息名 | 查找出社团信息 | 与预期结果一致 |
点击搜索社团信息,输入不存在的社团信息名 | 不显示社团信息 | 与预期结果一致 |
下表是社团留言管理功能的测试用例,检测了社团留言管理中社团留言单的操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表6-2 社团留言管理的测试用例
功能描述 | 用于社团留言管理 | |
测试目的 | 检测社团留言管理时各种操作的情况 | |
测试数据以及操作 | 预期结果 | 实际结果 |
未选择留言,点击提交 | 提示请选择留言 | 与预期结果一致 |
未上传附件,点击提交 | 提示请选择附件 | 与预期结果一致 |
未选择原因,点击提交 | 提示请选择原因 | 与预期结果一致 |
- 测试结果
根据以上测试情况,测试结果如下表所示。
表6-1测试结果表
测试项目 | 测试结果 |
登录测试 | 成功 |
修改密码测试 | 成功 |
加入申请测试 | 成功 |
社团留言测试 | 成功 |
社团信息管理测试 | 成功 |
加入申请测试 | 成功 |
用户管理测试 | 成功 |
社团成员管理测试 | 成功 |
- 总结与展望
本研究针对学生社团大数据监控与管理平台地需求建模,数据建模及过程建模分析设计并实现学生社团大数据监控与管理平台的过程。给出系统应用架构并分析优劣势,通过功能分解图,系统组件图描述功能需求。设计建立了数据库,给出系统关键数据结构的定义。通过类关系图描述组件间的协作关系,给出各个类的定义方法。通过描述每一个类的字段,属性及方法实现学生社团大数据监控与管理平台的前后端代码。最终给出系统集成整合方法,完成学生社团大数据监控与管理平台地设计与实现。
在此项目的开发中,先要按照产品经理做出的产品模型铺出大体的页面,并在其中找好页面的逻辑关系,并且中途总结一些页面上的问题重新反馈给产品经理,当静态页面的搭建的大体已经完善时,就需要和负责后台开发的技术开发者联系,来接好前后台的数据接口,可以让后台的信息在前台显示出来,在这个项目实现中,不光明白了前端开发和产品经理的联系,也明白了后台在整个系统中起到了什么作用,因为前后台的连接,用户可以对系统进行操作,可以在输入自己的相关信息后,通过后台加工,完成对数据库的查找、修改、添加,而理解了这些关系与实现的方法后。再去完善整个系统的功能就更加清晰与简单了。此次的项目它涉及了前台与后台系统的搭建,在学校所学的知识基础上,此次的项目,让我对于一个系统的前端开发,以及后台的作用都有了一个更深切的认知。
源码获取