实现用户和组织模型(店铺、企业、个人客户)

核心功能:
- 实现 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:
2026-01-09 18:02:46 +08:00
parent 6fc90abeb6
commit a36e4a79c0
51 changed files with 5736 additions and 144 deletions

View File

@@ -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. **可理解性**:中文注释让数据库结构一目了然,便于团队协作和新人上手
---