- 数据模型与迁移: 新增 000082 迁移在 users 表追加 distribution_site_id 并建索引,用户首次在分销站点注册/短信登录时自动绑定站点归属 - 分销管理接口: 新增 GET /admin/distribution/users 接口,聚合本站注册用户与下单客户,返回完整11位手机号、累计消费金额、订单数及来源标签 - 统计与大盘扩展: GET /admin/distribution/sites/:id/analytics 补全今日注册、累计用户、成交客户指标,主站分销商列表追加用户体量展示 - 分销后台前端: 新增「客户与用户」页面 (Users.tsx) 支持一键复制手机号与订单穿透,大盘 (Dashboard.tsx) 增加用户规模核心卡片 - 自动化测试与门禁: 新增 TestListDistributionUsersAndAnalytics 单元测试,通过全量 Go 后端集成测试及前后端构建检查
35 lines
2.1 KiB
Go
35 lines
2.1 KiB
Go
package model
|
|
|
|
import "time"
|
|
|
|
type User struct {
|
|
ID uint64 `gorm:"primaryKey" json:"id"`
|
|
Phone string `gorm:"size:32;not null;uniqueIndex" json:"phone"`
|
|
PasswordHash string `gorm:"size:255;not null;default:''" json:"-"`
|
|
Nickname string `gorm:"size:64;not null;default:''" json:"nickname"`
|
|
AvatarURL string `gorm:"size:512;not null;default:''" json:"avatar_url"`
|
|
RealnameStatus string `gorm:"size:32;not null;default:'unverified'" json:"realname_status"`
|
|
RiskStatus string `gorm:"size:32;not null;default:'normal'" json:"risk_status"`
|
|
CreditScore int `gorm:"not null;default:100" json:"credit_score"`
|
|
DepositFreeQuotaCent int64 `gorm:"not null;default:0" json:"-"`
|
|
RenterGrowthPoints int64 `gorm:"not null;default:0;index:idx_users_renter_growth_level,priority:2" json:"renter_growth_points"`
|
|
RenterGrowthLevel string `gorm:"size:32;not null;default:'normal';index:idx_users_renter_growth_level,priority:1" json:"renter_growth_level"`
|
|
Status string `gorm:"size:32;not null;default:'active'" json:"status"`
|
|
// 会话版本:递增后该用户已签发的全部令牌立即失效。
|
|
// 默认值对齐迁移 000052 的 users.token_version DEFAULT 0。
|
|
TokenVersion int64 `gorm:"not null;default:0" json:"-"`
|
|
// 注册归因:注册时由前端携带的推广短码。
|
|
RegisterTrackCode string `gorm:"size:64;index:idx_users_register_track_code" json:"register_track_code,omitempty"`
|
|
DistributionSiteID uint64 `gorm:"not null;default:0;index:idx_users_distribution_site_id" json:"distribution_site_id"` // 0=主站, >0=对应分销站点
|
|
InviteCode *string `gorm:"size:32;uniqueIndex:uk_users_invite_code" json:"invite_code,omitempty"`
|
|
InvitedByID uint64 `gorm:"not null;default:0;index:idx_users_invited_by_id" json:"invited_by_id,omitempty"`
|
|
InviteVerifiedAt *time.Time `json:"invite_verified_at,omitempty"`
|
|
LastLoginAt *time.Time `json:"last_login_at"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
func (User) TableName() string {
|
|
return "users"
|
|
}
|