feat: add bun-fullstack agent and update skills
This commit is contained in:
139
.qoder/skills/business/content-management/SKILL.md
Normal file
139
.qoder/skills/business/content-management/SKILL.md
Normal file
@@ -0,0 +1,139 @@
|
||||
---
|
||||
name: content-management
|
||||
description: 内容管理(CMS)模块的业务规则,包含文章发布流程、富文本编辑规范与 SEO 要求。当涉及文章、资讯、公告等内容管理功能时必须参考此 Skill。
|
||||
---
|
||||
|
||||
# 内容管理 (CMS) 业务 Skill
|
||||
|
||||
## 适用范围
|
||||
|
||||
当任务涉及以下场景时,必须加载并遵循此 Skill:
|
||||
|
||||
- 文章/资讯列表、编辑、发布
|
||||
- 内容分类与标签管理
|
||||
- 富文本/Markdown 编辑器集成
|
||||
- SEO 字段管理
|
||||
|
||||
## 业务规则
|
||||
|
||||
### 1. 文章发布流程
|
||||
|
||||
```
|
||||
草稿 (draft) → 待审核 (pending_review) → 已发布 (published) → 已归档 (archived)
|
||||
↓
|
||||
驳回 (rejected) → 草稿 (draft) [修改后重新提交]
|
||||
```
|
||||
|
||||
**关键约束**:
|
||||
|
||||
- 普通编辑: 只能提交审核,不能直接发布
|
||||
- 管理员/主编: 可以跳过审核直接发布
|
||||
- 已发布文章: 编辑后生成新版本,需重新审核
|
||||
- 定时发布: 支持设置 `publishAt` 时间,到达时间后系统自动从「待发布」改为「已发布」
|
||||
|
||||
### 2. 内容模型
|
||||
|
||||
- **标题** (title): 必填,2-100 字符
|
||||
- **摘要** (summary): 选填,≤ 200 字符。若未填写,自动截取正文前 200 字
|
||||
- **正文** (content): 必填,支持 Markdown 格式
|
||||
- **封面图** (coverImage): 推荐尺寸 16:9(如 1200×675),支持裁剪
|
||||
- **分类** (categoryId): 必填,单选
|
||||
- **标签** (tags): 选填,多选,最多 5 个
|
||||
- **SEO 字段**:
|
||||
- `seoTitle`: 选填,≤ 60 字符
|
||||
- `seoDescription`: 选填,≤ 160 字符
|
||||
- `seoKeywords`: 选填,逗号分隔
|
||||
|
||||
### 3. 排序规则
|
||||
|
||||
- 默认按发布时间倒序
|
||||
- 支持「置顶」功能(`isTop: boolean`),置顶文章优先展示
|
||||
- 置顶文章之间按置顶时间倒序
|
||||
|
||||
## 数据模型
|
||||
|
||||
### 核心接口
|
||||
|
||||
```typescript
|
||||
// src/services/article.ts
|
||||
export async function getArticleList(
|
||||
params: ArticleQueryParams,
|
||||
): Promise<API.PageResult<ArticleItem>> {}
|
||||
export async function getArticleDetail(id: string): Promise<ArticleDetail> {}
|
||||
export async function createArticle(
|
||||
data: ArticleFormData,
|
||||
): Promise<ArticleItem> {}
|
||||
export async function updateArticle(
|
||||
id: string,
|
||||
data: Partial<ArticleFormData>,
|
||||
): Promise<ArticleItem> {}
|
||||
export async function updateArticleStatus(
|
||||
id: string,
|
||||
status: ArticleStatus,
|
||||
): Promise<void> {}
|
||||
export async function deleteArticle(id: string): Promise<void> {}
|
||||
export async function toggleTop(id: string, isTop: boolean): Promise<void> {}
|
||||
```
|
||||
|
||||
### 关键类型
|
||||
|
||||
```typescript
|
||||
// src/pages/Article/data.d.ts
|
||||
type ArticleStatus =
|
||||
| 'draft'
|
||||
| 'pending_review'
|
||||
| 'published'
|
||||
| 'archived'
|
||||
| 'rejected';
|
||||
|
||||
interface ArticleItem {
|
||||
id: string;
|
||||
title: string;
|
||||
summary?: string;
|
||||
content: string;
|
||||
coverImage?: string;
|
||||
categoryId: string;
|
||||
categoryName: string;
|
||||
tags: string[];
|
||||
status: ArticleStatus;
|
||||
author: string;
|
||||
isTop: boolean;
|
||||
viewCount: number;
|
||||
publishAt?: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
seoTitle?: string;
|
||||
seoDescription?: string;
|
||||
seoKeywords?: string;
|
||||
}
|
||||
```
|
||||
|
||||
## UI 交互规范
|
||||
|
||||
### 1. 文章列表页
|
||||
|
||||
- **组件**: `ProTable`(搜索字段 < 4,使用内置 search)
|
||||
- **必须包含列**: 标题(可点击预览)、分类、状态、作者、发布时间、阅读量、操作
|
||||
- **操作逻辑**: 根据状态动态展示按钮
|
||||
- 草稿: 编辑 / 提交审核 / 删除
|
||||
- 已发布: 编辑 / 下架(归档)/ 置顶/取消置顶
|
||||
- **置顶标识**: 在标题前显示 📌 图标
|
||||
|
||||
### 2. 文章编辑页
|
||||
|
||||
- **组件**: `ProForm`(非分步)
|
||||
- **编辑器**: 使用项目中已有的 `MarkdownEditor` 组件(`src/components/MarkdownEditor`)
|
||||
- **布局**: 左侧大区域放编辑器,右侧抽屉或区域放 SEO/分类/标签
|
||||
- **自动保存**: 每 30 秒自动保存草稿(使用 `useRequest` 配合 `debounce`)
|
||||
|
||||
### 3. 预览
|
||||
|
||||
- 支持在弹窗中预览 Markdown 渲染结果
|
||||
- 预览模式使用 `Modal` + Markdown 渲染组件
|
||||
|
||||
## i18n Key 规范
|
||||
|
||||
- 菜单: `menu.content.*` 或 `menu.article.*`
|
||||
- 页面: `pages.article.*`
|
||||
- 表单: `article.form.*`
|
||||
- 状态: `article.status.*`
|
||||
151
.qoder/skills/business/order-management/SKILL.md
Normal file
151
.qoder/skills/business/order-management/SKILL.md
Normal file
@@ -0,0 +1,151 @@
|
||||
---
|
||||
name: order-management
|
||||
description: 订单管理模块的业务规则、订单流转状态机、支付与退款逻辑。当涉及订单相关功能开发时必须参考此 Skill。
|
||||
---
|
||||
|
||||
# 订单管理 (Order Management) 业务 Skill
|
||||
|
||||
## 适用范围
|
||||
|
||||
当任务涉及以下场景时,必须加载并遵循此 Skill:
|
||||
|
||||
- 订单列表、订单详情、订单创建
|
||||
- 支付流程、退款流程
|
||||
- 发货与物流跟踪
|
||||
- 订单统计与报表
|
||||
|
||||
## 业务规则
|
||||
|
||||
### 1. 订单状态机
|
||||
|
||||
```
|
||||
待支付 (pending_payment)
|
||||
├─ 支付成功 → 待发货 (pending_shipment)
|
||||
│ ├─ 发货 → 运输中 (shipping)
|
||||
│ │ ├─ 签收 → 已完成 (completed)
|
||||
│ │ └─ 拒收 → 退回中 (returning)
|
||||
│ └─ 申请退款 → 退款中 (refunding)
|
||||
├─ 超时未付 → 已取消 (cancelled) [系统自动, 30分钟]
|
||||
└─ 用户取消 → 已取消 (cancelled)
|
||||
```
|
||||
|
||||
**关键约束**:
|
||||
|
||||
- 超时取消: 下单后 **30 分钟**未支付自动取消,释放库存
|
||||
- 退款窗口: 仅在「待发货」状态可申请全额退款
|
||||
- 已发货订单: 需走退货退款流程(用户寄回 → 确认收货 → 退款)
|
||||
- 已完成订单: 签收后 **7 天**内可申请售后
|
||||
|
||||
### 2. 金额计算规则
|
||||
|
||||
- **订单总额** = Σ(商品售价 × 数量) - 优惠金额 + 运费
|
||||
- **金额精度**: 所有金额计算统一使用 **分 (cent)** 为单位(整数运算),前端展示时 ÷ 100 并保留 2 位小数
|
||||
- **⚠️ 严禁浮点运算**: 禁止使用 `0.1 + 0.2` 等浮点计算,必须转换为整数
|
||||
|
||||
### 3. 订单号规则
|
||||
|
||||
- 格式: `ORD{YYYYMMDD}{6位序号}`
|
||||
- 示例: `ORD2026021600001`
|
||||
- 订单号由后端生成,前端仅用于展示
|
||||
|
||||
## 数据模型
|
||||
|
||||
### 核心接口
|
||||
|
||||
```typescript
|
||||
// src/services/order.ts
|
||||
export async function getOrderList(
|
||||
params: OrderQueryParams,
|
||||
): Promise<API.PageResult<OrderItem>> {}
|
||||
export async function getOrderDetail(orderId: string): Promise<OrderDetail> {}
|
||||
export async function cancelOrder(
|
||||
orderId: string,
|
||||
reason: string,
|
||||
): Promise<void> {}
|
||||
export async function shipOrder(
|
||||
orderId: string,
|
||||
logistics: LogisticsInfo,
|
||||
): Promise<void> {}
|
||||
export async function refundOrder(
|
||||
orderId: string,
|
||||
refundData: RefundRequest,
|
||||
): Promise<void> {}
|
||||
```
|
||||
|
||||
### 关键类型
|
||||
|
||||
```typescript
|
||||
// src/pages/Order/data.d.ts
|
||||
type OrderStatus =
|
||||
| 'pending_payment'
|
||||
| 'pending_shipment'
|
||||
| 'shipping'
|
||||
| 'completed'
|
||||
| 'cancelled'
|
||||
| 'refunding'
|
||||
| 'returning';
|
||||
|
||||
interface OrderItem {
|
||||
orderId: string;
|
||||
orderNo: string;
|
||||
userId: string;
|
||||
userName: string;
|
||||
items: OrderProduct[];
|
||||
totalAmount: number; // 单位: 分
|
||||
discountAmount: number; // 单位: 分
|
||||
shippingFee: number; // 单位: 分
|
||||
payableAmount: number; // 单位: 分 (实付)
|
||||
status: OrderStatus;
|
||||
paymentMethod?: string;
|
||||
paidAt?: string;
|
||||
shippedAt?: string;
|
||||
completedAt?: string;
|
||||
createdAt: string;
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
interface OrderProduct {
|
||||
productId: string;
|
||||
productName: string;
|
||||
skuId: string;
|
||||
price: number; // 单位: 分
|
||||
quantity: number;
|
||||
subtotal: number; // 单位: 分
|
||||
}
|
||||
```
|
||||
|
||||
## UI 交互规范
|
||||
|
||||
### 1. 订单列表页
|
||||
|
||||
- **组件**: 独立 `QueryFilter` + `ProTable`(字段 ≥ 4)
|
||||
- **必须筛选项**: 订单号、订单状态、下单时间范围、用户名
|
||||
- **状态标签颜色**:
|
||||
- pending_payment → 橙色 (warning)
|
||||
- pending_shipment → 蓝色 (processing)
|
||||
- shipping → 青色 (cyan)
|
||||
- completed → 绿色 (success)
|
||||
- cancelled → 灰色 (default)
|
||||
- refunding → 红色 (error)
|
||||
- **金额展示**: 使用 `valueType: 'money'`,需自定义 render 将分转换为元
|
||||
|
||||
### 2. 订单详情页
|
||||
|
||||
- **组件**: `ProDescriptions` + `Steps`(状态流转进度条)
|
||||
- **布局**: 顶部状态进度条 + 基本信息 + 商品清单 + 操作按钮
|
||||
- **操作按钮**: 根据当前状态动态显示(如待发货显示「发货」按钮,待支付显示「取消」按钮)
|
||||
|
||||
### 3. 金额格式化工具函数
|
||||
|
||||
```typescript
|
||||
// src/utils/currency.ts
|
||||
export const centToYuan = (cent: number): string => (cent / 100).toFixed(2);
|
||||
export const yuanToCent = (yuan: number): number => Math.round(yuan * 100);
|
||||
```
|
||||
|
||||
## i18n Key 规范
|
||||
|
||||
- 菜单: `menu.order.*`
|
||||
- 页面: `pages.order.*`
|
||||
- 表单: `order.form.*`
|
||||
- 状态: `order.status.*`
|
||||
132
.qoder/skills/business/product-management/SKILL.md
Normal file
132
.qoder/skills/business/product-management/SKILL.md
Normal file
@@ -0,0 +1,132 @@
|
||||
---
|
||||
name: product-management
|
||||
description: 商品管理模块的业务规则、数据模型、状态机与 UI 交互规范。当涉及商品相关功能开发时必须参考此 Skill。
|
||||
---
|
||||
|
||||
# 商品管理 (Product Management) 业务 Skill
|
||||
|
||||
## 适用范围
|
||||
|
||||
当任务涉及以下场景时,必须加载并遵循此 Skill:
|
||||
|
||||
- 商品列表、商品详情、商品创建/编辑
|
||||
- SKU 管理、库存管理、价格体系
|
||||
- 商品分类与属性管理
|
||||
|
||||
## 业务规则
|
||||
|
||||
### 1. 商品状态机
|
||||
|
||||
```
|
||||
草稿 (draft) → 待审核 (pending_review) → 已上架 (online) → 已下架 (offline)
|
||||
↓ ↑
|
||||
驳回 (rejected) ────────────────────────────→ ┘
|
||||
```
|
||||
|
||||
**关键约束**:
|
||||
|
||||
- 草稿状态可直接删除
|
||||
- 已上架商品必须先下架才能编辑核心字段(名称、价格、SKU)
|
||||
- 已上架商品的**非核心字段**(描述、图片)允许直接编辑
|
||||
- 删除操作仅限于「草稿」和「已下架」状态
|
||||
|
||||
### 2. 价格体系
|
||||
|
||||
- `originalPrice`: 原价(必填,> 0)
|
||||
- `salePrice`: 售价(必填,> 0,且 ≤ 原价)
|
||||
- `costPrice`: 成本价(选填,仅管理员可见)
|
||||
- 价格精度: 统一保留 **2 位小数**,使用 `number` 类型,前端展示时通过 `valueType: 'money'` 格式化
|
||||
|
||||
### 3. 库存规则
|
||||
|
||||
- 库存低于 `safetyStock`(安全库存)时在列表显示 ⚠️ 警告标识
|
||||
- 库存为 0 时自动标记为「缺货」状态(不影响上下架状态)
|
||||
- 库存变更必须记录变更日志(调拨、入库、出库、盘点)
|
||||
|
||||
## 数据模型
|
||||
|
||||
### 核心接口
|
||||
|
||||
```typescript
|
||||
// src/services/product.ts
|
||||
export async function getProductList(
|
||||
params: ProductQueryParams,
|
||||
): Promise<API.PageResult<ProductItem>> {}
|
||||
export async function getProductDetail(id: string): Promise<ProductItem> {}
|
||||
export async function createProduct(
|
||||
data: ProductFormData,
|
||||
): Promise<ProductItem> {}
|
||||
export async function updateProduct(
|
||||
id: string,
|
||||
data: Partial<ProductFormData>,
|
||||
): Promise<ProductItem> {}
|
||||
export async function updateProductStatus(
|
||||
id: string,
|
||||
status: ProductStatus,
|
||||
): Promise<void> {}
|
||||
export async function deleteProduct(id: string): Promise<void> {}
|
||||
```
|
||||
|
||||
### 关键类型
|
||||
|
||||
```typescript
|
||||
// src/pages/ProductList/data.d.ts
|
||||
type ProductStatus =
|
||||
| 'draft'
|
||||
| 'pending_review'
|
||||
| 'online'
|
||||
| 'offline'
|
||||
| 'rejected';
|
||||
|
||||
interface ProductItem {
|
||||
id: string;
|
||||
name: string;
|
||||
categoryId: string;
|
||||
categoryName: string;
|
||||
originalPrice: number;
|
||||
salePrice: number;
|
||||
costPrice?: number;
|
||||
stock: number;
|
||||
safetyStock: number;
|
||||
status: ProductStatus;
|
||||
images: string[];
|
||||
description: string;
|
||||
attributes: Record<string, string>;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
}
|
||||
```
|
||||
|
||||
## UI 交互规范
|
||||
|
||||
### 1. 商品列表页
|
||||
|
||||
- **组件**: `ProTable`
|
||||
- **必须包含列**: 商品名称、分类、售价、库存、状态、操作
|
||||
- **状态筛选**: 使用 `valueEnum` 映射状态标签颜色
|
||||
- draft → 灰色
|
||||
- pending_review → 橙色
|
||||
- online → 绿色
|
||||
- offline → 默认
|
||||
- rejected → 红色
|
||||
- **批量操作**: 支持批量上架/下架
|
||||
|
||||
### 2. 商品编辑
|
||||
|
||||
- **组件**: `ProForm` + `StepsForm`(分步表单)
|
||||
- **步骤**: 基本信息 → SKU/价格 → 图片/描述 → 确认提交
|
||||
- **价格输入**: 使用 `ProFormMoney` 或 `ProFormDigit` 并配置 `precision={2}`
|
||||
|
||||
### 3. 库存警告
|
||||
|
||||
- 库存 < 安全库存: 单元格显示橙色 + ⚠️
|
||||
- 库存 = 0: 单元格显示红色 + "缺货" 标签
|
||||
|
||||
## i18n Key 规范
|
||||
|
||||
菜单和页面文案 Key 前缀:
|
||||
|
||||
- 菜单: `menu.product.*`
|
||||
- 页面: `pages.product.*`
|
||||
- 表单: `product.form.*`
|
||||
- 状态: `product.status.*`
|
||||
Reference in New Issue
Block a user