You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

326 lines
17 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 系统配置
> 模块编码system
> 端侧Web专属仅超级管理员
> 关联文档01-模块划分 §2.3 / 02-功能清单-超级管理员 §3 / 03-业务流转逻辑-超级管理员 §9 / 05-接口规范 §9.2 / 06-项目技术要求 §8.3~8.4
> 强制规范遵循 `07-前端界面开发规范.md`
## 功能概览
| 项目 | 说明 |
|------|------|
| 菜单名称 | 系统配置 |
| 子菜单 | 系统版本管理、缓存管理 |
| 功能编号 | SA-S-01 ~ SA-S-02 |
| 权限编码前缀 | system:version:* / system:cache:* |
---
## 页面1系统版本管理页
**页面编号**SA-S-01-P01
**端侧归属**Web专属
**页面路径**/system/versions
### 界面布局
```
┌──────────────────────────────────────────────────────────────────┐
│ [面包屑] 系统配置 > 系统版本管理 │
├──────────────────────────────────────────────────────────────────┤
│ [当前版本信息卡片] │
│ ┌──────────────────────┐ ┌──────────────────────┐ │
│ │ 管理后台版本 │ │ 小程序版本 │ │
│ │ 当前版本v1.2.0 │ │ 当前版本v1.1.0 │ │
│ │ 最低兼容v1.0.0 │ │ 最低兼容v1.0.0 │ │
│ │ 发布日期2026-04-01 │ │ 发布日期2026-03-15 │ │
│ └──────────────────────┘ └──────────────────────┘ │
├──────────────────────────────────────────────────────────────────┤
│ [操作栏] [新增版本] │
├──────────────────────────────────────────────────────────────────┤
│ [列表区] │
│ 序号 | 版本号 | 端侧 | 最低兼容版本 | 是否强制更新 | 发布日期 | 操作 │
│ 1 | v1.2.0 | Web | v1.0.0 | 否 | 2026-04-01| 编辑│
│ 2 | v1.1.0 | 小程序 | v1.0.0 | 否 | 2026-03-15| 编辑│
│ 3 | v1.0.0 | 小程序 | v1.0.0 | 是 | 2026-01-01| — │
├──────────────────────────────────────────────────────────────────┤
│ [分页] 共5条 │
└──────────────────────────────────────────────────────────────────┘
```
### 查询条件
| 字段名 | 控件类型 | 必填 | 默认值 | 说明 |
|--------|----------|------|--------|------|
| — | — | — | — | 无筛选条件,展示全部版本 |
### 列表字段
| 序号 | 字段名 | 列宽 | 支持排序 | 说明 |
|------|--------|------|----------|------|
| 1 | 序号 | 60px | — | 自增 |
| 2 | 版本号 | 100px | 是 | 语义化版本号 |
| 3 | 端侧 | 80px | 否 | Web/小程序 |
| 4 | 最低兼容版本 | 120px | 否 | 低于此版本需强制更新 |
| 5 | 是否强制更新 | 110px | 否 | 是(红色)/否(绿色) |
| 6 | 发布日期 | 120px | 是 | 默认倒序 |
| 7 | 更新说明 | 200px | 否 | 简述本次更新内容 |
| 8 | 操作 | 80px | — | 编辑 |
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 新增版本 | system:version:create | 操作栏 | 始终 | 弹窗 |
| 编辑 | system:version:update | 行操作 | 始终 | 弹窗 |
### 表单字段(新增/编辑弹窗)
| 字段名 | 控件类型 | 必填 | 默认值 | 数据来源 | 校验规则 |
|--------|----------|------|--------|----------|----------|
| 版本号 | 文本输入 | 是 | — | 自填 | 语义化版本格式(x.y.z) |
| 端侧 | 下拉单选 | 是 | — | 固定选项 | Web/小程序 |
| 最低兼容版本 | 文本输入 | 是 | — | 自填 | 语义化版本格式 |
| 是否强制更新 | 开关 | 是 | 否 | — | 强制更新时用户无法跳过 |
| 更新说明 | 多行文本 | 是 | — | 自填 | 最大500字 |
### 通知触发
| 触发操作 | 通知对象 | 通知方式 | 消息模板 | 文档来源 |
|----------|----------|----------|----------|----------|
| 版本发布 | 小程序用户 | 小程序检测 | 下次启动时检测版本更新 | 03-小程序端 §10 / 06 §8.3 |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 列表查询 | /api/v1/system/versions | GET | — |
| 新增 | /api/v1/system/versions | POST | — |
| 编辑 | /api/v1/system/versions/{id} | PUT | — |
| 获取最新版本 | /api/v1/system/versions/latest | GET | 小程序启动时调用 |
### 交互流程要求
1. **页面加载流程**
- 进入页面 → 并行调用:当前版本信息卡片数据 + 版本列表数据
- 卡片数据优先渲染
2. **操作流程**
- **新增版本**:点击"新增版本"→ 弹出表单弹窗 → 填写版本信息 → 保存 → 刷新列表和卡片
- **编辑**:点击行"编辑"→ 弹出表单弹窗(回填数据)→ 修改 → 保存 → 刷新列表和卡片
3. **弹窗交互**
- 新增/编辑共用一个 `el-dialog` 弹窗
- 保存成功后弹窗关闭,列表刷新
4. **异常处理**
- 版本号格式校验失败 → 字段下方红色提示
- 版本号已存在 → 提示"该版本号已存在"
- 新增版本后小程序端自动检测更新
5. **权限控制交互**
-`system:version:create` → "新增版本"按钮不渲染
-`system:version:update` → 行"编辑"按钮不渲染
6. **[H1]防重复请求**(列表页)
- 行内操作按钮点击后整行操作禁用 + loading态
- 分页切换 abort上一请求后再发新请求
7. **[H2]超时与加载反馈**(列表页)
- 列表查询 timeout=15秒写操作(新增/编辑) timeout=30秒
- 超时 → ElMessage.error("请求超时,请稍后重试") + 按钮恢复
- 加载>2秒显示全局ElLoading
8. **[H3]操作确认机制**
- 版本发布无需额外确认(弹窗内已有保存按钮)
9. **[H8]操作结果反馈**
- 成功 ElMessage.success(2s) → silent刷新
- 失败 ElMessage.error(0手动关闭)
10. **[H1]防重复请求**(弹窗内保存按钮)
- 保存按钮 :loading + disabledAPI返回后恢复
11. **[H2]超时与加载反馈**(弹窗内提交)
- 弹窗内提交 timeout=30秒
12. **[H4]脏数据检测**(编辑模式弹窗)
- 弹窗打开时记录快照
- 关闭弹窗/点击取消时 isDirty 检测 → 确认提示"修改尚未保存,确定关闭吗?"
13. **[H8]操作结果反馈**(弹窗)
- 保存成功 → 关闭弹窗 → 刷新列表
- 保存失败 → 弹窗保持打开,错误提示
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 版本信息卡片 | el-card | shadow="hover", :body-style="{padding:'20px'}" |
| 当前版本号 | div | font-size=20px, font-weight=bold |
| 版本列表 | el-table | stripe, border, v-loading |
| 端侧标签 | el-tag | Web:type="primary", 小程序:type="success" |
| 强制更新标签 | el-tag | 是:type="danger", 否:type="success" |
| 新增/编辑弹窗 | el-dialog | width="500px", :close-on-click-modal=false |
| 版本号输入 | el-input | placeholder="x.y.z格式", clearable |
| 端侧下拉 | el-select | :options="[{label:'Web',value:'web'},{label:'小程序',value:'miniapp'}]" |
| 强制更新开关 | el-switch | active-text="是", inactive-text="否" |
| 更新说明 | el-input | type="textarea", :rows=4, maxlength=500, show-word-limit |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 版本号 | 必填, 语义化格式(/^\d+\.\d+\.\d+$/) | "请输入版本号" / "版本号格式为x.y.z" |
| 端侧 | 必填 | "请选择端侧" |
| 最低兼容版本 | 必填, 语义化格式 | "请输入最低兼容版本" / "版本号格式为x.y.z" |
| 更新说明 | 必填, 最大500字符 | "请输入更新说明" / "更新说明不能超过500字符" |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 版本卡片一行两个;列表完整展示所有列 |
| 1024-1279pxPad横屏 | 版本卡片一行两个;"更新说明"列隐藏 |
| 768-1023pxPad竖屏 | 版本卡片一行一个(全宽);列表仅显示:序号、版本号、端侧、是否强制更新、操作
---
## 页面2缓存管理页
**页面编号**SA-S-02-P01
**端侧归属**Web专属
**页面路径**/system/cache
### 界面布局
```
┌──────────────────────────────────────────────────────────────────┐
│ [面包屑] 系统配置 > 缓存管理 │
├──────────────────────────────────────────────────────────────────┤
│ [缓存状态概览] │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Redis状态● 已连接 内存使用128MB/512MB 连接数24 │ │
│ └────────────────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────────┤
│ [缓存模块列表] │
│ 模块名称 | 缓存键前缀 | 缓存条数 | 最后更新时间 | 操作 │
│ 权限缓存 | perm:* | 1,234 | 10:30:25 | [清理] │
│ 字典缓存 | dict:* | 56 | 09:00:00 | [清理] │
│ 菜单缓存 | menu:* | 120 | 09:00:00 | [清理] │
│ 业务缓存 | biz:* | 0 | — | [清理] │
├──────────────────────────────────────────────────────────────────┤
│ [操作栏] [全部清理] │
└──────────────────────────────────────────────────────────────────┘
```
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 清理(单模块) | system:cache:update | 行操作 | 始终 | 二次确认后清理指定模块缓存 |
| 全部清理 | system:cache:update | 操作栏 | 始终 | 二次确认后清理全部缓存 |
### 缓存模块说明
| 模块 | 缓存键前缀 | 过期策略 | 刷新机制 | 文档来源 |
|------|------------|----------|----------|----------|
| 权限缓存 | perm:* | 2小时TTL | 权限变更时实时刷新Redis Pub/Sub | 06 §5.3 / 03-超级管理员 §9 |
| 字典缓存 | dict:* | 24小时TTL | 字典变更时手动/自动刷新 | 06 §5.3 |
| 菜单缓存 | menu:* | 24小时TTL | 菜单变更时手动/自动刷新 | 06 §5.3 |
| 业务缓存 | biz:* | 按需懒加载 | 不缓存,实时查询 | 06 §5.3 |
### 通知触发
| 触发操作 | 通知对象 | 通知方式 | 消息模板 | 文档来源 |
|----------|----------|----------|----------|----------|
| 缓存清理 | 在线用户 | WebSocket推送 | 提示刷新页面 | 03-超级管理员 §9 |
| 权限缓存清理 | 在线用户 | Redis Pub/Sub | 刷新权限缓存 | 03-超级管理员 §9 |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 缓存状态 | /api/v1/system/cache/status | GET | Redis连接状态+各模块缓存统计 |
| 清理单模块 | /api/v1/system/cache/clear/{module} | POST | 清理指定模块缓存 |
| 全部清理 | /api/v1/system/cache/clear-all | POST | 清理全部缓存 |
### 交互流程要求
1. **页面加载流程**
- 进入页面 → 并行调用:缓存状态概览(`GET /api/v1/system/cache/status`+ 缓存模块列表
- 概览数据优先渲染
2. **操作流程**
- **清理单模块**:点击行"清理"→ 二次确认("确认清理XX缓存清理后相关数据将从数据库重新加载")→ 调用API → 成功提示 → 刷新缓存状态
- **全部清理**:点击"全部清理"→ 二次确认("确认清理全部缓存?所有在线用户将收到刷新提示")→ 调用API → 成功提示 → 刷新缓存状态
3. **缓存状态实时更新**
- 清理操作完成后自动刷新状态概览和模块列表
- 支持手动刷新(页面顶部刷新按钮)
4. **异常处理**
- Redis连接断开 → 状态概览显示"● 未连接"红色标识,清理按钮禁用
- 清理失败 → 提示错误信息
5. **权限控制交互**
-`system:cache:update` → 所有清理按钮不渲染
6. **[H1]防重复请求**
- 行内清理按钮点击后整行操作禁用 + loading态
- "全部清理"按钮点击后 disabled + loading态API返回后恢复
7. **[H2]超时与加载反馈**
- 写操作(缓存清理) timeout=30秒
- 超时 → ElMessage.error("请求超时,请稍后重试") + 按钮恢复
- 加载>2秒显示全局ElLoading
8. **[H3]操作确认机制**
- 缓存清理ElMessageBox.confirm("确认清理XX缓存清理后相关数据将从数据库重新加载", { type: 'warning' })
- 全部清理ElMessageBox.confirm("确认清理全部缓存?所有在线用户将收到刷新提示", { type: 'error' })
9. **[H8]操作结果反馈**
- 成功 ElMessage.success(2s) → silent刷新
- 失败 ElMessage.error(0手动关闭)
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| Redis状态指示 | el-badge | 已连接:type="success", 未连接:type="danger" |
| 内存使用 | el-progress | :percentage, :stroke-width=10, :color |
| 缓存模块列表 | el-table | stripe, :show-header=true |
| 缓存条数 | el-statistic | :value, 千分位格式化 |
| 清理按钮(行) | el-button | type="danger", link, size="small", icon="Delete" |
| 全部清理按钮 | el-button | type="danger", icon="Delete", plain |
| 刷新按钮 | el-button | icon="Refresh", circle |
### 校验规则
无表单校验(操作类页面)
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 状态概览一行展示;缓存模块列表完整展示 |
| 1024-1279pxPad横屏 | 状态概览一行展示;"最后更新时间"列隐藏 |
| 768-1023pxPad竖屏 | 状态概览竖向堆叠;缓存模块列表仅显示:模块名称、缓存条数、操作
---
## 需求追溯
| 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 |
|------------|----------|----------|----------|----------|
| SA-S-01 | 系统版本管理 | 02-超级管理员 §3 / 03-超级管理员 §9 | 版本发布→小程序检测更新 | 小程序端版本更新提示(MP-C-05) |
| SA-S-02 | 缓存管理 | 02-超级管理员 §3 / 03-超级管理员 §9 | 清理缓存→通知在线用户刷新 | 权限管理(权限缓存清理) / 物业系统配置(字典缓存) |
## 业务规则
1. **版本更新策略**小版本更新提示用户可选更新大版本更新低于最低兼容版本强制更新来源03-小程序端 §10 / 06 §8.3
2. **SDK依赖校验**小程序启动时校验蓝牙SDK、微信SDK等关键依赖版本来源03-小程序端 §10
3. **缓存自动清理**系统启动时自动全量清理缓存权限变更时定向清理权限缓存来源03-超级管理员 §9 / 06 §8.4
4. **缓存手动清理**超级管理员可按模块清理缓存清理后通知在线用户刷新页面来源03-超级管理员 §9
5. **权限缓存TTL降级**Redis连接断开时权限缓存2小时TTL到期后自动刷新来源06 §3.1