平行志愿管理系统
一、引言
1.1 编写目的
写此文档的目的是进一步定制软件开发的细节问题,希望能使本软件开发工作更具体。为了使用户、软件开发者及分析和测试人员对该软件的初始规定有一个共同的认识和理解,它说明了本软件的各项功能需求、性能需求和数据需求,明确标识各项功能的具体含义,阐述实用背景及范围,提供客户解决问题或达到目标所需要的条件或权能,提供一个度量和遵循的基准。具体而言,编写软件需求规格说明的目的是为开发的软件提出:
-
软件设计总体要求,作为软件开发人员、软件测试人员相互了解的基础。
-
功能、性能要求,数据结构和采集要求,重要的接口要求,作为软件设计人员进行概要设计的依据。
-
软件确认测试的依据。
1.2 读者对象
用户、软件设计人员、开发人员、需求分析和测试人员
1.3 软件项目概述
项目名称: 平行志愿录取系统
用户单位: 各大高校
开发单位: 广东外语外贸大学数据库工程小组
软件项目的背景和大致功能:
随着高考参考人数的增多,现如今的高考志愿早已采用网上填志愿的方式。志愿填报与每个高考考生今后的发展息息相关,如果考生的高考分数达到自己的理想水平,在加上志愿填报的好就可以锦上添花,进入理想的大学,与之相反,如果考生在填报志愿时盲目的填报高考志愿,轻则无法进入较为满意的学校、学习喜欢的专业,重则直接会导致退档。因此,高校正确录取学生的志愿显得尤为重要,一套软件系统能够在录取学生的时候处理海量的学生数去,能在录取中减少录取失误的可能性。并且能够分析生源数据,为学校分析学生水平,来源地等都有了很大的帮助。
1.4 文档概述
软件的设计约束部分。它包括软件设计目标和原则、软件设计受到的约束和限制。
软件的设计部分。它主要分为软件体系结构设计、用户界面设计、用例设计、类设计、数据设计以及部署设计。
1.5 参考资料
《软件工程(第三版)》.钱秋乐,赵文耘,牛军钰.北京:清华大学出版社,2016
二、软件设计约束
2.1 软件设计目标和原则
目标:
-
实现用户的登录,注册功能
-
实现考生的模拟投档功能
-
实现学校和专业的预测推荐功能
-
实现各大院校专业的招生信息查看功能
-
可选择查看全校/学院/专业查看最高分、最低分、学院专业成绩区间分布、生源地分布等信息
-
录取结果可查询功能
-
软件应能快捷地提供查询服务,软件正常启动的响应时间应该小于1s,各个功能模块的点击,键盘输入响应时间也应在用户能够容忍的范围之内,数据更新的时间应小于0.2s 原则:
-
抽象化原则
-
模块化原则
-
可拓展性原则
-
软件重用的原则
-
迭代设计的原则
-
可追踪性的原则
-
2.2 软件设计的约束和限制
-
运行环境要求:安卓操作系统Android、windows操作系统、Macos操作
-
系统、ubantu等支持Internet的系统
-
开发语言:Java、html
-
标准规范:Java编码风格(规范)
-
开发工具:Idea 2020
三、软件设计
3.1 软件体系结构设计
该系统主要分为前端界面层,业务逻辑层,数据交互层。界面层主要用于用户对系统进行交互,能够使用户使用系统。其中“loginUi”用于用户登录,验证用户的账号密码。“StudentUI”
图 3.1.2:“平行志愿录取系统”的总体设计架构
3.2 用户界面设计
根据“平行志愿录取系统”的用例描述以及每个用例的交互图,可以发现该软件系统在网页版上需要有以下一组界面以支持用户的操作。
- 登录界面“LoginUI”,其职责是帮助用户输入用户信息以登录到系统之中。
- 概况界面“OverviewUI”,其职责是显示志愿录取执行的各个步骤。
- 历史操作界面“HistoryUI”,其职责是帮助用户查看录取执行操作历史。
- 招生计划界面“EnrollmentUI”,其职责是显示学校的招生计划。
- 学生信息界面“StudentUI”,其职责是显示所有学生信息。
- 录取结果界面“ResultUI”,其职责是帮助用户查看并搜索录取结果。
- 数据分析界面“AnalyzeUI”,其职责是帮助用户查看数据分析结果。
图3.2 描述“平行志愿录取系统”用户界面跳转关系的顺序图
本界面为用户进行登录的界面
图 3.2.1 系统用户登录界面
下图为软件的全体概况界面
图 3.2.2 系统全体概况
下图为操作历史界面
图 3.2.3 操作历史界面
下图为招生计划界面
图 3.2.4 招生计划界面
下图为学生信息界面
图 3.2.5 学生信息界面
下图为录取结果界面
图 3.2.6 系统录取结果界面
下图为数据分析界面
图 3.2.7 系统数据分析界面
3.3 用例设计
1.“用户登录”用例实现的设计方案
“用户登录”功能是通过控制器“LoginController”来完成,当用户发出登录请求时,该用户请求会被转发给控制器 “LoginController”,由其实例化“LoginProperties”,完成读取配置文件中的管理员用户名和密码,完成验证
2.“导入文件”用例实现的设计方案
“导入文件”的控制器为“FileController”;当用户发出上传文件请求时,该请求将会被转发至控制器“FileController”,再由控制器调用 “ExcelServiceImpl”服务类,对“导入文件”该业务进行处理。在 “ExcelServiceImpl”服务类中,一共封装了三类处理Excel文件方法,分别是 “读取专业录取计划”、“读取学生志愿信息”及“导出结果”,在处理“导入文件”请求时,主要用到前两类方法。该服务类处理“导入文件”请求时,以导入“专业录取计划”为例,其主要业务逻辑为:
-
获取当前所处流程,检查流程合法性;若当前录取流程处于“缺失专业录取计划”,则允许导入
-
调用数据访问层“majorMapper”,对数据库中“t_department”表内容进行清空
-
读取“专业录取计划”Excel文件,调用“ReadMajorListener”类,首先实例化“Department”及“ExcelMajor”实体类;而后调用数据访问层“DepartmentMapper”,对数据库中“t_department”表进行插入数据操作,将招生计划中所有“系信息”录入数据库;然后再使用数据访问层“departmentMapper”类,对“招生计划”数据导入
-
针对不同情况,调用数据访问层“statusMapper”,对操作历史(流程状态)写入相应内容,如:导入专业招生计划文件、重新导入专业招生计划文件
3.“录取”用例实现的设计方案
“录取”的控制器为“StudentController”;当用户发出录取请求时,该请求将会被转发至控制器“StudentController”,再由控制器调用 “StudentServiceImpl”服务类中的“doEnroll”方法,对“录取”该业务进行处理,该类中“doEnroll”方法使用了“重载”特性,即根据传入的参数不同,调用不同方法;第一种方法不需要传入参数,其用途为获取“招生计划”及“学生志愿信息”,不返回结果;第二种方法需要传入“专业”参数,其用途为检查该学生能否被学校录取,返回“Boolean”类型结果。在“StudentServiceImpl” 服务类中,对于“录取”的业务逻辑如下:
- 获取当前所处流程,检查流程合法性;若当前录取流程处于“Ready”状态,则允许进行“录取”操作
- 获取招生计划,该步“StudentServiceImpl”服务类会调用“majorMapper” 完成。
- 进行录取操作,该操作单次对两百名学生进行操作,直至录取完成。在该操作中,按学生排位获取学生信息,而后交至同类下同名“doEnroll” 方法进行处理,检查该生能否被志愿专业录取,而后将操作返回无参“doEnroll”方法,对录取信息进行写入数据库操作
- 针对不同情况,调用数据访问层“statusMapper”,对操作历史(流程状态)写入相应内容,例如:录取完成
4.“调剂”用例实现的设计方案
“调剂”的控制器为“StudentController”;当用户发出录取请求时,该请求将会被转发至控制器“StudentController”,再由控制器调用 “StudentServiceImpl”服务类中的“doAdjust”方法,对“调剂”该业务进行处理。在“StudentServiceImpl”服务类中,对于“调剂”的业务逻辑如下:
-
获取当前所处流程,检查流程合法性;若当前录取流程处于“ENROLLED” 录取完成状态,则允许进行“调剂”操作
-
获取专业调剂计划,该步“StudentServiceImpl”服务类会调用 “majorMapper”完成,其SQL语句逻辑为检索招生计划“t_major”与学生志愿信息“t_student”,查找实际招生人数大于计划招生人数的专业以及其最低排位“bottom_rank”
-
进行调剂操作,该操作单次对一百名学生进行操作,直至调剂完成。在该操作中,对“AcceptedTyp”为0,即状态为可调剂的学生,按排位获取学生信息,而后顺序检索专业调剂计划,检查该生能否被未录满的专业录取,然后对录取信息进行写入数据库操作
-
针对不同情况,调用数据访问层“statusMapper”,对操作历史(流程状态)写入相应内容,例如:调剂完成
5.“导出结果”用例实现的设计方案
“导出结果”的控制器为“FileController”;当用户发出上传文件请求时,
该请求将会被转发至控制器“FileController”,再由控制器调用 “ExcelServiceImpl”服务类,对“导出结果”该业务进行处理。该服务类处理
“导出结果”请求时,其主要业务逻辑为:
-
获取当前所处流程,检查流程合法性;若当前录取流程处于“调剂已完成”,则允许导出结果
-
调用数据访问层“StudentMapper”,查询录取结果,其SQL语句逻辑为检索“t_student”,“t_major”及“t_department”三表,对上述三表进行自然连接,筛选“accepted_type”状态码为1-7的学生,展示特定字段,完成查询
-
将查询结果写出至Excel文件,每次写出200行,直至全部写出完成
3.4 类设计
配置类
1.EnrollConfig
完成SpringBoot框架中,自定义拦截器与跨域问题配置
其包含两种方法,分别为“addInterceptors(InterceptorRegistry registry)”与“addCorsMappings(CorsRegistryregistry)”方法,分别 对 应 拦 截 器 配 置 与 Cors 配 置 。“addInterceptors(InterceptorRegistryregistry)”会对登录状态进行验证,只有登录后才能访问相应的控制器,否则跳转到登录页面。
“addCorsMappings(CorsRegistry registry)”则是对跨域访问进行配置,其允许所有路径、源、请求方法、头部设置等进行跨域访问
2.LoginProperties 注入配置文件的管理员账户名及密码至该类
图3.4.1 EnrollConfig、LoginProperties类图
控制器
1.DepartmentController (学院信息控制器)
方法:getDepartments 获取学院信息
可调用“DepartmentService”服务类,完成系信息相关业务处理
2.FileController (文件控制器
方法:
- “uploadMajorExcel” 上传招生计划
- “uploadStudentExcel” 上传学生志愿信息
- “export” 导出结果
可调用“ExcelService”服务类,完成文件相关业务处理
3.LoginController (登录控制器
成员变量:LoginProperties(管理员账户及密码配置)、Map<String, Object>(目前登录状态)
方法:
- “doLogin”(登录) 验证管理员用户名及密码,若验证成功向登录状态storage写入session对象,值为“authSession”。“checkLogin”(检查登录状态) 验证登录状态storage中有无名为“authSession”的session对象,完成对登录状态的检查
- “logout”(退出登录); 移除在登录状态storage中值为“authSession”的session对象
4.MajorController (招生计划控制器)
方法:
- “getMajorPlan”获取详细招生计划
- “updateMajorPlan”更新招生计划
- “getMajors”获取招生专业id与专业名
- “getMajorsByDepartment”根据学院id获取学院下专业
可调用“MajorService”服务类,完成专业相关业务处理
5.StatusController(操作历史<流程>控制器)
方法:
- “getStatus”获取当前所处流程
- “getLogList”获取操作历史
可调用“StatusService”服务类,完成操作历史(流程)相关业务处理
6.StudentController(学生志愿信息控制器)
方法:
- “getStudentRaw”获取学生志愿信息
- “getAdjustStudentRaw”获取处于调剂队列学生信息
- “getExitStudentRaw”获取被退档学生信息
- “doEnroll”执行录取操作
- “doAdjust”执行调剂操作
- “getResult”获取录取结果
- “getResultByDepartment”根据学院查询录取结果
- “getResultByMajor”根据专业查询录取结果
- “searchStudent”搜索学生信息
- “searchStudentByCandidate”根据准考证号查询学生信息
- “getStudentBeforeRank”根据排名查询学生信息
- “getStatisticsResult”获取录取结果统计信息
- “getStatisticsResultInDepartment”根据学院获取录取结果
- 统计信息 “getStatisticsResultInMajor”根据专业获取录取结果统计信息
- “getDistribute”获取录取学生地域分布信息
- “getDistributeInProvince”根据省份获取录取学生地域分布信息
- “getGradeDistribute”获取录取学生分数段分布信息
- “getGradeDistributeByDepartment”根据学院获取录取学生分数段分布信息
- “getGradeDistributeByMajor”根据专业获取录取学生分数段分布信息
- “getCountDistributeInDepartment”根据学院查询该学院录取人数
- “getCountDistributeInMajor”根据专业查询该学院录取人数
- “getCountDistributeInMajorByDepartment”根据学院查询该学院下专业录取人数
- “reset”清空学生志愿信息表
- “formallyReady”检查录取前流程合法性
可调用“StudentService”服务类,完成学生志愿信息、录取信息相关业务处理
7.IndexViewConfig(默认首页控制器)
方法:addViewControllers 对UrlPath为“/”进行转发,跳转至首页“index.html”
实体类
- Department 学院
- EnrollStatus 流程状态
- Log 操作历史内容
- Major 招生专业ID及专业名(用于SQL语句查询返回类型)
- StatisticsResult 统计结果(用于SQL语句查询返回类型)
- StudentResult 录取结果(用于SQL语句查询返回类型)
- ExcelMajor 招生计划
- ExcelStudent 学生志愿信息
服务类
1.ReadMajorListener(招生计划服务类)
成员变量:
-
List< ExcelMajor> list 招生计划列表(私有全局变量)
-
int BATCH_COUNT 每批导入数据库招生计划数量(私有全局变量)
-
MajorMapper majorMapper 招生计划Mapper类(私有变量)
-
DepartmentMapper departmentMapper 学院信息Mapper类(私有变量)
-
Map<String, Integer> departmentIds 学院信息列表(私有变量)
方法:
- “ReadMajorListener” 构造方法
- “Invoke”自动保存,当List容器中信息条数达指定值,将其写入数据库
- “doAfterAllAnalysed”当Excel文件中所有数据被读取完成,执行数据写入数据库及清空list操作
- “save” 将list、departmentIds信息写入数据库
2.Map<String, Integer> departmentIds 学院信息列表(私
成员变量:
-
List< ExcelStudent> list学生志愿信息列表(私有全局变量)
-
int BATCH_COUNT每批导入数据库志愿信息数量(私有全局变量)
-
StudentMapperstudentMapper 学生志愿信息Mapper类(私有变量)
方法:
- “ReadStudentListener”构造方法
- “Invoke”自动保存,当List容器中信息条数达指定值,将其写入数据库
- “doAfterAllAnalysed”当Excel文件中所有数据被读取完成,执行数据写入数据库及清空list操作
- “save” 将志愿信息写入数据库
3.DepartmentServiceImpl(系信息服务类)
成员变量:DepartmentMapper Mapper层接口
方法:“getDepartments” 调用Maper层相关类,获取学院信息
4.ExcelServiceImpl(Excel 文件服务类)
成员变量:
- MajorMapper Mapper层接口
- DepartmentMapper Mapper层接口
- StudentMapper Mapper层接口
- StatusMapper Mapper层接口
方法:
-
“ReadMajorExcel” 导入招生计划
-
“ReadStudentExcel” 导入学生志愿信息
-
“doExport” 导出结果
5.MajorServiceImpl(招生计划服务类)
成员变量:
MajorMapper Mapper层接口
StatusMapper Mapper层接口
方法:
- “updateMajorPlan” 调用Maper层相关类,更新招生计划
- “getMajorPlan” 调用Maper层相关类,获取详细招生计划
- “getMajors” 调用Maper层相关类,获取招生专业id与专业名
- “getMajorsByDepartment” 调用Maper层相关类,根据学院 id获取学院下专业
6.StatusServiceImpl (操作历史<流程>服务类)
成员变量:
StatusMapper Mapper层接口
方法:
“getStatus” 调用Maper层相关类,获取当前所处流程
“getLogList” 调用Maper层相关类,获取操作历史
7.StudentServiceImpl(学生志愿信息服务类)
成员变量:
-
MajorMapper Mapper层接口
-
StudentMapper Mapper层接口
-
StatusMapper Mapper层接口
方法:
- “getStudentRaw” 调用Maper层相关类,获取学生志愿信息
- “getAdjustStudentRaw” 调用Maper层相关类,获取处于调剂队列学生信息
- “getExitStudentRaw” 调用Maper层相关类,获取被退档学生信息
- “doEnroll” 调用Maper层相关类,执行录取操作
- “doAdjust” 调用Maper层相关类,执行调剂操作
- “getResult” 调用Maper层相关类,获取录取结果
- “getResultByDepartment” 调用Maper层相关类,根据学院查询录取结果
- “getResultByMajor”调用Maper层相关类,根据专业查询录取结果
- “searchStudent” 调用Maper层相关类,搜索学生信息
- “searchStudentByCandidate”调用Maper层相关类,根据准考证号查询学生信息
- “getStudentBeforeRank”调用Maper层相关类,根据排名查询学生信息
- “getStatisticsResult” 调用Maper层相关类,获取录取结果统计信息
- “getStatisticsResultInDepartment” 调用Maper层相关类,根据学院获取录取结果统计信息
- “getStatisticsResultInMajor”调用Maper层相关类,根据专业获取录取结果统计信息
- “getDistribute” 调用Maper层相关类,获取录取学生地域分布信息
- “getDistributeInProvince” 调用Maper层相关类,根据省份获取录取学生地域分布信息
- “getGradeDistribute”调用Maper层相关类,获取录取学生分数段分布信息
- “getGradeDistributeByDepartment”调用Maper层相关类,根据学院获取录取学生分数段分布信息
- “getGradeDistributeByMajor” 调用Maper层相关类,根据专业获取录取学生分数段分布信息
- “getCountDistributeInDepartment”调用Maper层相关类,根据学院查询该学院录取人数
- “getCountDistributeInMajor” 调用Maper层相关类,根据专业查询该学院录取人数
- “getCountDistributeInMajorByDepartment” 调用Maper层相关类,根据学院查询该学院下专业录取人数
- “reset” 调用Maper层相关类,清空学生志愿信息表
- “formallyReady” 调用Maper层相关类,检查录取前流程合法性
Mapper层接口
- DepartmentMapper
- MajorMapper
- StatusMapper
- StudentMapper
Mapper层配置文件
- DepartmentMapper.xml
- MajorMapper .xml
- StatusMapper.xml
- StudentMapper.xml
Filter 过滤器
CharacterEncodingFilter 拦截用户向服务器的请求以及服务器向用户
的回应,对不符合编码要求得进行过滤
3.5 数据设计
设计永久保存数据的数据库表及字段
为了保存学院的信息,针对“平行志愿录取系统”中的Department类,需要为其设计表“T_department”,该表有两个字段:长度为 11 的字符串“department_id”表示学院id,长度为20的字符串“department_name”表示学院名信息。
为了保存操作历史的信息,针对“平行志愿录取系统”中的Log类,需要为其设计表“t_log”,该表有四个字段:类型为整数的“log_id”表示log的id, 长度为100的字符串“log_content”表示操作内容,类型为“datetime”的 “log_time”表示操作时间,类型为“tinyint”的status表示操作状态。
为了保存招生计划的信息,针对“平行志愿录取系统”中的ExcelMajor类,需要为其设计表“t_major”,该表有八个字段,major_id, major_code ,department_id,major_name,comment,period, plan_student_count ,realistic_student_count分别表示专业的id,专业编码,学院id,专业名称,专业类型,学年,计划招生人数,真实招生人数。
为了保存学生信息,针对“平行志愿录取系统”中的ExcelStudent类, 需要为其设计表“t_student”,该表有十七个字段,按顺序分别表示学生id, 准考证号,姓名,总分,志愿1,志愿2,志愿3,志愿4,志愿5,志愿6,调剂,排位,省份,城市,科类,最终接受专业的id,接受的方式。
设计永久数据的操作
为了支持对“T_department”、“t_log”、“t_major”、“t_student” 四 个数 据库 表的 操作 ,设 计模 型中 有 相应 四个 关键 设计 接口:
“DepartmentMapper”,“StatusMapper”,“MajorMapper”,“StudentMapper”, 它们提供了一组方法以实现对数据的操作。
3.6 部署设计
本软件工程从部署和运行方面主要分为客户端、服务器以及Excel表格。
首先,客户端为web客户端。用户可以在网站上登陆账户,并且通过简介的界面一步步导入数据,处理数据,自动实现不同的功能。用户只需要进行几步简单的操作,就能够获得处理好的数据。Web客户端利用Vue.js来进行网页的html 语言的编程,生成对应的网页,界面风格简洁,用户操作简单。。
其次,服务器方面主要分为应用服务器,web服务器、excel服务器以及数据库服务器。 web客户端通过web服务器与应用服务器相连接,应用客户端直接与应用服务器相连接。数据库服务器与应用服务器通过mybatis相连接,excle服务器通过excle服务器与应用服务器相连接。其中应用服务器是连接客户端和外部设备的桥梁,在整个软件开发中起到至关重要的作用。
最后,软件的Excel表格分为大学的招生计划,以及平行志愿考生的数据两部分。需要用户自行提供。其中表格样式需要与模板一致,拥有相同的列名以及格式。
3.7 代码组织结构
展示代码组织结构如图所示,独立编写的代码量约2000,开源代码量约1500,
其主要是对数据的读取和部分功能的实现。
代码符合编写规范(命令、换行等符合要求)通过单元测试、集成测试检查代码逻辑等方面错误合并分支时对代码进行审查,查找缺陷
四、项目部署与运行
4.1 系统登录界面
登录界面,用户在此界面输入账号密码,后台进行验证。正确的话能够进入系统。
图 3.1 系统登录界面
4.2 系统主界面
主界面,用户在此界面进行重要操作。导入专业录取计划和学生志愿信息,能够进行预录取、预调剂等操作。最后完成整个录取,导出结果。
图 3.2 系统主界面
4.3 系统招生界面
招生计划界面,用户在此可以查看招生计划,并且对招生计划的详细信息进行修改。
图 3.3 系统招生界面
4.4 学生信息界面
学生信息界面,用户在此可以查看学生的具体信息。采用分页处理,每一页显示一定的数量。
图 3.4 学生信息界面
4.5 录取结果界面
录取结果界面,用户在此界面可以查询所有的录取信息,也可以根据学院,专业,名次等条件查询。
图 3.5 录取结果界面
4.6 调剂队列界面
调剂队列界面,用户在此界面可以查询学生对滴调剂信息,能够清楚哪个学生被调剂。
图 3.6 调剂队列界面
4.7 录取结果界面
录取结果界面,用户在此界面可以查询所有的录取信息,也可以根据学院,专业,名次等条件查询。
图 3.7 录取结果界面
4.8 成绩分析界面
成绩分析界面,用户在此界面可以得到学生的成绩分析数据。可以按全校、学院、专业分类。
图 3.8 成绩分析界面
4.9 人数分布界面
人数分布界面,用户在此界面可以通过柱状图直观的看见不同学院的人数分布,可以通过此图进行分析学生录取信息。
图 3.9.1 人数分布界面
图 3.9.2 人数分布界面
4.10 生源地分布界面
生源地分布界面,此界面详细的显示了生源的全部过分,省内分布,以及通过柱状图显示分布的数量。
图 3.10 生源地分布界面
五、项目中完成要求的相关代码截图
将错误信息写入 log4j 日志文件中;
5.1 错误页面处理
5.2 二级访问的虚拟路径
5.3 解决中文乱码
5.4 设置默认首页
5.5 后台数据校验
5.6 事务管理
5.7 视图解析器
本项目中所有视图解析器封装在前端代码中,如登录页面视图解析器,当用户发送登录请求后,后端LoginController会执行数据库查询操作,验证用户名及密码,而后返回Json类型状态码及需要展示给用户的信息,前端解析Json数据后,返回相应视图其解析代码如下:
methods:
{
doLogin(){
this.loading = true;
request({
url:
'login/doLogin', method:
'POST', data: {
name:
this.username, pass:
this.password
}
}).then ( res => {
if(res.code ===
'000'){
this.$router.push('/backStage/situation')
this.$message.success('登陆成功');
} else {
this.$message.error(res.message);
}
this.loading = false;
}).catch( err => {
this.$message.error('系统错误'); this.loading = false;
})
}
},
控制器代码:
public JsonResponse doLogin(String name, String pass, HttpSession
session){
if(properties.getAdminName().equals(name) &&
properties.getAdminPass().equals(pass)){
storage.put("authSession", session);
return new JsonResponse(JsonResponse.OK, null, null);
} else {
return new JsonResponse(JsonResponse.AUTH_ERR, null, "登陆失败");
}
♻️ 资源
大小: 8.78MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87575086
注:如当前文章或代码侵犯了您的权益,请私信作者删除!