# Conflicts: # miniprogram/app.js # miniprogram/app.json # miniprogram/pages/chapters/chapters.js # miniprogram/pages/chapters/chapters.wxml # miniprogram/pages/chapters/chapters.wxss # miniprogram/pages/index/index.js # miniprogram/pages/index/index.wxml # miniprogram/pages/match/match.js # miniprogram/pages/my/my.js # miniprogram/pages/my/my.wxml # miniprogram/pages/read/read.js # miniprogram/pages/read/read.wxml # miniprogram/pages/read/read.wxss # miniprogram/pages/referral/referral.js # miniprogram/pages/search/search.js # miniprogram/pages/vip/vip.js # miniprogram/pages/wallet/wallet.wxml # miniprogram/project.private.config.json # soul-admin/dist/index.html # soul-admin/src/pages/dashboard/DashboardPage.tsx # soul-admin/src/pages/settings/SettingsPage.tsx # soul-api/go.mod # soul-api/internal/handler/admin_dashboard.go # soul-api/internal/handler/db.go # soul-api/wechat/info.log # 开发文档/10、项目管理/运营与变更.md # 开发文档/README.md
68 lines
4.8 KiB
Go
68 lines
4.8 KiB
Go
package model
|
||
|
||
import (
|
||
"time"
|
||
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// User 对应表 users,JSON 输出与现网接口 1:1(小写驼峰)
|
||
// 软删除:管理端删除仅设置 deleted_at,用户再次登录会创建新账号
|
||
type User struct {
|
||
ID string `gorm:"column:id;primaryKey;size:50" json:"id"`
|
||
OpenID *string `gorm:"column:open_id;size:100" json:"openId,omitempty"`
|
||
SessionKey *string `gorm:"column:session_key;size:200" json:"-"` // 微信 session_key,不输出到 JSON
|
||
Nickname *string `gorm:"column:nickname;size:100" json:"nickname,omitempty"`
|
||
Avatar *string `gorm:"column:avatar;size:500" json:"avatar,omitempty"`
|
||
Phone *string `gorm:"column:phone;size:20" json:"phone,omitempty"`
|
||
WechatID *string `gorm:"column:wechat_id;size:100" json:"wechatId,omitempty"`
|
||
Tags *string `gorm:"column:tags;type:text" json:"tags,omitempty"`
|
||
// P3 资料扩展(stitch_soul)
|
||
Mbti *string `gorm:"column:mbti;size:16" json:"mbti,omitempty"`
|
||
Region *string `gorm:"column:region;size:100" json:"region,omitempty"`
|
||
Industry *string `gorm:"column:industry;size:100" json:"industry,omitempty"`
|
||
Position *string `gorm:"column:position;size:100" json:"position,omitempty"`
|
||
BusinessScale *string `gorm:"column:business_scale;size:100" json:"businessScale,omitempty"`
|
||
Skills *string `gorm:"column:skills;size:500" json:"skills,omitempty"`
|
||
StoryBestMonth *string `gorm:"column:story_best_month;type:text" json:"storyBestMonth,omitempty"`
|
||
StoryAchievement *string `gorm:"column:story_achievement;type:text" json:"storyAchievement,omitempty"`
|
||
StoryTurning *string `gorm:"column:story_turning;type:text" json:"storyTurning,omitempty"`
|
||
HelpOffer *string `gorm:"column:help_offer;size:500" json:"helpOffer,omitempty"`
|
||
HelpNeed *string `gorm:"column:help_need;size:500" json:"helpNeed,omitempty"`
|
||
ProjectIntro *string `gorm:"column:project_intro;type:text" json:"projectIntro,omitempty"`
|
||
ReferralCode *string `gorm:"column:referral_code;size:20" json:"referralCode,omitempty"`
|
||
HasFullBook *bool `gorm:"column:has_full_book" json:"hasFullBook,omitempty"`
|
||
PurchasedSections *string `gorm:"column:purchased_sections;type:json" json:"-"` // 内部字段,实际数据从 orders 表查
|
||
Earnings *float64 `gorm:"column:earnings;type:decimal(10,2)" json:"earnings,omitempty"`
|
||
PendingEarnings *float64 `gorm:"column:pending_earnings;type:decimal(10,2)" json:"pendingEarnings,omitempty"`
|
||
ReferralCount *int `gorm:"column:referral_count" json:"referralCount,omitempty"`
|
||
CreatedAt time.Time `gorm:"column:created_at" json:"createdAt"`
|
||
UpdatedAt time.Time `gorm:"column:updated_at" json:"updatedAt"`
|
||
IsAdmin *bool `gorm:"column:is_admin" json:"isAdmin,omitempty"`
|
||
WithdrawnEarnings *float64 `gorm:"column:withdrawn_earnings;type:decimal(10,2)" json:"withdrawnEarnings,omitempty"`
|
||
Source *string `gorm:"column:source;size:50" json:"source,omitempty"`
|
||
|
||
// 用户标签(管理端编辑、神射手回填共用 ckb_tags 列,JSON 数组字符串)
|
||
CkbTags *string `gorm:"column:ckb_tags;type:text" json:"tags,omitempty"`
|
||
// VIP 相关(与 next-project 线上 users 表一致,支持手动设置;管理端需读写)
|
||
IsVip *bool `gorm:"column:is_vip" json:"isVip,omitempty"`
|
||
VipExpireDate *time.Time `gorm:"column:vip_expire_date" json:"vipExpireDate,omitempty"`
|
||
VipActivatedAt *time.Time `gorm:"column:vip_activated_at" json:"vipActivatedAt,omitempty"` // 成为 VIP 时间,排序用:付款=pay_time,手动=now
|
||
VipSort *int `gorm:"column:vip_sort" json:"vipSort,omitempty"` // 手动排序,越小越前,NULL 按 vip_activated_at
|
||
VipRole *string `gorm:"column:vip_role;size:50" json:"vipRole,omitempty"` // 角色:从 vip_roles 选或手动填写
|
||
VipName *string `gorm:"column:vip_name;size:100" json:"vipName,omitempty"`
|
||
VipAvatar *string `gorm:"column:vip_avatar;size:500" json:"vipAvatar,omitempty"`
|
||
VipProject *string `gorm:"column:vip_project;size:200" json:"vipProject,omitempty"`
|
||
VipContact *string `gorm:"column:vip_contact;size:100" json:"vipContact,omitempty"`
|
||
VipBio *string `gorm:"column:vip_bio;type:text" json:"vipBio,omitempty"`
|
||
|
||
// 软删除:管理端假删除,用户再次登录会新建账号
|
||
DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;index" json:"-"`
|
||
|
||
// 以下为接口返回时从订单/绑定表实时计算的字段,不入库
|
||
PurchasedSectionCount int `gorm:"-" json:"purchasedSectionCount,omitempty"`
|
||
WalletBalance *float64 `gorm:"-" json:"walletBalance,omitempty"`
|
||
}
|
||
|
||
func (User) TableName() string { return "users" }
|