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.
haoliang-net/docs/02-前端全局规范.md

633 lines
26 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.

# CNC机床数据采集系统 - 前端全局规范
> 最后更新2026-04-25
> 状态:设计中
---
## 说明
本文档为**全局规范汇总**,定义所有页面通用的技术规则。各模块的页面设计(布局、字段、交互流程等)见 `docs/02-功能清单/管理后台/``docs/02-功能清单/大屏/` 对应模块子文件。
---
## 全局规范
### 组件规范
| 组件 | 用途 | 配置参数 |
|------|------|---------|
| el-table | 列表展示 | border, stripe, size=default, header-cell-style背景#f5f7fa+居中, cell-style居中 |
| el-table-column | 列定义 | show-overflow-tooltip=true 默认开启, 所有列居中对齐 |
| el-pagination | 分页 | page-sizes=[20,50,100], background=true, layout=total,sizes,prev,pager,next,jumper |
| el-form | 表单 | label-width=120px, label-position=right, size=default |
| el-dialog | 弹窗 | close-on-click-modal=false, close-on-press-escape=true, destroy-on-close=true |
| el-select | 下拉 | filterable=true, clearable=true |
| el-date-picker | 日期 | type=daterange, value-format=YYYY-MM-DD, clearable=true |
| el-input | 输入 | clearable=true, maxlength按字段定义 |
| el-button | 按钮 | size=default, 操作类type=primary, 危险类type=danger |
| el-message | 轻提示 | 成功success, 失败error, 警告warning |
| el-message-box | 确认框 | type=warning |
| el-tag | 状态标签 | size=small, 按状态配color |
| el-tooltip | 提示 | placement=top |
### el-table 列宽均分规则
- **禁止使用固定 `width`**:所有 `el-table-column` 不设置 `width` 属性,由浏览器自动按内容均分剩余空间
- **操作列例外**:最右侧操作列(如"操作"列)可设置固定 `width`如180px其余列不设置
- **需要最小宽度的列**:使用 `min-width` 替代 `width`(如长文本列 `min-width=150`
- **排序/索引列例外**:序号列可设 `width=60`,选择框列可设 `width=50`
- **目标效果**:除操作列/序号列/选择框列外的所有数据列自动撑满表格宽度,无空白区域
### 操作按钮统一布局规则
- **所有操作按钮统一放在列表上方**:增删改查、批量操作、导出等按钮均在搜索栏下方、表格上方的一排区域内
- **按钮排列顺序**(从左到右):主操作(新增)→ 批量操作(批量删除/批量标记等)→ 其他操作(导出等)
- **禁止使用下方浮出条**:不再使用表格底部浮出条(`position: sticky`)放置批量操作按钮
- **批量操作按钮的显示条件**:选中行数>0时才显示按钮文本含数量如"批量删除(3)"
- **行内操作列**:每行右侧的操作列(编辑/删除/查看等)保留在表格最后一列不变
- **操作列按钮风格统一**:行内操作按钮统一使用 `el-button link` 类型,主操作(编辑/查看)`type=primary`,危险操作(删除)`type=danger`,其他操作(启用/停用)`type=primary`
- **操作列不换行**:操作列设置 `white-space: nowrap`,确保所有按钮在一行内显示,不因宽度不足换行
### 防重复请求
- 所有写操作按钮点击后立即loading=true+disabled=true
- 请求锁requestLock指令同一按钮1秒内不可重复点击
- axios拦截器相同URL+参数的请求500ms内自动去重
### 超时与加载反馈
- API超时30秒(可配置)
- 列表页v-loading指令
- 弹窗提交按钮loading+弹窗内遮罩
- 超时提示el-message error
### 操作确认机制
- 删除:确定删除【{name}】?此操作不可恢复。
- 停用/启用:确定{操作}
- 批量操作:确定对选中的{N}项执行{操作}
- 产量修正:确定修正产量?修正后将记录审计日志。
### 脏数据检测
- 编辑弹窗关闭时:若表单有未保存修改,弹出确认
- 表单组件内维护isDirty状态对比初始值与当前值
- 路由切换时beforeRouteLeave守卫
### 操作结果反馈
| 场景 | 反馈方式 | 持续时间 |
|------|---------|---------|
| 创建成功 | el-message success {资源}创建成功 | 3秒 |
| 修改成功 | el-message success 保存成功 | 3秒 |
| 删除成功 | el-message success {资源}已删除 | 3秒 |
| 操作失败 | el-message error {具体错误信息} | 5秒 |
| 批量操作 | el-message info 已{操作}{N}项 | 3秒 |
### 校验规则
| 字段类型 | 规则 | 错误提示 | 触发时机 |
|---------|------|---------|---------|
| 必填 | required | 此项为必填 | blur |
| IP地址 | pattern正则 | 请输入正确的IP地址 | blur |
| URL | pattern正则 | 请输入正确的HTTP地址 | blur |
| 数字 | type:number | 请输入数字 | blur |
| 正整数 | pattern正则 | 请输入正整数 | blur |
| 长度限制 | maxlength | 最多{N}个字符 | input |
| 编码唯一 | async validator API调用 | 此{字段}已存在 | blur |
### Mock数据规格
成功响应: code=0, message=success, data=对象
分页列表: code=0, data={items:[], total:160, page:1, pageSize:20}
失败响应: code=40001, message=具体错误, data=null
### 空状态设计
| 场景 | 展示 |
|------|------|
| 列表无数据 | el-empty description=暂无数据 image-size=120 |
| 查询无结果 | el-empty description=未找到匹配的数据,请调整查询条件 |
| 图表无数据 | 居中显示暂无数据灰色文字 |
### 错误码处理
| 错误码 | 含义 | 前端处理 |
|--------|------|---------|
| 0 | 成功 | 正常处理data |
| 40001 | 参数校验失败 | el-message error显示message |
| 40002 | 资源不存在 | el-message warning+刷新列表 |
| 40003 | 资源已存在 | el-message error+聚焦冲突字段 |
| 40101 | Token无效/过期 | 清除Token跳转登录页 |
| 50001 | 服务器内部错误 | el-message error服务器错误 |
| 50002 | 采集服务不可达 | el-message warning采集服务未响应 |
### 管理后台Layout
```
┌──────────────────────────────────────────────────────────┐
│ [顶部栏] height=48px │
│ 左系统名称「CNC机床数据采集系统」 │
│ 右:管理员 ▼ → [修改密码] [退出登录] │
├────────┬─────────────────────────────────────────────────┤
│ [侧边栏]│ [内容区] padding=20px │
│ width= │ │
│ 200px │ │
│ │ │
│ 仪表盘 │ │
│ 设备管理│ │
│ 品牌模板│ │
│ 采集地址│ │
│ 员工管理│ │
│ 产量报表│ │
│ 告警中心│ │
│ 系统设置│ │
│ 操作日志│ │
│ 大屏配置│ │
├────────┤ │
│ [折叠] │ │
└────────┴─────────────────────────────────────────────────┘
```
**顶部栏规范:**
- 高度48px背景色#409EFFElement Plus primary文字白色
- 左侧系统名称font-size=16pxfont-weight=bold
- 右侧管理员下拉菜单el-dropdowntrigger=click
- [修改密码]打开修改密码弹窗见09-系统设置)
- [退出登录]:确认"确定退出登录?" → 清除Token → 跳转/login
**侧边栏规范:**
- 宽度200px可折叠至64px仅图标
- 折叠按钮底部el-icon Fold/Expand
- 菜单项el-menubackground=#304156text=#bfcbd9active-text=#409EFF
- 当前路由自动高亮,使用 el-menu 的 default-active 绑定当前路由path
- 菜单项无子菜单(均为一级),无折叠子菜单
**侧边栏菜单项与路由映射:**
| 菜单名称 | 路由 | 图标(el-icon) |
|---------|------|-------------|
| 仪表盘 | /dashboard | Odometer |
| 设备管理 | /machine | Monitor |
| 品牌模板 | /brand | PriceTag |
| 采集地址 | /collect-address | Link |
| 员工管理 | /worker | User |
| 产量报表 | /production | DataAnalysis |
| 告警中心 | /alert | Bell |
| 系统设置 | /settings | Setting |
| 操作日志 | /log | Document |
| 大屏配置 | /screen-config | Monitor |注意与设备管理图标不同用View或FullScreen
**内容区规范:**
- padding=20px
- 最大宽度不限(全宽)
- 背景#f0f2f5
- 面包屑在内容区顶部,非顶部栏中
### 路由总表
| 路由 | 组件 | 权限 | 需Token | 重定向/备注 |
|------|------|------|---------|------------|
| /login | LoginPage | 无 | 否 | 登录页独立Layout无侧边栏 |
| / | Layout | admin | 是 | 管理后台框架,重定向→/dashboard |
| /dashboard | DashboardPage | admin | 是 | 嵌套在Layout内 |
| /machine | MachineListPage | admin | 是 | 嵌套在Layout内 |
| /machine/:id | MachineDetailPage | admin | 是 | 嵌套在Layout内 |
| /brand | BrandListPage | admin | 是 | 嵌套在Layout内 |
| /brand/create | BrandEditPage | admin | 是 | 新增品牌 |
| /brand/:id/edit | BrandEditPage | admin | 是 | 编辑品牌(复用同一组件) |
| /collect-address | CollectAddressListPage | admin | 是 | 嵌套在Layout内 |
| /collect-address/:id | CollectAddressDetailPage | admin | 是 | 嵌套在Layout内 |
| /worker | WorkerListPage | admin | 是 | 嵌套在Layout内 |
| /worker/:id | WorkerDetailPage | admin | 是 | 嵌套在Layout内 |
| /production | ProductionPage | admin | 是 | 嵌套在Layout内 |
| /alert | AlertPage | admin | 是 | 嵌套在Layout内 |
| /settings | SettingsPage | admin | 是 | 嵌套在Layout内 |
| /log | LogPage | admin | 是 | 嵌套在Layout内 |
| /screen-config | ScreenConfigPage | admin | 是 | 嵌套在Layout内 |
| /screen | ScreenPage | 无 | 否 | 大屏看板独立Layout全屏无侧边栏 |
### axios封装与路由守卫
**axios实例配置**
- baseURL'/'同IIS站点无跨域
- timeout3000030秒可通过cnc_sys_config配置
- 请求拦截:自动添加 `Authorization: Bearer {token}` header从localStorage取token
- 响应拦截:
- code=0 → 正常返回data
- code=40101 → 清除localStorage.token → router.push('/login') → 弹出el-message warning"登录已过期"
- code=40001/40002/40003/50001/50002 → 按错误码处理表执行
- HTTP状态码非200 → el-message error "网络异常"
**路由守卫router.beforeEach**
- 访问/login → 如果localStorage有token → 重定向/dashboard
- 访问/api/admin/**路由 → 如果localStorage无token → 重定向/login?redirect=当前路由
- 访问/screen → 放行(免认证)
- 其他 → 放行
**Token管理**
- 存储localStorage.setItem('token', value)
- 读取localStorage.getItem('token')
- 清除localStorage.removeItem('token')
- 登录成功后跳转redirect参数存在则跳redirect否则跳/dashboard
---
## 前端工程开发规范
> 最后更新2026-04-26
> 本章节为1:1可交互界面生成的工程实现规范
### 技术栈
| 类别 | 选型 | 版本要求 |
|------|------|---------|
| 框架 | Vue3 | >=3.4 |
| 构建工具 | Vite | >=5.0 |
| 语言 | TypeScript | >=5.0 |
| UI组件库 | Element Plus | >=2.5 |
| 路由 | Vue Router 4 | >=4.3 |
| HTTP | Axios | >=1.6 |
| 图表 | ECharts | >=5.5 |
| Mock | vite-plugin-mock | >=3.0 |
### 项目目录
```
D:\opencode\haoliang\frontend\
├── index.html
├── package.json
├── tsconfig.json
├── vite.config.ts # mock插件 + proxy配置
├── mock/ # Mock数据定义按模块拆分
│ ├── login.ts
│ ├── dashboard.ts
│ ├── machine.ts
│ ├── brand.ts
│ ├── collect-address.ts
│ ├── worker.ts
│ ├── production.ts
│ ├── alert.ts
│ ├── settings.ts
│ ├── log.ts
│ └── screen.ts
└── src/
├── main.ts
├── App.vue
├── router/
│ └── index.ts # 路由定义(双套:正常路由 + /mock前缀路由
├── composables/
│ └── useMockMode.ts # Mock模式检测
├── utils/
│ └── request.ts # axios封装根据mock模式切换baseURL
├── layouts/
│ ├── AdminLayout.vue # 管理后台Layout顶部栏+侧边栏+内容区)
│ └── ScreenLayout.vue # 大屏Layout全屏独立
├── views/ # 页面组件(按模块目录)
│ ├── login/
│ ├── dashboard/
│ ├── machine/
│ ├── brand/
│ ├── collect-address/
│ ├── worker/
│ ├── production/
│ ├── alert/
│ ├── settings/
│ ├── log/
│ ├── screen-config/
│ └── screen/
├── styles/
│ ├── admin.scss # 管理后台全局样式
│ └── screen.scss # 大屏深色主题样式
└── types/ # TypeScript类型定义
```
### Mock方案URL前缀切换
**核心规则:** 同一组件、同一套交互逻辑仅axios请求路径不同。
```
/mock/dashboard → axios请求走 /mock-api/** → vite-plugin-mock拦截返回Mock JSON
/dashboard → axios请求走 /api/** → Vite proxy转发到真实后端
```
#### 使用体验
| 阶段 | URL | 行为 |
|------|-----|------|
| 开发阶段(后端未就绪) | `http://localhost:5173/mock/dashboard` | Mock数据完整展示 |
| 开发阶段(后端未就绪) | `http://localhost:5173/dashboard` | 界面正常API请求404 |
| 后端就绪后 | `http://localhost:5173/dashboard` | 直接对接真实API |
| 后端就绪后 | `http://localhost:5173/mock/dashboard` | 仍可切回Mock对比 |
#### 双列URL使用规则
接口文档(`docs/03-API接口设计.md` §3.1~3.13中每个端点同时列出两列URL
| 列名 | 用途 | HTTP方法 | URL风格 |
|------|------|---------|---------|
| **Mock URL 列** | 前端Mock开发阶段使用 | 全部POST简化 | `/xxx/update`、`/xxx/delete`、`/xxx/detail?id=` |
| **正式API 列** | 前端正式联调使用 | RESTfulGET/POST/PUT/DELETE | `/xxx/{id}` 路径参数 |
**前端开发者必须遵守**
- Mock 开发阶段(`/mock/` 路径访问):按 Mock URL 列调用,全部用 POST
- 正式联调阶段(`/` 路径访问按正式API列调用写操作用 PUT/DELETEid放URL路径
- 切换时机后端接口开发完成并可联调时逐个接口从Mock风格切换到RESTful风格
- 禁止在正式环境中残留Mock风格的URL调用
#### Mock模式检测
```typescript
// src/composables/useMockMode.ts
// 根据 route.path.startsWith('/mock') 判断是否为Mock模式
// 返回 computed<boolean> isMock
```
#### axios baseURL切换
```typescript
// src/utils/request.ts
// if (isMock) baseURL = '/mock-api'
// else baseURL = '/api'
// 其余拦截逻辑不变Token/错误码/超时等)
```
#### 路由定义
```typescript
// src/router/index.ts
// 函数生成两套路由:
// 1. 正常路由:/dashboard, /machine, /login ...
// 2. Mock前缀路由/mock/dashboard, /mock/machine, /mock/login ...
// 两套路由复用同一组件Mock路由额外注入mock标识
```
#### Mock数据文件
```
mock/*.ts 文件内容来源:
- 各页面.md中的Mock数据章节
- 数据结构严格匹配页面.md中定义的JSON
- 一个模块一个文件按API路径组织
```
#### Vite配置
```typescript
// vite.config.ts
// 1. vite-plugin-mock 配置 mock/**.ts
// 2. proxy 配置:
// /mock-api/** → mock插件拦截开发环境
// /api/** → proxy到后端可配置target默认http://localhost:5800
```
### CSS规范
- 方案Element Plus默认主题 + 局部scoped样式
- 管理后台Element Plus默认蓝色主题(#409EFF),背景#f0f2f5
- 大屏看板:独立深色主题(#0f0f1a背景/#1a1a2e卡片),样式文件 `styles/screen.scss`
- 不引入Tailwind CSS
### Mock→API切换 Checklist强制
联调切换时,开发者必须执行以下检查清单,逐项确认后才能声明切换完成:
1. **全局搜索残留**
- 搜索代码中所有 `mock-api` 字符串,确认零残留
- 搜索所有 `/mock-api/` URL 引用,确认零残留
2. **逐调用点确认URL**
- 搜索所有 `request.get(`、`request.post(`、`request.put(`、`request.delete(` 调用点
- 输出完整清单(文件路径 + 行号 + URL
- 逐个确认每个 URL 已从 Mock 风格切换为 RESTful 风格
3. **逐调用点确认HTTP方法**
- 写操作(新增/编辑/删除/启停)必须使用正确的 RESTful 方法POST/PUT/DELETE
- 禁止写操作用 GET
- 禁止所有操作都用 POSTMock 遗留)
4. **对照API设计文档**
- 打开 `docs/03-API接口设计.md` 的正式API列
- 逐个端点确认前端调用 URL 和 Method 与文档一致
**检查模板:**
```
模块:设备管理
切换日期2026-04-XX
| # | 前端方法 | 文件 | Mock URL | 正式 URL | HTTP Method | 已确认 |
|---|---------|------|---------|---------|-------------|--------|
| 1 | loadData | MachineListPage.vue | POST /mock-api/machine/list | GET /api/admin/machine | GET | ✅ |
| 2 | handleCreate | MachineListPage.vue | POST /mock-api/machine/create | POST /api/admin/machine | POST | ✅ |
| 3 | handleEdit | MachineListPage.vue | POST /mock-api/machine/update | PUT /api/admin/machine/{id} | PUT | ✅ |
| ... | ... | ... | ... | ... | ... | ... |
```
### RESTful 调用规范
1. **资源 ID 必须使用路径参数传递**
```typescript
// ✅ 正确ID 在 URL 路径中
request.get(`/api/admin/machine/${id}/status`)
request.put(`/api/admin/machine/${id}/toggle`)
// ❌ 错误ID 在 query 参数中
request.get('/api/admin/machine/status', { params: { id } })
```
2. **禁止自行编造后端不存在的接口**
- 前端调用的每个 URL 必须在 `docs/03-API接口设计.md` 的正式API列中存在
- 批量操作如果后端只提供单个操作接口,前端通过循环调用实现,不编造批量端点
3. **代码审查必检项**
- 每个新增的 `request.xxx()` 调用,审查时必须对照 API 设计文档确认 URL 和 Method 正确
### el-pagination 使用规范
使用 `<el-pagination>` 组件时,**必须同时**绑定以下事件:
```vue
<!-- 正确v-model + 事件绑定 -->
<el-pagination
v-model:current-page="query.page"
v-model:page-size="query.pageSize"
:page-sizes="[20, 50, 100]"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@current-change="loadData"
@size-change="handleSizeChange"
/>
<script setup>
const handleSizeChange = () => {
query.page = 1 // 切换每页条数时回到第1页
loadData()
}
</script>
```
```vue
<!-- 错误只有 v-model没有事件绑定 -->
<!-- v-model 只更新响应式变量的值不会自动触发数据加载 -->
<el-pagination
v-model:current-page="query.page"
v-model:page-size="query.pageSize"
:total="total"
/>
```
**原因**`v-model:current-page` 只是双向绑定数据,页码变化时不会自动调用 `loadData()`。必须通过 `@current-change``@size-change` 事件手动触发数据请求。
### 布尔字段类型规范
1. **TypeScript 接口中二元状态字段使用 `boolean` 类型**
```typescript
// ✅ 正确
interface Machine {
isOnline: boolean
isEnabled: boolean
}
// ❌ 错误
interface Machine {
isOnline: number // 0/1 语义不明确
isEnabled: number // 隐式转换碰巧正确但不可靠
}
```
2. **后端返回 `int` 时的前端处理**:如果后端 DTO 暂时无法改为 `bool`(需协调),前端应在 API 响应拦截或数据转换层统一转为 `boolean`
```typescript
// 在 loadData 或 API 响应处理中
const machine = {
...raw,
isOnline: Boolean(raw.isOnline),
isEnabled: Boolean(raw.isEnabled),
}
```
3. **禁止在模板中使用 number 做隐式布尔判断**
```vue
<!-- 错误number 隐式转换 -->
<el-tag :type="detail.isOnline ? 'success' : 'info'">
<!-- 正确boolean 显式判断 -->
<el-tag :type="detail.isOnline ? 'success' : 'info'">
```
### 大屏独立规范
- 独立Layout`ScreenLayout.vue`(全屏,无侧边栏/面包屑)
- 独立路由:`/screen` 和 `/mock/screen`
- 独立主题:深色背景,通过 `screen.scss` 覆盖Element Plus默认样式
- 免认证:`/api/screen/**` 不需要Token
- 自动刷新:定时器按卡片配置的刷新策略轮询
### 强制要求
- **思考过程使用中文**所有AI助手的推理、分析、思考过程必须使用中文输出
- **控制台输出中文**:所有控制台输出、日志、提示信息使用中文,不得出现乱码
- **所有文档使用中文**:项目内所有文档、注释、界面文案使用中文
- **组件文案中文**:所有界面文字(按钮/标签/提示/空状态/确认框)必须使用中文
- **代码注释中文**:所有代码注释使用中文
---
## CRUD页面必填项
> 页面文件完整模板见 `功能清单文件夹创建规范.md` 第五节共20项。以下为本项目CRUD页面的**最小必填项**——20项的子集。未列出的项若本模块有特殊需求则补充填写无特殊需求则省略继承全局规范即可
**默认继承全局规范、页面文件无需重复填写的项目:**
- 防重复请求(8)、超时与加载反馈(9)、操作确认机制(10)、操作结果反馈(12)、校验规则(14)、响应式布局(15)、空状态设计(18)、错误码处理(19)、安全规范(20)
- 仅当本页面有**不同于全局规范**的特殊逻辑时,才在页面文件中补充对应项
### 列表页必填项
| 序号 | 必填项 | 说明 |
|------|--------|------|
| 1 | 基本信息 | 路由、权限、入口、面包屑 |
| 2 | 界面布局 | ASCII图 |
| 3 | 查询条件 | 字段/控件/必填/默认值/校验/联动,无筛选则写"无" |
| 4 | 列表字段 | 字段名/列宽/排序/筛选/固定/超长处理/对齐 |
| 5 | 操作按钮 | 名称/权限编码/位置/显示条件/点击行为 |
| 6 | 弹窗规格 | 弹窗宽度/遮罩/ESC/表单字段定义,无弹窗则写"无" |
| 7 | 状态机 | 状态值/颜色/可用操作,无状态则写"无" |
| 8 | 交互流程 | 每个操作的主流程+异常处理 |
| 9 | 空状态 | 列表无数据/查询无结果的展示 |
**弹窗表单字段必填列:**
| 列 | 说明 |
|----|------|
| 字段 | 中文名 |
| 控件 | el-input/el-select等+具体参数 |
| 必填 | 是/否 |
| 默认值 | 无则写"-" |
| 校验 | 必填/格式/唯一性等,无则写"-" |
| 联动 | 值变化时影响哪些字段,无则写"-" |
### 详情页必填项
| 序号 | 必填项 | 说明 |
|------|--------|------|
| 1 | 基本信息 | 路由(含参数)、权限、入口、面包屑 |
| 2 | 界面布局 | ASCII图 |
| 3 | 数据区块 | 每个区块的展示字段+控件类型 |
| 4 | 操作按钮 | 名称/位置/行为 |
| 5 | 交互流程 | 加载/刷新/跳转 |
### 统计/仪表盘页必填项
| 序号 | 必填项 | 说明 |
|------|--------|------|
| 1 | 基本信息 | 路由、权限、入口、面包屑 |
| 2 | 界面布局 | ASCII图统计卡片+表格/图表区域) |
| 3 | 数据区块 | 每个区块的数据来源API+刷新策略 |
| 4 | 操作按钮 | 名称/位置/行为 |
| 5 | 状态机 | 状态值/颜色(如有) |
| 6 | 交互流程 | 加载/自动刷新/跳转 |
| 7 | 空状态 | 各区块无数据的展示 |
### 登录/特殊页必填项
| 序号 | 必填项 | 说明 |
|------|--------|------|
| 1 | 基本信息 | 路由、入口 |
| 2 | 界面布局 | ASCII图 |
| 3 | 表单字段 | 字段/控件/校验(如有表单) |
| 4 | 操作按钮 | 名称/行为 |
| 5 | 交互流程 | 成功/失败/跳转 |
| 6 | 安全规范 | Token存储/过期/登出策略 |
---
## 模块设计进度
> 具体页面设计见 `docs/02-功能清单/管理后台/{编号}-{模块名}/` 对应子文件
| 编号 | 模块 | 页面数 | 设计状态 | 备注 |
|------|------|--------|---------|------|
| 01 | 登录 | 1 | ✅ 已设计 | 见 `管理后台/01-登录/01-01-登录页面.md` |
| 02 | 仪表盘 | 1 | ✅ 已设计 | 见 `管理后台/02-仪表盘/02-01-仪表盘页面.md` |
| 03 | 设备管理 | 2 | ✅ 已设计 | 列表页+详情页,见 `管理后台/03-设备管理/` |
| 04 | 品牌模板 | 2 | ✅ 已设计 | 列表页+编辑页,见 `管理后台/04-品牌模板/` |
| 05 | 采集地址 | 2 | ✅ 已设计 | 列表页+详情页(采集历史+原始JSON),见 `管理后台/05-采集地址/` |
| 06 | 员工管理 | 2 | ✅ 已设计 | 列表页+详情页,见 `管理后台/06-员工管理/` |
| 07 | 产量报表 | 1 | ✅ 已设计 | 含修正+导出+数据缺失标记,见 `管理后台/07-产量报表/` |
| 08 | 告警中心 | 1 | ✅ 已设计 | 含批量标记+统计,见 `管理后台/08-告警中心/` |
| 09 | 系统设置 | 1 | ✅ 已设计 | 3Tab:配置项+车间管理+修改密码,见 `管理后台/09-系统设置/` |
| 10 | 车间管理 | - | 🔀 已合并 | 合并至09-系统设置 |
| 11 | 操作日志 | 1 | ✅ 已设计 | 双Tab:修正审计日志+系统运行日志,见 `管理后台/11-操作日志/` |
| 12 | 大屏配置 | 1 | ✅ 已设计 | 见 `管理后台/12-大屏配置/12-01-大屏配置页面.md` |
**大屏模块:**
| 编号 | 模块 | 页面数 | 设计状态 | 备注 |
|------|------|--------|---------|------|
| 大屏-01 | 大屏看板 | 1 | ✅ 已设计 | 免认证,深色主题,卡片式自动刷新,见 `大屏/01-01-大屏看板页面.md` |