作者主页:编程指南针
作者简介:Java领域优质创作者、多年架构师设计经验、腾讯课堂常驻讲师
主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助
项目编号:BS-XX-193
前言:
随着计算机技术和网络技术的快速发展,信息化建设已经成为影响我国社会各行各业发展的重要因素,特别是电子政务系统的运用,受到了我国很多政府部门的亲睐,也给他们政务工作带来了显著的效果。加上我国医疗制度不断的改革与发展,在医院业务流程上也提出实现信息化,同时,民政部门救助工作也应该积极响应国家信息化建设的号召,把手工的业务流程转化为信息化流程,使整个业务流程更加高效和规范。而我国民政救助工作不是独立的一项工作,运作过程中涉及贫困人口管理、工作内容管理、资金管理、扶贫帮对管理、追踪记录等众多的模块,这样民政部门要实现民政救助业务的信息化就变的非常困难,民政救助系统建设一个信息管理系统,目前国家还没有建设一款比较成熟和完善的系统,还需要更多的学者进行深入的研究。本文就是在这种背景下对民政救助系统的开发展开探讨,通过结合民政救助需求实际情况,对民政救助系统设计进行了研究与系统的开发工作。在民政救助系统设计方面,为了更方便于软件开发与维护,采用B/S三层结构。在设计过程中,把民政救助系统分为了贫困人口管理模块、工作内容管理模块、资金管理模块、扶贫帮对管理模块、追踪记录功能模块等五个部分,希望可以实现民政救助内部人员的网上办公。这个系统的实施运行可以提高民政救助部门的内部办公的效率,规范办公流程,为民政部门的信息化发展起到积极的作用。
一,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
二,项目简介
民政救助系统提供了贫困人口管理、工作内容管理、资金管理、扶贫帮对管理、追踪记录等功能。主要进行贫困人口管理:对贫困人口进行注册、申请、审批等操作 2.工作内容管理:申请管理扶贫补助、管理扶贫项目 3.资金管理:记录系统金额的使用情况,近路当前资金总量,资金使用过多余额较少时给出提醒。 4.扶贫帮对管理:扶贫对象信息管理,扶贫主体信息管理,结对管理 5.追踪记录:帮扶记录、帮扶措施、帮扶计划、帮扶成效。
本系统初步分为七个模块主要是贫困人口管理,工作内容管理,资金管理,扶贫帮对管理,追踪记录,救济金管理,建档立卡等七个主要的模块。
(1)贫困人口管理模块:这个模块主要包括贫困人口注册,贫困人口
申请,贫困人口审批等功能。
(2)工作内容管理模块:这个模块主要包括申请管理扶贫补助,管理扶贫项目。
(3)资金管理模块:这个模块主要包括记录系统金额的使用情况,近路当前资金总量,资金使用过多余额较少时给出提醒。
(4)扶贫帮对管理模块:这个模块主要包括扶贫对象信息管理,扶贫主体信息管理,结对管理。
(5)追踪记录模块:这个模块主要包括帮扶记录、帮扶措施、帮扶计划、帮扶成效。
民政救助系统提供了贫困人口管理、工作内容管理、资金管理、扶贫帮对管理、追踪记录等功能。主要进行贫困人口管理:对贫困人口进行注册、申请、审批等操作 2.工作内容管理:申请管理扶贫补助、管理扶贫项目 3.资金管理:记录系统金额的使用情况,近路当前资金总量,资金使用过多余额较少时给出提醒。 4.扶贫帮对管理:扶贫对象信息管理,扶贫主体信息管理,结对管理 5.追踪记录:帮扶记录、帮扶措施、帮扶计划、帮扶成效。功能模块图如图2-1所示:
图2-1系统功能模块图
普通游客可以进行注册,登录,贫困人口申请,贫困人口注册用户功能用例如图2-2用户功能用例图
图2-2用户功能用例图
管理员通过系统内置的账户登录,管理员账户除了能使用普通用户的所有功能之外,还能进入后台管理页面对用户进行贫困人口注册,贫困人口申请,贫困人口审批,贫困人口注册,管理扶贫项目,记录资金,扶贫帮对管理等如图2-3
管理员用例图
图2-3管理员用例图
三,系统展示
3.1注册和登录
前端登录与注册页面由login.vue和register.vue实现用户信息由userInfo.vue实现。用户首先需要输入用户名和邮箱,之后点击发送验证码,前端会将用户名和邮箱通过/api/sendCode提交到后端。后端接受到数据之后,首先会验证邮箱是否符合格式,邮箱是否已经被注册,如果条件成立,则返回相关提示信息。否则将生成验证码,通过邮件发送至用户邮箱,同时将邮箱和验证码存储于session中。之后用户需要将其他信息填写完毕,并且输入验证码,点击注册,前端会通过/api/register接口将数据提交到后端。后端收到数据后,首先会通过提交信息的邮箱从session中读取之前存储的验证码并进行对比,如果不一致,则返回验证码无效提示信息,否则继续业务。之后会验证邮箱是否符合规范,以及是否被注册,如果验证通过,则后端调用服务层类userService的register方法添加用户,register方法首先会将用户的密码进行MD5加密,填充注册时间,用户状态等信息,然后通过持久层类userMapper的方法将用户信息提交至数据库。提交成功之将创建用户的文件仓库,通过调用fileStoreService的 createFileStore方法创建对应用户的文件仓库并提交到数据库。界面实现效果如图5-1所示。
完成注册之后用户就可以登录了。输入用户名和密码之后点击登录,前端会将携带用户名与密码通过/api/login接口提交至后端,后端调用服务层类userService的login方法来处理数据。首先会将用户的明文密码使用MD5加密,之后通过持久层类userMapper的方法去数据库中查询是否存在对应用户名的用户,然后对比密码是否正确,并返回相应结果至控制层。如果账户密码正确,则将查询到的用户数据存储于session中,并且生成token提交至数据库中。之后将提示信息与token返回至前端,前端会将token存储于cookie中,以保持登录状态。界面实现效果如图5-2所示。
用户完成登录之后,将跳转至网盘界面,同时通过/api/getTokenVerity接口验证token是否有效,然后通过/api/getLoggedUser接口向后端的session中获取当前登录用户信息,并存储于cookie中。
3.2贫困人口管理
3.3申请管理扶贫补助
3.4管理扶贫项目
3.5资金管理
3.6扶贫帮对管理模块
5.7追踪记录模块
四,核心代码展示
package cn.poverty.api.controller;
import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
import cn.poverty.interaction.req.item.apply.ReliefItemApplyAddReq;
import cn.poverty.interaction.req.item.apply.ReliefItemApplyPageReq;
import cn.poverty.interaction.req.item.apply.ReliefItemApplyReq;
import cn.poverty.interaction.req.item.apply.ReliefItemApplyUpdateReq;
import cn.poverty.interaction.resp.base.ApiResponse;
import cn.poverty.interaction.resp.item.apply.ReliefItemApplyResp;
import cn.poverty.interaction.resp.page.Pagination;
import cn.poverty.service.ReliefItemApplyService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.Arrays;
/**
* @author
* @packageName cn.poverty.api.controller
* @Description: 前端控制器
* @date
*/
@RestController
@RequestMapping(value = "api/v1/reliefItemApply")
@Slf4j
public class ReliefItemApplyController extends BaseApiController {
@Resource
private ReliefItemApplyService reliefItemApplyService;
@Resource
private HttpServletResponse response;
@Resource
private IExcelDictHandler excelDictHandler;
/**
* 申请扶贫项目
* @author
* @date
* @param addReq 申请扶贫项目请求参数
*/
@PostMapping(value = "/applyItem")
@RequiresPermissions("reliefItemApply:add")
public ApiResponse applyItem(@RequestBody @Valid ReliefItemApplyReq addReq){
reliefItemApplyService.applyItem(addReq);
return apiResponse();
}
/**
* 新增
* @author
* @date
* @param addReq 新增Req
*/
@PostMapping(value = "/addItem")
@RequiresPermissions("reliefItemApply:add")
public ApiResponse addItem(@RequestBody @Valid ReliefItemApplyAddReq addReq){
reliefItemApplyService.addItem(addReq);
return apiResponse();
}
/**
* 主键ID集合批量
*
* @date
* @param mainIdList 主键ID集合
*/
@DeleteMapping(value = "/batchDeleteItem/{mainIdList}")
@RequiresPermissions("reliefItemApply:batchDelete")
public ApiResponse batchDeleteItem(@PathVariable(name = "mainIdList") String mainIdList){
reliefItemApplyService.batchDeleteItem(Arrays.asList(mainIdList.split(",")));
return apiResponse();
}
/**
* 分页查询
*
* @date
* @param pageReq 分页查询Req
* @return Pagination
*/
@PostMapping(value = "/queryByPage")
@RequiresPermissions("reliefItemApply:itemList")
public ApiResponse<Pagination<ReliefItemApplyResp>> queryByPage(
@RequestBody @Valid ReliefItemApplyPageReq pageReq){
return apiResponse(reliefItemApplyService.queryByPage(pageReq));
}
/**
* 更新
*
* @date
* @param updateReq 更新请求参数
*/
@PutMapping(value = "/updateItem")
@RequiresPermissions("reliefItemApply:edit")
public ApiResponse updateItem(@RequestBody @Valid ReliefItemApplyUpdateReq updateReq){
reliefItemApplyService.updateItem(updateReq);
return apiResponse();
}
}
package cn.poverty.api.controller;
import cn.poverty.common.utils.alibaba.AliOssService;
import cn.poverty.interaction.req.common.MultipleFileAccessUrlReq;
import cn.poverty.interaction.resp.base.ApiResponse;
import cn.poverty.interaction.resp.upload.AppFileUrlResp;
import cn.poverty.interaction.resp.upload.MultipartFileUrlResp;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.List;
/**
* @author
* @projectName poverty-help-api
* @Description: 系统文件相关前端控制器
* @date
*/
@RestController
@RequestMapping("api/systemFile")
public class SystemFileController extends BaseApiController {
@Resource
private AliOssService aliOssService;
/**
* 拿到文件直接访问路径
*
* @date
* @param fileNames
* @return ApiResponse
*/
@GetMapping("/appFileAccessUrl")
@RequiresPermissions("file:accessUrl")
public ApiResponse<List<AppFileUrlResp>> appFileAccessUrl(@RequestParam(name = "fileNames") String fileNames){
return apiResponse(aliOssService.getObjectAccessUrlList(Arrays.asList(fileNames.split(","))));
}
/**
* 拿到单个文件名称的地址
* @author
* @date
* @param fileName 文件名称
* @return String
*/
@GetMapping("/singleFileAccessUrl")
public ApiResponse<String> singleFileAccessUrl(@RequestParam(name = "fileName")String fileName){
return apiResponse(aliOssService.getObjectAccessUrl(fileName));
}
/**
* 拿到多个文件名称的地址
* @author
* @date
* @param multipleFileAccessUrlReq 文件名称集合
* @return String
*/
@PostMapping("/multipleFileAccessUrl")
public ApiResponse<List<String>> multipleFileAccessUrl(@RequestBody @Valid MultipleFileAccessUrlReq multipleFileAccessUrlReq){
return apiResponse(aliOssService.getObjectAccessUrlList(multipleFileAccessUrlReq.getFileNameList()));
}
/**
* 拿到多个文件名称的地址
* @author
* @date
* @param multipleFileAccessUrlReq 文件名称集合
* @return List
*/
@PostMapping("/queryMultipleFileAccessUrl")
public ApiResponse<List<MultipartFileUrlResp>> queryMultipleFileAccessUrl(@RequestBody @Valid MultipleFileAccessUrlReq multipleFileAccessUrlReq){
return apiResponse(aliOssService.getObjectAccessUrlList(multipleFileAccessUrlReq.getFileNameList()));
}
/**
* 删除OSS的文件
* @author
* @date
* @param name 删除OSS的文件
*/
@DeleteMapping("/deleteFileByFileName")
public ApiResponse deleteFileByFileName(@RequestParam(name = "name") String name){
aliOssService.deleteObject(name);
return apiResponse();
}
/**
* 上传文件
*
* @date
* @param file
* @return String
*/
@PostMapping(value = "/uploadFile")
public ApiResponse<String> uploadFile(@RequestParam(name = "file") MultipartFile file){
return apiResponse(aliOssService.multipartFileToOss(file,false));
}
/**
* 上传文件
*
* @date
* @param file
* @return String
*/
@PostMapping(value = "/uploadFileMixed")
public ApiResponse<String> uploadFileMixed(@RequestParam(name = "file") MultipartFile file){
return apiResponse(aliOssService.mixFileToOss(file,true));
}
}
package cn.poverty.api.controller;
import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
import cn.poverty.interaction.req.item.ReliefItemAddReq;
import cn.poverty.interaction.req.item.ReliefItemPageReq;
import cn.poverty.interaction.req.item.ReliefItemUpdateReq;
import cn.poverty.interaction.resp.base.ApiResponse;
import cn.poverty.interaction.resp.item.ReliefItemResp;
import cn.poverty.interaction.resp.page.Pagination;
import cn.poverty.service.ReliefItemService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.List;
/**
* @author
* @packageName cn.poverty.api.controller
* @Description: 前端控制器
* @date
*/
@RestController
@RequestMapping(value = "api/v1/reliefItem")
@Slf4j
public class ReliefItemController extends BaseApiController {
@Resource
private ReliefItemService reliefItemService;
@Resource
private HttpServletResponse response;
@Resource
private IExcelDictHandler excelDictHandler;
/**
* 新增
*
* @date
* @param addReq 新增Req
*/
@PostMapping(value = "/addItem")
@RequiresPermissions("reliefItem:add")
public ApiResponse addItem(@RequestBody @Valid ReliefItemAddReq addReq){
reliefItemService.addItem(addReq);
return apiResponse();
}
/**
* 主键ID集合批量
*
* @date
* @param mainIdList 主键ID集合
*/
@DeleteMapping(value = "/batchDeleteItem/{mainIdList}")
@RequiresPermissions("reliefItem:batchDelete")
public ApiResponse batchDeleteItem(@PathVariable(name = "mainIdList") String mainIdList){
reliefItemService.batchDeleteItem(Arrays.asList(mainIdList.split(",")));
return apiResponse();
}
/**
* 分页查询
*
* @date
* @param pageReq 分页查询Req
* @return Pagination
*/
@PostMapping(value = "/queryByPage")
@RequiresPermissions("reliefItem:itemList")
public ApiResponse<Pagination<ReliefItemResp>> queryByPage(
@RequestBody @Valid ReliefItemPageReq pageReq){
return apiResponse(reliefItemService.queryByPage(pageReq));
}
/**
* 查询所有项目
*
* @date
* @return java.util.List
*/
@GetMapping(value = "/queryAllItem")
public ApiResponse<List<ReliefItemResp>> queryAllItem(){
return apiResponse(reliefItemService.queryAllItem());
}
/**
* 更新
*
* @date
* @param updateReq 更新请求参数
*/
@PutMapping(value = "/updateItem")
@RequiresPermissions("reliefItem:edit")
public ApiResponse updateItem(@RequestBody @Valid ReliefItemUpdateReq updateReq){
reliefItemService.updateItem(updateReq);
return apiResponse();
}
}
五,项目总结
随着计算机技术和网络技术的快速发展,信息化建设已经成为影响我国社会各行各业发展的重要因素,特别是电子政务系统的运用,受到了我国很多政府部门的亲睐,也给他们政务工作带来了显著的效果。加上我国扶贫制度不断的改革与发展,在扶贫业务流程上也提出实现信息化,同时,民政部门救助工作也应该积极响应国家信息化建设的号召,把手工的业务流程转化为信息化流程,使整个业务流程更加高效和规范。而我国民政救助工作不是独立的一项工作,运作过程中涉及扶贫、资金管理、贫困人口管理等众多的部门,这样民政部门要实现民政救助业务的信息化就变的非常困难,民政救助系统建设一个信息管理系统,目前国家还没有建设一款比较成熟和完善的系统,还需要更多的学者进行深入的研究。 本文就是在这种背景下对民政救助系统的开发展开探讨,通过结合民政救助需求实际情况,对民政救助系统设计进行了研究与系统的开发工作。在民政救助系统设计方面,为了更方便于软件开发与维护,采用B/S三层结构。在设计过程中,把民政救助系统分为了办公中心功能模块、民政城市优抚医疗救助功能模块、民政农村优抚医疗救助功能模块、系统维护功能模块、医疗机构救助功能模块等五个部分,希望可以实现民政救助内部人员的网上办公。这个系统的实施运行可以提高民政救助部门的内部办公的效率,规范办公流程,为民政部门的信息化发展起到积极的作用。