fetch(add): 订单管理-企业设备
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 3m30s
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 3m30s
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# Change: 企业设备授权管理
|
||||
|
||||
## Why
|
||||
|
||||
当前系统中已存在企业客户管理和企业卡授权功能,但缺少企业设备授权管理能力。企业客户需要能够查看和管理被授权的设备列表,运营人员需要能够将设备授权给企业客户使用,并支持撤销授权操作。
|
||||
|
||||
根据业务需求文档 (`docs/企业设备授权.md`),需要在资产管理模块下新增"企业设备列表"功能,实现以下核心能力:
|
||||
|
||||
1. **授权设备给企业** - 支持批量授权,最多100个设备号
|
||||
2. **查看企业设备列表** - 支持分页和按设备号搜索
|
||||
3. **撤销设备授权** - 支持批量撤销授权
|
||||
|
||||
## What Changes
|
||||
|
||||
新增企业设备授权管理功能,包括:
|
||||
|
||||
### 类型定义
|
||||
- 新增 `src/types/api/enterpriseDevice.ts` 文件
|
||||
- 定义设备列表项、查询参数、分页结果类型
|
||||
- 定义授权/撤销请求和响应类型
|
||||
- 在 `src/types/api/index.ts` 中导出新类型
|
||||
|
||||
### API 服务层
|
||||
- 扩展 `EnterpriseService` 类,新增3个方法:
|
||||
- `allocateDevices(enterpriseId, data)` - POST 授权设备
|
||||
- `getEnterpriseDevices(enterpriseId, params)` - GET 设备列表
|
||||
- `recallDevices(enterpriseId, data)` - POST 撤销授权
|
||||
|
||||
### 视图层
|
||||
- 新增 `src/views/asset-management/enterprise-devices/index.vue` 页面
|
||||
- 实现设备列表展示 (表格、分页、搜索)
|
||||
- 实现授权设备对话框 (支持批量输入设备号)
|
||||
- 实现撤销授权功能 (二次确认)
|
||||
- 实现操作结果展示 (成功/失败统计)
|
||||
|
||||
### 路由配置
|
||||
- 在 `src/router/routesAlias.ts` 添加路由别名
|
||||
- 在 `src/router/routes/asyncRoutes.ts` 的资产管理模块下添加子路由
|
||||
|
||||
### 国际化
|
||||
- 在 `src/locales/langs/zh.json` 和 `en.json` 添加中英文翻译
|
||||
- 包含菜单、表单、表格、对话框、提示消息等所有文案
|
||||
|
||||
## Impact
|
||||
|
||||
- **新增模块**: 企业设备授权管理
|
||||
- **影响范围**:
|
||||
- 新增文件: `enterpriseDevice.ts`, `enterprise-devices/index.vue`
|
||||
- 扩展文件: `enterprise.ts` (API), `routesAlias.ts`, `asyncRoutes.ts`, `zh.json`, `en.json`, `index.ts` (types)
|
||||
- **依赖关系**:
|
||||
- 依赖现有的 `EnterpriseService` 基础设施
|
||||
- 依赖已实现的设备管理模块
|
||||
- 后端 API 已就绪
|
||||
- **向后兼容性**: 完全兼容,不影响现有功能
|
||||
- **数据迁移**: 无需数据迁移
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
无破坏性变更。这是一个纯新增功能,不修改现有代码逻辑。
|
||||
|
||||
## Risks
|
||||
|
||||
- **低风险**: 功能独立,不影响现有企业卡授权功能
|
||||
- **低风险**: API 已定义清晰,类型安全有保障
|
||||
- **中风险**: 需要确保批量操作时的用户体验良好 (处理大量设备号输入和结果展示)
|
||||
|
||||
## Alternatives Considered
|
||||
|
||||
1. **复用企业卡授权页面** - 不可行,设备和卡的数据结构和操作逻辑不同
|
||||
2. **在设备管理页面添加企业授权功能** - 不符合业务流程,企业授权属于资产管理范畴
|
||||
3. **使用单个设备号输入而非批量** - 不满足业务需求,运营人员需要批量授权能力
|
||||
|
||||
## Open Questions
|
||||
|
||||
1. ✅ 设备号输入格式 - 支持换行或逗号分隔
|
||||
2. ✅ 最大批量数量 - API 限制最多100个设备号
|
||||
3. ✅ 失败情况处理 - API 返回成功/失败统计及失败原因列表
|
||||
4. ✅ 设备列表排序 - 按授权时间倒序
|
||||
|
||||
## References
|
||||
|
||||
- API 文档: `docs/企业设备授权.md`
|
||||
- 相关 OpenSpec 变更: `add-device-management`
|
||||
- 参考实现: 企业卡授权功能 (`enterprise-cards/index.vue`)
|
||||
@@ -0,0 +1,291 @@
|
||||
# Spec: Enterprise Device Authorization
|
||||
|
||||
## Overview
|
||||
|
||||
企业设备授权功能允许运营人员将设备授权给企业客户使用,并支持查看授权设备列表和撤销授权操作。
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: System SHALL define enterprise device types
|
||||
|
||||
系统必须提供完整的企业设备授权相关类型定义,确保类型安全。
|
||||
|
||||
#### Scenario: 定义企业设备列表项类型
|
||||
|
||||
**Given** 需要展示企业设备列表
|
||||
**When** 定义 `EnterpriseDeviceItem` 接口
|
||||
**Then** 接口必须包含以下字段:
|
||||
- `device_id: number` - 设备ID
|
||||
- `device_no: string` - 设备号
|
||||
- `device_name: string` - 设备名称
|
||||
- `device_model: string` - 设备型号
|
||||
- `card_count: number` - 绑定卡数量
|
||||
- `authorized_at: string` - 授权时间
|
||||
|
||||
#### Scenario: 定义设备列表查询参数
|
||||
|
||||
**Given** 需要查询和搜索企业设备
|
||||
**When** 定义 `EnterpriseDeviceListParams` 接口
|
||||
**Then** 接口必须包含以下可选字段:
|
||||
- `page?: number` - 页码
|
||||
- `page_size?: number` - 每页数量
|
||||
- `device_no?: string` - 设备号模糊搜索
|
||||
|
||||
#### Scenario: 定义授权设备请求类型
|
||||
|
||||
**Given** 需要授权设备给企业
|
||||
**When** 定义 `AllocateDevicesRequest` 接口
|
||||
**Then** 接口必须包含:
|
||||
- `device_nos: string[]` - 设备号列表 (nullable, 最多100个)
|
||||
- `remark?: string` - 授权备注
|
||||
|
||||
#### Scenario: 定义授权设备响应类型
|
||||
|
||||
**Given** 授权操作需要返回详细结果
|
||||
**When** 定义 `AllocateDevicesResponse` 接口
|
||||
**Then** 接口必须包含:
|
||||
- `success_count: number` - 成功数量
|
||||
- `fail_count: number` - 失败数量
|
||||
- `authorized_devices: AuthorizedDeviceItem[]` - 已授权设备列表 (nullable)
|
||||
- `failed_items: FailedDeviceItem[]` - 失败项列表 (nullable)
|
||||
|
||||
**And** `AuthorizedDeviceItem` 包含:
|
||||
- `device_id: number` - 设备ID
|
||||
- `device_no: string` - 设备号
|
||||
- `card_count: number` - 绑定卡数量
|
||||
|
||||
**And** `FailedDeviceItem` 包含:
|
||||
- `device_no: string` - 设备号
|
||||
- `reason: string` - 失败原因
|
||||
|
||||
#### Scenario: 定义撤销授权请求类型
|
||||
|
||||
**Given** 需要撤销设备授权
|
||||
**When** 定义 `RecallDevicesRequest` 接口
|
||||
**Then** 接口必须包含:
|
||||
- `device_nos: string[]` - 设备号列表 (nullable, 最多100个)
|
||||
|
||||
#### Scenario: 定义撤销授权响应类型
|
||||
|
||||
**Given** 撤销操作需要返回结果统计
|
||||
**When** 定义 `RecallDevicesResponse` 接口
|
||||
**Then** 接口必须包含:
|
||||
- `success_count: number` - 成功数量
|
||||
- `fail_count: number` - 失败数量
|
||||
- `failed_items: FailedDeviceItem[]` - 失败项列表 (nullable)
|
||||
|
||||
---
|
||||
|
||||
### Requirement: System SHALL provide enterprise device authorization API services
|
||||
|
||||
系统必须提供企业设备授权相关的 API 服务方法。
|
||||
|
||||
#### Scenario: 授权设备给企业
|
||||
|
||||
**Given** 运营人员需要授权设备给企业客户
|
||||
**When** 调用 `EnterpriseService.allocateDevices(enterpriseId, data)`
|
||||
**Then** 必须发送 POST 请求到 `/api/admin/enterprises/{id}/allocate-devices`
|
||||
**And** 请求体必须包含设备号列表和可选备注
|
||||
**And** 返回授权结果,包含成功/失败统计和详细列表
|
||||
|
||||
#### Scenario: 获取企业设备列表
|
||||
|
||||
**Given** 需要查看企业的设备列表
|
||||
**When** 调用 `EnterpriseService.getEnterpriseDevices(enterpriseId, params)`
|
||||
**Then** 必须发送 GET 请求到 `/api/admin/enterprises/{id}/devices`
|
||||
**And** 支持分页参数 (page, page_size)
|
||||
**And** 支持设备号模糊搜索
|
||||
**And** 返回设备列表和总数
|
||||
|
||||
#### Scenario: 撤销设备授权
|
||||
|
||||
**Given** 需要撤销企业的设备授权
|
||||
**When** 调用 `EnterpriseService.recallDevices(enterpriseId, data)`
|
||||
**Then** 必须发送 POST 请求到 `/api/admin/enterprises/{id}/recall-devices`
|
||||
**And** 请求体必须包含设备号列表
|
||||
**And** 返回撤销结果,包含成功/失败统计和失败原因
|
||||
|
||||
---
|
||||
|
||||
### Requirement: System SHALL provide enterprise device list page
|
||||
|
||||
系统必须提供企业设备列表管理页面,支持查询、授权和撤销操作。
|
||||
|
||||
#### Scenario: 显示企业设备列表
|
||||
|
||||
**Given** 用户访问企业设备列表页面
|
||||
**When** 页面加载完成
|
||||
**Then** 必须显示设备列表表格
|
||||
**And** 表格必须包含以下列:
|
||||
- 设备ID
|
||||
- 设备号
|
||||
- 设备名称
|
||||
- 设备型号
|
||||
- 绑定卡数量
|
||||
- 授权时间
|
||||
|
||||
**And** 必须支持分页功能
|
||||
**And** 必须显示加载状态
|
||||
|
||||
#### Scenario: 搜索企业设备
|
||||
|
||||
**Given** 设备列表已加载
|
||||
**When** 用户在搜索框输入设备号
|
||||
**And** 点击搜索按钮
|
||||
**Then** 必须根据设备号模糊查询设备
|
||||
**And** 必须更新设备列表显示
|
||||
**And** 必须重置到第一页
|
||||
|
||||
#### Scenario: 授权设备对话框
|
||||
|
||||
**Given** 用户点击"授权设备"按钮
|
||||
**When** 授权设备对话框打开
|
||||
**Then** 必须显示设备号输入框 (textarea)
|
||||
**And** 必须显示备注输入框 (可选)
|
||||
**And** 必须提示支持的输入格式 (换行或逗号分隔)
|
||||
**And** 必须提示最多100个设备号限制
|
||||
**And** 必须有表单验证 (设备号必填)
|
||||
|
||||
#### Scenario: 提交授权设备
|
||||
|
||||
**Given** 用户在对话框中输入了设备号列表
|
||||
**When** 用户点击提交按钮
|
||||
**Then** 必须解析设备号列表 (支持换行和逗号分隔)
|
||||
**And** 必须去除空白字符和空行
|
||||
**And** 必须验证设备号数量不超过100个
|
||||
**And** 必须调用授权 API
|
||||
**And** 必须显示加载状态
|
||||
**And** 授权完成后必须展示结果:
|
||||
- 成功数量
|
||||
- 失败数量
|
||||
- 失败设备列表及原因
|
||||
|
||||
**And** 如果有成功授权的设备,必须刷新设备列表
|
||||
**And** 必须关闭对话框
|
||||
|
||||
#### Scenario: 撤销设备授权
|
||||
|
||||
**Given** 用户选中了要撤销的设备
|
||||
**When** 用户点击"撤销授权"按钮
|
||||
**Then** 必须显示二次确认对话框
|
||||
**And** 确认对话框必须显示将要撤销的设备数量
|
||||
|
||||
**When** 用户确认撤销
|
||||
**Then** 必须调用撤销 API
|
||||
**And** 必须显示加载状态
|
||||
**And** 撤销完成后必须展示结果:
|
||||
- 成功数量
|
||||
- 失败数量
|
||||
- 失败设备列表及原因
|
||||
|
||||
**And** 如果有成功撤销的设备,必须刷新设备列表
|
||||
|
||||
#### Scenario: 错误处理
|
||||
|
||||
**Given** API 调用可能失败
|
||||
**When** API 返回错误
|
||||
**Then** 必须显示友好的错误提示消息
|
||||
**And** 必须在控制台记录错误详情
|
||||
**And** 必须停止加载状态
|
||||
|
||||
#### Scenario: 分页切换
|
||||
|
||||
**Given** 设备列表超过一页
|
||||
**When** 用户切换页码或每页数量
|
||||
**Then** 必须保持当前的搜索条件
|
||||
**And** 必须重新加载设备列表
|
||||
**And** 必须显示加载状态
|
||||
|
||||
---
|
||||
|
||||
### Requirement: System SHALL configure routing for enterprise device list
|
||||
|
||||
系统必须为企业设备列表配置正确的路由。
|
||||
|
||||
#### Scenario: 注册企业设备列表路由
|
||||
|
||||
**Given** 需要访问企业设备列表页面
|
||||
**When** 配置路由
|
||||
**Then** 必须在资产管理模块 (`/asset-management`) 下添加子路由
|
||||
**And** 路由路径必须为 `enterprise-devices`
|
||||
**And** 路由名称必须为 `EnterpriseDevices`
|
||||
**And** 必须使用路由别名 `RoutesAlias.EnterpriseDevices`
|
||||
**And** 必须配置 meta 信息:
|
||||
- `title: 'menus.assetManagement.enterpriseDevices'`
|
||||
- `keepAlive: true`
|
||||
|
||||
---
|
||||
|
||||
### Requirement: System SHALL provide internationalization support
|
||||
|
||||
系统必须提供中英文翻译支持。
|
||||
|
||||
#### Scenario: 中文翻译
|
||||
|
||||
**Given** 系统语言设置为中文
|
||||
**When** 访问企业设备相关页面
|
||||
**Then** 所有文本必须显示中文,包括:
|
||||
- 菜单标题: "企业设备列表"
|
||||
- 搜索表单标签和占位符
|
||||
- 表格列名
|
||||
- 按钮文本
|
||||
- 对话框标题和内容
|
||||
- 提示消息
|
||||
|
||||
#### Scenario: 英文翻译
|
||||
|
||||
**Given** 系统语言设置为英文
|
||||
**When** 访问企业设备相关页面
|
||||
**Then** 所有文本必须显示英文,包括:
|
||||
- 菜单标题: "Enterprise Devices"
|
||||
- 搜索表单标签和占位符
|
||||
- 表格列名
|
||||
- 按钮文本
|
||||
- 对话框标题和内容
|
||||
- 提示消息
|
||||
|
||||
---
|
||||
|
||||
### Requirement: System SHALL optimize user experience
|
||||
|
||||
系统必须提供良好的用户体验。
|
||||
|
||||
#### Scenario: 批量输入设备号
|
||||
|
||||
**Given** 用户需要授权多个设备
|
||||
**When** 在设备号输入框中输入
|
||||
**Then** 必须支持以下输入方式:
|
||||
- 每行一个设备号
|
||||
- 逗号分隔的设备号
|
||||
- 混合使用换行和逗号
|
||||
|
||||
**And** 系统必须能正确解析所有格式
|
||||
**And** 必须自动去除首尾空白字符
|
||||
**And** 必须过滤空行
|
||||
|
||||
#### Scenario: 操作结果展示
|
||||
|
||||
**Given** 批量操作完成
|
||||
**When** 显示操作结果
|
||||
**Then** 必须清晰展示:
|
||||
- 总共处理的数量
|
||||
- 成功的数量
|
||||
- 失败的数量
|
||||
- 每个失败项的设备号和失败原因
|
||||
|
||||
**And** 如果全部成功,必须显示成功提示
|
||||
**And** 如果部分失败,必须显示警告提示
|
||||
**And** 如果全部失败,必须显示错误提示
|
||||
|
||||
#### Scenario: 表格列管理
|
||||
|
||||
**Given** 设备列表表格已显示
|
||||
**When** 用户点击列管理按钮
|
||||
**Then** 必须能够选择显示/隐藏的列
|
||||
**And** 列配置必须被保存
|
||||
|
||||
## Related Specs
|
||||
|
||||
- 参考现有的企业卡授权功能 (enterpriseCard.ts)
|
||||
- 依赖现有的企业客户管理功能 (enterprise.ts)
|
||||
- 关联设备管理模块 (add-device-management)
|
||||
158
openspec/changes/add-enterprise-device-authorization/tasks.md
Normal file
158
openspec/changes/add-enterprise-device-authorization/tasks.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# Tasks: Add Enterprise Device Authorization
|
||||
|
||||
## Overview
|
||||
|
||||
按照从底层到上层的顺序实现企业设备授权功能,确保每一步都可测试和验证。
|
||||
|
||||
## Task List
|
||||
|
||||
### Phase 1: Type Definitions (Foundation)
|
||||
|
||||
1. **创建企业设备类型定义文件**
|
||||
- 创建 `src/types/api/enterpriseDevice.ts`
|
||||
- 定义 `EnterpriseDeviceItem` 接口 (设备列表项)
|
||||
- 定义 `EnterpriseDeviceListParams` 接口 (查询参数)
|
||||
- 定义 `EnterpriseDevicePageResult` 接口 (分页结果)
|
||||
- 定义 `AllocateDevicesRequest` 接口 (授权请求)
|
||||
- 定义 `AllocateDevicesResponse` 接口 (授权响应)
|
||||
- 定义 `AuthorizedDeviceItem` 接口 (已授权设备项)
|
||||
- 定义 `FailedDeviceItem` 接口 (失败设备项)
|
||||
- 定义 `RecallDevicesRequest` 接口 (撤销请求)
|
||||
- 定义 `RecallDevicesResponse` 接口 (撤销响应)
|
||||
- **验证**: 运行 `npm run type-check` 确保无类型错误
|
||||
|
||||
2. **导出类型定义**
|
||||
- 在 `src/types/api/index.ts` 中导出新增的类型
|
||||
- **验证**: 确认其他模块可以正确导入类型
|
||||
|
||||
### Phase 2: API Service Layer
|
||||
|
||||
3. **扩展 EnterpriseService API 方法**
|
||||
- 在 `src/api/modules/enterprise.ts` 中添加:
|
||||
- `allocateDevices(enterpriseId, data)` - 授权设备
|
||||
- `getEnterpriseDevices(enterpriseId, params)` - 获取设备列表
|
||||
- `recallDevices(enterpriseId, data)` - 撤销授权
|
||||
- 导入新增的类型定义
|
||||
- **验证**: 运行 `npm run type-check` 确保类型正确
|
||||
|
||||
### Phase 3: Internationalization
|
||||
|
||||
4. **添加中文翻译**
|
||||
- 在 `src/locales/langs/zh.json` 的 `menus.assetManagement` 下添加 `enterpriseDevices` 条目
|
||||
- 在 `src/locales/langs/zh.json` 添加 `enterpriseDevices` 模块的所有中文文案:
|
||||
- 页面标题和搜索表单
|
||||
- 表格列名
|
||||
- 操作按钮和对话框标题
|
||||
- 表单标签和提示文本
|
||||
- 成功/错误消息
|
||||
- **验证**: 检查 JSON 格式正确性
|
||||
|
||||
5. **添加英文翻译**
|
||||
- 在 `src/locales/langs/en.json` 添加对应的英文翻译
|
||||
- 确保 key 与中文版本一致
|
||||
- **验证**: 检查 JSON 格式正确性,切换语言测试
|
||||
|
||||
### Phase 4: Routing
|
||||
|
||||
6. **添加路由别名**
|
||||
- 在 `src/router/routesAlias.ts` 添加 `EnterpriseDevices = '/asset-management/enterprise-devices'`
|
||||
- **验证**: 确认导出正确
|
||||
|
||||
7. **配置路由**
|
||||
- 在 `src/router/routes/asyncRoutes.ts` 的资产管理 (`/asset-management`) 模块下添加企业设备列表路由
|
||||
- 配置路由 meta 信息 (title, keepAlive)
|
||||
- **验证**: 运行应用,检查路由注册成功
|
||||
|
||||
### Phase 5: UI Components
|
||||
|
||||
8. **创建企业设备列表页面**
|
||||
- 创建 `src/views/asset-management/enterprise-devices/index.vue`
|
||||
- 实现页面基础结构:
|
||||
- 使用 `ArtTableFullScreen` 布局
|
||||
- 使用 `ArtSearchBar` 实现搜索表单 (企业ID,设备号搜索)
|
||||
- 使用 `ArtTable` 展示设备列表
|
||||
- 使用 `ArtTableHeader` 添加"授权设备"和"撤销授权"按钮
|
||||
- **验证**: 页面能正常渲染,无控制台错误
|
||||
|
||||
9. **实现设备列表查询功能**
|
||||
- 实现 `loadDeviceList()` 方法调用 API
|
||||
- 实现搜索和重置功能
|
||||
- 实现分页功能
|
||||
- 添加 loading 状态
|
||||
- **验证**: 能正确展示设备列表数据,分页工作正常
|
||||
|
||||
10. **实现授权设备对话框**
|
||||
- 创建授权设备对话框
|
||||
- 使用 `ElForm` + `ElInput` (textarea) 输入设备号列表
|
||||
- 支持多行输入或逗号分隔
|
||||
- 添加备注输入框 (可选)
|
||||
- 实现表单验证 (必填项,格式校验)
|
||||
- **验证**: 对话框显示正常,表单验证工作
|
||||
|
||||
11. **实现授权设备提交逻辑**
|
||||
- 实现 `handleAllocateDevices()` 方法
|
||||
- 解析设备号列表 (处理换行和逗号分隔)
|
||||
- 调用 `EnterpriseService.allocateDevices()` API
|
||||
- 展示授权结果 (成功数量,失败数量,失败列表)
|
||||
- 使用 `ElMessageBox` 或 `ElDialog` 展示详细结果
|
||||
- 授权成功后刷新列表
|
||||
- **验证**: 能成功授权设备,正确处理部分成功/失败情况
|
||||
|
||||
12. **实现撤销授权对话框**
|
||||
- 创建撤销授权对话框
|
||||
- 使用表格多选模式选择要撤销的设备
|
||||
- 或者使用输入框输入设备号列表
|
||||
- 实现二次确认逻辑
|
||||
- **验证**: 对话框显示正常
|
||||
|
||||
13. **实现撤销授权提交逻辑**
|
||||
- 实现 `handleRecallDevices()` 方法
|
||||
- 收集选中的设备号
|
||||
- 调用 `EnterpriseService.recallDevices()` API
|
||||
- 展示撤销结果 (成功数量,失败数量,失败列表)
|
||||
- 撤销成功后刷新列表
|
||||
- **验证**: 能成功撤销授权,正确处理部分成功/失败情况
|
||||
|
||||
### Phase 6: Polish & Testing
|
||||
|
||||
14. **完善表格列配置**
|
||||
- 配置表格列 (设备ID,设备号,设备名称,设备型号,绑定卡数量,授权时间)
|
||||
- 实现列显示/隐藏功能
|
||||
- 添加时间格式化
|
||||
- **验证**: 表格数据展示完整美观
|
||||
|
||||
15. **添加错误处理**
|
||||
- 为所有 API 调用添加 try-catch
|
||||
- 添加友好的错误提示消息
|
||||
- 处理网络错误和业务错误
|
||||
- **验证**: 各种错误场景都有适当提示
|
||||
|
||||
16. **样式调整**
|
||||
- 确保页面样式与系统其他页面一致
|
||||
- 响应式布局适配
|
||||
- 对话框尺寸和布局优化
|
||||
- **验证**: 在不同屏幕尺寸下显示正常
|
||||
|
||||
17. **最终验证**
|
||||
- 运行 `npm run type-check` 确保无类型错误
|
||||
- 运行 `npm run build` 确保能成功构建
|
||||
- 运行 `openspec validate add-enterprise-device-authorization --strict` 验证 spec
|
||||
- 手动测试所有功能点
|
||||
- 测试中英文切换
|
||||
- **验证**: 所有功能正常,无控制台错误
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Task 3 依赖 Task 1 (API 需要类型定义)
|
||||
- Task 8-13 依赖 Task 1-7 (UI 需要 API 和路由)
|
||||
- Task 14-16 是并行任务,可以同时进行
|
||||
|
||||
## Estimated Effort
|
||||
|
||||
- Phase 1-2: 30 分钟 (类型和 API)
|
||||
- Phase 3: 30 分钟 (国际化)
|
||||
- Phase 4: 15 分钟 (路由)
|
||||
- Phase 5: 2-3 小时 (UI 实现)
|
||||
- Phase 6: 30 分钟 (测试和优化)
|
||||
|
||||
**Total**: 约 4-4.5 小时
|
||||
Reference in New Issue
Block a user