HaniBlindBox/.kiro/specs/system-config-frontend/design.md
2026-01-18 01:29:27 +08:00

375 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Design Document: 系统配置模块前端迁移
## Overview
本设计文档描述系统配置模块从老项目PHP ThinkPHP + Layui迁移到新项目ASP.NET Core + Vue 3 + Element Plus的技术设计方案。系统配置模块包含8个子模块基础设置、微信支付配置、支付宝支付配置、小程序配置、H5配置、上传配置、签到配置和系统设置。
## Architecture
### 整体架构
```
┌─────────────────────────────────────────────────────────────┐
│ 前端 (Vue 3 + Element Plus) │
├─────────────────────────────────────────────────────────────┤
│ views/business/config/ │
│ ├── base.vue (基础设置页面) │
│ ├── weixinpay.vue (微信支付配置页面) │
│ ├── alipay.vue (支付宝支付配置页面) │
│ ├── miniprogram.vue (小程序配置页面) │
│ ├── h5.vue (H5配置页面) │
│ ├── uploads.vue (上传配置页面) │
│ ├── sign.vue (签到配置页面) │
│ └── system.vue (系统设置页面) │
├─────────────────────────────────────────────────────────────┤
│ api/business/config.ts (API调用层) │
├─────────────────────────────────────────────────────────────┤
│ 后端 (ASP.NET Core) │
│ ConfigController.cs + AdminConfigService.cs │
│ - GET /api/admin/business/config/{key} │
│ - PUT /api/admin/business/config/{key} │
│ - GET /api/admin/business/config/keys │
└─────────────────────────────────────────────────────────────┘
```
### 配置键映射
| 配置键 | 说明 | 对应页面 |
|--------|------|----------|
| base | 基础设置 | base.vue |
| weixinpay_setting | 微信支付配置 | weixinpay.vue |
| alipay_setting | 支付宝支付配置 | alipay.vue |
| miniprogram_setting | 小程序配置 | miniprogram.vue |
| h5_setting | H5配置 | h5.vue |
| uploads | 上传配置 | uploads.vue |
| sign | 签到配置 | sign.vue |
| systemconfig | 系统配置 | system.vue |
| app_setting | 应用设置 | system.vue |
| user_config | 用户UID设置 | system.vue |
| infinite_multiple | 无限赏抽奖倍数 | system.vue |
| rank_setting | 排行榜设置 | system.vue |
| system_test | 内测配置 | system.vue |
## Components and Interfaces
### 前端API接口定义
```typescript
// api/business/config.ts
// 配置键类型
export type ConfigKey =
| 'base'
| 'weixinpay_setting'
| 'alipay_setting'
| 'miniprogram_setting'
| 'h5_setting'
| 'uploads'
| 'sign'
| 'systemconfig'
| 'app_setting'
| 'user_config'
| 'infinite_multiple'
| 'rank_setting'
| 'system_test';
// 获取配置
export function getConfig<T>(key: ConfigKey): Promise<ApiResponse<T>>;
// 更新配置
export function updateConfig<T>(key: ConfigKey, value: T): Promise<ApiResponse<void>>;
// 获取所有配置键
export function getConfigKeys(): Promise<ApiResponse<string[]>>;
```
### 数据模型定义
```typescript
// 基础设置
export interface BaseSetting {
title: string; // 网站名称
logistics_code: string; // 物流code
lianji_max_num: number; // 连击赏最大抽取次数
fx_bili: number; // 分销奖励比例
coupon_ling_max_ci: number; // 赏券每人每天最多领取次数
coupon_a_xz_max: number; // 特级赏券限制参与人数
coupon_b_xz_max: number; // 终极赏券限制参与人数
coupon_c_xz_max: number; // 高级赏券限制参与人数
coupon_d_xz_max: number; // 普通赏券限制参与人数
free_post: number; // 背包满多少包邮
post_money: number; // 背包发货运费
three_time: number; // 一番赏三发+时间(秒)
five_time: number; // 一番赏五发+时间(秒)
erweima: string; // 福利进群二维码
share_title: string; // 分享标题
share_image: string; // 分享图片
draw_people_num: number; // 抽奖券拉人上限
is_shou_tan: number; // 首页是否弹窗 0关闭 1开启
is_exchange: number; // 兑换开关 0关闭 1开启
}
// 微信支付商户
export interface WeixinPayMerchant {
name: string; // 商户名称
mch_id: string; // 商户号
keys: string; // 商户密钥
order_prefix: string; // 订单前缀(3位)
weight: number; // 权重
is_enabled: number; // 是否启用 0禁用 1启用
remark: string; // 备注
}
// 微信支付配置
export interface WeixinPaySetting {
merchants: WeixinPayMerchant[];
}
// 支付宝商户
export interface AlipayMerchant {
name: string; // 商户名称
appId: string; // 应用ID
privateKey: string; // 应用私钥
publicKey: string; // 支付宝公钥
weight: number; // 权重
is_enabled: number; // 是否启用
remark: string; // 备注
}
// 支付宝配置
export interface AlipaySetting {
merchants: AlipayMerchant[];
}
// 小程序配置项
export interface MiniprogramConfig {
name: string; // 小程序名称
appid: string; // AppId
appsecret: string; // AppSecret
domain: string; // 域名(逗号分隔)
order_prefix: string; // 订单前缀(2位)
is_default: number; // 是否默认 0否 1是
merchants: number[]; // 关联商户索引
}
// 小程序配置
export interface MiniprogramSetting {
miniprograms: MiniprogramConfig[];
}
// H5应用配置项
export interface H5AppConfig {
name: string; // 应用名称
appid: string; // AppId
appsecret: string; // AppSecret
domain: string; // 域名(逗号分隔)
order_prefix: string; // 订单前缀(2位)
is_default: number; // 是否默认 0否 1是
pay_type: string; // 支付方式 alipay/wechat
wx_merchant_index: number; // 微信商户索引
ali_merchant_index: number; // 支付宝商户索引
}
// H5配置
export interface H5Setting {
h5apps: H5AppConfig[];
}
// 上传配置
export interface UploadSetting {
type: string; // 存储类型 local/aliyun/tencent
bucket: string; // 空间名称
region: string; // 地域
accessKeyId: string; // AccessKeyId
accessKeySecret: string; // AccessKeySecret
domain: string; // 请求域名
}
// 签到配置
export interface SignSetting {
one_num: number; // 第一天奖励
two_num: number; // 第二天奖励
three_num: number; // 第三天奖励
four_num: number; // 第四天奖励
five_num: number; // 第五天奖励
six_num: number; // 第六天奖励
seven_num: number; // 第七天奖励
}
// 应用设置
export interface AppSetting {
project_name: string; // 项目名称
buy_popup: number; // 购买弹窗 1弹出一次 2每天显示
mall_buy_limit: number; // 商城购买次数
balance_name: string; // 余额名称
balance_icon: string; // 余额图标
currency1_name: string; // 货币1名称
currency1_icon: string; // 货币1图标
currency2_name: string; // 货币2名称
currency2_icon: string; // 货币2图标
win_audio: string; // 中奖音频
version: string; // 小程序版本号
sign_threshold: number; // 签到消费门槛
exchange_show_threshold: number; // 显示兑换达达券按钮门槛
takeout_box_id: number; // 外卖盒子ID
daily_free_draw_id: number; // 每日免费抽奖ID
box_exchange_limit: number; // 盒柜兑换次数限制
daily_coupon_limit: number; // 每天优惠券次数
}
// 用户UID配置
export interface UserConfig {
uid_type: string; // UID类型 real_id/number/random
uid_length: number; // UID长度
}
// 内测配置
export interface SystemTest {
is_test: number; // 是否开启内测 0关闭 1开启
disable_wechat_pay: number; // 是否禁用微信支付 0启用 1禁用
sign_multiple: number; // 签到倍数
}
// 无限赏抽奖倍数
export interface InfiniteMultiple {
multiple: number; // 抽奖倍数 1000/10000/100000
}
// 排行榜设置
export interface RankSetting {
dada_type: string; // 达达券排行榜统计方式 day/week/month/year/custom
dada_start: string; // 达达券自定义开始时间
dada_end: string; // 达达券自定义结束时间
diamond_type: string; // 钻石排行榜统计方式
diamond_start: string; // 钻石自定义开始时间
diamond_end: string; // 钻石自定义结束时间
uu_type: string; // UU币排行榜统计方式
uu_start: string; // UU币自定义开始时间
uu_end: string; // UU币自定义结束时间
}
```
### 页面组件结构
```
views/business/config/
├── base.vue # 基础设置页面
├── weixinpay.vue # 微信支付配置页面
│ └── components/
│ └── MerchantForm.vue # 商户表单组件(可复用)
├── alipay.vue # 支付宝支付配置页面
├── miniprogram.vue # 小程序配置页面
│ └── components/
│ └── MiniprogramForm.vue # 小程序表单组件
├── h5.vue # H5配置页面
│ └── components/
│ └── H5AppForm.vue # H5应用表单组件
├── uploads.vue # 上传配置页面
├── sign.vue # 签到配置页面
└── system.vue # 系统设置页面(多卡片)
└── components/
├── AppSettingCard.vue # 应用设置卡片
├── UserConfigCard.vue # 用户UID设置卡片
├── SystemTestCard.vue # 内测配置卡片
├── InfiniteMultipleCard.vue # 无限赏抽奖倍数卡片
└── RankSettingCard.vue # 排行榜设置卡片
```
## Data Models
### 后端已有的配置模型
后端 `ConfigModels.cs` 已定义以下模型:
- `WeixinPaySetting` / `WeixinPayMerchant`
- `MiniprogramSetting` / `MiniprogramConfig`
- `H5Setting` / `H5AppConfig`
### 需要补充的后端模型
后端需要补充以下配置模型的验证逻辑:
- `AlipaySetting` / `AlipayMerchant` - 支付宝配置验证
- `BaseSetting` - 基础设置验证
- `SignSetting` - 签到配置验证
- `AppSetting` - 应用设置验证
- `UserConfig` - 用户UID配置验证
- `SystemTest` - 内测配置验证
- `InfiniteMultiple` - 无限赏抽奖倍数验证
- `RankSetting` - 排行榜设置验证
## Correctness Properties
*A property is a characteristic or behavior that should hold true across all valid executions of a system-essentially, a formal statement about what the system should do. Properties serve as the bridge between human-readable specifications and machine-verifiable correctness guarantees.*
### Property 1: 配置保存后获取一致性
*For any* 有效的配置数据,保存配置后再获取,应该返回与保存时相同的数据。
**Validates: Requirements 1.2, 1.3, 1.4, 7.2**
### Property 2: 微信支付商户前缀唯一性验证
*For any* 微信支付商户列表所有商户的订单前缀必须是3位字符且互不相同。
**Validates: Requirements 2.4**
### Property 3: 小程序默认唯一性验证
*For any* 小程序配置列表,必须有且只有一个默认小程序。
**Validates: Requirements 4.4, 4.9**
### Property 4: H5应用默认唯一性验证
*For any* H5应用配置列表必须有且只有一个默认H5应用。
**Validates: Requirements 5.4, 5.11**
### Property 5: 商户列表最少保留一个
*For any* 商户列表(微信支付/支付宝),删除操作后至少保留一个商户。
**Validates: Requirements 2.7, 3.7**
### Property 6: API响应格式一致性
*For any* 配置API调用响应格式应该符合 `ApiResponse<T>` 结构。
**Validates: Requirements 10.1, 10.2, 10.3**
## Error Handling
### 前端错误处理
1. **网络错误**: 显示网络错误提示,允许重试
2. **验证错误**: 在表单字段下方显示具体错误信息
3. **保存失败**: 显示错误消息,保留用户输入
4. **加载失败**: 显示加载失败提示,允许重新加载
### 后端错误处理
1. **配置键无效**: 返回 400 Bad Request错误信息 "不支持的配置键"
2. **配置值格式错误**: 返回 400 Bad Request具体验证错误信息
3. **保存失败**: 返回 500 Internal Server Error
## Testing Strategy
### 单元测试
1. **API调用测试**: 测试 `config.ts` 中的API调用函数
2. **表单验证测试**: 测试各配置页面的表单验证逻辑
3. **数据转换测试**: 测试前后端数据格式转换
### 属性测试
使用 fast-check 进行属性测试:
1. **配置保存一致性测试**: 生成随机配置数据,验证保存后获取一致
2. **前缀唯一性测试**: 生成随机商户列表,验证前缀唯一性检查
3. **默认唯一性测试**: 生成随机小程序/H5列表验证默认唯一性检查
### 测试配置
- 属性测试最少运行 100 次迭代
- 每个属性测试需要标注对应的设计文档属性编号
- 标签格式: **Feature: system-config-frontend, Property {number}: {property_text}**