bindbox-game/development_standards.md
邹方成 1ab39d2f5a
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 25s
refactor: 重构项目结构并重命名模块
feat(admin): 新增工会管理功能
feat(activity): 添加活动管理相关服务
feat(user): 实现用户道具卡和积分管理
feat(guild): 新增工会成员管理功能

fix: 修复数据库连接配置
fix: 修正jwtoken导入路径
fix: 解决端口冲突问题

style: 统一代码格式和注释风格
style: 更新项目常量命名

docs: 添加项目框架和开发规范文档
docs: 更新接口文档注释

chore: 移除无用代码和文件
chore: 更新Makefile和配置文件
chore: 清理日志文件

test: 添加道具卡测试脚本
2025-11-14 21:10:00 +08:00

209 lines
6.2 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.

# 开发规范与问题记录
## 项目概述
本项目基于 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
<!-- 搜索栏 -->
<ArtSearchBar />
<!-- 表格头部和按钮 -->
<div class="table-header-wrapper">
<div class="header-actions">
<el-button type="primary" @click="handleCreate">
新增道具卡
</el-button>
</div>
</div>
<!-- 数据表格 -->
<ArtTable />
```
### 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
<template #status="{ row }">
<el-tag :type="row.status === 1 ? 'success' : 'danger'">
{{ row.status === 1 ? '启用' : row.status === 2 ? '禁用' : '未知' }}
</el-tag>
</template>
<template #card_type="{ row }">
<el-tag>{{ getCardTypeLabel(row.card_type || 0) }}</el-tag>
</template>
```
2. **操作按钮修复**
```vue
<template #actions="{ row }">
<ArtButtonTable type="edit" @click="handleEdit(row)" />
<ArtButtonTable type="delete" @click="handleDelete(row)" />
</template>
```
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日
**文档维护**:开发团队