Merge branch 'devlop' into yongxu-dev
# Conflicts: # .cursor/skills/miniprogram-dev/SKILL.md resolved by devlop version # miniprogram/pages/index/index.js resolved by devlop version # miniprogram/pages/index/index.wxml resolved by devlop version # miniprogram/pages/my/my.wxml resolved by devlop version # miniprogram/pages/read/read.wxml resolved by devlop version # miniprogram/pages/read/read.wxss resolved by devlop version # soul-admin/dist/index.html resolved by devlop version # soul-admin/src/pages/content/ChapterTree.tsx resolved by devlop version # soul-admin/src/pages/content/ContentPage.tsx resolved by devlop version # soul-admin/src/pages/distribution/DistributionPage.tsx resolved by devlop version # soul-api/internal/handler/book.go resolved by devlop version # soul-api/internal/handler/ckb.go resolved by devlop version # soul-api/internal/handler/db_book.go resolved by devlop version # soul-api/internal/handler/db_ckb_leads.go resolved by devlop version # soul-api/internal/handler/db_person.go resolved by devlop version # soul-api/internal/model/chapter.go resolved by devlop version
This commit is contained in:
44
soul-api/internal/model/balance.go
Normal file
44
soul-api/internal/model/balance.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package model
|
||||
|
||||
import "time"
|
||||
|
||||
type UserBalance struct {
|
||||
UserID string `gorm:"column:user_id;primaryKey;size:50" json:"userId"`
|
||||
Balance float64 `gorm:"column:balance;type:decimal(10,2);default:0" json:"balance"`
|
||||
TotalRecharged float64 `gorm:"column:total_recharged;type:decimal(10,2);default:0" json:"totalRecharged"`
|
||||
TotalGifted float64 `gorm:"column:total_gifted;type:decimal(10,2);default:0" json:"totalGifted"`
|
||||
TotalRefunded float64 `gorm:"column:total_refunded;type:decimal(10,2);default:0" json:"totalRefunded"`
|
||||
CreatedAt time.Time `gorm:"column:created_at" json:"createdAt"`
|
||||
UpdatedAt time.Time `gorm:"column:updated_at" json:"updatedAt"`
|
||||
}
|
||||
|
||||
func (UserBalance) TableName() string { return "user_balances" }
|
||||
|
||||
type BalanceTransaction struct {
|
||||
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
|
||||
UserID string `gorm:"column:user_id;size:50;index" json:"userId"`
|
||||
Type string `gorm:"column:type;size:20" json:"type"`
|
||||
Amount float64 `gorm:"column:amount;type:decimal(10,2)" json:"amount"`
|
||||
BalanceAfter float64 `gorm:"column:balance_after;type:decimal(10,2)" json:"balanceAfter"`
|
||||
RelatedOrder *string `gorm:"column:related_order;size:50" json:"relatedOrder,omitempty"`
|
||||
TargetUserID *string `gorm:"column:target_user_id;size:50" json:"targetUserId,omitempty"`
|
||||
SectionID *string `gorm:"column:section_id;size:50" json:"sectionId,omitempty"`
|
||||
Description string `gorm:"column:description;size:200" json:"description"`
|
||||
CreatedAt time.Time `gorm:"column:created_at" json:"createdAt"`
|
||||
}
|
||||
|
||||
func (BalanceTransaction) TableName() string { return "balance_transactions" }
|
||||
|
||||
type GiftUnlock struct {
|
||||
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
|
||||
GiftCode string `gorm:"column:gift_code;uniqueIndex;size:32" json:"giftCode"`
|
||||
GiverID string `gorm:"column:giver_id;size:50;index" json:"giverId"`
|
||||
SectionID string `gorm:"column:section_id;size:50" json:"sectionId"`
|
||||
ReceiverID *string `gorm:"column:receiver_id;size:50" json:"receiverId,omitempty"`
|
||||
Amount float64 `gorm:"column:amount;type:decimal(10,2)" json:"amount"`
|
||||
Status string `gorm:"column:status;size:20;default:pending" json:"status"`
|
||||
CreatedAt time.Time `gorm:"column:created_at" json:"createdAt"`
|
||||
RedeemedAt *time.Time `gorm:"column:redeemed_at" json:"redeemedAt,omitempty"`
|
||||
}
|
||||
|
||||
func (GiftUnlock) TableName() string { return "gift_unlocks" }
|
||||
@@ -8,7 +8,6 @@ type Chapter struct {
|
||||
ID string `gorm:"column:id;size:20;uniqueIndex" json:"id"`
|
||||
PartID string `gorm:"column:part_id;size:20" json:"partId"`
|
||||
PartTitle string `gorm:"column:part_title;size:100" json:"partTitle"`
|
||||
PartLabel string `gorm:"column:part_label;size:20" json:"partLabel"` // 篇角标,如 一、二、派
|
||||
ChapterID string `gorm:"column:chapter_id;size:20" json:"chapterId"`
|
||||
ChapterTitle string `gorm:"column:chapter_title;size:200" json:"chapterTitle"`
|
||||
SectionTitle string `gorm:"column:section_title;size:200" json:"sectionTitle"`
|
||||
@@ -22,8 +21,8 @@ type Chapter struct {
|
||||
// 普通版/增值版:两者分开互斥,添加文章时勾选归属
|
||||
EditionStandard *bool `gorm:"column:edition_standard" json:"editionStandard,omitempty"` // 是否属于普通版
|
||||
EditionPremium *bool `gorm:"column:edition_premium" json:"editionPremium,omitempty"` // 是否属于增值版
|
||||
HotScore int `gorm:"column:hot_score;default:0" json:"hotScore"` // 热度分,用于排名算法
|
||||
PreviewPercent *int `gorm:"column:preview_percent" json:"previewPercent,omitempty"` // 未解锁时显示前 N%,空则用全局 unpaid_preview_percent
|
||||
HotScore float64 `gorm:"column:hot_score;type:decimal(10,2);default:0" json:"hotScore"` // 热度分(加权计算),用于排名算法
|
||||
PreviewPercent *int `gorm:"column:preview_percent" json:"previewPercent,omitempty"` // 章节级预览比例(%),nil 表示使用全局设置
|
||||
CreatedAt time.Time `gorm:"column:created_at" json:"createdAt"`
|
||||
UpdatedAt time.Time `gorm:"column:updated_at" json:"updatedAt"`
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ type LinkTag struct {
|
||||
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
|
||||
TagID string `gorm:"column:tag_id;size:50;uniqueIndex" json:"tagId"`
|
||||
Label string `gorm:"column:label;size:200" json:"label"`
|
||||
Aliases string `gorm:"column:aliases;size:500;default:''" json:"aliases"` // comma-separated alternative labels
|
||||
URL string `gorm:"column:url;size:500" json:"url"`
|
||||
Type string `gorm:"column:type;size:20" json:"type"`
|
||||
AppID string `gorm:"column:app_id;size:100" json:"appId,omitempty"`
|
||||
|
||||
@@ -2,6 +2,10 @@ package model
|
||||
|
||||
import "time"
|
||||
|
||||
// PersonSourceVipSync 超级个体开通后自动同步创建,共用后台配置的「统一获客计划」;
|
||||
// 删除人物时不得调用存客宝删除计划,否则会波及其他超级个体。
|
||||
const PersonSourceVipSync = "vip_sync"
|
||||
|
||||
// Person @提及人物配置(ContentPage 用)
|
||||
// token 为 32 位唯一密钥,文章 @ 时传入 token,小程序点击时用 token 兑换 ckb_api_key
|
||||
// 同时缓存与存客宝 API 获客计划相关的配置,便于管理端回显与二次编辑
|
||||
@@ -32,6 +36,12 @@ type Person struct {
|
||||
StartTime string `gorm:"column:start_time;size:10;default:'09:00'" json:"startTime"`
|
||||
EndTime string `gorm:"column:end_time;size:10;default:'18:00'" json:"endTime"`
|
||||
DeviceGroups string `gorm:"column:device_groups;size:255;default:''" json:"deviceGroups"` // 逗号分隔的设备ID列表
|
||||
IsPinned bool `gorm:"column:is_pinned;default:false" json:"isPinned"`
|
||||
|
||||
// PersonSource 来源:空=后台手工添加;vip_sync=超级个体自动同步(共用统一计划)
|
||||
PersonSource string `gorm:"column:person_source;size:32;default:''" json:"personSource"`
|
||||
|
||||
IsPinned bool `gorm:"column:is_pinned;default:false" json:"isPinned"` // 置顶到小程序首页
|
||||
|
||||
CreatedAt time.Time `gorm:"column:created_at" json:"createdAt"`
|
||||
UpdatedAt time.Time `gorm:"column:updated_at" json:"updatedAt"`
|
||||
|
||||
@@ -16,6 +16,7 @@ type User struct {
|
||||
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"`
|
||||
@@ -42,7 +43,7 @@ type User struct {
|
||||
Source *string `gorm:"column:source;size:50" json:"source,omitempty"`
|
||||
|
||||
// 用户标签(管理端编辑、神射手回填共用 ckb_tags 列,JSON 数组字符串)
|
||||
CkbTags *string `gorm:"column:ckb_tags;type:text" json:"tags,omitempty"`
|
||||
CkbTags *string `gorm:"column:ckb_tags;type:text" json:"ckbTags,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"`
|
||||
@@ -59,7 +60,8 @@ type User struct {
|
||||
DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;index" json:"-"`
|
||||
|
||||
// 以下为接口返回时从订单/绑定表实时计算的字段,不入库
|
||||
PurchasedSectionCount int `gorm:"-" json:"purchasedSectionCount,omitempty"`
|
||||
PurchasedSectionCount int `gorm:"-" json:"purchasedSectionCount,omitempty"`
|
||||
WalletBalance *float64 `gorm:"-" json:"walletBalance,omitempty"`
|
||||
}
|
||||
|
||||
func (User) TableName() string { return "users" }
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
package model
|
||||
|
||||
import "time"
|
||||
|
||||
// UserBalance 对应表 user_balances
|
||||
type UserBalance struct {
|
||||
UserID string `gorm:"column:user_id;primaryKey;size:50"`
|
||||
Balance float64 `gorm:"column:balance;type:decimal(10,2);default:0"`
|
||||
UpdatedAt time.Time `gorm:"column:updated_at"`
|
||||
}
|
||||
|
||||
func (UserBalance) TableName() string { return "user_balances" }
|
||||
|
||||
// BalanceTransaction 对应表 balance_transactions
|
||||
type BalanceTransaction struct {
|
||||
ID string `gorm:"column:id;primaryKey;size:50"`
|
||||
UserID string `gorm:"column:user_id;size:50"`
|
||||
Type string `gorm:"column:type;size:20"` // recharge, consume, refund, gift
|
||||
Amount float64 `gorm:"column:amount;type:decimal(10,2)"`
|
||||
OrderID *string `gorm:"column:order_id;size:50"`
|
||||
CreatedAt time.Time `gorm:"column:created_at"`
|
||||
}
|
||||
|
||||
func (BalanceTransaction) TableName() string { return "balance_transactions" }
|
||||
Reference in New Issue
Block a user