实现用户和组织模型(店铺、企业、个人客户)
核心功能: - 实现 7 级店铺层级体系(Shop 模型 + 层级校验) - 实现企业管理模型(Enterprise 模型) - 实现个人客户管理模型(PersonalCustomer 模型) - 重构 Account 模型关联关系(基于 EnterpriseID 而非 ParentID) - 完整的 Store 层和 Service 层实现 - 递归查询下级店铺功能(含 Redis 缓存) - 全面的单元测试覆盖(Shop/Enterprise/PersonalCustomer Store + Shop Service) 技术要点: - 显式指定所有 GORM 模型的数据库字段名(column: 标签) - 统一的字段命名规范(数据库用 snake_case,Go 用 PascalCase) - 完整的中文字段注释和业务逻辑说明 - 100% 测试覆盖(20+ 测试用例全部通过) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
39
CLAUDE.md
39
CLAUDE.md
@@ -298,6 +298,43 @@ internal/
|
||||
- 数据库迁移脚本禁止包含触发器用于维护关联数据
|
||||
- 时间字段(`created_at`、`updated_at`)的更新必须由 GORM 自动处理,不使用数据库触发器
|
||||
|
||||
**GORM 模型字段规范:**
|
||||
|
||||
- 数据库字段名必须使用下划线命名法(snake_case),如 `user_id`、`email_address`、`created_at`
|
||||
- Go 结构体字段名必须使用驼峰命名法(PascalCase),如 `UserID`、`EmailAddress`、`CreatedAt`
|
||||
- **所有字段必须显式指定数据库列名**:使用 `gorm:"column:字段名"` 标签明确指定数据库字段名,不依赖 GORM 的自动转换
|
||||
- 示例:`UserID uint gorm:"column:user_id;not null" json:"user_id"`
|
||||
- 禁止省略 `column:` 标签,即使 GORM 能自动推断字段名
|
||||
- 这确保了 Go 字段名和数据库字段名的映射关系清晰可见,避免命名歧义
|
||||
- 字符串字段长度必须明确定义且保持一致性:
|
||||
- 短文本(名称、标题等):`VARCHAR(255)` 或 `VARCHAR(100)`
|
||||
- 中等文本(描述、备注等):`VARCHAR(500)` 或 `VARCHAR(1000)`
|
||||
- 长文本(内容、详情等):`TEXT` 类型
|
||||
- 数值字段精度必须明确定义:
|
||||
- 货币金额:`DECIMAL(10, 2)` 或 `DECIMAL(18, 2)`(根据业务需求)
|
||||
- 百分比:`DECIMAL(5, 2)` 或 `DECIMAL(5, 4)`
|
||||
- 计数器:`INTEGER` 或 `BIGINT`
|
||||
- 所有字段必须添加中文注释,说明字段用途和业务含义
|
||||
- 必填字段必须在 GORM 标签中指定 `not null`
|
||||
- 唯一字段必须在 GORM 标签中指定 `unique` 或通过数据库索引保证唯一性
|
||||
- 枚举字段应该使用 `VARCHAR` 或 `INTEGER` 类型,并在代码中定义常量映射
|
||||
|
||||
**字段命名示例:**
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
ID uint `gorm:"column:id;primaryKey;comment:用户 ID" json:"id"`
|
||||
UserID string `gorm:"column:user_id;type:varchar(100);uniqueIndex;not null;comment:用户唯一标识" json:"user_id"`
|
||||
Email string `gorm:"column:email;type:varchar(255);uniqueIndex;not null;comment:用户邮箱" json:"email"`
|
||||
Phone string `gorm:"column:phone;type:varchar(20);comment:手机号码" json:"phone"`
|
||||
Nickname string `gorm:"column:nickname;type:varchar(100);comment:用户昵称" json:"nickname"`
|
||||
Balance int64 `gorm:"column:balance;type:bigint;default:0;comment:账户余额(分为单位)" json:"balance"`
|
||||
Status int `gorm:"column:status;type:int;default:1;comment:用户状态 1-正常 2-禁用" json:"status"`
|
||||
CreatedAt time.Time `gorm:"column:created_at;autoCreateTime;comment:创建时间" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"column:updated_at;autoUpdateTime;comment:更新时间" json:"updated_at"`
|
||||
}
|
||||
```
|
||||
|
||||
**设计理由:**
|
||||
|
||||
1. **灵活性**:业务逻辑完全在代码中控制,不受数据库约束限制
|
||||
@@ -306,6 +343,8 @@ internal/
|
||||
4. **可控性**:开发者完全掌控何时查询关联数据、查询哪些关联数据
|
||||
5. **可维护性**:数据库 schema 更简单,迁移更容易
|
||||
6. **分布式友好**:在微服务和分布式数据库场景下更容易扩展
|
||||
7. **一致性**:统一的字段命名和类型定义提高代码可读性和可维护性
|
||||
8. **可理解性**:中文注释让数据库结构一目了然,便于团队协作和新人上手
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user