feat: 实现技能审核全流程 - 新增审核管理模块、技能状态机、版本审核机制

- 新增审核管理页面:版本审核列表、下架审核列表、审核详情页
- 完善技能状态机:开发中/已上架/下架审核中/已下架四种状态
- 实现版本审核机制:审核中/通过/拒绝/撤销四种状态
- 更新 README:详细记录技能开发流程与审核机制
- 优化技能详情页:根据状态展示不同操作按钮
- 完善我的技能列表:状态筛选与操作限制
- 新增上传新版本页面:分离版本上传与基本信息编辑
- 更新 openspec 规范:技能审核流程与状态定义
This commit is contained in:
2026-03-20 17:54:51 +08:00
parent 9c487f3ed6
commit fb9616a10f
18 changed files with 938 additions and 119 deletions

295
README.md
View File

@@ -88,13 +88,26 @@ grandclaw-archtype/
│ │ │ ├── AdminProjectsPage.jsx # 项目管理
│ │ │ ├── AddProjectPage.jsx # 新增/编辑项目
│ │ │ └── AdminLogsPage.jsx # 全局日志查询
│ │ ├── console/ # 工作台子页面
│ │ │ ├── ChatPage.jsx # 聊天页面
│ │ │ ├── SkillsPage.jsx # 技能市场
│ │ │ ├── SkillDetailPage.jsx # 技能详情
│ │ │ ├── LogsPage.jsx # 日志查询
│ │ │ ├── TasksPage.jsx # 定时任务
│ │ │ ├── TaskDetailPage.jsx # 任务详情
│ │ │ ├── AccountPage.jsx # 账号管理
│ │ │ ├── ProjectsPage.jsx # 项目管理
│ │ │ ├── MemberConfigPage.jsx # 成员配置
│ │ │ ├── AddMemberPage.jsx # 增加成员
│ │ │ ├── ConsoleReviewListPage.jsx # 审核管理列表NEW
│ │ │ └── ConsoleReviewDetailPage.jsx # 审核详情NEW
│ │ └── developer/ # 开发台子页面
│ │ ├── DevOverviewPage.jsx # 开发者总览
│ │ ├── MySkillsPage.jsx # 我的技能(筛选+分页)
│ │ ├── SkillEditorPage.jsx # 技能详情(只读+操作)
│ │ ├── UploadSkillPage.jsx # 创建技能
│ │ ├── UploadSkillPage.jsx # 创建技能(基本信息)
│ │ ├── UpdateSkillInfoPage.jsx # 更新基本信息
│ │ ├── NewVersionPage.jsx # 上传新版本(仅版本信息
│ │ ├── UploadVersionPage.jsx # 上传新版本(NEW
│ │ ├── DevDocsPage.jsx # 开发文档
│ │ └── DevAccountPage.jsx # 开发者设置
│ └── styles/ # SCSS样式模块
@@ -153,7 +166,7 @@ pnpm build
### 3. 工作台Console
- **聊天界面**:支持多种聊天场景(欢迎页、普通对话、技能调用、文件上传)
- **技能市场**:浏览、订阅、查看技能详情
- **技能市场**:浏览、订阅、查看技能详情(仅展示最新版本)
- **日志查询**:支持按用户、类型、状态筛选
- **定时任务**:管理定时任务,支持启用/禁用,查看任务详情
- **项目管理**:成员列表,增加成员
@@ -161,18 +174,19 @@ pnpm build
### 4. 管理台Admin
- **运营总览**:平台运营指标卡片(用户总数、部门数量、项目数量、今日调用)、异常/待办事项提醒、最近操作日志
- **审核管理**版本审核列表与详情、下架审核列表与详情NEW
- **部门管理**:部门列表,支持搜索筛选、新增、编辑、启用/禁用、删除确认
- **用户管理**:用户列表,支持搜索筛选(关键词/部门/状态)、新增、编辑、启用/禁用、删除确认,角色区分(管理员/开发者/成员)
- **项目管理**:项目列表,支持搜索筛选、新增、编辑、启用/禁用、删除确认
- **日志查询**:全局系统日志查询,支持多维度筛选(关键词、用户、部门、类型、状态、时间范围)
### 5. 开发台Developer
- **总览**:开发者指标卡片(我的技能总数、已发布、草稿、待审核)、待审核项目列表、最近动态
- **我的技能**:技能列表,支持关键词搜索、分类筛选、状态筛选、分页,支持上架/下架、删除操作
- **技能详情**:基本信息只读展示、版本历史管理(启用/下载/删除)、审核拒绝原因展示
- **创建技能**:基本信息表单 + 技能图标选择 + 技能包上传
- **总览**:开发者指标卡片(我的技能总数、已上架、开发中、待审核)、待审核项目列表、最近动态
- **我的技能**:技能列表,支持关键词搜索、分类筛选、状态筛选(开发中/已上架/下架审核中/已下架)、分页,支持下架(需要先撤回审核中的版本)、删除(已上架需要先下架)
- **技能详情**:基本信息只读展示、版本历史管理(根据状态展示操作按钮:审核中-撤回审核+下载、审核通过/拒绝/撤销-仅下载、审核拒绝-显示拒绝理由)、技能操作(上传新版本-有审核中版本时禁用、下架技能、删除技能-已上架时禁用)
- **创建技能**:基本信息表单 + 技能图标选择(移除技能包上传
- **更新基本信息**:独立页面编辑技能名称/描述/分类/标签/图标,与版本上传分离
- **上传新版本**:仅包含版本说明和技能包上传,不含基本信息编辑
- **上传新版本**:仅包含版本说明和技能包上传NEW
- **开发文档**:技能开发相关文档
- **开发者设置**:开发者账号信息
@@ -550,8 +564,8 @@ const members = api.members.list();
### 数据文件说明
- `conversations.js`:聊天场景和对话历史
- `skills.js`:技能市场数据,包含技能详情、文件列表、版本历史
- `developerData.js`:开发台数据,包含我的技能(含图标、版本审核状态)、技能分类、开发者总览、开发文档
- `skills.js`:技能市场数据,包含技能详情含状态dev/published/unlisting/unlisted、文件列表、版本历史含状态reviewing/approved/rejected/withdrawn、拒绝理由、审核列表pendingVersionReviews、pendingUnlistReviews
- `developerData.js`:开发台数据,包含我的技能(含图标、版本审核状态、hasPendingReview标识)、技能分类、开发者总览、开发文档
- `logs.js`:操作日志数据(成功/失败/警告状态)
- `tasks.js`:定时任务数据(包含任务配置和执行日志)
- `adminData.js`:管理台数据(部门列表、用户列表、项目列表、总览指标、全局日志、可选项数据)
@@ -631,4 +645,263 @@ export default defineConfig({
3. 组件样式添加到 `_components.scss`
4. 页面特定样式添加到 `global.scss`
*最后更新2026-03-19*
---
## 技能开发流程与审核机制
### 流程概述
技能从创建到上架的完整流程包括:技能创建、版本上传、审核管理、上架销售四个主要环节。
### 状态定义
#### 技能状态
技能有四种状态,表示技能在平台上的可见性和可用性:
| 状态 | 英文 | 描述 | 图标样式 |
|------|------|------|---------|
| 开发中 | `dev` | 技能已创建但尚未有审核通过的版本 | status-stopped (灰色) |
| 已上架 | `published` | 技能有审核通过的版本,可在技能市场展示和订阅 | status-running (绿色) |
| 下架审核中 | `unlisting` | 开发者申请下架,等待管理员审核 | status-warning (黄色) |
| 已下架 | `unlisted` | 技能已下架,不在技能市场展示,可删除 | status-stopped (灰色) |
#### 版本状态
版本有四种状态,表示版本在审核流程中的位置:
| 状态 | 英文 | 描述 | 图标样式 |
|------|------|------|---------|
| 审核中 | `reviewing` | 版本已提交,等待管理员审核 | status-warning (黄色) |
| 审核通过 | `approved` | 版本审核通过,自动生效,技能可上架 | status-running (绿色) |
| 审核拒绝 | `rejected` | 版本审核未通过,需修改后重新提交 | status-error (红色) |
| 已撤销 | `withdrawn` | 开发者主动撤回审核,版本废弃 | status-stopped (灰色) |
### 完整流程
```
┌───────────────────────────────────────────────────────────────────┐
│ 技能开发流程 │
└───────────────────────────────────────────────────────────────────┘
开发者操作 管理员操作 技能市场
──────────── ─────────── ─────────
[1. 创建技能] → 技能: 开发中
↓ (创建后可立即上传版本)
[2. 上传新版本] → 版本: 审核中
│ ──────────────────────────▶ [待审核列表]
↓ │
[3. 提交审核] ↓
│ [4. 审核操作]
├───────────────────────────────────────────────┼───────┐
│ │ │
↓ ↓ ↓
[审核通过] [审核通过] [审核拒绝]
│ │
└───────────────────────────────────────────────┘
技能: 已上架
版本: 审核通过(生效)
───────────────────────────────────────────────────────────▶ [可在技能市场展示]
后续操作:
- [5. 上传新版本] → (需先撤回审核中的版本,一次只能有一个审核中)
- [6. 下架技能] → (需先撤回审核中的版本,下架需管理员审核)
- [7. 删除技能] → (已上架的技能必须先下架)
```
### 关键规则
#### 1. 版本上传规则
- **版本号由后端自动生成**:前端上传时无需填写版本号
- **上传即进入审核**:版本上传后状态自动变为"审核中",没有"草稿"状态
- **一次只能有一个审核中的版本**
- 如果存在审核中的版本,"上传新版本"按钮禁用
- 审核通过或撤回后,才能上传新版本
#### 2. 审核中版本操作
- 可执行操作:撤回审核、下载
- 撤回审核后,版本状态变为"已撤销"(终态),无法继续操作
- 如需重新提交,需上传新版本
#### 3. 技能操作规则
| 技能状态 | 可用操作 | 备注 |
|---------|---------|------|
| 开发中 | 更新基本信息、删除技能 | 未上架,可直接删除 |
| 已上架 | 更新基本信息、下架技能 | 删除按钮禁用(需先下架) |
| 已上架+有审核中版本 | 更新基本信息 | 下架按钮禁用、上传按钮禁用 |
| 下架审核中 | 无(等待管理员审核) | 所有操作按钮禁用 |
| 已下架 | 更新基本信息、删除技能 | 可删除 |
#### 4. 下架流程
- **下架需要管理员审核**
1. 开发者点击"下架技能"
2. 技能状态变为"下架审核中"
3. 管理台"审核管理" -> "下架审核"列表中显示
4. 管理员审核通过/拒绝
5. 通过:技能状态变为"已下架",技能市场移除
6. 拒绝:技能状态回到"已上架"
- **下架期间禁止操作**
- 下架审核中的技能,所有操作按钮禁用
- 不能上传新版本
#### 5. 审核拒绝
- 版本审核拒绝后,在版本说明下方显示拒绝理由
- 被拒绝的版本在技能详情页可见,但无法再次提交审核
- 开发者需上传新版本重新提交
### 数据结构
#### 技能数据skills.js / developerData.js
```javascript
{
id: 1,
name: '代码生成助手',
desc: '根据需求自动生成高质量代码',
tags: ['开发', '代码', 'AI'],
status: 'published', // 技能状态: dev | published | unlisting | unlisted
hasPendingReview: false, // 是否有审核中的版本
category: '开发工具',
versions: [...] // 版本列表
}
```
#### 版本数据
```javascript
{
version: 'v1.3.0',
date: '2026-03-12',
desc: '新增 Python 3.11 支持',
status: 'approved', // 版本状态: reviewing | approved | rejected | withdrawn
rejectionReason: '' // 审核拒绝理由仅status为rejected时
}
```
#### 审核列表数据
```javascript
// 版本审核列表
pendingVersionReviews = [{
id: 1,
skillName: '代码生成助手',
version: 'v1.4.0',
date: '2026-03-20',
developer: '张三'
}]
// 下架审核列表
pendingUnlistReviews = [{
id: 1,
skillName: 'CRM 客户查询',
currentVersion: 'v1.5.0',
date: '2026-03-20',
developer: '赵六'
}]
```
### 页面交互细节
#### 技能详情页SkillEditorPage
**版本历史表格:**
| 版本号 | 版本说明 | 状态 | 更新时间 | 操作 |
|-------|---------|------|---------|------|
| v1.3.0 | 新增功能... | 审核通过 | 2026-03-12 | [下载] |
| v1.2.0 | 优化性能... | 审核拒绝 | 2026-03-08 | [下载] 拒绝理由: 测试用例不完整 |
| v1.1.0 | 新增支持... | 审核中 | 2026-02-20 | [撤回审核] [下载] |
**技能操作按钮:**
- 更新基本信息:始终可用
- 上传新版本:有审核中版本时禁用,提示"存在审核中的版本,请先撤回后再上传新版本"
- 下架技能:技能状态为已上架且无审核中版本时可用
- 删除技能:技能状态为开发中或已下架时可用,已上架时禁用并提示"已上架的技能需要先下架才能删除"
#### 我的技能列表页MySkillsPage
**状态列展示:**
- 开发中:显示"开发中"
- 已上架:显示"已上架"
- 已上架+有审核中版本:显示"已上架 · 审核中"
- 下架审核中:显示"下架审核中"
- 已下架:显示"已下架"
**操作列:**
- 编辑:始终可用
- 下架技能:已上架且无审核中版本时可用
- 删除技能:开发中或已下架时可用
#### 管理台审核管理AdminPage - reviewList
**Tab切换**
- 版本审核:显示待审核的版本列表
- 下架审核:显示待审核的下架申请列表
**版本审核列表:**
| 技能名称 | 版本号 | 提交时间 | 开发者 | 操作 |
|---------|-------|---------|--------|------|
| 代码生成助手 | v1.4.0 | 2026-03-20 | 张三 | [审核] |
**审核详情页reviewDetail**
**版本审核详情:**
- 基本信息:技能名称、开发者、分类、标签
- 版本信息:版本号、提交时间、版本说明
- 文件列表:显示技能包包含的文件
- 操作:[拒绝] [通过]
**下架审核详情:**
- 技能信息:技能名称、开发者、当前版本、订阅数、申请时间
- 操作:[拒绝] [通过]
#### 技能市场详情页SkillDetailPage
**版本展示:**
- 只显示最新审核通过版本的信息
- 不展示完整版本历史
- 示例:
```
当前版本: v1.3.0
更新说明: 新增 Python 3.11 支持
更新时间: 2026-03-12
```
### 状态映射关系
```javascript
// 技能状态映射
const skillStatusMap = {
dev: { text: '开发中', className: 'status-stopped' },
published: { text: '已上架', className: 'status-running' },
unlisting: { text: '下架审核中', className: 'status-warning' },
unlisted: { text: '已下架', className: 'status-stopped' }
};
// 版本状态映射
const versionStatusMap = {
reviewing: { text: '审核中', className: 'status-warning' },
approved: { text: '审核通过', className: 'status-running' },
rejected: { text: '审核拒绝', className: 'status-error' },
withdrawn: { text: '已撤销', className: 'status-stopped' }
};
```
### 注意事项
1. **原型说明**:本页面为静态原型,所有交互均为前端模拟,未连接真实后端
2. **状态持久化**:页面刷新后,状态会重置为初始值
3. **按钮禁用**:使用 HTML 原生 `disabled` 属性,配合 `title` 提示显示禁用原因
4. **Modal 确认**:删除和下架操作需要二次确认,使用 Modal 组件展示确认对话框
5. **Toast 提示**:操作完成后显示 Toast 提示,展示操作结果(成功/失败)
*最后更新2026-03-20*