# 开发规范与问题记录
## 项目概述
本项目基于 Vue 3 + TypeScript + Element Plus + Vite 技术栈开发的管理系统。
## 已发现的问题与解决方案
### 1. 时间字段处理错误
**问题描述**:
创建道具卡时出现数据库错误:`Error 1292 (22007): Incorrect date value: '0000-00-00' for column 'valid_start' at row 1`
**问题原因**:
- 当用户没有选择有效期时,代码仍然尝试提交时间字段
- 时间数据格式不正确或包含无效值
- 后端数据库不接受'0000-00-00'这样的无效日期
**解决方案**:
```typescript
// 处理有效期 - 只有当时间范围有效时才添加时间字段
if (validTimeRange.value && validTimeRange.value.length === 2 &&
validTimeRange.value[0] && validTimeRange.value[1]) {
try {
const startTime = new Date(validTimeRange.value[0]).getTime()
const endTime = new Date(validTimeRange.value[1]).getTime()
// 验证时间是否有效
if (!isNaN(startTime) && !isNaN(endTime) && startTime > 0 && endTime > 0) {
submitData.valid_start_unix = Math.floor(startTime / 1000)
submitData.valid_end_unix = Math.floor(endTime / 1000)
}
} catch (error) {
console.error('时间处理错误:', error)
}
}
```
**开发规范**:
1. **时间字段处理**:
- 必须验证时间数据的有效性
- 使用`isNaN()`检查时间戳是否为有效数字
- 确保时间值大于0
- 添加try-catch处理可能的异常
2. **数据提交原则**:
- 只提交有效和必要的数据字段
- 避免提交null、undefined或无效的时间数据
- 对可选字段进行严格的有效性检查
### 2. 价格字段数据类型错误
**问题描述**:
创建道具卡时出现错误:`json: cannot unmarshal null into Go struct field createItemCardRequest.price of type int64`
**解决方案**:
```typescript
// 确保价格字段存在且为数字类型
if (submitData.price === undefined || submitData.price === null) {
submitData.price = 0
} else {
submitData.price = Number(submitData.price)
}
```
### 3. 组件结构错误
**问题描述**:
道具卡管理页面按钮不显示,原因是错误的组件插槽使用
**解决方案**:
使用独立的按钮区域布局,避免错误的插槽使用:
```vue
```
### 4. 数据枚举显示问题
**问题描述**:
状态、类型、范围、效果等字段显示为数字而不是对应的文本标签
**解决方案**:
1. 增强枚举映射函数的空值处理
2. 完善状态字段的多状态判断
3. 添加数据类型检查
```typescript
// 增强的枚举映射函数
const getCardTypeLabel = (type: number) => cardTypeMap[type as keyof typeof cardTypeMap] || '未知'
// 完善的状态显示
{{ row.status === 1 ? '启用' : row.status === 2 ? '禁用' : '未知' }}
// 空值处理
{{ getCardTypeLabel(row.card_type || 0) }}
```
### 5. API路径404错误
**问题描述**:
优惠券API请求返回404错误:`admin/system_coupons` 路径不存在
**问题原因**:
后端API路径可能不存在或需要调整
**解决方案**:
1. 检查实际的API路径配置
2. 对比道具卡API路径确认一致性
3. 添加详细的请求调试信息
4. 检查代理配置是否正确
### 6. 数据枚举和操作按钮显示问题
**问题描述**:
道具卡管理页面中:
- 状态、类型、范围、效果等字段显示为数字而不是对应的文本标签
- 操作栏(编辑、删除按钮)不显示
**问题原因**:
1. 枚举映射函数没有正确处理空值
2. 使用了错误的按钮组件(原生的`el-button`而不是项目封装的`ArtButtonTable`)
3. 插槽模板语法正确但组件渲染有问题
**解决方案**:
1. **枚举显示修复**:
```vue
{{ row.status === 1 ? '启用' : row.status === 2 ? '禁用' : '未知' }}
{{ getCardTypeLabel(row.card_type || 0) }}
```
2. **操作按钮修复**:
```vue
```
3. **组件导入**:
```typescript
import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
```
**开发规范**:
1. **组件使用规范**:
- 优先使用项目封装的组件(如`ArtButtonTable`)而不是原生Element Plus组件
- 保持与其他页面一致的UI风格和交互体验
- 使用项目统一的图标和样式系统
2. **枚举显示规范**:
- 所有状态字段必须提供完整的枚举映射
- 处理空值和异常值情况,提供默认值
- 使用统一的标签样式和颜色规范
3. **调试和日志**:
- 添加详细的数据结构检查日志
- 验证枚举映射函数的正确性
- 检查组件渲染和插槽绑定的正确性
## 前端开发规范
### 1. 表单数据处理
- 提交前必须清理数据,移除undefined和null值
- 对数字类型字段进行类型转换和验证
- 时间字段必须验证有效性
- 可选字段需要条件判断
### 2. 错误处理
- 所有API调用必须添加try-catch异常处理
- 用户友好的错误提示信息
- 控制台记录详细错误信息便于调试
### 3. 代码结构
- 保持组件单一职责原则
- 复杂的表单处理逻辑抽取为独立函数
- 添加必要的注释说明业务逻辑
### 4. 数据验证
- 前端表单必须进行完整的验证
- 后端返回的错误需要友好处理
- 特殊字段(如时间、价格)需要额外验证
## 后端接口规范
- 明确字段类型要求(如int64)
- 提供清晰的错误信息和错误码
- 对无效数据给出具体的错误描述
## 数据库规范
- 不允许插入'0000-00-00'等无效日期
- 时间字段必须有默认值或允许为null
- 数字类型字段不能接收字符串类型
---
**最后更新**:2025年11月14日
**文档维护**:开发团队