Flutter
- 用户登录之后,通过后端获取当前用户的角色&权限列表,根据所有权限判断是否展示页面中的某些按钮(可跳转到相应页面)。
Golang
- 所有的接口都要绑定所需权限permission string,除了登录,获取当前登录的用户信息,动态菜单或页面展示控制
类型 | 说明 |
---|---|
登录 | 通常放行,不验证权限(只验证身份JWT) |
获取当前登录用户信息 | 用于前端展示,不做权限限制 |
动态菜单或页面展示控制:登录后返回“用户拥有的权限集”,由前端根据权限判断决定显示什么页面、按钮
|–本质上是前端展示逻辑,但必须由后端控制
|–要控制每个角色权限范围内能看到的菜单以及页面
|–所以,后端要根据用户角色返回一个菜单结构树给前端–>前端根据这个结构展示不同的页面入口
- 🚀 性能优化建议
即使“每个接口都鉴权”,仍然可以做到高性能运行,前提是:
优化点 |
---|
✅ JWT 解码用高效库(如 github.com/golang-jwt/jwt/v5) 解码+校验快 |
✅ gorbac 结构在程序启动时加载,不用每次查库 全部在内存中 |
✅ 权限中间件结构简洁 只做角色-权限的判断 |
✅ 数据读取按需分页 避免一次读太多 |
✅ 可设置 JWT 缓存时间长一点(如 2 小时) 减少重新登录频率 |
管理员角色 - admin(系统超级管理员,拥有所有权限)
主管角色 - manager - [部门代码]_manager(管理本部门所有工序及操作员)
角色名 对应部门 dye_manager 印染部门 strap_manager 拉带部门 fixture_manager 装夹部门 qc_manager 检验部门 无主管,只有操作员operator 打包部门 操作员角色 - operator - [部门代码]_[工序代码]_operator / [部门代码]_operator(仅限本工序的操作权限)
①印染部门(dye)角色名 对应工序 dye_calender_operator 压光工序 dye_lamination_operator 覆膜工序 dye_printing_operator 印染工序 dye_fabric_check_operator 验布工序 dye_cutting_operator 分切工序 ②拉带部门(strap) —无工序划分
角色名 说明 strap_operator 拉带部门统一操作员 ③装夹部门(fixture)
角色名 对应工序 fixture_assembly_operator 装夹整理工序 fixture_heat_operator 加热工序(平台&烘箱) ④检验部门(qc)
角色名 对应工序 qc_inspection_operator 检验工序 qc_repair_operator 检修工序 ⑤打包部门(pack) —无工序划分
角色名 说明 pack_operator 打包部门统一操作员
GET /api/workorders?process=印染&status=unassigned
Authorization: Bearer <JWT>
| 【前端】用户输入账号密码 → 发送 /login → 后端验证成功,返回 JWT
↓ 【前端】保存 JWT
↓ 【前端】每次访问 /api/xxx 时加上 Authorization: Bearer
↓ 【后端】中间件解析 JWT,知道你是谁、有什么权限
↓ 【后端】返回你该看到的工单数据
- 对于工单信息的访问接口权限控制:
路径 说明 权限 GET /api/orders/my-status 当前登录用户自己的工单状态 登录状态(无RBAC) GET /api/orders/group-status 当前用户所在组内的所有工单状态(主管用) 需RBAC权限 GET /api/orders/all-status 所有部门所有工单状态(管理员或调度员使用) 管理员级 RBAC 权限
├ MES/
├── cmd/
│ └── main.go # 项目启动入口,只负责初始化服务和加载路由(保持极简)
│
├── internal/ # 项目内部业务模块,分层结构,禁止外部直接访问(Go module机制)
│ ├── auth/
│ │ └── middleware.go # 鉴权中间件,负责JWT身份认证 + RBAC权限控制
│ │
│ ├── admin/
│ │ └── user_handler.go # 管理员接口实现,如添加用户、修改角色、重置密码等
│ │
│ ├── model/
│ │ └── user.go # 用户结构体定义(GORM模型)+ JSON映射标签
│ │ # 可包含基本校验、表名绑定、字段约束等
│ │
│ ├── repo/
│ │ └── user_repo.go # 用户相关的数据访问层,封装具体的数据库操作逻辑(如增删改查)
│ │ # 与业务逻辑解耦,便于复用与单元测试
│ │
│ ├── rbac/
│ │ └── loader.go # 角色权限配置加载(从JSON/数据库/硬编码加载角色权限映射)
│ │ # 用于初始化 gorbac 权限模型
│ │
│ ├── db/
│ │ └── mysql.go # 数据库连接初始化(GORM配置、连接池、日志、错误处理等)
│ │ # 通常在 main 中初始化一次,供全局使用
│ │
│ └── router/ # 所有路由的集中注册(推荐拆分各模块路由并集中注册)
│ └── router.go # 统一管理各模块的路由挂载,避免 main.go 路由混乱
│
├── config/
│ └── config.go # 应用配置加载(支持YAML、JSON、env等)
│ # 存储数据库连接信息、JWT密钥、端口号等
│
├── utils/
│ └── jwt.go # 工具类函数(如生成/解析JWT、加密、字符串处理等)
│
├── go.mod # Go模块管理文件,声明项目依赖和模块名
├── go.sum # 依赖校验和文件,确保构建一致性
MES需求分析
🔐 登录与权限控制
登录方式:普通用户通过手机号 + 密码登录。
注册方式:普通用户不能注册,只能由管理员添加用户。
登录认证:使用 JWT 进行身份鉴权,登录成功后返回 Token。
权限验证:集成 gorbac 控制角色权限,自动加载权限配置。
🧑💼 用户管理(管理员操作)
添加用户:管理员可以创建用户并设定角色。
修改用户:管理员可以修改用户名、角色、状态等信息。
删除用户:管理员可以禁用或删除普通用户账号。
重置密码:管理员可以为用户重置密码。
🛡️ 角色与权限管理(管理员操作)
角色配置:管理员可以新增、编辑、删除角色。
权限配置:为每个角色配置具体的权限(资源名 + 动作)。
gorbac 自动加载角色权限配置:从数据库或配置文件加载。
📦 项目结构(Go 后端)
按角色模块划分(如 admin/manager/operator)
JWT 登录、认证中间件模块
RBAC 权限加载与判断模块
User、Role、Permission 的数据库模型
MySQL 数据库初始化脚本
🌐 前端(Flutter)
登录页:手机号 + 密码登录
权限控制:根据用户权限动态展示页面组件(页面级控制)
用户管理页面:显示用户列表 + 新增用户 + 修改角色权限等功能
角色权限配置页:角色列表 + 权限勾选界面