☰
亿业联盟后台管理脚手架:RBAC权限与代码生成器实战解析
2026/10/15 23:02:39 网站建设 项目流程

1. 后台管理脚手架到底在解决什么问题

做过中后台系统的人都有一个共同感受:业务逻辑还没写几行,光是搭架子就耗掉了大半精力。登录鉴权、菜单权限、角色管理、操作日志、数据字典、代码生成器……这些东西每个项目都要来一遍,每次都是复制粘贴改改改,改到最后自己都不知道哪些是原生的、哪些是魔改的。亿业联盟后台管理快速开发脚手架就是冲着这个痛点来的——它把中后台系统里那些"万年不变"的通用能力提前封装好,让开发者拿到手就能直接写业务模块,而不是从零搭权限体系。

这个脚手架的核心定位很明确:面向企业级中后台管理系统的快速开发。它适合几类人用——一是接私活或者做外包的独立开发者,需要快速交付一个带完整权限体系的管理后台;二是中小团队的技术负责人,想统一团队的技术栈和代码规范,避免每个人各写一套;三是刚入行的后端或全栈开发者,想通过一个成熟项目学习企业级后台的标准架构长什么样。不管你基础如何,只要做过CRUD,就能在这个脚手架上跑起来。

我接触过不少类似的快速开发框架,有的偏重代码生成、有的偏重权限模型、有的偏重前端交互。亿业联盟这个脚手架的特点在于它把"开箱即用"和"可扩展"这两件事平衡得比较好——默认提供的能力足够覆盖80%的常规需求,同时预留了清晰的扩展点,不会让你在需要定制的时候发现到处是死胡同。下面我会从整体设计思路、核心模块拆解、实操搭建流程、常见问题排查几个维度,把这个脚手架彻底讲透。

2. 整体架构设计与技术选型逻辑

2.1 为什么采用前后端分离加RBAC的组合

这个脚手架在架构上走的是标准的前后端分离路线,后端提供RESTful接口,前端独立部署。这个选择在今天看来几乎是默认答案,但背后的考量值得说清楚。前后端分离最大的好处是职责清晰——后端只管数据和业务逻辑,前端只管交互和展示,两边可以并行开发,接口定好之后互不阻塞。对于快速开发场景来说,这意味着你可以先让后端把接口跑通,前端同时用Mock数据搭页面,最后联调时基本一次过。

权限模型用的是RBAC(基于角色的访问控制),这是企业级后台最主流的方案。简单说就是:用户关联角色,角色关联权限,权限控制到菜单和按钮级别。为什么不用更细粒度的ABAC或者更简单的ACL?因为RBAC在灵活性和实现成本之间取得了最佳平衡。ACL太粗,每个资源单独配权限,用户一多就爆炸;ABAC太复杂,策略引擎的维护成本很高,小团队根本hold不住。RBAC的"用户-角色-权限"三层结构,既能让管理员通过角色批量管理用户权限,又能精确控制到每个按钮的显隐,实际用下来最顺手。

注意:RBAC的经典坑在于"角色爆炸"——如果每个用户都配一个独立角色,那角色表会迅速膨胀。正确的做法是按岗位或职能划分角色,比如"运营专员""财务主管""系统管理员",而不是按人头建角色。

2.2 技术栈选型的取舍与理由

后端这块,脚手架通常选择Spring Boot作为基础框架,配合MyBatis-Plus做数据访问。Spring Boot的自动配置和起步依赖让项目初始化变得极其简单,MyBatis-Plus则在MyBatis的基础上提供了大量开箱即用的CRUD方法,单表查询几乎不用写SQL。这两个组合在一起,写一个基础模块的增删改查,熟练的话十分钟就能搞定。

数据库默认用MySQL,这是国内中后台系统的事实标准,资料多、运维成本低、社区活跃。缓存层用Redis,主要解决三个问题:登录会话的存储、高频字典数据的缓存、以及分布式环境下的锁。Redis的引入不是炫技,而是实际场景倒逼的——比如用户登录后Token需要有个地方存,放数据库每次请求都查库太慢,放本地内存又没法多实例共享,Redis正好补上这个位置。

前端方面,主流选择是Vue 3配合Element Plus,或者React配合Ant Design。脚手架一般会选其中一套作为默认模板。Vue 3的组合式API在逻辑复用上比Options API清爽很多,Element Plus的组件覆盖度足够应付绝大多数后台场景。构建工具用Vite,冷启动和热更新速度比Webpack快一个数量级,开发体验提升非常明显。

层次技术选型选型理由
后端框架Spring Boot生态成熟,起步依赖简化配置
数据访问MyBatis-Plus单表CRUD零SQL,支持代码生成
数据库MySQL社区活跃,运维成本低
缓存Redis会话共享、字典缓存、分布式锁
前端框架Vue 3组合式API逻辑复用清晰
UI组件Element Plus后台组件覆盖度高
构建工具Vite冷启动快,热更新秒级响应

2.3 模块划分的底层逻辑

脚手架在模块划分上遵循"通用能力下沉、业务能力上浮"的原则。底层是基础设施模块,包括数据库配置、Redis配置、全局异常处理、统一响应封装、日志切面这些;中间层是系统管理模块,包括用户、角色、菜单、部门、字典、日志这些通用功能;最上层才是业务模块,开发者真正要写的东西。

这种分层的好处是依赖关系单向清晰——业务模块依赖系统模块,系统模块依赖基础设施,反过来不行。这样当你需要把脚手架迁移到新项目时,只需要替换业务模块,底下的系统能力和基础设施原封不动搬过去就行。我见过不少项目把权限逻辑和业务逻辑混在一起写,结果想抽离的时候发现到处是耦合,根本拆不干净。脚手架从一开始就把这条线划清楚,省的是后期的维护成本。

另一个设计要点是配置的外置化。数据库连接、Redis地址、文件上传路径、邮件服务器这些环境相关的参数全部放在配置文件里,通过多环境配置(dev/test/prod)来切换。这样同一套代码在不同环境部署时不需要改代码,只改配置就行。这个习惯看起来简单,但很多赶工期的项目直接把配置写死在代码里,后期换环境时苦不堪言。

3. 核心模块拆解与关键实现细节

3.1 认证鉴权模块的实现要点

认证鉴权是后台系统的第一道门,也是最容易出安全问题的地方。这个脚手架默认采用Token机制,用户登录成功后服务端生成一个Token返回给前端,前端后续每次请求都在请求头里带上这个Token。服务端通过拦截器校验Token的有效性,无效或过期则返回401。

Token的生成方式有两种常见选择:一种是JWT,把用户信息编码进Token本身,服务端不存储,校验时直接解码验证签名;另一种是随机字符串,服务端把Token和用户信息的映射存在Redis里,校验时查Redis。脚手架通常两种都支持,默认用后者。为什么?因为JWT有个天然缺陷——无法主动失效。用户登出或者管理员禁用某个账号后,已经签发的JWT在过期前依然有效,除非额外维护一个黑名单,那还不如直接用Redis存。用Redis存Token的话,登出时直接删掉对应的key就行,干净利落。

权限校验分两层:接口层和按钮层。接口层通过注解标记某个接口需要什么权限,拦截器在请求进入Controller之前校验当前用户是否具备该权限。按钮层则是前端根据用户权限列表决定某个按钮是否渲染。这里有个关键点——前端隐藏按钮只是体验优化,真正的安全防线在接口层。我见过有项目只在前端做了按钮隐藏,结果用户直接调接口照样能操作,这就是典型的权限漏洞。

实操心得:权限编码建议采用"模块:子模块:操作"的格式,比如system:user:add、system:user:delete。这样一眼就能看出权限的归属和粒度,后期排查权限问题时非常方便。不要用纯数字ID做权限标识,可读性太差。

3.2 菜单与路由的动态生成机制

后台系统的菜单通常不是写死的,而是存在数据库里由管理员配置。前端登录后拉取当前用户有权限的菜单树,然后动态生成路由。这个机制的核心在于"菜单"和"路由"的映射关系。

数据库里的菜单表一般包含这些字段:菜单ID、父菜单ID、菜单名称、路由路径、组件路径、权限标识、菜单类型(目录/菜单/按钮)、图标、排序号、是否可见。前端拿到菜单树后,递归遍历生成路由配置,目录类型生成嵌套路由,菜单类型生成具体页面路由,按钮类型不生成路由只用于权限判断。

这里有个容易踩的坑:组件路径的动态导入。Vite环境下不能用完全的动态字符串拼接来import组件,因为构建时无法静态分析。解决办法是用import.meta.glob预扫描所有页面组件,然后根据菜单里的组件路径去匹配。这个细节如果不注意,开发环境可能正常,打包后就会报组件找不到的错误。

菜单的层级设计也要注意。一般建议不超过三级,超过三级的菜单用户找起来很费劲,交互上也不友好。如果业务确实需要更深的层级,考虑用标签页或者分步导航来替代。

3.3 代码生成器的原理与使用边界

代码生成器是快速开发脚手架的灵魂功能。它的原理其实不复杂:读取数据库表的元信息(表名、字段名、字段类型、注释),然后按照预设的模板生成对应的后端代码(Entity、Mapper、Service、Controller)和前端代码(列表页、表单页、API文件)。

模板引擎通常用Velocity或者Freemarker,模板文件里定义了代码的结构和占位符,生成时把表信息填充进去。比如一个用户表,生成器会产出User.java、UserMapper.java、UserService.java、UserController.java,以及前端的user/index.vue、user/api.js。字段的注释会变成代码里的中文注释,字段类型会映射成Java类型,主键会自动识别并生成对应的查询方法。

但代码生成器不是万能的,用的时候要清楚它的边界。它擅长的是单表的标准CRUD,一旦涉及多表关联查询、复杂的业务校验、特殊的数据处理,生成出来的代码只能作为起点,后续还是要手写。我的建议是:用生成器生成基础骨架,然后在此基础上修改,而不是指望生成器直接产出可上线的完整功能。另外,生成器生成的代码要纳入版本管理,不要每次重新生成覆盖手改的逻辑,否则改一次丢一次。

生成内容覆盖场景需手写补充的场景
Entity单表字段映射关联对象字段
Mapper基础CRUD多表联查SQL
Service标准业务逻辑复杂校验、事务编排
ControllerRESTful接口特殊参数处理
前端页面列表+表单自定义交互组件

3.4 数据字典与系统配置的缓存策略

数据字典是后台系统里高频读取但低频修改的典型数据。比如"用户状态"这个字典,有"正常""禁用"两个选项,几乎每个涉及用户的页面都要读它,但它可能几个月都不变一次。这种数据如果每次都查数据库,纯属浪费资源。

脚手架的做法是在应用启动时把字典数据全量加载到Redis,后续读取直接走缓存。当管理员修改字典时,同步更新Redis里的数据。这样读的性能问题解决了,写的实时性也保证了。更进一步的做法是在本地内存里也存一份,配合Redis的发布订阅机制做多实例同步,不过对于中小规模系统来说,直接读Redis已经足够了。

系统配置的管理思路类似,但要注意区分"敏感配置"和"普通配置"。像文件上传路径、分页默认条数这类普通配置可以放数据库;像数据库密码、第三方服务密钥这类敏感信息,建议放环境变量或者配置中心,不要存在数据库里明文保存。这个边界如果划不清楚,后期做安全审计时会很被动。

注意:字典缓存的更新时机要覆盖所有修改入口。如果只在一个地方更新了缓存,另一个入口直接改了数据库,就会出现缓存和数据库不一致的问题。建议把字典的修改操作统一收口到一个Service方法里,在这个方法里同时处理数据库更新和缓存刷新。

4. 从零搭建的完整实操流程

4.1 环境准备与项目初始化

动手之前先把环境理清楚。需要准备的东西包括:JDK 17(Spring Boot 3.x的最低要求)、Maven 3.8以上、MySQL 8.0、Redis 6以上、Node.js 18以上。版本不要随意降,特别是JDK和Node,版本不匹配会导致各种奇怪的编译错误。

数据库初始化是第一步。脚手架一般会提供一个SQL脚本,里面包含建库建表语句和初始数据。执行脚本后你会得到几张核心表:用户表、角色表、菜单表、用户角色关联表、角色菜单关联表、字典表、日志表。初始数据里通常有一个超级管理员账号,用这个账号首次登录后第一件事就是改密码。

后端项目拉下来之后,改application-dev.yml里的数据库连接和Redis连接,然后直接启动。如果启动报错,九成是连接配置不对或者数据库没建好。启动成功后访问接口文档地址(通常是/doc.html或者/swagger-ui),能看到接口列表就说明后端通了。

前端项目拉下来后先npm install,然后改.env.development里的接口地址指向后端,再npm run dev。浏览器打开后如果能看到登录页,用初始账号登录进去看到完整菜单,环境就算搭好了。整个过程顺利的话半小时以内,不顺利的话可能卡在依赖下载或者版本冲突上,这个后面排查章节会细说。

4.2 新建一个业务模块的完整步骤

假设我们要做一个"供应商管理"模块,包含供应商的增删改查。完整流程是这样的:

第一步,在数据库里建表。字段包括:主键ID、供应商名称、联系人、联系电话、地址、状态、创建时间、更新时间。表名用biz_supplier,加biz_前缀是为了和系统表区分开。字段注释一定要写清楚,因为代码生成器会读取注释作为代码里的中文说明。

第二步,用代码生成器生成代码。在脚手架的管理界面里找到代码生成功能,选择biz_supplier表,配置好包名、模块名、作者信息,点击生成。生成器会产出后端四个Java文件和前端两个文件。把后端文件放到对应的包路径下,前端文件放到views目录下。

第三步,配置菜单和权限。在菜单管理里新增一个菜单,路由路径填/biz/supplier,组件路径填biz/supplier/index,权限标识填biz:supplier:list。然后在菜单下新增三个按钮权限:新增(biz:supplier:add)、编辑(biz:supplier:edit)、删除(biz:supplier:delete)。最后在角色管理里把这些权限分配给对应的角色。

第四步,重启后端,刷新前端。如果一切正常,用有权限的账号登录后就能看到"供应商管理"菜单,点进去能看到列表页和新增按钮,增删改查都能跑通。整个过程熟练的话二十分钟以内。

// 生成的Controller示例结构 @RestController @RequestMapping("/biz/supplier") public class SupplierController { @Autowired private SupplierService supplierService; @PreAuthorize("@ss.hasPermi('biz:supplier:list')") @GetMapping("/list") public TableDataInfo list(Supplier supplier) { startPage(); List<Supplier> list = supplierService.selectSupplierList(supplier); return getDataTable(list); } @PreAuthorize("@ss.hasPermi('biz:supplier:add')") @PostMapping public AjaxResult add(@RequestBody Supplier supplier) { return toAjax(supplierService.insertSupplier(supplier)); } }

4.3 权限分配的实操演示

权限分配这个环节看似简单,但实际用起来最容易出问题。我按标准流程走一遍,把关键点标出来。

先建角色。在角色管理里新增一个"供应商管理员"角色,角色标识填supplier_admin。角色标识是程序里判断用的,一旦确定就不要改,改了会导致已分配的权限失效。

然后给角色分配菜单权限。在角色编辑界面里会看到一棵菜单树,勾选"供应商管理"及其下的按钮权限。这里有个细节:如果只勾了子菜单没勾父目录,前端菜单树可能渲染不出来。所以勾选的时候要从父节点开始勾,保证树的完整性。

接着建用户并关联角色。新增一个用户,在角色字段里选择"供应商管理员"。用户登录后,系统会根据用户ID查到关联的角色,再根据角色查到关联的菜单和权限,最终生成这个用户能看到的菜单和能操作的按钮。

最后验证。用新用户登录,检查三件事:菜单是否只显示了有权限的部分、按钮是否按权限显隐、直接调无权限的接口是否返回403。这三项都通过,权限配置才算真正生效。

实操心得:调试权限问题时,先看后端日志里当前用户被识别成了谁、拥有哪些权限,再看前端拿到的菜单树和权限列表是什么。大部分权限问题出在数据配置上,而不是代码逻辑上。把这两端的日志打出来对比,问题一目了然。

4.4 打包部署的关键配置

开发环境跑通之后,部署到服务器还有几个坑要过。

后端打包用mvn clean package,产出一个jar文件。启动命令里要指定生产环境的配置文件:java -jar app.jar --spring.profiles.active=prod。生产环境的配置文件里,数据库连接池大小要调大,日志级别要调高(只记warn和error),文件上传路径要指向服务器上的实际目录。

前端打包用npm run build,产出dist目录。把dist里的文件放到Nginx的静态目录下,配置里加一段反向代理把/api开头的请求转发到后端服务。Nginx配置里要注意两点:一是开启gzip压缩,二是给静态资源设置合理的缓存时间。前端路由用的是history模式的话,还要加一条try_files规则,把所有找不到的路径都指向index.html,否则刷新页面会404。

数据库方面,生产环境不要用root账号连应用,单独建一个只有业务库权限的账号。Redis要设密码,并且不要暴露在公网。这些安全基线看起来是常识,但实际部署时因为赶时间跳过的人不在少数,出事的时候后悔都来不及。

5. 常见问题排查与避坑经验实录

5.1 启动阶段的典型报错与解决

启动报错是最让人抓狂的,因为信息量大、方向多。我把最常见的几类整理出来,按排查优先级排序。

第一类是数据库连接失败。报错信息里通常有Communications link failure或者Access denied。先确认MySQL服务是否启动、端口是否对、账号密码是否正确、数据库是否已创建。如果用的是Docker,还要确认容器网络是否互通。这类问题占启动报错的六成以上。

第二类是Redis连接失败。报错关键词是Unable to connect to Redis。检查Redis是否启动、密码是否配置、application.yml里的配置是否和实际一致。有个隐蔽的坑是Redis的bind配置,默认只允许本机连接,如果应用和Redis不在同一台机器上,需要改配置并重启Redis。

第三类是端口占用。报错Port 8080 was already in use。用lsof -i:8080找到占用进程杀掉,或者改应用的端口配置。开发环境建议固定端口,不要用随机端口,否则前端代理配置要跟着改,很麻烦。

第四类是依赖冲突。报错里出现NoSuchMethodError或者ClassNotFoundException,基本就是依赖版本冲突。用mvn dependency:tree打出依赖树,找到冲突的包,在pom里用exclusions排除掉旧版本。这类问题在引入第三方SDK时特别常见。

报错类型关键词排查方向
数据库连接Communications link failure服务状态、端口、账号、库是否存在
Redis连接Unable to connect to Redis服务状态、密码、bind配置
端口占用Port already in use查占用进程、改端口
依赖冲突NoSuchMethodError依赖树、排除旧版本
配置缺失Failed to bind properties检查yml配置项拼写和层级

5.2 权限不生效的排查思路

权限问题最让人头疼的地方在于"看起来都对但就是不生效"。我总结了一套排查顺序,按这个顺序走基本能定位到问题。

先确认后端识别到的当前用户是谁。在接口里打印当前登录用户的ID和权限列表,看是否为空。如果为空,说明Token没传或者解析失败,检查前端请求头里有没有带Token、Token格式对不对。

再确认数据库里的权限配置。查用户角色关联表,看这个用户有没有关联到角色;查角色菜单关联表,看这个角色有没有关联到目标菜单;查菜单表,看目标菜单的权限标识是否和接口注解里写的一致。这三步查完,数据层面的问题基本就暴露了。

然后确认缓存。如果权限数据改了但没生效,很可能是缓存没刷新。登出重新登录会强制刷新权限缓存,如果重新登录后生效了,说明是缓存刷新逻辑有问题,需要检查修改权限时有没有同步清缓存。

最后确认前端。如果后端接口返回403但前端按钮还显示着,说明前端的权限判断逻辑有问题。检查前端拿到的权限列表里有没有这个权限标识,以及按钮上的v-if判断条件写对没有。

注意:权限标识的大小写和分隔符要严格一致。system:user:add和system:User:add在程序里是两个不同的权限。建议统一用小写加冒号分隔,并且在代码里用常量而不是硬编码字符串,避免手误。

5.3 代码生成器使用中的高频问题

代码生成器用起来爽,但有几个坑几乎每个人都会踩。

第一个坑是字段类型映射错误。比如数据库里的datetime类型,生成器可能映射成Date也可能映射成LocalDateTime,取决于模板配置。如果映射成了Date,前端传过来的时间字符串可能解析失败。解决办法是在生成前检查模板里的类型映射表,确保和项目实际用的类型一致。

第二个坑是主键策略。MySQL表的主键如果是自增的,生成器要配置成对应的策略;如果是雪花算法生成的,配置又不一样。配错了会导致新增时主键为空或者重复。生成前确认一下表的主键生成方式,选对策略。

第三个坑是生成的文件覆盖了手写的代码。如果第一次生成后手动改了一些逻辑,第二次重新生成时直接覆盖,改动就丢了。正确的做法是:生成后立即提交到版本库,后续修改基于生成结果改,需要重新生成时先对比差异再合并,不要无脑覆盖。

第四个坑是前端组件路径不匹配。生成器写进菜单表的组件路径要和实际文件路径一致,否则前端动态导入时会找不到组件。生成后检查一下菜单表里的组件路径和views目录下的实际路径是否对得上。

5.4 性能与安全方面的经验提醒

后台系统虽然不像面向C端的高并发系统那样压力大,但有些性能和安全问题还是要注意。

性能方面,列表查询一定要分页。我见过有项目图省事,列表接口一次性返回全表数据,数据量小的时候没感觉,上了几万条之后页面直接卡死。脚手架默认集成了分页插件,用的时候记得在查询前调用startPage(),否则分页不生效。

另一个性能点是N+1查询。比如查用户列表时,每个用户要显示所属部门名称,如果在循环里逐个查部门,一百个用户就是一百零一次查询。正确的做法是用关联查询或者批量查询,一次把部门数据捞出来在内存里匹配。这个在数据量大的时候性能差距是数量级的。

安全方面,SQL注入是最需要防范的。用MyBatis-Plus的QueryWrapper构造条件时,不要直接把用户输入拼接到SQL片段里,要用参数化的方式。文件上传要限制文件类型和大小,并且把上传的文件存在Web根目录之外,防止被直接访问执行。接口要做频率限制,特别是登录接口,防止暴力破解。

还有一点容易被忽略:操作日志要记全。谁在什么时间做了什么操作、影响了哪些数据,这些信息在出问题时是排查的依据。脚手架的日志切面一般会自动记录增删改操作,但查询操作是否记录要看配置。建议至少把增删改和登录登出记全,查询操作视数据敏感程度决定。

6. 二次开发与扩展的实用建议

6.1 如何替换默认技术栈

脚手架虽然提供了默认的技术组合,但实际项目中经常需要替换某些组件。比如团队更熟悉PostgreSQL而不是MySQL,或者想用Sa-Token替代Spring Security做认证。替换的原则是:先理解原组件的职责边界,再找替代品,最后改配置和适配层,不要动业务代码。

以替换数据库为例,步骤是:换JDBC驱动依赖、改连接配置、改方言配置(MyBatis-Plus需要指定数据库类型)、检查SQL里有没有数据库特有的语法。如果原项目用了MySQL的LIMIT语法,换到PostgreSQL也是支持的,但如果是ON DUPLICATE KEY UPDATE这种MySQL特有的写法,就要改成PostgreSQL的ON CONFLICT。

替换认证组件相对复杂一些,因为认证和授权是穿插在拦截器、注解、工具类里的。建议的做法是保留原有的权限注解和工具类接口,只替换底层的实现。比如@PreAuthorize注解和SecurityUtils.getUserId()这些上层API不变,把底层的Token生成、校验、存储逻辑换掉。这样业务代码一行不用改,替换成本最低。

6.2 多模块与微服务的演进路径

单体脚手架用着用着,业务变复杂了,自然会考虑拆模块甚至拆服务。我的建议是不要过早拆,单体能撑住的时候就用单体。拆分的时机应该是:团队规模超过十人、不同模块的发布频率差异很大、或者某个模块的性能需求明显高于其他模块。

如果决定拆,第一步是模块化而不是微服务化。把代码按业务域分成Maven子模块,模块之间通过接口调用而不是直接依赖实现类。这一步做完,代码结构已经清晰很多了,但部署还是一个包,运维成本没增加。

第二步才是服务化。把核心业务域拆成独立服务,服务间通过HTTP或者消息队列通信。这时候脚手架里的认证鉴权要做成独立的认证服务,其他服务通过它来校验Token。分布式事务、服务发现、配置中心这些基础设施也要跟上。这一步的复杂度是数量级的提升,没有足够的运维能力不要轻易走。

6.3 团队协作中的规范约定

脚手架要在一个团队里用好,光有代码不够,还得有约定。我建议至少定下这几条规矩。

包名规范:按com.公司名.项目名.模块名的格式,模块名用业务域而不是技术层。比如com.example.erp.supplier而不是com.example.erp.controller。这样找代码的时候按业务找,而不是按技术层找,更符合人的思维习惯。

接口规范:RESTful风格,GET查、POST增、PUT改、DELETE删。接口路径用名词复数,比如/api/suppliers而不是/api/getSupplierList。统一响应格式,成功返回{code: 200, data: ..., msg: "操作成功"},失败返回对应的错误码和提示信息。

提交规范:Git提交信息写清楚做了什么,不要写"修改""更新"这种没信息量的词。建议用feat:、fix:、refactor:这样的前缀区分提交类型。代码提交前跑一遍编译和基础测试,不要提交编译不过的代码。

数据库规范:表名和字段名用小写加下划线,每张表必须有主键、创建时间、更新时间。字段注释必须写,因为代码生成器依赖注释生成中文说明。变更数据库结构时,要提供对应的迁移脚本,不要手动改完就完事。

这些规范看起来琐碎,但团队规模一上来,没有规范的话代码质量会迅速滑坡。脚手架提供的是技术底座,规范提供的是协作底座,两者缺一不可。

6.4 长期维护的注意事项

脚手架用久了,版本升级是个绕不开的问题。我的经验是:不要频繁升级,但也不要一直不升。建议每半年评估一次,看有没有安全漏洞修复或者重大功能改进,有就升,没有就等下一个周期。

升级前一定要在独立分支上做,升级完跑一遍完整的回归测试。重点测认证鉴权、权限控制、代码生成这几个核心功能,因为这些模块和框架版本耦合最紧。升级过程中遇到不兼容的API变更,优先改适配层而不是改业务代码。

另外,脚手架里的第三方依赖要定期检查有没有已知漏洞。可以用依赖扫描工具跑一下,有高危漏洞的包及时升级。这个工作看起来不起眼,但真出事的时候就是大事故。

最后一点,脚手架不是越用越旧就好,也不是越新越好。关键是找到适合团队当前阶段的版本,稳定运行,按需演进。我见过有团队为了追新版本,半年升级了三次,每次升级都引入新问题,反而拖慢了业务进度。技术选型的核心永远是服务于业务,而不是反过来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询