Features - User Management (Phase 4.1): - Database: Add user_modules table for fine-grained module permissions - Database: Add 4 user permissions (view/create/edit/delete) to role_permissions - Backend: UserService (780 lines) - CRUD with tenant isolation - Backend: UserController + UserRoutes (648 lines) - 13 API endpoints - Backend: Batch import users from Excel - Frontend: UserListPage (412 lines) - list/filter/search/pagination - Frontend: UserFormPage (341 lines) - create/edit with module config - Frontend: UserDetailPage (393 lines) - details/tenant/module management - Frontend: 3 modal components (592 lines) - import/assign/configure - API: GET/POST/PUT/DELETE /api/admin/users/* endpoints Architecture Upgrade - Module Permission System: - Backend: Add getUserModules() method in auth.service - Backend: Login API returns modules array in user object - Frontend: AuthContext adds hasModule() method - Frontend: Navigation filters modules based on user.modules - Frontend: RouteGuard checks requiredModule instead of requiredVersion - Frontend: Remove deprecated version-based permission system - UX: Only show accessible modules in navigation (clean UI) - UX: Smart redirect after login (avoid 403 for regular users) Fixes: - Fix UTF-8 encoding corruption in ~100 docs files - Fix pageSize type conversion in userService (String to Number) - Fix authUser undefined error in TopNavigation - Fix login redirect logic with role-based access check - Update Git commit guidelines v1.2 with UTF-8 safety rules Database Changes: - CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled) - ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code) - INSERT 4 permissions + role assignments - UPDATE PUBLIC tenant with 8 module subscriptions Technical: - Backend: 5 new files (~2400 lines) - Frontend: 10 new files (~2500 lines) - Docs: 1 development record + 2 status updates + 1 guideline update - Total: ~4900 lines of code Status: User management 100% complete, module permission system operational
4.4 KiB
4.4 KiB
子域名 iit.xunzhengyixue.com SSL 证书全流程配置指南 (针对 SAE/CLB 架构)
根据你的《2025版部署手册》,你的公网入口为 CLB(IP: 8.140.53.236),后端为 SAE 应用。为了满足企业微信/服务号的 HTTPS 强制要求,请严格按照以下四个阶段执行操作。
阶段一:证书申请(在你的阿里云账号操作)
- 进入控制台:登录你的阿里云账号,搜索进入 “数字证书管理服务”。
- 创建证书名额:
- 点击 “正式证书” -> “个人测试证书(免费)”。
- 点击 “创建证书”,获得一个“待申请”状态的名额(每年有 20 个免费额度)。
- 提交申请信息:
- 在对应条目点击 “证书申请”。
- 证书绑定域名:填写 iit.xunzhengyixue.com。
- 域名验证方式:必须选择“DNS 验证”。
- CSR 生成方式:选择“系统生成”。
- 获取验证信息:提交后,页面会显示 主机记录(如 _dnsauth.iit)和 记录值(一串随机长字符串)。请记录下来发给持有域名的同事。
阶段二:域名连接与验证(跨账号协作)
此阶段需要你同事在其阿里云账号(xunzhengyixue.com 持有者)下操作:
- 建立 A 记录(建立连接):
- 主机记录:iit
- 记录类型:A
- 记录值:8.140.53.236(指向你的 SAE CLB 公网 IP)
- 目的:让访问者能找到你的服务器。
- 建立 TXT 记录(证书验证):
- 主机记录:填写你从阶段一获得的 _dnsauth.iit。
- 记录类型:TXT
- 记录值:填写你发给他的那串长字符串。
- 目的:证明你对该子域名拥有控制权。
- 完成签发:同事添加成功后,回到你的证书控制台点击 “验证”。等待 10-30 分钟,状态变为“已签发”。
阶段三:SAE 部署证书(核心步骤)
等证书签发后,需要将“钥匙”挂在大门(CLB)上。
- 下载证书:在控制台点击下载,服务器类型选择 “Nginx”。解压得到 .pem(证书)和 .key(私钥)文件。
- 配置 SAE 访问设置:
- 进入 SAE 控制台 -> 应用 frontend-nginx-service -> 访问设置。
- 找到已有的公网 CLB 访问记录,点击 “修改配置”。
- 添加 HTTPS 443 监听:
- 保留原有 80 端口规则:不要删除它。
- 添加监听:
- 协议:HTTPS
- HTTPS 端口:443(标准加密端口)
- SSL 证书:选择“自定义上传”,用记事本打开那两个文件,完整复制内容贴入对应的“证书内容”和“私钥内容”框中。
- 双向认证:必须关闭 (OFF)。
- 容器端口:填写 80(对应你手册 5.2 节 Nginx 容器的端口)。
- 开启 HTTP 重定向至 HTTPS:
- 在刚才的“修改配置”弹窗中,找到 HTTP 80 那一行规则。
- 勾选下方的 “HTTP 重定向至 HTTPS” 开关。
- 目的:用户输入 http://... 会自动强制跳转到安全的 https://...。
阶段四:验证与微信端联调
- 全链路测试:
- 访问 https://iit.xunzhengyixue.com/api/v1/health。
- 若返回 JSON 且地址栏显示“小绿锁”,说明 HTTPS 链路已通。
- 微信校验文件部署:
- 从企业微信/服务号后台下载 WW_verify_xxx.txt。
- 放入前端代码的 public 目录(这样打包后会在根目录)。
- 运行 docker build 和 docker push(参考手册 11.1 节)。
- 在 SAE 点击“部署应用”更新镜像。
- 确保 https://iit.xunzhengyixue.com/WW_verify_xxx.txt 可被外部访问。
💡 避坑总结
- 端口别写错:是 443,不是 433 或其他。
- 双向认证:千万别开,开了 PI 的手机就连不上了。
- 容器端口:CLB 负责解密,解密后依然把流量发给容器的 80 端口,所以容器端口填 80 是正确的。
- 解析优先级:同事加 A 记录时,确保没有冲突的 CNAME 记录指向同一主机名 iit。
当前状态:SOP Fully Detailed | 建议:证书签发后,第一时间按“阶段三”进行 CLB 配置。