磨了半个月,再接再厉(5.11~5.21)

在留家里还是再冲北京反复横跳 磨蹭了两个礼拜 终于闭环项目基座核心 (由ChatGPT总结整理)

cursor + chatgpt + trae + gemini + 豆包 不会前端 折腾完了 真的累 ,月底前完善几个业务功能 估计就能单体项目上线了。预计6月开始并发→微服务→AI 这个路线弄。加油吧 哈哈~

一、RBAC 改造前(基础项目阶段)

1️⃣ 项目基础架构

技术栈:SpringBoot3 + JDK17 + MyBatis-Plus + PostgreSQL

工作内容:

分层架构:Controller → Service → Mapper → Entity

多环境配置(开发/测试/生产)

封装统一返回结果与全局异常处理

解决问题:

项目结构混乱、接口返回不统一、异常处理无标准

2️⃣ 用户模块

用户表设计(账号、昵称、手机号、密码)

功能:注册、登录、分页查询、编辑删除、密码重置

解决问题:缺少完整账号体系与基础用户管理能力

3️⃣ 前端工程化

技术栈:React + Vite + Ant Design

功能:

前端项目搭建

路由与后台布局

Axios 全局封装

登录页与后台管理页开发

解决问题:前后端无法联调,项目无界面

4️⃣ 安全基础

登录拦截器 + CORS + 接口白名单/黑名单

实现未登录接口拦截和跨域配置

解决问题:接口裸露、未授权访问

5️⃣ 接口防刷

Redis + AOP + 自定义限流注解

功能:登录/注册接口限流、防止高频请求

解决问题:防止暴力破解密码、接口高频浪费资源

6️⃣ 登录体系升级

Token + Redis 无状态登录

弃用 Session

登录生成唯一 Token

Redis 存储 Token

拦截器统一校验

支持退出登录、Token 失效

解决问题:Session 扩展性差、状态丢失、登录统一管理难

7️⃣ 前端登录态适配

Axios 拦截器 + Token 持久化

请求自动携带 Token

Token 失效自动跳转登录页

前端统一处理登录状态

解决问题:前后端登录状态不一致、权限控制混乱

8️⃣ 部署上线

Linux + 宝塔面板 + JDK17

项目部署、守护进程、日志管理

解决问题:项目上线环境配置、服务稳定运行

二、RBAC 改造阶段(权限闭环 + 双 Token 完整体系)

1️⃣ 权限体系设计

数据库表:

sys_user、sys_role、sys_permission

关联表:sys_user_role, sys_role_permission

支持动态分配角色和权限

支持超级管理员与普通管理员区分

2️⃣ 后端权限管理

接口权限注解:@RequiresPerm

安全配置:

SecurityConfig 配置 Spring Security

JwtAuthenticationFilter 拦截请求并校验 Token

JwtUtil 生成/解析 Token

接口限流:RateLimit + Redis

操作日志记录:OperationLog

异常处理:GlobalExceptionHandler + BusinessException + ResultCode

接口文档:Knife4jConfiguration

3️⃣ 前端权限管理

权限标识文件:permissions.ts

权限动态渲染:

动态菜单

按钮权限控制

前端路由守卫

全局状态管理:

使用 Zustand 存储当前用户权限

组件通过订阅状态动态渲染权限

支持权限动态刷新和多组件共享

4️⃣ 双 Token + Token 安全

Access Token(短期)+ Refresh Token(长期)

Token 无感续期(自动刷新)

强制下线 / 账号封禁

Redis 管理在线 Token

登录/刷新/登出接口完善

5️⃣ CRUD 功能完善

用户管理、角色管理、权限管理、菜单管理

支持增删改查

确保前后端权限闭环、接口访问控制可追踪

当前项目闭环

用户登录

├─> Token 校验(Access + Refresh, Redis)

├─> RBAC 权限加载

│ ├─ 用户-角色

│ ├─ 角色-权限

│ └─ 更新前端 Zustand 全局状态

├─> 前端请求接口

│ ├─ JWT 校验 Token

│ ├─ 接口权限注解校验

│ └─ RateLimit 限流控制

├─> 操作结果

│ ├─ ResultCode 返回统一状态

│ ├─ OperationLog 记录

│ └─ 异常由 GlobalExceptionHandler 捕获

└─> 前端动态渲染菜单/按钮/路由(Zustand 状态驱动)

ChatGPT Image 2026年5月21日 21_05_45.png

Zustand 权限改造总结

1️⃣、改造前旧方案(Context 全局状态)

权限数据来源:登录仅拿令牌,页面加载后调用 /auth/current 接口获取用户 + 权限

存储方式:React Context 上下文全局挂载权限、用户信息

权限判断:组件内读取 Context 值,校验权限编码控制按钮 / 路由

痛点:

Context 层级嵌套多,组件层层透传,性能一般

页面刷新依赖二次接口拉取权限

状态读写繁琐,多组件共享状态逻辑臃肿

2️⃣、改造后新方案(Zustand 状态管理)

权限数据来源:登录接口直接一并返回权限数组

存储方式:摒弃 Context,改用 Zustand 独立仓库统一存储权限

权限判断:封装通用权限 Hook,从 Zustand 仓库取值校验

原 /auth/current 接口:仅用来获取用户基础资料,不再读取权限字段

3️⃣、核心改造步骤

新建 Zustand 仓库

创建 auth 状态仓库,定义权限数组、修改权限的方法,全局统一管理权限状态

登录页逻辑调整

登录成功后,直接从响应里取出 permissions 权限列表

调用仓库方法存入 Zustand,页面首次进入就完成权限初始化

布局页面精简逻辑

保留 /auth/current 获取昵称、头像、角色 ID 等基础信息

删除从该接口读取权限的代码,不再二次赋值权限

权限判断逻辑替换

所有按钮、路由权限校验处,从读取 Context 改为调用封装好的 Zustand 权限 Hook

路由适配修复

修正路由权限读取报错

权限编码直接匹配仓库数据,解决白屏、按钮隐藏问题

4️⃣ 、改造前后对比

对比项 旧 Context 方案 新 Zustand 方案

权限获取 登录后二次接口拉取 登录一次性获取存入状态

状态共享 嵌套透传,耦合度高 独立仓库,任意组件直接取值

刷新体验 刷新重发接口拿权限 登录已存权限,无需重复请求

代码简洁度 层级冗余 逻辑轻量化,读写简单

接口改动 无需改接口 后端登录接口附带权限即可,原接口无需删减字段

5️⃣、最终运行流程

用户登录 → 后端返回令牌 + 用户信息 + 完整权限

前端登录页 → 将权限存入 Zustand 仓库

进入主页布局 → 仅拉取用户基础资料,不处理权限

页面 / 按钮渲染 → 调用 Hook 读取仓库权限,自动判断展示与否

退出登录 → 清空 Zustand 权限与本地缓存,跳转登录页

ChatGPT Image 2026年5月22日 13_49_47.png

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP