架构设计
通过三张图理解脚手架的整体拓扑、登录认证流程与权限模型
整体架构拓扑图
多端单仓 · 共享基础设施 · Docker 编排,三端独立部署共享同一套后端
📋 部署要点
- 三端独立部署:管理后台、API、Web 各一个 Nginx 容器,端口分离(18113/18114/18115),互不影响
- 共享基础设施:MySQL 与 Redis 由
docker/docker-sites/common独立部署,多项目共享 - web-network:所有容器接入同一 Docker 网络,通过容器名互访(如
common-mysql) - 源码 bind mount:
../backend:/var/www/app与../web/dist:/usr/share/nginx/html挂载,无需构建镜像
登录认证时序图
JWT 多密钥 + 设备指纹 + 401 刷新队列,完整的鉴权链路
401 刷新队列:单例锁
isRefreshing + requestQueue,并发 401 合并为一次刷新,避免重复请求。管理后台(axios)与小程序(uni.request)均实现此机制。 📄 关键文件
中间件
backend/app/middleware/AuthMiddleware.phpJWT 服务
backend/app/common/service/JwtService.php缓存服务
backend/app/common/service/CacheService.php前端刷新队列
wechat-miniprogram/api/request.js权限模型 ER 图
RBAC 四要素 + 部门隔离 + 直接授权,最终权限 = 角色权限 ∪ 直接授权
🔐 权限计算公式
- 最终权限 = 角色权限 ∪ 直接授权权限
PermissionMiddleware用in_array($permissionCode, $activePermissionCodes)校验- 权限码缓存键
user:perm_codes:{userId},1 小时过期,角色/直接权限变更时主动清理 - 直接授权仅限
can_direct_assign = 1的权限(如 feedback:view / feedback:delete) - 登录时按
is_default = 1的部门-角色构建active_*字段,可通过切换部门变更
关键文件
backend/app/common/traits/HasPermissions.php