ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Spring Boot实战:思政考核管理系统设计与开发全流程解析

Spring Boot实战:思政考核管理系统设计与开发全流程解析 1. 需求分析与整体设计思路1.1 业务场景与管理痛点先聊一下这个项目到底在解决什么问题。思政考核管理系统说白了就是把组织内部的综合考核业务从纸质表格和Excel里搬到线上来。我前阵子帮一位朋友评估过类似的毕业设计项目他当时给我看了学校还在用的考核流程每个季度下发一张Word表格各部门填完再汇总到负责人手里录入电脑后手动算分、排序、做公示统计。这个流程里最要命的问题有三个第一是数据分散每个考核对象手里一份材料最后汇总时经常出现版本不一致第二是计算全靠人工指标一多加权平均算错是常事一旦算错还得从头核对第三是过程不透明被考核者不知道自己各项指标的得分依据申诉也无据可查。所以你在做这类系统时第一件事别急着写代码先把业务规则吃透。思政考核管理系统的核心并不是简单地把评分表搬到网页上而是要抽象出一套完整的考核闭环也就是方案制定、任务下发、评分填报、材料佐证、结果排名、公示反馈、申诉处理这七个环节。我见过不少毕设项目数据库建了十来张表看下来却只有用户表、角色表、成绩表完全没有考核任务的批次概念和流程状态流转概念这样写出来的系统到了答辩环节老师问几个业务问题就露馅了。既然是从零开始设计实现我建议你在写代码前先把考核业务拆成维度、指标、方案、任务、评分、材料、公示、申诉这几个独立对象再思考它们之间的关系。这样做的好处是后续无论是改指标权重还是增加考核批次都不需要大改表结构。1.2 角色权限与状态机设计权限模型是整个系统的地基。常见的考核系统会涉及四类角色系统管理员负责基础数据维护和考核方案配置部门负责人负责发起考核任务和审核结果考核员负责具体的评分打分被考核人则可以进行自评、查看结果和发起申诉。这里有一个容易踩坑的点就是“角色-权限-数据范围”三者要分开。很多初学者只做了菜单权限也就是不同角色看到不同页面但忽略了数据权限结果就是A部门的负责人可以查看到B部门的考核数据。这个问题在考核系统里尤其敏感因为考核结果直接关系到个人评价数据权限必须做到部门级甚至个人级。我建议你设计一个状态机来驱动考核任务流转。考核任务的典型状态可以是草稿、已发布、评分中、评分完成、公示中、申诉处理中、已归档。每一次状态变更都对应一组业务操作例如只有评分中的任务允许填写评分公示中则只允许查看和被考核人发起申诉。把状态流转写清楚后你再去设计接口就会非常顺畅比如“提交评分”这个接口的逻辑就是校验任务状态为评分中然后写入评分记录并判断是否所有评分人都已完成如果完成则自动把状态推进到评分完成。这个思路在写代码时能减少大量if/else的混乱嵌套。1.3 功能模块划分与需求优先级从项目落地的角度我把功能模块按优先级划分成三层。第一层是必须做的基础模块包括用户管理、部门管理、角色权限、考核指标库管理。第二层是考核核心业务模块包括考核方案配置、任务下发、自评/他评评分、材料上传、成绩计算、考核结果排名。第三层属于加分项包括公示与申诉流程、考核结果导出、数据统计图表、通知消息提醒。我在实际开发时习惯先把第二层业务的数据库表设计好因为这一层业务最复杂表结构一旦确定基础模块基本就是套模板的增删改查。有一个加分项我特别推荐做就是考核结果的可视化统计。不用做得很复杂至少要有两个页面一个展示部门整体的考核得分分布一个展示同批次内各个考核对象的指标得分对比雷达图。这类图表用CheckScript或者ECharts前端绘制后端只需要提供汇总的JSON数据接口。看起来工作量不大但整体系统的完整度和答辩时的演示效果会提升很多评委会觉得这个系统真正做到了“管理”层面的价值而不仅仅是“记录”。在需求分析阶段你先按这个优先级列表和导师或需求方确认好范围后面开发过程中就不会频繁返工。2. 技术选型与工程架构2.1 为什么选Spring Boot加MyBatis-Plus组合技术栈选型这件事很多刚接触Java的同学喜欢追求新版本新技术但做管理系统项目稳定性和生态成熟度永远应该放在第一位。Spring Boot当前用的最多的稳定版本是2.7.x系列搭配JDK 8或JDK 11这个组合在绝大多数服务器上都能顺利部署网上资料也最多遇到问题几乎都能搜到解决方案。当然如果要用Spring Boot 3.x也可以但要注意JDK必须是17以上同时MyBatis-Plus、Spring Security这些配套框架也要跟着换新版本否则会遇到javax包名改成jakarta这一类的兼容性问题。我的建议是如果你不是对虚拟机线程、GraalVM这些新特性有硬需求就选Spring Boot 2.7.x把精力放在业务实现上。ORM框架我选了MyBatis-Plus理由很直接这种考核管理系统有大量固定的增删改查操作MyBatis-Plus提供的BaseMapper可以让单表CRUD零SQL实现省出的时间足够你多写两个统计接口。不过对应的多表关联查询时MyBatis-Plus的Wrapper有时候会显得不太灵活所以我的习惯是简单查询用它的LambdaQueryWrapper复杂统计查询还是写XML里的自定义SQL。另外一个容易被忽略的地方是逻辑删除字段。考核指标、考核方案这些数据用户可能今天删除明天又想恢复物理删除了就彻底没了。在表里统一加上deleted字段配合MyBatis-Plus的TableLogic注解一行配置就能实现假删除这个设计在答辩时也是一个加分点。2.2 前后端分离与项目结构设计系统整体采用前后端分离架构后端提供纯JSON接口前端用Vue加Element-UI或者Element-Plus搭建页面。有人会问一个毕业设计项目用前后端分离会不会太重了我的看法是如果经费富余能用这个方式就用。Spring Boot后端天然适合这种模式而且Vue生态里现成的后台管理模板很多比如vue-element-admin、若依框架这类开源项目在这些模板基础上做页面开发效率非常高——用户管理、权限管理页面基本可以直接复用你只需要把精力放在考核业务页面就好。后端项目结构我会这样组织。com.example.check下分包config包放配置类如跨域配置、MyBatis-Plus配置、拦截器配置controller包负责接收请求和参数校验service包放业务逻辑mapper包是MyBatis的接口entity包对应数据库表实体类dto包放接收前端参数的类vo包放返回前端的视图对象。dto和vo分开是很多新人容易忽略的直接用实体类接收前端参数会导致前端可以传一些你不希望它传的字段比如id、deleted产生安全隐患。另外不要在Controller里写业务代码Controller只做参数接收和结果包装业务逻辑全部下沉到Service层这个习惯从第一个接口就要养成。2.3 Spring Boot自动装配原理在工作中的实际意义项目里用到了Spring Boot自动装配很多面试也会问到这里我简单串一下原理。Spring Boot在启动时通过SpringBootApplication注解里的EnableAutoConfiguration去加载META-INF目录下的spring.factories文件Spring Boot 3开始是AutoConfiguration.imports这个文件里声明了一堆AutoConfiguration类。每个自动配置类上用ConditionalOnClass和ConditionalOnMissingBean做条件判断比如你引入了redis的jar包对应的RedisAutoConfiguration才会生效。你在yml里写的spring.redis.host那些配置最终会被绑定到RedisProperties类上这个类上的ConfigurationProperties(prefix spring.redis)注解就是配置绑定的关键。理解这个原理后你会得到一个实际的能力排查配置不生效的问题。比如你明明在yml里写了某个自定义配置项运行时却拿不到值那大概率是你没有写对应的ConfigurationProperties类或者没有在配置类上开启EnableConfigurationProperties。还有类路径上有没有对应依赖的关系搞懂自动装配机制后你能在几分钟内定位这些问题的方向而不是对着配置反复试错。虽然写业务代码时不一定每天都和原理打交道但它真的是排查问题的一把钥匙。3. 数据库设计与核心业务建模3.1 核心数据表的结构设计数据库设计是这类系统的灵魂。我先列一下核心表和关键字段然后重点讲几个容易设计错的地方。用户表sys_userid、部门id、用户名、密码、真实姓名、角色id、状态部门表sys_deptid、父级id、部门名称、排序考核指标表assess_indicatorid、指标名称、指标类型定性/定量、满分分值、指标说明、是否启用考核方案表assess_planid、方案名称、考核周期月度/季度/年度、状态、备注方案指标关联表assess_plan_indicatorid、方案id、指标id、权重百分比考核任务表assess_taskid、方案id、批次名称、开始时间、结束时间、状态、创建人任务对象关联表assess_task_objectid、任务id、被考核人id、总得分评分记录表assess_score_recordid、任务id、对象id、指标id、评分人id、得分、评语、评分时间材料证明表assess_materialid、任务id、对象id、材料类型、文件路径、上传时间公示表assess_publicityid、任务id、公示开始时间、结束时间、状态申诉表assess_appealid、任务id、对象id、申诉原因、处理结果、处理人、处理时间核心要把握住三点。第一考核方案必须和指标分开方案关联指标表中存权重这样可以做到多个方案复用同一套指标库。第二任务必须和方案分开同一套方案可以发起多批次考核任务。第三被考核对象和评分记录也要分开一次考核任务对应多个被考核对象每个对象又有多条评分记录。这几个表关系理不清的话后面写统计SQL时会异常痛苦。这里说一个我实际经历过的设计教训。最初的版本里我把任务和方案合并到一张表认为一个方案只会执行一次。结果第三个月需要补发一次考核任务时发现根本没地方维护两批任务的开始结束时间和考核对象名单只能把旧数据改掉非常狼狈。从那以后我所有考核类系统的设计都会把任务与方案独立成表并加上批次号字段。你再想一想公示和申诉其实都是围绕任务展开的任务表结构稳定了其余表跟着也就顺了。3.2 评分规则与权重计算方式评分规则是整个系统业务上最核心的部分。考核指标分为定性指标和定量指标两类。定性指标靠评分人按量表打分比如“学习出勤情况”满分5分、“工作配合度”满分10分不同评分人打完分后取平均分。定量指标则根据事实数据计算比如“参加集体学习次数”每参加一次得2分上限10分这类指标通常由系统管理员统一录入不需要多人打分。总得分的计算要考虑指标的权重。设计时我在方案指标关联表中存一个weight字段表示该指标在方案中所占的百分比权重比如出勤占30%、学习表现占40%、实践参与占30%。那么某个被考核对象的最终得分计算公式是最终得分 Σ(单项指标得分 × 该指标权重)。这里有个坑用户录入权重时往往录的是30、40、30这样的整数计算时必须先除以100还原成小数。如果被测对象的某条评分记录缺失会直接导致计算时该项按零分算业务上不合理。我建议计算总分的SQL或Java代码里对缺失记录默认按满分或者按弃权处理具体规则在方案表里加一个字段控制。这块别偷懒把规则做成可配置的后面业务方改起来你就不用改代码。3.3 多评分人合并计算与并发控制在考核任务实际执行中一个被考核对象往往是多个评分人同时打分。这时就涉及数据一致性多个评分人同时提交评分时系统要保证同一对象的同一指标不被重复覆盖也要保证最后计算平均分时读取的数据是一致的。我的做法是评分记录表中增加唯一索引字段组合为任务id、被考核对象id、指标id、评分人id这样即使前端重复点击提交第二次插入也会因为唯一索引冲突而失败不会产生脏数据。如果评分规则是多人打分取平均最终总得分的计算时机放在任务状态进入“评分完成”时一次性算好并把结果冗余存储在任务对象关联表的总得分字段上。这样做的好处是查询排名时不需要每次都实时计算一长串SQL直接查这个冗余字段排序就可以了。计算的过程注意用事务加分布式锁或乐观锁控制防止多人同时触发结算任务导致分数重复写入。对于中小型项目来说一个简单的synchronized或者数据库行锁就行把聚合计算做成一个独立的结算服务接口来调用即可。4. 核心功能模块实现要点4.1 用户认证、密码安全与接口数据权限登录认证我选了JWT方案实现上并不复杂。用户输入用户名密码后后端校验通过则签发一个token后续请求在Header里携带token由拦截器统一解析并设置当前用户上下文。密码不能明文存储至少要用BCrypt加密Spring Security里自带了BCryptPasswordEncoder哪怕你不引入整套Spring Security单独使用这个密码工具类也是可以的。token的有效期建议设置为8到12小时同时引入Redis做存储这样后端可以主动让token失效比如用户修改密码后把旧token踢掉。只做JWT无状态而不做服务端标记当用户被管理员禁用时已签发的token依然有效如果校验逻辑里只验证签名不查用户状态就有安全漏洞。数据权限这块我强烈建议让部门负责人只能看到本部门及下级部门的数据。一种常见的实现是在查询SQL里自动拼接部门过滤条件。你可以通过MyBatis-Plus的拦截器实现也可以简单一点在Service层从当前登录用户上下文里取出部门id传给Mapper作为查询条件。后者更好排查代码也更直白推荐新手用这种方式。在写查询接口时不要相信前端传过来的部门id作为唯一过滤条件必须以服务端解析到的当前登录人部门id为基准。4.2 考核方案配置与任务发布流程考核方案配置页的核心交互是勾选指标并填写权重。后端接收的数据格式是一个方案主表的信息加一个指标id列表每个指标带权重值。我建议用事务来保存方案先插入方案主表拿到自增id再循环插入关联表。这里要做一个校验方案下所有指标的权重之和必须等于100否则直接抛业务异常。指标权重在页面上常常会被修改所以每次保存方案时把原有关联数据全部逻辑删除再重新插入这是最简单可靠的一种做法。任务发布流程相对复杂一些。管理员选择一个已配置好的方案设定开始时间和结束时间然后选择参与考核的对象列表后台会创建考核任务并把考核任务与对象关联起来同时给每个对象生成评分所需的初始化数据。发布之后系统还要为每个对象分配评分人。评分人的分配规则可能是可选配置的常见的是被考核人的直属领导加部门成员代表。我建议在代码里把分配逻辑做得可扩展一些比如用一个ScoreAssignService接口当前默认按部门负责人加两位随机成员组合来实现后续如果改了规则只需要替换这个实现类即可。任务发布后用Spring Boot自带的Async异步通知功能给相关用户发送站内消息提醒。4.3 评分录入、材料上传与自动结算评分页面是被考核对象用户每天要面对的页面。前端展示当前任务下的所有指标和评分规则说明评分人逐个打分并填写评语还可以上传证明材料。后端接收评分时调一次保存接口即可。这里有一个设计经验评分保存的接口必须是“保存评分明细”而不是“保存总分”总分一定要在结算阶段计算不能在每次评分时更新。否则多人评分时后写的人会覆盖前一个人的总分这种情况在真实使用中踩坑概率极高。材料上传我用了本地磁盘存储方案上传目录在yml中配置同时把文件路径存入数据库表。对于中小项目而言开个MinIO或者OSS成本偏高但要预留一个存储接口后续要换对象存储时改一个实现类就行。文件上传注意默认的spring.servlet.multipart.max-file-size只有1MB一定要在配置里调大同时做文件类型校验只允许jpg、png、pdf这些格式防上传恶意脚本。另外别忘了给上传文件按日期分目录存储比如yyyyMMdd目录下再放UUID重命名后的文件避免文件名冲突和管理混乱。任务截止日期过了之后管理员点击“结算”按钮系统遍历当前任务下所有对象执行加权平均计算并更新每个对象的总得分。计算过程在事务中执行遍历数据时加上乐观锁版本号字段防止并发重复结算。4.4 统计报表与Excel导出排名页面需要展示当前任务下所有参与对象的考核得分排名。SQL按总得分降序排列同时返回部门和排名序号。如果是多部门参与还能按部门聚合展示平均得分。图表数据接口我通常返回两类JSON一类是各部门得分的横向柱状图数据另一类是某对象各指标得分的雷达图数据。前端用ECharts接两个JSON就能渲染出漂亮的统计页面不需要后端做任何图表生成工作。这块投入时间短、演示效果好值得优先做。Excel导出是考核管理系统的刚需通常要把考核汇总表导出给上级存档。用EasyExcel实现非常方便在web接口里写好导出的数据集合调用EasyExcel.write方式输出到HttpServletResponse的输出流即可。注意设置响应的ContentType和文件名的URL编码否则浏览器下载中文文件名会乱码。做导出时为了防止大数据量导致内存溢出要使用EasyExcel的按行写入模式一批一批地从数据库查询数据写入Excel。很多同学不在意这个几千条数据时还看不出问题数据量到几万条时就直接OOM了。4.5 前端打包部署与运行配置目前主流是前后端分离先分别开发后端跑在8080端口前端用Vite开发服务器跑在5173端口通过代理转发解决跨域。开发完成后把前端打包此时有两个部署选择。第一种是独立部署前端dist目录交给Nginx托管后端jar包单独运行Nginx把/api路径代理到后端服务这种方式上线后扩展性最好。第二种是简单部署把前端打包生成的静态文件直接复制到Spring Boot项目的src/main/resources/static目录下再重新打包成一个jar包访问项目根路径就能看到前端页面不需要额外装Nginx适合演示和单机部署。第二种方案对毕设答辩和中小型内部系统特别友好。需要注意两点一是前端里所有请求路径要走相对路径或者以/api开头的绝对路径不要写死localhost:8080否则部署后页面调用接口地址不对。二是因为前端页面和接口走的是同一个应用Spring Security或拦截器要对静态资源路径放行但要注意不能直接放行所有路径否则接口也没有保护了。我之前遇到过一个同学的页面可以打开但登录后接口全部401的问题排查到最后就是拦截器把静态文件放行配置写错把/api前缀的接口路径也放行了。在这个问题上多花十分钟部署时能省下一小时排查。打包时如果遇到前端静态资源加载404的问题优先检查Spring Boot静态资源默认映射是否被自定义配置覆盖默认映射路径都在classpath:/static/目录下。5. 常见问题与排查实录5.1 Spring Boot版本过高导致的兼容性问题开发中遇到最多的一个问题就是Spring Boot版本选择不当引发的连锁反应。很多同学一上来直接创建Spring Boot 3.4或者3.5项目然后引入网上搜索到的老版本MyBatis-Plus依赖启动直接报错。这里的核心原因是Spring Boot 3基于Jakarta EE 9规范包名从javax.改成了jakarta.老版本的MyBatis-Plus及部分数据库驱动不兼容。解决方式有两种一是把Spring Boot降级到2.7.x二是给MyBatis-Plus等依赖换成3.5.3以上的适配版本。如果是刚上手做项目我建议直接用2.7.x因为教程多、坑少如果你熟悉新技术、愿意自己排查那就用Spring Boot 3.x性能和后续扩展会更好。版本问题最坑的地方在于很多报错信息并不会直接告诉你“版本不兼容”而是抛一些奇怪的SQL异常或者Bean创建异常。排查思路是看堆栈最前面的异常类型搜索一下Spring Boot版本号和框架版本号的兼容矩阵而不要盲目改业务代码。另外特别注意数据库驱动版本如果你用MySQL 8.x数据库驱动至少要mysql-connector-j 8.0.x以上。这点踩一次坑后就记住了。5.2 评分提交并发导致的数据覆盖或重复评分人在考核结束前集中提交评分是常态瞬间的高并发请求会暴露不少问题。一种情况是前端重复点击提交按钮导致同一评分人同一指标的记录插入两条如果只靠后端业务代码判断数据库里是否已有高并发下这份判断也会失效。最有效的办法是我前面提到的唯一索引兜底索引字段组合设为任务id、对象id、指标id、评分人id。插入时如果违反唯一索引捕获DuplicateKeyException并给出友好提示即可。不要只在前端做按钮防重复点击前端的限制只能提高体验不能作为数据正确的保障。另一种情况是管理者在评分过程中提前点击了结算导致评分人后续提交的数据不参与计算最终分数不完整。解决办法是增加状态校验只有在“评分中”状态下的任务才允许提交评分一旦结算则自动把状态变更为“评分完成”并锁定。同时结算操作使用事务内检查更新状态确保两个操作要么同时成功要么同时失败。5.3 定时任务在多实例部署下的重复执行考核系统通常在月底自动触发上月考核任务的结算或者定时生成考核提醒消息。Spring Boot的Scheduled注解用起来很简单但要注意一个陷阱如果你把系统部署到多个实例上每个实例都会执行一次定时任务轻则消息重复发送重则结算数据重复计算。解决方式有几种最轻量的是配置文件加一个开关只有指定实例才开启定时任务复杂一点的是引入分布式锁用Redis的setnx命令做一个锁标记每次任务执行前判断一下锁是否被占用。对于毕业设计或中小型系统前者足够了但是答辩时能说出后者说明你考虑过生产环境部署的问题印象会更好。定时任务里还有两个细节。一是定时任务执行的时间到达后如果用默认的单线程调度器上一个任务还没执行完下一个就已经到时间了会排队甚至堆积。配置一个线程池大小的TaskScheduler就能解决。二是在定时任务里做数值计算一定要处理好事务边界比如给任务方法加Transactional注解的同时注意锁库配合避免读到中间状态。5.4 文件上传大小限制与中文文件名问题前面提到Spring Boot默认文件上传大小只有1MB不调整的话传几张照片就会失败。配置在application.yml里修改spring.servlet.multipart.max-file-size和max-request-size即可。我通常会设置为50MB和100MB覆盖绝大多数业务场景。与此同时如果前端和后端分离部署需要通过Nginx反代上传接口时还要在Nginx配置里同步修改client_max_body_size否则Nginx会直接拦截请求返回413错误。这个错不配一下查起来容易走弯路因为后端日志里根本没记录。中文文件名也是一个小坑。直接使用用户上传的原始文件名保存会有两个隐患一是文件名特殊字符导致存储异常二是同名文件互相覆盖。统一做法是文件保存时用UUID重新生成文件名原始文件名存入数据库一个字段下载时通过接口读取数据库再拼回原名进行输出。下载接口设置Content-Disposition时要注意对文件名做URL编码否测浏览器解析中文会乱码这个细节能用一行代码解决不处理就是妥妥的体验事故。5.5 EasyExcel导出大数据量时的内存问题很多毕设项目在导出功能时直接用POI一行行写Excel几百上千条数据没问题但考核系统一学期下来汇总记录上万甚至数万条POI默认模式会把所有数据加载到内存很容易触发堆内存溢出。EasyExcel默认的写模式就是流式的根本思路是保证只有一小部分数据常驻内存。使用上注意一点数据查询层不要一次性把所有记录List全部查询出来再交给EasyExcel而是通过MyBatis的游标查询或者分页查询每查出一批就往Writer里写一批。核心代码大概是循环分页查询查询结果直接写入writer.write方法写完一批后清空list让GC回收。导出时还要注意对超大数字段的处理比如考核评语中可能包含较多内容默认的Excel单元格有长度限制超过32000字符需要另作处理。虽然考核评语一般不会这么长但做系统时知道这个限制能避免某些极端情况下导出文件损坏。导出功能做好后记得在答辩前实际导一次几千条数据的Excel验收别等到演示当天才发现文件下载不下来。5.6 部署上线前的一些细节检查代码写完了部署上线之前我习惯按这个清单快速过一遍。第一配置文件里的账号密码和密钥不要提交到代码仓库改成环境变量或者jasypt加密。第二关闭Spring Boot的Actuator生产敏感端点只保留health和info否则线上接口信息可能被探测。第三确认数据库连接池配置合理HikariCP的maximum-pool-size默认是10并发量不大时可不必修改。第四给所有写操作接口加上日志记录日志里至少包含操作人、操作时间和操作内容摘要这是考核系统审计溯源的必要条件。第五前端页面在打包前确认接口请求路径是通过相对地址或统一前缀不要残留开发环境的本机地址。这些细节不会直接影响功能跑通但决定了系统是否像一个“能交付”的正式项目。很多学生在答辩时只演示功能流程一被问到线上的配置和安全就直接卡壳提前检查好这些内容实际上是在给自己加分。6. 个人实操经验与扩展建议最后说说我的几点体会。做这类管理系统尤其是考核方向的技术难点其实不算高真正的门槛在于把业务规则抽象成数据模型。我做这个项目最大的心得是前三天全部用来画业务流程图和设计表结构真正写代码的时间反而很短。你千万不要跳过这个阶段直接建表考核这种业务涉及多角色多流程一旦表结构设计错误后面改起来比重写还麻烦。用纸笔把“发布任务→评分→结算→公示→申诉”的完整数据流走一遍每个节点标注涉及的表和状态变化这个步骤做完你的开发路径就非常清晰了。再分享一个扩展方向。如果系统后续要做得更完善可以加入考核模板库把不同岗位的常用考核方案做成模板供一键套用还可以加入移动端适配因为评分人在手机上打分比在电脑上操作方便得多。这些内容不一定都要做进当前版本但架构上预留好扩展点后续演进时能省很多事。对于正在做相关项目的人我的建议很简单先抓核心闭环流程再做统计分析最后补权限和日志按这个顺序推进你的项目大概率会比同批次的大部分作品完整度高出一截。
返回列表