feat: 迁移plant

This commit is contained in:
Blizzard
2026-05-23 13:55:05 +08:00
parent a93477ea8e
commit ae6d03d351
228 changed files with 25296 additions and 917 deletions
+190 -124
View File
@@ -5,12 +5,12 @@ import (
"time"
)
// ========== 用户扩展表plant业务特有字段) ==========
// ========== 用户扩展表 ==========
// SundynixPlantUserProfile 植物服务用户扩展表
type SundynixPlantUserProfile struct {
type UserProfile struct {
model.BaseModel
UserID string `gorm:"size:50;uniqueIndex;column:user_id" json:"userId"`
MiniOpenID string `gorm:"size:80;column:mini_open_id" json:"miniOpenId"`
NickName string `gorm:"size:100;column:nick_name" json:"nickName"`
AvatarID string `gorm:"size:50;column:avatar_id" json:"avatarId"`
LevelID string `gorm:"size:50;column:level_id" json:"levelId"`
@@ -26,14 +26,11 @@ type SundynixPlantUserProfile struct {
PhotoCount int64 `gorm:"not null;default:0;column:photo_count" json:"photoCount"`
}
func (SundynixPlantUserProfile) TableName() string {
return "sundynix_plant_user_profile"
}
func (UserProfile) TableName() string { return "sundynix_plant_user_profile" }
// ========== 我的植物 ==========
// SundynixMyPlant 我的植物
type SundynixMyPlant struct {
type MyPlant struct {
model.BaseModel
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
Name string `gorm:"size:20;column:name" json:"name"`
@@ -44,26 +41,26 @@ type SundynixMyPlant struct {
PotSize string `gorm:"size:50;column:pot_size" json:"potSize"`
Sunlight string `gorm:"size:50;column:sunlight" json:"sunlight"`
PlantingMaterial string `gorm:"size:50;column:planting_material" json:"plantingMaterial"`
// 关联(使用 Preload 加载,仅限本地 sundynix_plant_* 表)
CarePlans []*CarePlan `gorm:"foreignKey:PlantID" json:"carePlans"`
CareRecords []*CareRecord `gorm:"foreignKey:PlantID" json:"careRecords"`
GrowthRecords []*GrowthRecord `gorm:"foreignKey:PlantID" json:"growthRecords"`
CareTasks []*CareTask `gorm:"foreignKey:PlantID" json:"careTasks"`
}
func (SundynixMyPlant) TableName() string {
return "sundynix_my_plant"
}
func (MyPlant) TableName() string { return "sundynix_plant_my_plant" }
// SundynixMyPlantOss 植物图片关联表
type SundynixMyPlantOss struct {
type MyPlantOss struct {
MyPlantID string `gorm:"size:50;primaryKey;column:sundynix_my_plant_id" json:"myPlantId"`
OssID string `gorm:"size:50;primaryKey;column:sundynix_oss_id" json:"ossId"`
}
func (SundynixMyPlantOss) TableName() string {
return "sundynix_my_plant_oss"
}
func (MyPlantOss) TableName() string { return "sundynix_plant_my_plant_oss" }
// ========== 养护计划/记录 ==========
// ========== 养护计划/记录/任务 ==========
// SundynixCarePlan 养护计划
type SundynixCarePlan struct {
type CarePlan struct {
model.BaseModel
UserID string `gorm:"size:50;column:user_id" json:"userId"`
PlantID string `gorm:"size:50;index;column:plant_id" json:"plantId"`
@@ -73,12 +70,9 @@ type SundynixCarePlan struct {
TargetAction string `gorm:"size:32;index;column:target_action" json:"targetAction"`
}
func (SundynixCarePlan) TableName() string {
return "sundynix_care_plan"
}
func (CarePlan) TableName() string { return "sundynix_plant_care_plan" }
// SundynixCareRecord 养护记录
type SundynixCareRecord struct {
type CareRecord struct {
model.BaseModel
UserID string `gorm:"size:50;column:user_id" json:"userId"`
PlantID string `gorm:"size:50;index;column:plant_id" json:"plantId"`
@@ -88,29 +82,27 @@ type SundynixCareRecord struct {
Icon string `gorm:"type:text;column:icon" json:"icon"`
}
func (SundynixCareRecord) TableName() string {
return "sundynix_care_record"
}
func (CareRecord) TableName() string { return "sundynix_plant_care_record" }
// SundynixCareTask 养护任务
type SundynixCareTask struct {
// CareTask 养护任务 status: 1=待完成 2=已完成 3=已过期
type CareTask struct {
model.BaseModel
UserID string `gorm:"size:50;column:user_id" json:"userId"`
PlantID string `gorm:"size:50;index;column:plant_id" json:"plantId"`
PlanID string `gorm:"size:50;index;column:plan_id" json:"planId"`
Name string `gorm:"size:50;column:name" json:"name"`
Icon string `gorm:"type:text;column:icon" json:"icon"`
TargetAction string `gorm:"size:32;column:target_action" json:"targetAction"`
DueDate time.Time `gorm:"column:due_date" json:"dueDate"`
Status int `gorm:"default:1;column:status" json:"status"`
UserID string `gorm:"size:50;column:user_id" json:"userId"`
PlantID string `gorm:"size:50;index;column:plant_id" json:"plantId"`
PlanID string `gorm:"size:50;index;column:plan_id" json:"planId"`
Name string `gorm:"size:50;column:name" json:"name"`
Icon string `gorm:"type:text;column:icon" json:"icon"`
TargetAction string `gorm:"size:32;column:target_action" json:"targetAction"`
DueDate time.Time `gorm:"column:due_date" json:"dueDate"`
CompletedAt *time.Time `gorm:"column:completed_at" json:"completedAt"`
Status int `gorm:"default:1;column:status" json:"status"`
}
func (SundynixCareTask) TableName() string {
return "sundynix_care_task"
}
func (CareTask) TableName() string { return "sundynix_plant_care_task" }
// SundynixGrowthRecord 成长记录
type SundynixGrowthRecord struct {
// ========== 成长记录 ==========
type GrowthRecord struct {
model.BaseModel
PlantID string `gorm:"size:50;index;column:plant_id" json:"plantId"`
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
@@ -120,16 +112,14 @@ type SundynixGrowthRecord struct {
Content string `gorm:"size:200;column:content" json:"content"`
}
func (SundynixGrowthRecord) TableName() string {
return "sundynix_growth_record"
}
func (GrowthRecord) TableName() string { return "sundynix_plant_growth_record" }
// ========== 百科 ==========
// SundynixWiki 植物百科
type SundynixWiki struct {
type Wiki struct {
model.BaseModel
IsHot int `gorm:"column:is_hot" json:"isHot"`
IsVectorSynced int `gorm:"column:is_vector_synced;type:tinyint;default:0" json:"isVectorSynced"`
Name string `gorm:"size:50;column:name" json:"name"`
LatinName string `gorm:"size:100;column:latin_name" json:"latinName"`
Aliases string `gorm:"size:100;column:aliases" json:"aliases"`
@@ -153,39 +143,52 @@ type SundynixWiki struct {
FloweringShape string `gorm:"size:100;column:flowering_shape" json:"floweringShape"`
FlowerDiameter int `gorm:"column:flower_diameter" json:"flowerDiameter"`
Fruit string `gorm:"size:200;column:fruit" json:"fruit"`
ClassID string `gorm:"size:50;index;column:class_id" json:"classId"`
}
func (SundynixWiki) TableName() string {
return "sundynix_wiki"
}
func (Wiki) TableName() string { return "sundynix_plant_wiki" }
// SundynixWikiClass 百科分类
type SundynixWikiClass struct {
type WikiClass struct {
model.BaseModel
Name string `gorm:"size:50;column:name" json:"name"`
OssID string `gorm:"size:50;column:oss_id" json:"ossId"`
}
func (SundynixWikiClass) TableName() string {
return "sundynix_wiki_class"
func (WikiClass) TableName() string { return "sundynix_plant_wiki_class" }
type WikiOss struct {
WikiID string `gorm:"size:50;primaryKey;column:wiki_id" json:"wikiId"`
OssID string `gorm:"size:50;primaryKey;column:oss_id" json:"ossId"`
}
// SundynixUserStar 用户收藏
type SundynixUserStar struct {
func (WikiOss) TableName() string { return "sundynix_plant_wiki_oss" }
type WikiClassRelation struct {
WikiID string `gorm:"size:50;primaryKey;column:wiki_id" json:"wikiId"`
ClassID string `gorm:"size:50;primaryKey;column:class_id" json:"classId"`
}
func (WikiClassRelation) TableName() string { return "sundynix_plant_wiki_class_rel" }
type WikiRelated struct {
WikiID string `gorm:"size:50;primaryKey;column:wiki_id" json:"wikiId"`
RelatedWikiID string `gorm:"size:50;primaryKey;column:related_wiki_id" json:"relatedWikiId"`
}
func (WikiRelated) TableName() string { return "sundynix_plant_wiki_related" }
type UserStar struct {
model.BaseModel
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
TargetID string `gorm:"size:50;index;column:target_id" json:"targetId"`
Type string `gorm:"size:20;column:type" json:"type"` // wiki/post
}
func (SundynixUserStar) TableName() string {
return "sundynix_user_star"
}
func (UserStar) TableName() string { return "sundynix_plant_user_star" }
// ========== 社区 ==========
// SundynixPost 社区帖子
type SundynixPost struct {
type Post struct {
model.BaseModel
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
Title string `gorm:"size:100;column:title" json:"title"`
@@ -196,14 +199,18 @@ type SundynixPost struct {
StarCount int `gorm:"default:0;column:star_count" json:"starCount"`
Location string `gorm:"size:100;column:location" json:"location"`
HasReviewed int `gorm:"default:0;column:has_reviewed" json:"hasReviewed"`
TopicID string `gorm:"size:50;index;column:topic_id" json:"topicId"`
// 关联(使用 Preload 加载,仅限本地 sundynix_plant_* 表)
CommentList []*PostComment `gorm:"foreignKey:PostID" json:"commentList"`
LikeList []*PostLike `gorm:"foreignKey:PostID" json:"likeList"`
HasLiked int `gorm:"-" json:"hasLiked"`
HasStar int `gorm:"-" json:"hasStar"`
}
func (SundynixPost) TableName() string {
return "sundynix_post"
}
func (Post) TableName() string { return "sundynix_plant_post" }
// SundynixPostComment 帖子评论
type SundynixPostComment struct {
type PostComment struct {
model.BaseModel
PostID string `gorm:"size:50;index;column:post_id" json:"postId"`
UserID string `gorm:"size:50;column:user_id" json:"userId"`
@@ -211,67 +218,95 @@ type SundynixPostComment struct {
ParentID string `gorm:"size:50;column:parent_id" json:"parentId"`
}
func (SundynixPostComment) TableName() string {
return "sundynix_post_comment"
}
func (PostComment) TableName() string { return "sundynix_plant_post_comment" }
// SundynixPostLike 帖子点赞
type SundynixPostLike struct {
type PostLike struct {
model.BaseModel
PostID string `gorm:"size:50;index;column:post_id" json:"postId"`
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
}
func (SundynixPostLike) TableName() string {
return "sundynix_post_like"
type PostOss struct {
PostID string `gorm:"size:50;primaryKey;column:post_id" json:"postId"`
OssID string `gorm:"size:50;primaryKey;column:oss_id" json:"ossId"`
}
// SundynixPostTopic 话题
type SundynixPostTopic struct {
func (PostOss) TableName() string { return "sundynix_plant_post_oss" }
type Topic struct {
model.BaseModel
Name string `gorm:"size:50;column:name" json:"name"`
PostCount int `gorm:"default:0;column:post_count" json:"postCount"`
Name string `gorm:"size:50;column:name" json:"name"`
Title string `gorm:"size:100;column:title" json:"title"`
Icon string `gorm:"type:text;column:icon" json:"icon"`
Desc string `gorm:"size:200;column:desc" json:"desc"`
Remark string `gorm:"size:500;column:remark" json:"remark"`
StartTime *time.Time `gorm:"column:start_time" json:"startTime"`
EndTime *time.Time `gorm:"column:end_time" json:"endTime"`
PostCount int `gorm:"default:0;column:post_count" json:"postCount"`
}
func (SundynixPostTopic) TableName() string {
return "sundynix_post_topic"
func (Topic) TableName() string { return "sundynix_plant_topic" }
// ========== OCR ==========
// OcrLog OCR识别记录
type OcrLog struct {
model.BaseModel
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
ImageUrl string `gorm:"size:500;column:image_url" json:"imageUrl"`
Result string `gorm:"type:text;column:result" json:"result"`
LogID uint64 `gorm:"column:log_id;index" json:"logId"`
}
func (OcrLog) TableName() string { return "sundynix_plant_ocr_log" }
// ========== 积分商城 ==========
// SundynixExchangeItem 兑换商品
type SundynixExchangeItem struct {
// ExchangeItem status: 1=上架 2=下架
type ExchangeItem struct {
model.BaseModel
Name string `gorm:"size:100;column:name" json:"name"`
Desc string `gorm:"size:200;column:desc" json:"desc"`
ImgID string `gorm:"size:50;column:img_id" json:"imgId"`
Cost int64 `gorm:"column:cost" json:"cost"`
Stock int `gorm:"column:stock" json:"stock"`
Status int `gorm:"default:1;column:status" json:"status"`
Name string `gorm:"size:100;column:name" json:"name"`
Desc string `gorm:"size:200;column:desc" json:"desc"`
Description string `gorm:"type:text;column:description" json:"description"`
ImgID string `gorm:"size:50;column:img_id" json:"imgId"`
ImageID string `gorm:"size:50;column:image_id" json:"imageId"`
Type string `gorm:"size:20;default:'PHYSICAL';column:type" json:"type"`
Cost int64 `gorm:"column:cost" json:"cost"`
CostSunlight int64 `gorm:"column:cost_sunlight" json:"costSunlight"`
Stock int `gorm:"column:stock;default:-1" json:"stock"`
LimitPerUser int `gorm:"column:limit_per_user;default:0" json:"limitPerUser"`
Status int `gorm:"default:1;column:status" json:"status"`
Sort int `gorm:"default:0;column:sort" json:"sort"`
StartTime *time.Time `gorm:"column:start_time" json:"startTime"`
EndTime *time.Time `gorm:"column:end_time" json:"endTime"`
}
func (SundynixExchangeItem) TableName() string {
return "sundynix_exchange_item"
}
func (ExchangeItem) TableName() string { return "sundynix_plant_exchange_item" }
// SundynixExchangeOrder 兑换订单
type SundynixExchangeOrder struct {
// ExchangeOrder status: 0=待处理 1=已完成 2=已取消
type ExchangeOrder struct {
model.BaseModel
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
ItemID string `gorm:"size:50;column:item_id" json:"itemId"`
Cost int64 `gorm:"column:cost" json:"cost"`
Status int `gorm:"default:0;column:status" json:"status"`
Address string `gorm:"size:200;column:address" json:"address"`
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
ItemID string `gorm:"size:50;column:item_id" json:"itemId"`
ItemName string `gorm:"size:100;column:item_name" json:"itemName"`
Cost int64 `gorm:"column:cost" json:"cost"`
CostSunlight int64 `gorm:"column:cost_sunlight" json:"costSunlight"`
Quantity int `gorm:"column:quantity;default:1" json:"quantity"`
Status int `gorm:"default:1;column:status" json:"status"`
ItemType string `gorm:"size:20;column:item_type" json:"itemType"`
RecipientName string `gorm:"size:50;column:recipient_name" json:"recipientName"`
Phone string `gorm:"size:20;column:phone" json:"phone"`
Address string `gorm:"size:255;column:address" json:"address"`
TrackingNo string `gorm:"size:100;column:tracking_no" json:"trackingNo"`
Remark string `gorm:"size:255;column:remark" json:"remark"`
CompletedAt *time.Time `gorm:"column:completed_at" json:"completedAt"`
}
func (SundynixExchangeOrder) TableName() string {
return "sundynix_exchange_order"
}
func (ExchangeOrder) TableName() string { return "sundynix_plant_exchange_order" }
// ========== 等级/徽章配置 ==========
// SundynixLevelConfig 等级配置
type SundynixLevelConfig struct {
type LevelConfig struct {
model.BaseModel
Level int `gorm:"column:level" json:"level"`
Title string `gorm:"size:50;column:title" json:"title"`
@@ -279,12 +314,9 @@ type SundynixLevelConfig struct {
Perks string `gorm:"size:200;column:perks" json:"perks"`
}
func (SundynixLevelConfig) TableName() string {
return "sundynix_level_config"
}
func (LevelConfig) TableName() string { return "sundynix_plant_level_config" }
// SundynixBadgeConfig 徽章配置
type SundynixBadgeConfig struct {
type BadgeConfig struct {
model.BaseModel
Name string `gorm:"size:64;column:name" json:"name"`
Description string `gorm:"size:255;column:description" json:"description"`
@@ -299,29 +331,63 @@ type SundynixBadgeConfig struct {
Sort int `gorm:"default:1;column:sort" json:"sort"`
}
func (SundynixBadgeConfig) TableName() string {
return "sundynix_badge_config"
}
func (BadgeConfig) TableName() string { return "sundynix_plant_badge_config" }
// SundynixUserBadge 用户徽章
type SundynixUserBadge struct {
type UserBadge struct {
model.BaseModel
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
BadgeID string `gorm:"size:50;index;column:badge_id" json:"badgeId"`
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
BadgeID string `gorm:"size:50;index;column:badge_id" json:"badgeId"`
AcquiredAt time.Time `gorm:"autoCreateTime;column:acquired_at" json:"acquiredAt"`
}
func (SundynixUserBadge) TableName() string {
return "sundynix_user_badge"
}
func (UserBadge) TableName() string { return "sundynix_plant_user_badge" }
// SundynixAiChatHistory AI聊天历史
type SundynixAiChatHistory struct {
// ========== AI ==========
// AiChatHistory 匹配旧项目 question/answer 字段
type AiChatHistory struct {
model.BaseModel
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
Role string `gorm:"size:20;column:role" json:"role"`
Content string `gorm:"type:text;column:content" json:"content"`
UserID string `gorm:"size:50;index;column:user_id" json:"userId"`
Question string `gorm:"type:text;column:question" json:"question"`
Answer string `gorm:"type:text;column:answer" json:"answer"`
Role string `gorm:"size:20;column:role" json:"role"`
Content string `gorm:"type:text;column:content" json:"content"`
}
func (SundynixAiChatHistory) TableName() string {
return "sundynix_ai_chat_history"
func (AiChatHistory) TableName() string { return "sundynix_plant_ai_chat_history" }
// ========== 成长记录图片关联 ==========
// GrowthRecordOss 成长记录与图片关联表
type GrowthRecordOss struct {
GrowthRecordID string `gorm:"size:50;index;column:growth_record_id" json:"growthRecordId"`
OssID string `gorm:"size:50;index;column:oss_id" json:"ossId"`
}
func (GrowthRecordOss) TableName() string { return "sundynix_plant_growth_record_oss" }
// ========== Banner ==========
type Banner struct {
model.BaseModel
Title string `gorm:"size:100;column:title" json:"title"`
ImageID string `gorm:"size:50;column:image_id" json:"imageId"`
Sort int `gorm:"default:0;column:sort" json:"sort"`
IsActive int `gorm:"default:1;column:is_active" json:"isActive"`
TargetURL string `gorm:"size:255;column:target_url" json:"targetUrl"`
}
func (Banner) TableName() string { return "sundynix_plant_banner" }
type MediaCheckResult struct {
model.BaseModel
TraceID string `gorm:"size:100;uniqueIndex;column:trace_id" json:"traceId"`
PostID string `gorm:"size:50;index;column:post_id" json:"postId"`
OssID string `gorm:"size:50;column:oss_id" json:"ossId"`
UserID string `gorm:"size:50;column:user_id" json:"userId"`
Status int `gorm:"column:status;default:0" json:"status"`
Type int `gorm:"column:type" json:"type"`
ErrMsg string `gorm:"size:255;column:err_msg" json:"errMsg"`
}
func (MediaCheckResult) TableName() string { return "sundynix_plant_media_check_result" }