目 录
摘 要 IV
Abstract V
第1章 绪论 1
1.1 课题研究背景 1
1.2 课题研究现状 1
1.2.1 国内研究现状 1
1.2.2 国外研究现状 2
1.3 课题研究目的和意义 3
1.4 论文结构和章节安排 3
1.5 本章小结 3
第2章 需求分析 4
2.1 任务目标 4
2.2 业务需求分析 5
2.2.1 用户特点 5
2.2.2 适用范围 5
2.2.3 业务流程图 5
2.3 系统主要业务功能需求 6
2.3.1 个人中心功能 6
2.3.2 投诉写信功能 8
2.3.3 留言管理功能 9
2.3.4 用户管理功能 10
2.3.5 角色管理功能 10
2.3.6 类别管理功能 11
2.3.7 菜单管理功能 12
2.4 本章小结 12
第3章 系统总体设计 14
3.1 构架设计 14
3.1.1 系统构架 14
3.1.2 功能结构设计 14
3.2 功能设计 16
3.2.1 个人中心功能 16
3.2.2 投诉写信功能 17
3.2.3 留言管理功能 18
3.2.4 用户管理功能 19
3.2.5 角色管理功能 20
3.2.6 类别管理功能 22
3.2.7 菜单管理功能 23
3.3 数据库设计 24
3.3.1 数据库环境说明 24
3.3.2 概念结构设计 24
3.4 开发环境选择 26
3.5 本章小结 27
第4章 系统详细设计 28
4.1 系统数据库表设计 28
4.1.1 逻辑结构设计 28
4.1.2 表结构设计 28
4.2 主要功能模块详细设计 31
4.2.1 个人中心模块设计 31
4.2.2 投诉写信模块设计 32
4.2.3 留言管理模块设计 33
4.2.4 用户管理模块设计 35
4.2.5 角色管理模块设计 37
4.2.6 类别管理模块设计 39
4.2.7 菜单管理模块设计 41
4.3 本章小结 43
5.1 测试环境 44
5.1.1 软件配置 44
5.1.2 硬件设备 44
5.2 系统主要功能模块测试 44
5.2.1 个人中心功能测试 44
5.2.2 投诉写信功能测试 47
5.2.3 留言管理功能测试 48
5.2.4 用户管理功能测试 50
5.2.5 角色管理功能测试 52
5.2.6 类别管理功能测试 55
5.2.7 菜单管理功能测试 55
5.3 测试结论 57
5.4 本章小结 58
结 论 59
参考文献 60
致 谢 61
第2章 需求分析
2.1 任务目标
本系统主要是随着通信和互联网的高速发展,针对市民对于政府部门的12345市民热线进行改进,为市民们提供了一个可以更加方便的提出自己所有问题的平台,同时给政府部门提供了一个方便管理的平台进行解决问题。
本系统针对以上需求具有以下功能:
1.个人中心功能
个人中心功能主要是对市民的个人信息进行管理,用户可以在其中查看和更改自己的个人信息、头像等信息。
2.投诉写信功能
投诉写信功能主要是让已经登录的市民提交自己的诉求,写投诉信。还可以查询诉求的状态,并针对已完成的诉求进行满意度评价。
3.留言管理功能
留言管理功能主要是针对市民提出的诉求进行管理。对规范的信件进行审核后交由相关部门,再由相关部门完成诉求。
4.用户管理功能
用户管理功能可以管理已经注册的市民用户,对其个人信息进行修改、查询等操作,还能够禁止用户登录。
5.角色管理功能
角色管理功能可以管理所拥有的角色,例如部门、审批人员、用户等。
6.类别管理功能
类别管理功能可以管理信件的类型,对用户所写出的诉求和建议进行归类。例如普通信件、投诉信件、表扬信件等。
7.菜单管理功能
与菜单管理功能可以管理后台页面的菜单选项。可以对菜单进行排序、分类、修改等操作。还可以导入使用Vue写的新页面。
2.2 业务需求分析
2.2.1 用户特点
本系统用户有市民、超级管理员、部门、审批人员。
1.市民
市民可以通过登录进行提出诉求、更改个人信息和查看诉求状态。
2.超级管理员
超级管理员拥有所有的权限。
3.部门
部门可以对审批通过的诉求进行回复、完成操作。
4.审批人员
审批人员可以对市民提出的诉求进行审批,并分配给相应的部门。
2.2.2 适用范围
本系统主要是为了哈尔滨市人民政府做的,部署在政府本地服务器或者是云服务器上。市民可以通过访问相应的网站,去提出诉求。部门可以在同一平台上,对市民所提出的诉求进行解答、完成等。管理员也可以在平台上对非法的用户进行封禁。
package cn.bellsee.citizen.controller;
import cn.bellsee.citizen.core.AjaxResult;
import cn.bellsee.citizen.domain.database.Menu;
import cn.bellsee.citizen.domain.database.User;
import cn.bellsee.citizen.domain.in.ManagerUserEditFormat;
import cn.bellsee.citizen.domain.in.ManagerUserMultipleSelection;
import cn.bellsee.citizen.domain.in.ManagerUserSelectFormat;
import cn.bellsee.citizen.domain.out.ManagerMenu;
import cn.bellsee.citizen.domain.out.UserData;
import cn.bellsee.citizen.exception.TipsException;
import cn.bellsee.citizen.repository.RoleMenuRepository;
import cn.bellsee.citizen.repository.UserRepository;
import cn.bellsee.citizen.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
public class UserController {
Logger logger = LoggerFactory.getLogger(UserController.class);
@Autowired
UserService userService;
@Autowired
UserRepository userRepository;
@Autowired
RoleMenuRepository roleMenuRepository;
@GetMapping("/info/{id}")
public AjaxResult getUserInfo(@PathVariable String id, @RequestHeader("Token") String token) throws TipsException {
logger.info("getUserInfo,id:{},token:{}", id, token);
return AjaxResult.success(userService.getUserInfo(id));
}
// TODO : 前台不应该使用 User 接收对象,使用一个自定义的对象来接收
@PostMapping("/info/change")
public AjaxResult changeUserInfo(@RequestBody User user, @RequestHeader("Token") String token) throws IllegalAccessException, TipsException {
logger.info("changeUserInfo,user:{},token:{}", user, token);
System.out.println(user);
userService.changeUserInfo(user);
User nUser = userRepository.findById(user.getUserId()).orElse(null);
if (nUser.getUserId() != null) {
//获取 route
List<Menu> menus = new ArrayList<>();
roleMenuRepository.getRoleMenusByRoleId(nUser.getRole().getRoleId())
.forEach(roleMenu -> {
menus.add(roleMenu.getMenu());
});
return AjaxResult.success("修改成功!", new UserData(nUser, ManagerMenu.parseMenuList(menus)));
} else {
return AjaxResult.error("修改失败!");
}
}
/**
* 后台 进行用户管理 查找所有用户
*/
@PostMapping("/manager/userPage")
public AjaxResult getUserPage(@RequestBody ManagerUserSelectFormat managerUserSelectFormat, @RequestHeader("Token") String token) {
logger.info("getUserPage,managerUserSelectFormat:{},token:{}", managerUserSelectFormat, token);
return AjaxResult.success(userService.selectUsers(managerUserSelectFormat));
}
/**
* 后台 统计 Total
*/
@PostMapping("/manager/userCount")
public AjaxResult getUserCount(@RequestBody ManagerUserSelectFormat managerUserSelectFormat, @RequestHeader("Token") String token) {
logger.info("getUserCount,managerUserSelectFormat:{},token:{}", managerUserSelectFormat, token);
return AjaxResult.success(userService.getUserCount(managerUserSelectFormat));
}
/**
* 后台 改变User信息 OR 添加用户 ( 给定的 UserId -> isHidden = 0 )
*/
@PostMapping("/manager/userChange")
public AjaxResult changeUserInfoManager(@RequestBody ManagerUserEditFormat managerUserEditFormat, @RequestHeader("Token") String token) throws IllegalAccessException {
logger.info("changeUserInfoManager,managerUserEditFormat:{},token:{}", managerUserEditFormat, token);
return AjaxResult.success(userService.changeUserInfo(managerUserEditFormat.getUser()));
}
/**
* 后台 新增用户 创建临时 User
*/
@GetMapping("/manager/newUser")
public AjaxResult getNewUser(@RequestHeader("Token") String token) {
Integer userId = userService.getNewUserId();
logger.info("getNewUser,userId:{},token:{}", userId, token);
return AjaxResult.success(userId);
}
/**
* 后台 多选 禁用、启用、删除
*/
@PostMapping("/manager/userMultipleSelection")
public AjaxResult changeMultipleUserStatus(@RequestBody ManagerUserMultipleSelection managerUserMultipleSelection, @RequestHeader("Token") String token) throws TipsException {
// System.out.println(managerUserMultipleSelection);
logger.info("changeMultipleUserStatus,managerUserMultipleSelection:{},token:{}", managerUserMultipleSelection, token);
// userRepository
if (managerUserMultipleSelection.getStatus() == -1) {
userRepository.deleteUser(managerUserMultipleSelection.getUserIdList());
} else if (managerUserMultipleSelection.getStatus() == 0) {
userRepository.updateUserBan(0, managerUserMultipleSelection.getUserIdList());
} else if (managerUserMultipleSelection.getStatus() == 1) {
userRepository.updateUserBan(1, managerUserMultipleSelection.getUserIdList());
} else throw new TipsException();
return AjaxResult.success();
}
@GetMapping("/manager/department/all")
public AjaxResult getAllDepartment(@RequestHeader("Token") String token){
logger.info("getAllDepartment,token:{}", token);
return AjaxResult.success(userRepository.findByRoleId(10));
}
}