项目编号: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三层结构。在设计过程中,把民政救助系统分为了办公中心功能模块、民政城市优抚医疗救助功能模块、民政农村优抚医疗救助功能模块、系统维护功能模块、医疗机构救助功能模块等五个部分,希望可以实现民政救助内部人员的网上办公。这个系统的实施运行可以提高民政救助部门的内部办公的效率,规范办公流程,为民政部门的信息化发展起到积极的作用。