【考试报名数据处理系统设计与实现13000字(论文)】_第1页
【考试报名数据处理系统设计与实现13000字(论文)】_第2页
【考试报名数据处理系统设计与实现13000字(论文)】_第3页
【考试报名数据处理系统设计与实现13000字(论文)】_第4页
【考试报名数据处理系统设计与实现13000字(论文)】_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I第1章绪论1.1研究背景随着我国IT办公技术的不断进步和产业飞速发展,互联网办公应用的广泛普及与大大推广,信息化企业办公逐步取代了目前传统的企业办公管理模式。信息化办公取代传统办公模式是当下办公模式发展的必然趋势。在现有的考试信息处理系统中对于学生进行报名信息处理也可以说是一个很重要的考验,学生对于考试信息的掌握程度很重要,并针对目前现有的报名信息处理系统中存在的功能而言进行了优化,定制一套更加能够适用于当前现有场景的更具灵活性的考试报名系统,将会有助于大大降低报名信息处理工作量和工作强度,提升学校的教务管理水平与工作效率。本文简要详细介绍了考试报名数据处理系统的理论基础及其设计开发应用全过程,包括了系统需求管理分析、系统结构设计、系统功能实现等详细理论内容。考试报名数据处理系统基于Java8进行开发,使用SpringBoot作为基础框架,前端使用Jquery+Layui作为主要技术,服务器的软件采用Nginx+Tomcat,后台数据库系统采用Mysql。1.2系统研究意义为了数字化校园建设内涵,提高考务报名工作的效率,为考生提供优质、便捷的报名服务,设计考试报名数据处理系统,目的有几个方面。考试报名数据处理系统,采用高度信息化的流程可以避免纸质填报、现场核对等不必要的工作流程,减少信息流转过程中操作失误,可能带来的错误数据。考试报名信息处理系统,实现对考试报名工作的情况的实时掌握,让老师可以更加自如地开展考试报名工作,避免信息采集与数据统计滞后的情况,同时能更加方便地通过各种图表了解报名信息的变化趋势,强化系统操作的简易性。同时在探索通过前后端完全分离的方式,减轻系统服务器的压力[1]。1.3国内外研究现状计算机技术的发源可以追溯到1946年,由滨夕法尼亚大学的摩尔学院开发了一种大规模的电子数字集成计算机,成为计算机时代到来的标志。20世纪中期计算机技术进入快速发展期,而在20世纪后期计算机技术得以普及,计算机技术得以进入千家万户,而如今计算机技术已经进入移动互联网时代。我国早期计算机技术严重落后于美国等西方国家,信息化普及程度相较于国外还是比较低。近年来随着国家对信息化建设的重视,我国计算机及IT技术已经进入千家万户,各类计算机及移动应用也相继出现。由于计算机技术与IT技术首先在国外发展和普及,早在20世纪90年代国外就开始推行信息化校园,我国考试报名工作信息化相较于国外发展较晚,当时我国的教学考试模式还处于传统模式。随着管理系统的普及考务工作的信息化的持续推进,信息化初期仅仅是将线下工作尽可能地移植到线上系统,现阶段我国也逐渐在脱离传统思维,使用互联网思维设计实现考试报名系统、在线课堂系统等教育相关应用。从以前的线下提供报名表缴费考试等,再到现在线上报名、选择科目、打印准考证、查询成绩的报考工作模式,这不仅大大便利了广大考生和减少考务工作者压力,同时也减少了人工操作带来的失误及考生排查等问题。1.4本文主要研究内容本文旨在建设高性能及高可用性的考试报名数据处理系统,给考生提供更加方便和考务工作者易于管理的体验。主要参考已有的考试考报名系统,考务管理的实际需求,根据现有的软件开发技术、数据存储及系统架构知识,从开发语言及业务流程等方面研究设计易于使用、操作流畅以及更加现代的考试报名数据处理系统。为解决传统考试报名系统无法更好地利用现代浏览器特性和性能、以及可扩展性和可维护性不足,从提高系统效率、UI交互、降低浏览器与应用服务器通信数据流量等多方面进行考量。本文针对基于C/S模式及传统B/S模式的报名数据处理系统存在的缺陷和不足之处,通过调整系统架构、软件架构、需求实现等研究如何通过减少应用服务器压力来提高系统整体性能。1.5本文组织结构第一章:说明所选题目的重要工作意义,描述项目当前的国内外研究现况,说明开发该项目的内容和目标。第二章:系统相关技术介绍。第三章:系统建设初期的重要环节,通过需求分析确认系统功能区域,按照功能划分若干模块。第四章:架构设计、针对各个功能模块进行分析以及数据库的设计。第五章:本文实现系统的重点章节,详细的阐述功能并演示系统界面。第六章:针对本文的系统完成情况进行测试,判断功能完整性正确性。第七章:系统实施过程中安全十分的重要尤其是考务工作中涉及很多敏感信息。第八章:总结本文的工作内容以及实现情况。第2章相关理论概述2.1JAVA技术Java是一门面向对象编程语言,它隶属于C语言家族。他吸收了C系语言的各种特点,除去了很多难以理解的概念如多继承等,当然也引入了一些缺点,部分场景运行效率不高。当然这些都阻挡不了Java在Web应用开发中的流行。Java这种开发语言可以广泛用来用于编制各种桌面软件应用程序,web软件应用程序,分布式系统和其他嵌入式的操作系统软件应用程序[2]。2.2Springboot技术Springboot是由Pivotal团队提供的框架,其目的是为了简化Spring应用的开发配置过程。该框架使用的特定的方式来进行配置,并提供了方便的外部化配置(环境变量,执行参数,java变量等)可以通过调整配置而不必重新修改代码并编译。SpringBoot已经成为Java快速开发领域的事实标准。同时SpringCloud项目是基于SpringBoot实现的云应用开发工具,是Java开发分布式云应用的首选[3]。SpringBoot提供自动配置的starter项目对象模型简化了Maven和应用内配置,尽可能自动配置Spring容器,去掉Spring开发的大量Xml配置[3]。并提供了大量准备好的特性,如指标、健康检查等常用功能[4]。2.3MySQL数据库技术MySQL是一个开源的关系型数据库管理系统,MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面十分的广泛。关系数据库的特点是不将所有数据放在一个大容器内,而是将数据保存在不同的表中,这样就可以增加处理速度并提高了灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库,并且在目前科技行业开源技术优先的前提下,MySql数据库也大量应用与大型应用及云原生应用[5]。2.4Nginx简介Nginx是一个高性能的HTTP和反向代理web服务器,其特点是使用epollandkqueue作为开发模型,其能够支持高达50,000个迸发连接数的响应。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名[6]。Nginx的强大并发能力和开源特点使得各大科技公司都有对Nginx进行过二层开发,比如淘宝的Tengine就是基于Nginx进行开发这无疑证明了Nginx强大。2.5B/S模式简介B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起一直处于高速发展中,它已经成为新建系统优先考虑的架构模式。B/S结构能大大提高系统开发(无需考虑跨平台问题)、维护(极大减少客户端维护成本)和升级效率(C/S结构的系统升级问题都不存在)。B/S结构也有他的不足之处,在于应用服务器(Server)的压力更大[7]。第3章系统需求分析本系统的定制开发是为了提升学校考试报名工作效率,使得考试报名信息精确无误、成绩查询、考务统计直观。3.1系统功能性需求通过对现有需求进行分析以及参考现有成果及文献,并结合现有用户进行调研。对需求进行整合优化。系统主要分为考生功能、管理员客功能。考试报名数据处理系统采用RBAC(基于角色的访问控制)对不同类型用户赋予不同的角色来控制权限。3.1.1考生功能需求考生注册:输入电子邮箱、手机、证件号码、姓名等基本信息完成账号注册流程,注册用户后方可使用本系统。登录:根据用户名、手机号、电子邮箱或者身份证号加上密码信息登录系统。个人信息:查看及修改部分个人信息。修改用户密码:修改的用户原来的密码要求校验好用户原来的密码,以提高安全性。考试报名:在考试窗口的报名时间段内考生可以选择该考试窗口的考试类型、级别、考试科目、日期、时间、考点进行报考。考试缴费:可以再报名完成后自动跳转至支付页面进行支付,也可以在报考列表中对未支付的报名进行缴费。打印准考证:考生可以对待考状态的报考信息打印准考证。成绩查询:考试完成后在成绩公布日期后可以在报名列表中进行查询成绩。考生用例图如图3-1所示图3-1考生用例图3.1.2管理员功能需求用户管理:管理员可以查询、添加、删除、编辑系统用户。角色管理:管理员可以查询、添加、删除、编辑系统角色。资源管理:管理员可以查询、添加、删除、编辑系统资源资源主要分为菜单和权限类。授权管理:管理员可以对角色的资源进行授权并添加删除角色下的用户。字典管理:管理员可以查询、添加、删除、编辑系统字典。系统参数设置:管理员可以查询、添加、删除、编辑系统参数如系统名称,软件版本等。系统字典管理:管理员可以查询、添加、删除、编辑系统字典目前系统字典主要有考试类型、考试级别、考试时间、支付状态、考试状态、审核状态其中考试级别与考试类型有级联关系。考试窗口管理:管理员可以查询、添加、删除、编辑考试窗口,设置窗口的报名时间、考试时间等。考试科目管理:管理员可以查询、添加、删除、编辑考试科目,设置科目的名称、代码、考试类型、级别、考试费用等信息。考点管理:管理员可以查询、添加、删除、编辑考点,设置考点名称、位置、可容纳人数等。报考管理:管理员可以查询、添加、编辑考试科目,退回报名信息并退回报考费用。报考报表:管理员可以在该页面实时查看报考统计信息。考试成绩导入:管理员可以导入考试成绩。管理员用例图如图3-2。图3-2管理员用例图3.2系统非功能性需求3.2.1性能需求界面清爽,考生使用时页面平均响应时间快,能够支持至少1000人迸发使用。同时需要保证系统的可维护性,以及可扩展性,以供将来对接其他系统,将来支持移动APP及H5页面以及功能扩展等。3.2.2兼容性需求系统软件要求为B/S架构,应用应该能部署到常用的服务器系统(Unix,Linux,Windows),客户端能支持常见的浏览器(IE、Firefox、360、Chrome、Edge等)3.2.3安全性需求涉及到考生身份证、姓名等大量敏感数据,要求支持加密(Https)访问,系统确保安全可靠。3.3系统分析3.3.1系统解决痛点考试报名数据处理系统通过使用B/S技术解决系统的可维护和可扩展性。通过前后端分离和Nginx等技术减少B/S模式带来的应用服务器压力,将传统WEB应用的服务端渲染模式改为应用仅提供API接口不负责页面渲染,增加系统的负载能力[8]。当前大部分单点应用系统应用和数据库是性能的主要瓶颈,通过调查和测试Nginx可以大大缓解Tomcat作为应用服务器的压力,并且Nginx可以通过负载均衡大大提高系统的负载能力及可用性[9]。3.3.2技术可行性考试报名数据处理系统,使用SpringBoot、Mybatis、Shiro作为系统的基础框架,并且使用前后端分离的开发模式。相比于现存的大量使用JSP和Struts2以及其他模板技术在后端生成html页面,Java应用的负载会更低[10]。3.3.3业务流程分析考试报名信息化工作整体考试报名主要是考生注册账号-登录系统-考生报名考试-考务进行审核-考生打印准考证-考务导入成绩-考生查询成绩这么一个主流程,当然其中会有多个分叉的情况会在后面详细说明。3.3.4数据处理分析涉及到考生身份证、姓名等大量敏感数据对部分数据需要进行加密处理,本系统中需要在报考查询管理页面对考生个人信息进行了隐藏。第4章系统概要设计4.1整体架构设计4.1.1系统架构设计考试报名数据处理系统使用Nginx作为web访问入口减少应用系统压力,并通过Nginx开启Https来提高网站安全性,防止使用Http访问时用户请求信息被拦截。用户通过网络访问系统时首先被Nginx处理如果是静态文件请求就直接被Nginx进行处理并直接返回给用户,如果为API请求则转发至Tomcat容器处理并获取返回结果转发给用户,这里通过url来区分静态资源请求和API请求,考试报名数据处理系统使用Nginx。Tomcat去访问Mysql数据库实现数据存取操作。这么做是因为使用Nginx处理静态资源远比Tomcat处理静态资源更加效率,服务器的资源占用率更低。图4-1系统架构图4.1.2软件架构设计考试报名数据处理系统是基于开源的SpringBoot应用框架的一套B/S应用系统,软件架构设计如图4-2所示。图4-2软件架构图(1)前端展现前端使用了layui和jquery来实现,做这个选择是因为考生的范围比较广,不能完全保证设备的性能。因此没有使用vue、react等重前端框架,使用了相对比较轻量的框架,以保障前端页面的渲染速度及响应时间。(2)Shiro权限框架考试报名数据处理系统使用了B/S架构,因此我们要假设所有的接口访问都有可能是伪造的不可靠的,需要对敏感操作进行鉴权。而Shiro是一个很好的开源权限框架,它有很灵活的机制和强大的功能。使用了Shiro作为系统的权限控制框架,以保护考生的隐私数据安全。同时防止越权操作发生[11]。(3)Restful接口前端通过Ajax与后面的Resfull接口之间进行了交互,从而实现了前后端的分离,能够更好地协助系统框架。后端专注于业务逻辑处理,不用关心前端页面渲染减少后端应用压力。并且可以实现多端统一接口只需要做前端适配不需要前端调整,扩展性也更好,适应变化能力也更强[12]。(4)后端功能划分后端功能整体被拆为两个部分,基础功能主要包含权限管理、系统管理和通用功能这些都属于系统的公共功能并且也是较少改动的功能。而其他的则为业务功能。(5)数据访问层考试报名数据处理系统使用Mybatis作为系统ORM框架,它的主要特点是使用方便及关联查询处理功能强大。并且它可以很方便的对数据库查询进行优化,因为它的查询逻辑是很容易预见的,多数情况是直接书写sql加上少量的判断标签。它的Interceptor机制也很方便扩展一些自定义处理宝库数据库自动物理分页、排序或者权限处理及通用日志等强大功能。4.2模块设计报名数据处理系统基本功能菜单模块设计如表4-1所示。表4-1报名数据处理系统基本功能设计表一级功能二级功能功能描述通用功能注册学生通过注册添加账号,以身份证号码为用户;管理员及教师账号不允许注册由管理员创建登录用户使用用户名、手机号、电子邮箱及身份证号和密码登录系统个人信息管理姓名、性别、手机号、个人照片这些信息可以进行修改,身份证号不允许修改考试报名报考申请报名表单包括个人信息、考试科目、考试时间、考试场地,个人信息可以从注册信息中获取并自动填充报考列表考试报名信息列表:(1)可以查看本人的报考历史记录(2)可以对未知的报考进行支付(3)待考考试可以打印准考证(4)考试成绩公布后可以查看考试成绩在线支付页面报考完成后会跳转到该页面进行支付操作权限管理用户账号管理超级管理员可以增加、删除、修改、查询账号并赋予角色角色管理针对教师账号,进行分角色管理,有超级管理员计算机考试审核等等资源管理对系统的菜单及权限进行管理授权管理控制各个角色的菜单及拥有的权限,系统管理字典管理对系统的字典进行维护系统参数管理对系统的参数信息进行维护考务管理考试窗口管理设置窗口的报名时间、考试时间等课程科目管理设置科目的代码、名称等考点管理考试信息管理考试类型等级、费用、报名时间、考试场次报考信息管理可以查看权限范围内的考试报名信息:(1)对考生报名部分信息进行编辑(2)管理员可以对异常的考生报名信息进行退回操作考试成绩导入以准考证号、身份证号、考试场次为唯一标识,导入考试成绩。并且需要逐条验证数据准确信如果信息有误,需要给出错误原因报考信息统计查看权限范围内的计算机等级考试学生报名情况,统计每日报名人数并生成趋势图,并可以按照考试类型及科目进行筛选从权限的角度来看报名数据处理系统可以分为考生、教务、系统管理员三大类模块,在他们下面又分为若干功能独立的子模块,考生、教务、系统管理员都可以登录系统去使用自己的模块将考试报名完成相应功能。4.3数据库设计4.3.1数据库结构化设计图4-3系统E-R图数据库的整体实体关系如图4-3所示,数据实体关系是通过对需求的调研,以及对现有文献及研究成功进行归纳总结,这也是整个数据库设计的很重要的部分。关系到整个系统的稳定性和可维护性以及数据完整性等。4.3.2数据库表的设计用户信息如表4-4所示表4-4用户信息表序号列名数据类型长度主键允许空1user_idint11是否2user_type20否3PAGEXXXhinese_namevarchar10否4usernamevarchar18否5id_cardchar18否6emailvarchar50是7mobilevarchar14是8saltchar21是9passwordchar64是10statusint1否角色信息如表4-5所示表4-5角色信息表序号列名数据类型长度主键允许空1role_idint11是否2role_codevarchar50否3role_namevarchar50否资源信息表如表4-6所示表4-6资源信息表序号列名数据类型长度主键允许空1res_idint11是否2res_typevarchar20否3res_namevarchar200否4res_permvarchar200是5res_descvarchar200是6res_urlvarchar200是7enabletinyint1否8parent_idint11是用户角色信息如表4-7所示表4-7用户角色信息表序号列名数据类型长度主键允许空1int11ur_id是否2int11user_id否3int11role_id否角色资源信息如表4-8所示表4-8角色资源信息表序号列名数据类型长度主键允许空1rr_idint11是否2role_idint11否3res_idint11否字典信息表如表4-9所示表4-9字典信息表序号列名数据类型长度主键允许空1dict_idint11是否2dict_namevarchar255否3dict_valuevarchar255否4parent_idvarchar255否考试窗口信息表如表4-10所示表4-10考试批次信息表序号列名数据类型长度主键允许空1batch_idint11否2batch_namevarchar255否3exam_typevarchar100否4reg_start_timedatetime0否5reg_end_timedatetime0否6exam_start_datedate0否7exam_end_datedate0否考试科目信息如表4-11所示表4-11考试科目信息表序号列名数据类型长度主键允许空1subject_idint11是否2exam_typevarchar255否3exam_rankint11否4subject_namevarchar255否5subject_codeint11否6exam_feedecimal8否考点信息如表4-12所示表4-12考点信息表序号列名数据类型长度主键允许空1site_idint11是否2site_namevarchar200否3site_locationvarchar255否4site_capacityint11否5enabledtinyint1否报考信息如表4-13所示表4-13报考信息表序号列名数据类型长度主键允许空1apply_idint11是否2batch_idint11否3exam_typevarchar200否4user_idint11否5subject_idint11否6site_idint11否7exam_datedate0否8exam_timevarchar100否9pay_statustinyint1否10pay_feedecimal8,2否11pay_timedatetime0是12create_atdatetime0否13apply_statustinyint1否第5章系统详细设计及实现5.1基础数据基础数据是系统运行必不可少的部分,在本系统中主要涉及有参数字典和配置参数。5.1.1参数字典考试报名时间处理系统主要有考试类型、考试时间、考试级别。根据需求调研发下它们都属于简单的键值对字典,但是它们部分字典之间有级联关系。5.1.2配置参数配置参数主要用于系统运行的部分行为,如系统名称显示等。5.2系统实现环境搭建硬件环境采用普通PC设备软件环境:服务器端操作系统:windows10数据库:MysqlWeb服务器:nginx、tomcat客户端操作系统:windows10Nginx配置截取关键部分如下:upstreamemis{server:8080weight=1;}server{listen80;server_namelocalhost;location/api/{proxy_passhttp://emis;proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}location/{root/www/static;indexindex.htmlindex.htm;}error_page500502503504/50x.html;location=/50x.html{roothtml;}}5.3系统业务流程设计通过需求对考试报名数据处理系统主要业务流程梳理如图5-1。图5-1主要业务流程图5.4考生端的功能5.4.1用户注册登录访客的用户直接访问后系统将自动跳转至注册的登录页面,在输入正确的用户名和注册密码后即可进行注册,界面结构如图5-2所示。关键代码如下:Stringusername=(String)authenticationToken.getPrincipal();SysUseruser=ShiroUtils.getUserByUK(username);if(user==null){//账号不存在thrownewUnknownAccountException(“账号不存在”);}if(user.getStatus()!=0){//账号被锁定thrownewLockedAccountException(“账号已被锁定”);}SimpleAuthenticationInfoauthenticationInfo=newSimpleAuthenticationInfo(user,user.getPassword(),ByteSource.Util.bytes(user.getUserId()+user.getSalt()),getName());returnauthenticationInfo;图5-2用户登录若考生还没有通过注册后就可以直接通过注册的页面进行注册,用户注册只能注册考生类型的账号,界面结构如图5-3。关键代码如下:@Overridepublicintregister(SysUsersysUser){sysUser.setUserType(UserType.CANDIDATE);returnaddUser(sysUser);}@Override@Transactional(rollbackFor=Throwable.class)publicintaddUser(SysUsersysUser){EmisValidUtils.validate(sysUser,ValidGroups.Insert.class);if(sysUser.getLocked()==null){sysUser.setLocked(0);}intadd=sysUserMapper.addUser(sysUser);ShiroUtils.encryptPassword(sysUser);sysUserMapper.changePasswordById(sysUser);switch(sysUser.getUserType()){//管理员添加到管理员角色caseADMIN:add+=userLinkRole(sysUser.getUserId(),Collections.singleton(EmisConst.ROLE_ADMIN));break;//考生添加到考生角色caseCANDIDATE:Set<Integer>roleIds=newHashSet<>();roleIds.add(2);roleIds.add(3);add+=userLinkRole(sysUser.getUserId(),roleIds);break;default:break;}returnadd;}图5-3用户注册5.4.2网上报考考生登录成功后可以通过报考申请菜单进入报考页面,考试类型通过报考批次进行关联,考生只允许选择当前可以报名的批次,如果没有可报考批次则无法进行报考操作,界面如图5-4。关键代码如下:@Overridepublicintadd(ExamApplyreg){EmisValidUtils.validate(reg,ValidGroups.Insert.class);returnexamApplyMapper.insertSelective(reg);}图5-4报考申请5.4.3成绩查询学生报考成功后可以通过报考列表查看支付状态、申请状态,以及考试成绩导入后查询考试成绩,如果支付状态为未支付可以通过点击立即支付跳转至支付页面,如果申请被退回会显示退款原因,界面如图5-5、图5-6。关键代码如下:@OverridepublicPage<ExamApplyDto>list(ExamApplyQueryquery){PageHelper.startPage(query.getPage(),query.getLimit());return(Page<ExamApplyDto>)examApplyMapper.listByQuery(query);}@OverridepublicExamApplyDtogetById(IntegerapplyId){ExamApplyfilter=newExamApply();filter.setApplyId(applyId);List<ExamApplyDto>examRegPage=examApplyMapper.listByQuery(filter);if(examRegPage.size()==1){returnexamRegPage.get(0);}returnnull;}图5-5报考列表图5-6未支付状态5.4.4准考证打印如报考申请通过则会显示打印准考证按钮可以跳转至打印准考证页面,这里使用js的print()方法实现页面打印,界面如图5-7。打印代码如下:$(‘#printBtn’).hide();//隐藏打印按钮window.print();//调用浏览器打印图5-7打印准考证5.5管理端功能的实现管理端功能主要针对考务工作者和系统管理员5.5.1基础功能权限管理分为四大模块,整体使用RBAC(基于角色的权限控制)的模型设计。用户管理如上图5-8所示,用户主要分为管理员和考生两种类型,其中考生账号可以通过考生注册管理员账号则只能同超级管理或者其他有权限账号添加,在这里可以修改用户属性以及重置用户密码,添加、编辑及删除页面如图5-9、图5-10和图5-11所示。除了密码外其他都是必填,如填入密码则表示需要重置密码,删除时会弹出确认框让管理员二次确认。关键代码如下:@OverridepublicPage<SysUser>userList(UserReqDtouserReq){PageHelper.startPage(userReq.getPage(),userReq.getLimit());List<SysUser>userList=sysUserMapper.selectAll();for(inti=0;i<userList.size();i++){userList.set(i,UserDto.of(userList.get(i)));}return(Page<SysUser>)userList;}@OverridepublicinteditUser(SysUseruser){EmisValidUtils.validate(user,ValidGroups.Update.class);UserDtoupdate=newUserDto();update.setUserId(user.getUserId());update.setUserType(user.getUserType());update.setChineseName(user.getChineseName());update.setIdCard(user.getIdCard());update.setEmail(user.getEmail());update.setMobile(user.getMobile());update.setUsername(user.getUsername());if(StringUtils.hasText(user.getPassword())){update.setPassword(user.getPassword());ShiroUtils.encryptPassword(update);}returnsysUserMapper.updateByPrimaryKeySelective(update);}@OverridepublicintchangePassword(IntegeruserId,StringoldPassword,StringnewPassword){SysUseruser=getUserByPk(userId);if(ShiroUtils.doCredentialsMatch(user,oldPassword)){user.setPassword(newPassword);ShiroUtils.encryptPassword(user);returnsysUserMapper.changePasswordById(user);}else{thrownewServiceException(403,"原密码错误");}}@Override@Transactional(rollbackFor=Throwable.class)publicintaddUser(SysUsersysUser){EmisValidUtils.validate(sysUser,ValidGroups.Insert.class);if(sysUser.getLocked()==null){sysUser.setLocked(0);}intadd=sysUserMapper.addUser(sysUser);ShiroUtils.encryptPassword(sysUser);sysUserMapper.changePasswordById(sysUser);switch(sysUser.getUserType()){//管理员添加到管理员角色caseADMIN:add+=userLinkRole(sysUser.getUserId(),Collections.singleton(EmisConst.ROLE_ADMIN));break;//考生添加到考生角色caseCANDIDATE:Set<Integer>roleIds=newHashSet<>();roleIds.add(2);roleIds.add(3);add+=userLinkRole(sysUser.getUserId(),roleIds);break;default:break;}returnadd;}@Override@Transactional(rollbackFor=Throwable.class)publicintdelUser(IntegeruserId){SysUsersysUser=getUserByPk(userId);if(sysUser==null){thrownewServiceException(400,"未找到用户");}intmod=sysUserMapper.deleteUserLinkedRole(userId);mod+=sysUserMapper.deleteUserByPk(userId);returnmod;}图5-8用户管理图5-9用户添加图5-10用户编辑图5-11用户删除(1)角色管理角色主要有角色代码和角色名称属性其添加和编辑页面与用户管理页面雷同这里不再赘述,如图5-12所示。关键代码如下:@OverridepublicList<SysRole>list(SysRolequery){returnsysRoleMapper.listByQuery(query);}@OverridepublicSysRoledetails(IntegerroleId){returnsysRoleMapper.selectByPrimaryKey(roleId);}@Overridepublicintadd(SysRolerole){EmisValidUtils.validate(role,ValidGroups.Insert.class);returnsysRoleMapper.insertSelective(role);}@Overridepublicintedit(SysRolerole){EmisValidUtils.validate(role,ValidGroups.Update.class);returnsysRoleMapper.updateByPrimaryKey(role);}@Overridepublicintdel(IntegerroleId){returnsysRoleMapper.deleteByPrimaryKey(roleId);}图5-12角色管理(2)资源管理资源管理是对系统的资源进行管理,主要分为两大类资源菜单和权限,其中菜单用与页面菜单动态控制,而权限则是控制接口和页面的访问权限防止用户越权访问不属于自己的资源,本系统中很多敏感信息权限控制是重中之重。权限控制基本细化到了每个接口除了通用的资源接口不做控制其他都有控制如图5-13所示。关键代码如下:@OverridepublicList<ResDto>list(SysResourcequery){returnsysResourceMapper.listByQuery(query);}@Overridepublicintadd(SysResourcedict){EmisValidUtils.validate(dict,ValidGroups.Insert.class);returnsysResourceMapper.insertSelective(dict);}@Overridepublicintedit(SysResourcedict){EmisValidUtils.validate(dict,ValidGroups.Insert.class);returnsysResourceMapper.updateByPrimaryKeySelective(dict);}@Overridepublicintdel(IntegerresId){if(resId==null){thrownewServiceException(400,"缺少资源ID参数");}SysResourcefilter=newSysResource();filter.setResId(resId);List<ResDto>resList=sysResourceMapper.listByQuery(filter);if(resList==null||resList.isEmpty()){thrownewServiceException(400,"未找到指定ID资源或已删除");}returnsysResourceMapper.deleteByPrimaryKey(resId);}图5-13资源管理(3)授权管理授权管理承担了管理谁有什么权限的功能。用户与角色一对多关联,角色又与资源一对多关联,这样的组合控制了每个用户的具体资源权限。用户角色授权:控制用户有什么角色,先选中左边的角色通过然后添加和删除该角色关联的用户如图5-14所示。角色资源授权:控制角色可以看到那些菜单页面以及可以访问哪些接口,先选中左边的角色反显角色拥有的菜单,然后通过选中右边的资源并点击保存来修改角色拥有的资源。这里使用了java8的新特性对两个集合做对比,摘取关键代码如下:/***比较新旧集合判断哪些需要更新哪些需要删除哪些需要添加*@paramsrc原集合*@paramtarget目标集合*@paramequals判断元素相等的方法*@paramneedUpdate判断元素需要更新的方法*@param<E>元素类型*@return*/publicstatic<E>ComparativeResult<E>comparative(Collection<E>src,Collection<E>target,BiFunction<E,E,Boolean>equals,BiFunction<E,E,E>needUpdate){ComparativeResult<E>result=newComparativeResult<E>();if(equals==null){equals=Objects::equals;}for(Es:src){booleanhas=false;for(Et:target){if(equals.apply(s,t)){has=true;if(needUpdate==null){result.getNothing().add(t);}else{Eu=needUpdate.apply(s,t);if(u!=null){result.getUpdate().add(u);}else{result.getNothing().add(t);}}}}if(!has){result.getDel().add(s);}}for(Et:target){booleanhas=false;for(Es:src){if(equals.apply(s,t)){has=true;break;}}if(!has){result.getAdd().add(t);}}returnresult;}/***比较新旧集合判断哪些需要更新哪些需要删除哪些需要添加*@paramsrc原集合*@paramtarget目标集合*@param<E>元素类型*@return*/publicstatic<E>ComparativeResult<E>comparative(Collection<E>src,Collection<E>target){returncomparative(src,target,null,null);}/***比较新旧集合判断哪些需要更新哪些需要删除哪些需要添加*@paramsrc原集合*@paramtarget目标集合*@paramgetKey获取元素的唯一KEY*@param<E>元素类型*@return*/publicstatic<E>ComparativeResult<E>comparative(Collection<E>src,Collection<E>target,Function<E,Object>getKey){returncomparative(src,target,(s,t)->Objects.equals(getKey.apply(s),getKey.apply(t)),null);}publicRroleNotLinkedUser(IntegerroleId){returnR.data(sysUserRoleMapper.roleNotLinkedUser(roleId));}publicRaddRoleUser(@RequestParamIntegerroleId,@RequestParamIntegeruserId){SysUserRoleuserRole=newSysUserRole();userRole.setUserId(userId);userRole.setRoleId(roleId);sysUserRoleMapper.insertSelective(userRole);returnR.ok("关联用户成功");}publicRdelRoleUser(@RequestParamIntegerroleId,@RequestParamIntegeruserId){SysUserRoleuserRole=newSysUserRole();userRole.setUserId(userId);userRole.setRoleId(roleId);sysUserRoleMapper.delete(userRole);returnR.ok("取消关联用户成功");}privateintuserLinkRole(IntegeruserId,Set<Integer>roleIds){List<SysRole>role=sysUserMapper.userLinkedRole(userId);ComparativeResult<Integer>rs=ComparativeUparative(role.stream().map(SysRole::getRoleId).collect(Collectors.toList()),roleIds);intadd=0;if(rs.getDel().size()>0){//删除需要删除的角色add+=sysUserMapper.userClearRole(userId,newHashSet<>(rs.getDel()));}if(rs.getAdd().size()>0){//添加需要关联的角色add+=sysUserMapper.userLinkRole(userId,newHashSet<>(rs.getAdd()));}returnadd;}@OverridepublicRroleResLink(Map<Integer,List<Integer>link){if(!link.isEmpty()){for(Map.Entry<Integer,List<Integer>e:link.entrySet()){SysRoleResoldFilter=newSysRoleRes();oldFilter.setRoleId(e.getKey());List<SysRoleRes>oldRes=sysRoleResMapper.select(oldFilter);List<SysRoleRes>newRes=e.getValue().stream().map(rid->{SysRoleResr=newSysRoleRes();r.setRoleId(e.getKey());r.setResId(rid);returnr;}).collect(Collectors.toList());ComparativeResult<SysRoleRes>rs=ComparativeUparative(oldRes,newRes,SysRoleRes:getResId);rs.getAdd().forEach(sysRoleResMapper:insert);rs.getDel().forEach(d->sysRoleResMapper.deleteByPrimaryKey(d.getRrId()));}}else{returnR.err(400,"参数缺失");}returnR.ok("更新成功");}图5-14用户角色授权图5-15角色资源授权(4)字典管理考试报名系统的字典主要用于系统各功能的下拉选择框的值进行管理增加系统可维护性,字典管理用于对系统的字典进行管理,这里采用树形列表进行展示能更加直观地看出部门层级,如图5-16所示。关键代码如下:@OverridepublicList<DictDto>list(SysDictquery){returnsysDictMapper.listByQuery(query);}@Overridepublicintadd(SysDictdict){EmisValidUtils.validate(dict,ValidGroups.Insert.class);returnsysDictMapper.insert(dict);}@Overridepublicintedit(SysDictdict){EmisValidUtils.validate(dict,ValidGroups.Update.class);returnsysDictMapper.updateByPrimaryKeySelective(dict);}@Overridepublicintdel(IntegerdictId){if(dictId==null){thrownewServiceException(400,"缺少字典ID参数");}SysDictfilter=newSysDict();filter.setDictId(dictId);List<DictDto>dictList=sysDictMapper.listByQuery(filter);if(dictList==null||dictList.isEmpty()){thrownewServiceException(400,"未找到指定ID字典或已删除");}returnsysDictMapper.deleteByPrimaryKey(dictId);}图5-16字典管理(5)系统参数管理系统参数管理用于对系统性配置进行管理,更加灵活的变更系统的运行状态,运行方式等,如图5-17所示这里修改了系统显示名称。关键代码如下:publicSysConfServiceImpl(SysConfMappersysConfMapper){this.sysConfMapper=sysConfMapper;reloadConf();}privateMap<String,String>confMap;@OverridepublicMap<String,String>getConfMap(){returnconfMap;}@OverridepublicList<SysConf>list(){returnsysConfMapper.selectAllConf();}@Overridepublicintedit(SysConfsysConf){if(sysConf==null){thrownewServiceException(400,"缺少参数");}if(sysConf.getConfKey()==null){thrownewServiceException(400,"缺少配置key");}if(sysConf.getConfValue()==null){thrownewServiceException(400,"缺少配置值");}returnsysConfMapper.updateValue(sysConf);}@OverridepublicbooleanreloadConf(){List<SysConf>allConf=sysConfMapper.selectAllConf();confMap=allConf.stream().collect(Collectors.toMap(SysConf:getConfKey,SysConf:getConfValue));returntrue;}图5-17系统参数管理5.5.2报考管理报名数据查询页面管理员可以对考生的报考信息进行编辑、审核决定考生的报考申请是否通过如果通过生成准考证号,并可以按照批次状态等筛选。考试成绩可以在考试成绩导入后及进行查询并且对部分信息进行隐藏处理,界面如图5-18、图5-19所示。关键代码如下:publicStringgetMobile(){returnmobile!=null?mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"):null;}@Overridepublicintapprove(ExamApplyapply){EmisValidUtils.validate(apply,ValidGroups.ExamApprove.class);ExamApplyapproveUpdate=newExamApply();approveUpdate.setApplyId(apply.getApplyId());approveUpdate.setApplyStatus(apply.getApplyStatus());approveUpdate.setReturnRemark(apply.getReturnRemark());//如果审核通过生成准考证号if(Integer.valueOf(1).equals(approveUpdate.getApplyStatus())){approveUpdate.setExamNo(genExamNo(approveUpdate));//不通过则退款}elseif(Integer.valueOf(2).equals(approveUpdate.getApplyStatus())){refund(approveUpdate);}else{thrownewValidationException("审核状态错误:不支持的审核状态"+approveUpdate.getApplyStatus());}returnexamApplyMapper.updateByPrimaryKeySelective(apply);}@OverridepublicRimportExamGrade(MultipartFilefile){PathtempDir=Paths.get(System.getProperty("java.io.tmpdir"),UUID.randomUUID().toString());tempDir.toFile().mkdirs();PathfilePath=Paths.get(tempDir.toString(),file.getOriginalFilename());try{//保存文件到临时文件file.transferTo(filePath);List<ImportExamDto>examList=ExcelUtils.toExamList(filePath,ImportExamDto.class);intlineNo=0;interrCount=0;StringBuildererrMsgSb=newStringBuilder();for(ImportExamDtod:examList){lineNo+=1;try{//数据校验EmisValidUtils.validate(d,ValidGroups.ExamGradeImport.class);//更新考试成绩ExamApplyexamImport=newExamApply();examImport.setBatchId(d.getBatchId());examImport.setSubjectId(d.getSubjectId());examImport.setExamNo(d.getExamNo());examImport.setGrade(d.getGrade());examApplyMapper.examGradeImport(examImport);}catch(Exceptione){errCount+=1;errMsgSb.append("第").append(lineNo).append("行导入失败:").append(e.getMessage()).append("\r\n");logger.error("第{}行导入失败",lineNo,e);}}if(errMsgSb.length()>0){returnR.ok("导入考试成绩成功:"+(lineNo-errCount)+"条,失败"+errCount+"条错误条目详情:"+errMsgSb);}else{returnR.ok("导入考试成绩成功"+lineNo+"条");}}catch(Exceptione){logger.error("导入考试成绩读取文件失败",e);returnR.err(500,"读取文件失败:"+e.getMessage());}}图5-18报考管理图5-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论