Compare commits

..

No commits in common. "0d8e6f599bac0858274d72455d302245b2c97a9b" and "463d7374afc6e826ec2e6d531fb0f82cff1569a4" have entirely different histories.

10 changed files with 146 additions and 541 deletions

View File

@ -15,9 +15,6 @@ type VipLevelConfig struct {
BadgeResourceID int64 `gorm:"column:badge_resource_id"` BadgeResourceID int64 `gorm:"column:badge_resource_id"`
BadgeName string `gorm:"column:badge_name;size:128"` BadgeName string `gorm:"column:badge_name;size:128"`
BadgeURL string `gorm:"column:badge_url;size:512"` BadgeURL string `gorm:"column:badge_url;size:512"`
ShortBadgeResourceID int64 `gorm:"column:short_badge_resource_id"`
ShortBadgeName string `gorm:"column:short_badge_name;size:128"`
ShortBadgeURL string `gorm:"column:short_badge_url;size:512"`
AvatarFrameResourceID int64 `gorm:"column:avatar_frame_resource_id"` AvatarFrameResourceID int64 `gorm:"column:avatar_frame_resource_id"`
AvatarFrameName string `gorm:"column:avatar_frame_name;size:128"` AvatarFrameName string `gorm:"column:avatar_frame_name;size:128"`
AvatarFrameURL string `gorm:"column:avatar_frame_url;size:512"` AvatarFrameURL string `gorm:"column:avatar_frame_url;size:512"`
@ -30,12 +27,6 @@ type VipLevelConfig struct {
FloatPictureResourceID int64 `gorm:"column:float_picture_resource_id"` FloatPictureResourceID int64 `gorm:"column:float_picture_resource_id"`
FloatPictureName string `gorm:"column:float_picture_name;size:128"` FloatPictureName string `gorm:"column:float_picture_name;size:128"`
FloatPictureURL string `gorm:"column:float_picture_url;size:512"` FloatPictureURL string `gorm:"column:float_picture_url;size:512"`
BackgroundCardResourceID int64 `gorm:"column:background_card_resource_id"`
BackgroundCardName string `gorm:"column:background_card_name;size:128"`
BackgroundCardURL string `gorm:"column:background_card_url;size:512"`
EffectImageResourceID int64 `gorm:"column:effect_image_resource_id"`
EffectImageName string `gorm:"column:effect_image_name;size:128"`
EffectImageURL string `gorm:"column:effect_image_url;size:512"`
CreateTime time.Time `gorm:"column:create_time"` CreateTime time.Time `gorm:"column:create_time"`
UpdateTime time.Time `gorm:"column:update_time"` UpdateTime time.Time `gorm:"column:update_time"`
} }
@ -57,9 +48,6 @@ type UserVipState struct {
BadgeResourceID int64 `gorm:"column:badge_resource_id"` BadgeResourceID int64 `gorm:"column:badge_resource_id"`
BadgeName string `gorm:"column:badge_name;size:128"` BadgeName string `gorm:"column:badge_name;size:128"`
BadgeURL string `gorm:"column:badge_url;size:512"` BadgeURL string `gorm:"column:badge_url;size:512"`
ShortBadgeResourceID int64 `gorm:"column:short_badge_resource_id"`
ShortBadgeName string `gorm:"column:short_badge_name;size:128"`
ShortBadgeURL string `gorm:"column:short_badge_url;size:512"`
AvatarFrameResourceID int64 `gorm:"column:avatar_frame_resource_id"` AvatarFrameResourceID int64 `gorm:"column:avatar_frame_resource_id"`
AvatarFrameName string `gorm:"column:avatar_frame_name;size:128"` AvatarFrameName string `gorm:"column:avatar_frame_name;size:128"`
AvatarFrameURL string `gorm:"column:avatar_frame_url;size:512"` AvatarFrameURL string `gorm:"column:avatar_frame_url;size:512"`
@ -72,12 +60,6 @@ type UserVipState struct {
FloatPictureResourceID int64 `gorm:"column:float_picture_resource_id"` FloatPictureResourceID int64 `gorm:"column:float_picture_resource_id"`
FloatPictureName string `gorm:"column:float_picture_name;size:128"` FloatPictureName string `gorm:"column:float_picture_name;size:128"`
FloatPictureURL string `gorm:"column:float_picture_url;size:512"` FloatPictureURL string `gorm:"column:float_picture_url;size:512"`
BackgroundCardResourceID int64 `gorm:"column:background_card_resource_id"`
BackgroundCardName string `gorm:"column:background_card_name;size:128"`
BackgroundCardURL string `gorm:"column:background_card_url;size:512"`
EffectImageResourceID int64 `gorm:"column:effect_image_resource_id"`
EffectImageName string `gorm:"column:effect_image_name;size:128"`
EffectImageURL string `gorm:"column:effect_image_url;size:512"`
CreateTime time.Time `gorm:"column:create_time"` CreateTime time.Time `gorm:"column:create_time"`
UpdateTime time.Time `gorm:"column:update_time"` UpdateTime time.Time `gorm:"column:update_time"`
} }

View File

@ -24,7 +24,6 @@ type badgePictureRow struct {
NotSelectURL sql.NullString `gorm:"column:not_select_url"` NotSelectURL sql.NullString `gorm:"column:not_select_url"`
AnimationURL sql.NullString `gorm:"column:animation_url"` AnimationURL sql.NullString `gorm:"column:animation_url"`
ExpireTime time.Time `gorm:"column:expire_time"` ExpireTime time.Time `gorm:"column:expire_time"`
UpdateTime time.Time `gorm:"column:update_time"`
} }
// Current returns the current user's badge list split by long and short display type. // Current returns the current user's badge list split by long and short display type.
@ -110,8 +109,6 @@ func (s *Service) loadLongBadges(ctx context.Context, sysOrigin string, userID i
Use: true, Use: true,
ExpireTime: formatMillis(state.ExpireAt), ExpireTime: formatMillis(state.ExpireAt),
ExpireAt: formatTime(state.ExpireAt), ExpireAt: formatTime(state.ExpireAt),
UpdateTime: formatMillis(firstNonZeroTime(state.UpdateTime, state.StartAt, state.CreateTime)),
UpdatedAt: formatTime(firstNonZeroTime(state.UpdateTime, state.StartAt, state.CreateTime)),
} }
item.BadgeName = firstNonEmpty(nullString(row.BadgeName), state.BadgeName, state.DisplayName) item.BadgeName = firstNonEmpty(nullString(row.BadgeName), state.BadgeName, state.DisplayName)
item.Name = item.BadgeName item.Name = item.BadgeName
@ -135,7 +132,6 @@ func (s *Service) loadShortBadges(ctx context.Context, sysOrigin string, userID
Select(` Select(`
backpack.badge_id AS badge_id, backpack.badge_id AS badge_id,
backpack.expire_time AS expire_time, backpack.expire_time AS expire_time,
backpack.update_time AS update_time,
config.type AS source_type, config.type AS source_type,
config.badge_level AS badge_level, config.badge_level AS badge_level,
config.milestone AS milestone, config.milestone AS milestone,
@ -178,8 +174,6 @@ func (s *Service) loadShortBadges(ctx context.Context, sysOrigin string, userID
Use: true, Use: true,
ExpireTime: formatMillis(row.ExpireTime), ExpireTime: formatMillis(row.ExpireTime),
ExpireAt: formatTime(row.ExpireTime), ExpireAt: formatTime(row.ExpireTime),
UpdateTime: formatMillis(row.UpdateTime),
UpdatedAt: formatTime(row.UpdateTime),
} }
if row.Milestone.Valid && row.Milestone.Int64 > 0 { if row.Milestone.Valid && row.Milestone.Int64 > 0 {
item.Milestone = formatID(row.Milestone.Int64) item.Milestone = formatID(row.Milestone.Int64)

View File

@ -78,8 +78,6 @@ type CurrentBadgeItem struct {
Use bool `json:"use"` Use bool `json:"use"`
ExpireTime int64 `json:"expireTime,omitempty"` ExpireTime int64 `json:"expireTime,omitempty"`
ExpireAt string `json:"expireAt,omitempty"` ExpireAt string `json:"expireAt,omitempty"`
UpdateTime int64 `json:"updateTime,omitempty"`
UpdatedAt string `json:"updatedAt,omitempty"`
} }
func normalizeUser(user AuthUser) (string, error) { func normalizeUser(user AuthUser) (string, error) {
@ -127,15 +125,6 @@ func formatTime(t time.Time) string {
return t.Format("2006-01-02 15:04:05") return t.Format("2006-01-02 15:04:05")
} }
func firstNonZeroTime(values ...time.Time) time.Time {
for _, value := range values {
if !value.IsZero() {
return value
}
}
return time.Time{}
}
func firstNonEmpty(values ...string) string { func firstNonEmpty(values ...string) string {
for _, value := range values { for _, value := range values {
if trimmed := strings.TrimSpace(value); trimmed != "" { if trimmed := strings.TrimSpace(value); trimmed != "" {

View File

@ -105,7 +105,7 @@ func (s *Service) PageUserStates(
Find(&rows).Error; err != nil { Find(&rows).Error; err != nil {
return nil, err return nil, err
} }
resourceIDs := make([]int64, 0, len(rows)*8) resourceIDs := make([]int64, 0, len(rows)*5)
for idx := range rows { for idx := range rows {
resourceIDs = appendResourceIDsFromState(resourceIDs, &rows[idx]) resourceIDs = appendResourceIDsFromState(resourceIDs, &rows[idx])
} }
@ -140,9 +140,6 @@ func (s *Service) expireDueStates(ctx context.Context, sysOrigin string, now tim
"badge_resource_id": 0, "badge_resource_id": 0,
"badge_name": "", "badge_name": "",
"badge_url": "", "badge_url": "",
"short_badge_resource_id": 0,
"short_badge_name": "",
"short_badge_url": "",
"avatar_frame_resource_id": 0, "avatar_frame_resource_id": 0,
"avatar_frame_name": "", "avatar_frame_name": "",
"avatar_frame_url": "", "avatar_frame_url": "",
@ -155,12 +152,6 @@ func (s *Service) expireDueStates(ctx context.Context, sysOrigin string, now tim
"float_picture_resource_id": 0, "float_picture_resource_id": 0,
"float_picture_name": "", "float_picture_name": "",
"float_picture_url": "", "float_picture_url": "",
"background_card_resource_id": 0,
"background_card_name": "",
"background_card_url": "",
"effect_image_resource_id": 0,
"effect_image_name": "",
"effect_image_url": "",
"update_time": now, "update_time": now,
} }
return s.db.WithContext(ctx). return s.db.WithContext(ctx).

View File

@ -477,9 +477,6 @@ func applyPlanToState(state *model.UserVipState, plan purchasePlan, now time.Tim
state.BadgeResourceID = plan.TargetConfig.BadgeResourceID state.BadgeResourceID = plan.TargetConfig.BadgeResourceID
state.BadgeName = "" state.BadgeName = ""
state.BadgeURL = "" state.BadgeURL = ""
state.ShortBadgeResourceID = plan.TargetConfig.ShortBadgeResourceID
state.ShortBadgeName = ""
state.ShortBadgeURL = ""
state.AvatarFrameResourceID = plan.TargetConfig.AvatarFrameResourceID state.AvatarFrameResourceID = plan.TargetConfig.AvatarFrameResourceID
state.AvatarFrameName = "" state.AvatarFrameName = ""
state.AvatarFrameURL = "" state.AvatarFrameURL = ""
@ -492,12 +489,6 @@ func applyPlanToState(state *model.UserVipState, plan purchasePlan, now time.Tim
state.FloatPictureResourceID = plan.TargetConfig.FloatPictureResourceID state.FloatPictureResourceID = plan.TargetConfig.FloatPictureResourceID
state.FloatPictureName = "" state.FloatPictureName = ""
state.FloatPictureURL = "" state.FloatPictureURL = ""
state.BackgroundCardResourceID = plan.TargetConfig.BackgroundCardResourceID
state.BackgroundCardName = ""
state.BackgroundCardURL = ""
state.EffectImageResourceID = plan.TargetConfig.EffectImageResourceID
state.EffectImageName = ""
state.EffectImageURL = ""
state.UpdateTime = now state.UpdateTime = now
if state.CreateTime.IsZero() { if state.CreateTime.IsZero() {
state.CreateTime = now state.CreateTime = now
@ -512,9 +503,6 @@ func expireState(state *model.UserVipState, now time.Time) {
state.BadgeResourceID = 0 state.BadgeResourceID = 0
state.BadgeName = "" state.BadgeName = ""
state.BadgeURL = "" state.BadgeURL = ""
state.ShortBadgeResourceID = 0
state.ShortBadgeName = ""
state.ShortBadgeURL = ""
state.AvatarFrameResourceID = 0 state.AvatarFrameResourceID = 0
state.AvatarFrameName = "" state.AvatarFrameName = ""
state.AvatarFrameURL = "" state.AvatarFrameURL = ""
@ -527,12 +515,6 @@ func expireState(state *model.UserVipState, now time.Time) {
state.FloatPictureResourceID = 0 state.FloatPictureResourceID = 0
state.FloatPictureName = "" state.FloatPictureName = ""
state.FloatPictureURL = "" state.FloatPictureURL = ""
state.BackgroundCardResourceID = 0
state.BackgroundCardName = ""
state.BackgroundCardURL = ""
state.EffectImageResourceID = 0
state.EffectImageName = ""
state.EffectImageURL = ""
state.UpdateTime = now state.UpdateTime = now
} }
@ -661,12 +643,10 @@ func (s *Service) alignVIPResourceExpireAt(ctx context.Context, userID int64, re
func vipGrantResourcesFromConfig(config model.VipLevelConfig) []vipGrantResource { func vipGrantResourcesFromConfig(config model.VipLevelConfig) []vipGrantResource {
return compactVIPGrantResources([]vipGrantResource{ return compactVIPGrantResources([]vipGrantResource{
{ResourceID: config.BadgeResourceID, Badge: true}, {ResourceID: config.BadgeResourceID, Badge: true},
{ResourceID: config.ShortBadgeResourceID, Badge: true},
{ResourceID: config.AvatarFrameResourceID, PropsType: vipPropsTypeAvatarFrame}, {ResourceID: config.AvatarFrameResourceID, PropsType: vipPropsTypeAvatarFrame},
{ResourceID: config.EntryEffectResourceID, PropsType: vipPropsTypeRide}, {ResourceID: config.EntryEffectResourceID, PropsType: vipPropsTypeRide},
{ResourceID: config.ChatBubbleResourceID, PropsType: vipPropsTypeChatBubble}, {ResourceID: config.ChatBubbleResourceID, PropsType: vipPropsTypeChatBubble},
{ResourceID: config.FloatPictureResourceID, PropsType: vipPropsTypeFloatPicture}, {ResourceID: config.FloatPictureResourceID, PropsType: vipPropsTypeFloatPicture},
{ResourceID: config.BackgroundCardResourceID, PropsType: vipPropsTypeDataCard},
}) })
} }
@ -676,12 +656,10 @@ func vipGrantResourcesFromState(state *model.UserVipState) []vipGrantResource {
} }
return compactVIPGrantResources([]vipGrantResource{ return compactVIPGrantResources([]vipGrantResource{
{ResourceID: state.BadgeResourceID, Badge: true}, {ResourceID: state.BadgeResourceID, Badge: true},
{ResourceID: state.ShortBadgeResourceID, Badge: true},
{ResourceID: state.AvatarFrameResourceID, PropsType: vipPropsTypeAvatarFrame}, {ResourceID: state.AvatarFrameResourceID, PropsType: vipPropsTypeAvatarFrame},
{ResourceID: state.EntryEffectResourceID, PropsType: vipPropsTypeRide}, {ResourceID: state.EntryEffectResourceID, PropsType: vipPropsTypeRide},
{ResourceID: state.ChatBubbleResourceID, PropsType: vipPropsTypeChatBubble}, {ResourceID: state.ChatBubbleResourceID, PropsType: vipPropsTypeChatBubble},
{ResourceID: state.FloatPictureResourceID, PropsType: vipPropsTypeFloatPicture}, {ResourceID: state.FloatPictureResourceID, PropsType: vipPropsTypeFloatPicture},
{ResourceID: state.BackgroundCardResourceID, PropsType: vipPropsTypeDataCard},
}) })
} }

View File

@ -120,15 +120,11 @@ func normalizeSaveLevels(levels []VipLevelPayload) ([]VipLevelPayload, error) {
item.DisplayName = levelDisplayName(item.Level) item.DisplayName = levelDisplayName(item.Level)
} }
item.DurationDays = vipDurationDay item.DurationDays = vipDurationDay
item.LongBadge = normalizeResource(firstResource(item.LongBadge, item.Badge)) item.Badge = normalizeResource(item.Badge)
item.Badge = item.LongBadge
item.ShortBadge = normalizeResource(item.ShortBadge)
item.AvatarFrame = normalizeResource(item.AvatarFrame) item.AvatarFrame = normalizeResource(item.AvatarFrame)
item.EntryEffect = normalizeResource(item.EntryEffect) item.EntryEffect = normalizeResource(item.EntryEffect)
item.ChatBubble = normalizeResource(item.ChatBubble) item.ChatBubble = normalizeResource(item.ChatBubble)
item.FloatPicture = normalizeResource(item.FloatPicture) item.FloatPicture = normalizeResource(item.FloatPicture)
item.BackgroundCard = normalizeResource(item.BackgroundCard)
item.EffectImage = normalizeResource(item.EffectImage)
normalized = append(normalized, item) normalized = append(normalized, item)
} }
@ -163,16 +159,6 @@ func normalizeResource(resource VipResourcePayload) VipResourcePayload {
return resource return resource
} }
func firstResource(preferred VipResourcePayload, fallback VipResourcePayload) VipResourcePayload {
if preferred.ResourceID.Int64() > 0 || strings.TrimSpace(preferred.Name) != "" ||
strings.TrimSpace(preferred.URL) != "" || strings.TrimSpace(preferred.SourceURL) != "" ||
strings.TrimSpace(preferred.ResourceURL) != "" || strings.TrimSpace(preferred.Cover) != "" ||
strings.TrimSpace(preferred.CoverURL) != "" {
return preferred
}
return fallback
}
func applyLevelPayloadToConfig(row *model.VipLevelConfig, item VipLevelPayload, now time.Time) { func applyLevelPayloadToConfig(row *model.VipLevelConfig, item VipLevelPayload, now time.Time) {
row.Level = item.Level row.Level = item.Level
row.LevelCode = levelCode(item.Level) row.LevelCode = levelCode(item.Level)
@ -180,12 +166,9 @@ func applyLevelPayloadToConfig(row *model.VipLevelConfig, item VipLevelPayload,
row.Enabled = item.Enabled row.Enabled = item.Enabled
row.DurationDays = vipDurationDay row.DurationDays = vipDurationDay
row.PriceGold = item.PriceGold row.PriceGold = item.PriceGold
row.BadgeResourceID = item.LongBadge.ResourceID.Int64() row.BadgeResourceID = item.Badge.ResourceID.Int64()
row.BadgeName = "" row.BadgeName = ""
row.BadgeURL = "" row.BadgeURL = ""
row.ShortBadgeResourceID = item.ShortBadge.ResourceID.Int64()
row.ShortBadgeName = ""
row.ShortBadgeURL = ""
row.AvatarFrameResourceID = item.AvatarFrame.ResourceID.Int64() row.AvatarFrameResourceID = item.AvatarFrame.ResourceID.Int64()
row.AvatarFrameName = "" row.AvatarFrameName = ""
row.AvatarFrameURL = "" row.AvatarFrameURL = ""
@ -198,12 +181,6 @@ func applyLevelPayloadToConfig(row *model.VipLevelConfig, item VipLevelPayload,
row.FloatPictureResourceID = item.FloatPicture.ResourceID.Int64() row.FloatPictureResourceID = item.FloatPicture.ResourceID.Int64()
row.FloatPictureName = "" row.FloatPictureName = ""
row.FloatPictureURL = "" row.FloatPictureURL = ""
row.BackgroundCardResourceID = item.BackgroundCard.ResourceID.Int64()
row.BackgroundCardName = ""
row.BackgroundCardURL = ""
row.EffectImageResourceID = item.EffectImage.ResourceID.Int64()
row.EffectImageName = ""
row.EffectImageURL = ""
row.UpdateTime = now row.UpdateTime = now
if row.CreateTime.IsZero() { if row.CreateTime.IsZero() {
row.CreateTime = now row.CreateTime = now

View File

@ -168,12 +168,6 @@ func TestApplyPlanToStateKeepsOnlyResourceIDsAndPayloadUsesLookup(t *testing.T)
TargetConfig: model.VipLevelConfig{ TargetConfig: model.VipLevelConfig{
Level: 3, Level: 3,
DisplayName: "VIP 3", DisplayName: "VIP 3",
BadgeResourceID: 10,
BadgeName: "long badge",
BadgeURL: "https://example.com/long.png",
ShortBadgeResourceID: 15,
ShortBadgeName: "short badge",
ShortBadgeURL: "https://example.com/short.png",
AvatarFrameResourceID: 11, AvatarFrameResourceID: 11,
AvatarFrameName: "frame", AvatarFrameName: "frame",
AvatarFrameURL: "https://example.com/frame.svga", AvatarFrameURL: "https://example.com/frame.svga",
@ -186,26 +180,16 @@ func TestApplyPlanToStateKeepsOnlyResourceIDsAndPayloadUsesLookup(t *testing.T)
FloatPictureResourceID: 14, FloatPictureResourceID: 14,
FloatPictureName: "float", FloatPictureName: "float",
FloatPictureURL: "https://example.com/float.svga", FloatPictureURL: "https://example.com/float.svga",
BackgroundCardResourceID: 16,
BackgroundCardName: "profile card",
BackgroundCardURL: "https://example.com/card.pag",
EffectImageResourceID: 17,
EffectImageName: "effect image",
EffectImageURL: "https://example.com/effect.svga",
}, },
} }
state := &model.UserVipState{UserID: 1001, SysOrigin: "LIKEI"} state := &model.UserVipState{UserID: 1001, SysOrigin: "LIKEI"}
applyPlanToState(state, plan, now) applyPlanToState(state, plan, now)
if state.BadgeResourceID != plan.TargetConfig.BadgeResourceID || if state.AvatarFrameResourceID != plan.TargetConfig.AvatarFrameResourceID ||
state.ShortBadgeResourceID != plan.TargetConfig.ShortBadgeResourceID ||
state.AvatarFrameResourceID != plan.TargetConfig.AvatarFrameResourceID ||
state.EntryEffectResourceID != plan.TargetConfig.EntryEffectResourceID || state.EntryEffectResourceID != plan.TargetConfig.EntryEffectResourceID ||
state.ChatBubbleResourceID != plan.TargetConfig.ChatBubbleResourceID || state.ChatBubbleResourceID != plan.TargetConfig.ChatBubbleResourceID ||
state.FloatPictureResourceID != plan.TargetConfig.FloatPictureResourceID || state.FloatPictureResourceID != plan.TargetConfig.FloatPictureResourceID {
state.BackgroundCardResourceID != plan.TargetConfig.BackgroundCardResourceID ||
state.EffectImageResourceID != plan.TargetConfig.EffectImageResourceID {
t.Fatalf("state resource ids were not copied from target config") t.Fatalf("state resource ids were not copied from target config")
} }
if state.AvatarFrameName != "" || state.AvatarFrameURL != "" { if state.AvatarFrameName != "" || state.AvatarFrameURL != "" {
@ -213,24 +197,15 @@ func TestApplyPlanToStateKeepsOnlyResourceIDsAndPayloadUsesLookup(t *testing.T)
} }
payload := statePayloadFromModelWithResources(state, now, vipResourceLookup{ payload := statePayloadFromModelWithResources(state, now, vipResourceLookup{
10: {ID: 10, Name: "long badge", Cover: "https://example.com/long.png", SourceURL: "https://example.com/long.svga"},
11: {ID: 11, Name: "frame", Cover: "https://example.com/frame.png", SourceURL: "https://example.com/frame.svga"}, 11: {ID: 11, Name: "frame", Cover: "https://example.com/frame.png", SourceURL: "https://example.com/frame.svga"},
12: {ID: 12, Name: "ride", Cover: "https://example.com/ride.png", SourceURL: "https://example.com/ride.svga"}, 12: {ID: 12, Name: "ride", Cover: "https://example.com/ride.png", SourceURL: "https://example.com/ride.svga"},
13: {ID: 13, Name: "bubble", Cover: "https://example.com/bubble.png", SourceURL: "https://example.com/bubble.svga"}, 13: {ID: 13, Name: "bubble", Cover: "https://example.com/bubble.png", SourceURL: "https://example.com/bubble.svga"},
14: {ID: 14, Name: "float", Cover: "https://example.com/float.png", SourceURL: "https://example.com/float.svga"}, 14: {ID: 14, Name: "float", Cover: "https://example.com/float.png", SourceURL: "https://example.com/float.svga"},
15: {ID: 15, Name: "short badge", Cover: "https://example.com/short.png", SourceURL: "https://example.com/short.svga"},
16: {ID: 16, Name: "profile card", Cover: "https://example.com/card.png", SourceURL: "https://example.com/card.pag"},
17: {ID: 17, Name: "effect image", Cover: "https://example.com/effect.png", SourceURL: "https://example.com/effect.svga"},
}) })
if payload.LongBadge.Cover != "https://example.com/long.png" || if payload.AvatarFrame.Cover != "https://example.com/frame.png" ||
payload.Badge.Cover != "https://example.com/long.png" ||
payload.ShortBadge.Cover != "https://example.com/short.png" ||
payload.AvatarFrame.Cover != "https://example.com/frame.png" ||
payload.EntryEffect.Cover != "https://example.com/ride.png" || payload.EntryEffect.Cover != "https://example.com/ride.png" ||
payload.ChatBubble.Cover != "https://example.com/bubble.png" || payload.ChatBubble.Cover != "https://example.com/bubble.png" ||
payload.FloatPicture.Cover != "https://example.com/float.png" || payload.FloatPicture.Cover != "https://example.com/float.png" {
payload.BackgroundCard.Cover != "https://example.com/card.png" ||
payload.EffectImage.Cover != "https://example.com/effect.png" {
t.Fatalf("state payload covers were not loaded from resource lookup") t.Fatalf("state payload covers were not loaded from resource lookup")
} }
} }
@ -265,18 +240,15 @@ func TestMapWalletPurchaseErrorGatewayFailure(t *testing.T) {
func TestVIPGrantResourcesFromConfigMapsBackpackTypes(t *testing.T) { func TestVIPGrantResourcesFromConfigMapsBackpackTypes(t *testing.T) {
config := model.VipLevelConfig{ config := model.VipLevelConfig{
BadgeResourceID: 10, BadgeResourceID: 10,
ShortBadgeResourceID: 15,
AvatarFrameResourceID: 11, AvatarFrameResourceID: 11,
EntryEffectResourceID: 12, EntryEffectResourceID: 12,
ChatBubbleResourceID: 13, ChatBubbleResourceID: 13,
FloatPictureResourceID: 14, FloatPictureResourceID: 14,
BackgroundCardResourceID: 16,
EffectImageResourceID: 17,
} }
resources := vipGrantResourcesFromConfig(config) resources := vipGrantResourcesFromConfig(config)
if len(resources) != 7 { if len(resources) != 5 {
t.Fatalf("resources len = %d, want 7", len(resources)) t.Fatalf("resources len = %d, want 5", len(resources))
} }
assertGrant := func(index int, resourceID int64, propsType string, badge bool) { assertGrant := func(index int, resourceID int64, propsType string, badge bool) {
t.Helper() t.Helper()
@ -286,12 +258,10 @@ func TestVIPGrantResourcesFromConfigMapsBackpackTypes(t *testing.T) {
} }
} }
assertGrant(0, 10, "", true) assertGrant(0, 10, "", true)
assertGrant(1, 15, "", true) assertGrant(1, 11, vipPropsTypeAvatarFrame, false)
assertGrant(2, 11, vipPropsTypeAvatarFrame, false) assertGrant(2, 12, vipPropsTypeRide, false)
assertGrant(3, 12, vipPropsTypeRide, false) assertGrant(3, 13, vipPropsTypeChatBubble, false)
assertGrant(4, 13, vipPropsTypeChatBubble, false) assertGrant(4, 14, vipPropsTypeFloatPicture, false)
assertGrant(5, 14, vipPropsTypeFloatPicture, false)
assertGrant(6, 16, vipPropsTypeDataCard, false)
} }
func TestVIPGrantDaysUntilCeilsPartialDay(t *testing.T) { func TestVIPGrantDaysUntilCeilsPartialDay(t *testing.T) {

View File

@ -54,7 +54,7 @@ func compactResourceIDs(resourceIDs []int64) []int64 {
} }
func resourceIDsFromConfigRows(rows []model.VipLevelConfig) []int64 { func resourceIDsFromConfigRows(rows []model.VipLevelConfig) []int64 {
ids := make([]int64, 0, len(rows)*8) ids := make([]int64, 0, len(rows)*5)
for _, row := range rows { for _, row := range rows {
ids = appendResourceIDsFromConfig(ids, row) ids = appendResourceIDsFromConfig(ids, row)
} }
@ -62,7 +62,7 @@ func resourceIDsFromConfigRows(rows []model.VipLevelConfig) []int64 {
} }
func resourceIDsFromConfigMap(configs map[int]model.VipLevelConfig) []int64 { func resourceIDsFromConfigMap(configs map[int]model.VipLevelConfig) []int64 {
ids := make([]int64, 0, len(configs)*8) ids := make([]int64, 0, len(configs)*5)
for _, row := range configs { for _, row := range configs {
ids = appendResourceIDsFromConfig(ids, row) ids = appendResourceIDsFromConfig(ids, row)
} }
@ -73,13 +73,10 @@ func appendResourceIDsFromConfig(ids []int64, row model.VipLevelConfig) []int64
return append( return append(
ids, ids,
row.BadgeResourceID, row.BadgeResourceID,
row.ShortBadgeResourceID,
row.AvatarFrameResourceID, row.AvatarFrameResourceID,
row.EntryEffectResourceID, row.EntryEffectResourceID,
row.ChatBubbleResourceID, row.ChatBubbleResourceID,
row.FloatPictureResourceID, row.FloatPictureResourceID,
row.BackgroundCardResourceID,
row.EffectImageResourceID,
) )
} }
@ -90,12 +87,9 @@ func appendResourceIDsFromState(ids []int64, row *model.UserVipState) []int64 {
return append( return append(
ids, ids,
row.BadgeResourceID, row.BadgeResourceID,
row.ShortBadgeResourceID,
row.AvatarFrameResourceID, row.AvatarFrameResourceID,
row.EntryEffectResourceID, row.EntryEffectResourceID,
row.ChatBubbleResourceID, row.ChatBubbleResourceID,
row.FloatPictureResourceID, row.FloatPictureResourceID,
row.BackgroundCardResourceID,
row.EffectImageResourceID,
) )
} }

View File

@ -40,7 +40,6 @@ const (
vipPropsTypeRide = "RIDE" vipPropsTypeRide = "RIDE"
vipPropsTypeChatBubble = "CHAT_BUBBLE" vipPropsTypeChatBubble = "CHAT_BUBBLE"
vipPropsTypeFloatPicture = "FLOAT_PICTURE" vipPropsTypeFloatPicture = "FLOAT_PICTURE"
vipPropsTypeDataCard = "DATA_CARD"
) )
type AppError = common.AppError type AppError = common.AppError
@ -91,14 +90,10 @@ type VipLevelPayload struct {
DurationDays int `json:"durationDays"` DurationDays int `json:"durationDays"`
PriceGold int64 `json:"priceGold"` PriceGold int64 `json:"priceGold"`
Badge VipResourcePayload `json:"badge"` Badge VipResourcePayload `json:"badge"`
LongBadge VipResourcePayload `json:"longBadge"`
ShortBadge VipResourcePayload `json:"shortBadge"`
AvatarFrame VipResourcePayload `json:"avatarFrame"` AvatarFrame VipResourcePayload `json:"avatarFrame"`
EntryEffect VipResourcePayload `json:"entryEffect"` EntryEffect VipResourcePayload `json:"entryEffect"`
ChatBubble VipResourcePayload `json:"chatBubble"` ChatBubble VipResourcePayload `json:"chatBubble"`
FloatPicture VipResourcePayload `json:"floatPicture"` FloatPicture VipResourcePayload `json:"floatPicture"`
BackgroundCard VipResourcePayload `json:"backgroundCard"`
EffectImage VipResourcePayload `json:"effectImage"`
UpdateTime string `json:"updateTime,omitempty"` UpdateTime string `json:"updateTime,omitempty"`
} }
@ -198,14 +193,10 @@ type UserVipStatePayload struct {
StartAt string `json:"startAt,omitempty"` StartAt string `json:"startAt,omitempty"`
ExpireAt string `json:"expireAt,omitempty"` ExpireAt string `json:"expireAt,omitempty"`
Badge VipResourcePayload `json:"badge,omitempty"` Badge VipResourcePayload `json:"badge,omitempty"`
LongBadge VipResourcePayload `json:"longBadge,omitempty"`
ShortBadge VipResourcePayload `json:"shortBadge,omitempty"`
AvatarFrame VipResourcePayload `json:"avatarFrame,omitempty"` AvatarFrame VipResourcePayload `json:"avatarFrame,omitempty"`
EntryEffect VipResourcePayload `json:"entryEffect,omitempty"` EntryEffect VipResourcePayload `json:"entryEffect,omitempty"`
ChatBubble VipResourcePayload `json:"chatBubble,omitempty"` ChatBubble VipResourcePayload `json:"chatBubble,omitempty"`
FloatPicture VipResourcePayload `json:"floatPicture,omitempty"` FloatPicture VipResourcePayload `json:"floatPicture,omitempty"`
BackgroundCard VipResourcePayload `json:"backgroundCard,omitempty"`
EffectImage VipResourcePayload `json:"effectImage,omitempty"`
UpdateTime string `json:"updateTime,omitempty"` UpdateTime string `json:"updateTime,omitempty"`
} }
@ -373,14 +364,10 @@ func payloadFromConfigWithResources(row model.VipLevelConfig, resources vipResou
DurationDays: duration, DurationDays: duration,
PriceGold: row.PriceGold, PriceGold: row.PriceGold,
Badge: resourcePayloadWithLookup(row.BadgeResourceID, row.BadgeName, row.BadgeURL, "", resources), Badge: resourcePayloadWithLookup(row.BadgeResourceID, row.BadgeName, row.BadgeURL, "", resources),
LongBadge: resourcePayloadWithLookup(row.BadgeResourceID, row.BadgeName, row.BadgeURL, "", resources),
ShortBadge: resourcePayloadWithLookup(row.ShortBadgeResourceID, row.ShortBadgeName, row.ShortBadgeURL, "", resources),
AvatarFrame: resourcePayloadWithLookup(row.AvatarFrameResourceID, row.AvatarFrameName, row.AvatarFrameURL, "", resources), AvatarFrame: resourcePayloadWithLookup(row.AvatarFrameResourceID, row.AvatarFrameName, row.AvatarFrameURL, "", resources),
EntryEffect: resourcePayloadWithLookup(row.EntryEffectResourceID, row.EntryEffectName, row.EntryEffectURL, "", resources), EntryEffect: resourcePayloadWithLookup(row.EntryEffectResourceID, row.EntryEffectName, row.EntryEffectURL, "", resources),
ChatBubble: resourcePayloadWithLookup(row.ChatBubbleResourceID, row.ChatBubbleName, row.ChatBubbleURL, "", resources), ChatBubble: resourcePayloadWithLookup(row.ChatBubbleResourceID, row.ChatBubbleName, row.ChatBubbleURL, "", resources),
FloatPicture: resourcePayloadWithLookup(row.FloatPictureResourceID, row.FloatPictureName, row.FloatPictureURL, "", resources), FloatPicture: resourcePayloadWithLookup(row.FloatPictureResourceID, row.FloatPictureName, row.FloatPictureURL, "", resources),
BackgroundCard: resourcePayloadWithLookup(row.BackgroundCardResourceID, row.BackgroundCardName, row.BackgroundCardURL, "", resources),
EffectImage: resourcePayloadWithLookup(row.EffectImageResourceID, row.EffectImageName, row.EffectImageURL, "", resources),
UpdateTime: formatTime(row.UpdateTime), UpdateTime: formatTime(row.UpdateTime),
} }
} }
@ -415,14 +402,10 @@ func statePayloadFromModelWithResources(row *model.UserVipState, now time.Time,
return payload return payload
} }
payload.Badge = resourcePayloadWithLookup(row.BadgeResourceID, row.BadgeName, row.BadgeURL, "", resources) payload.Badge = resourcePayloadWithLookup(row.BadgeResourceID, row.BadgeName, row.BadgeURL, "", resources)
payload.LongBadge = payload.Badge
payload.ShortBadge = resourcePayloadWithLookup(row.ShortBadgeResourceID, row.ShortBadgeName, row.ShortBadgeURL, "", resources)
payload.AvatarFrame = resourcePayloadWithLookup(row.AvatarFrameResourceID, row.AvatarFrameName, row.AvatarFrameURL, "", resources) payload.AvatarFrame = resourcePayloadWithLookup(row.AvatarFrameResourceID, row.AvatarFrameName, row.AvatarFrameURL, "", resources)
payload.EntryEffect = resourcePayloadWithLookup(row.EntryEffectResourceID, row.EntryEffectName, row.EntryEffectURL, "", resources) payload.EntryEffect = resourcePayloadWithLookup(row.EntryEffectResourceID, row.EntryEffectName, row.EntryEffectURL, "", resources)
payload.ChatBubble = resourcePayloadWithLookup(row.ChatBubbleResourceID, row.ChatBubbleName, row.ChatBubbleURL, "", resources) payload.ChatBubble = resourcePayloadWithLookup(row.ChatBubbleResourceID, row.ChatBubbleName, row.ChatBubbleURL, "", resources)
payload.FloatPicture = resourcePayloadWithLookup(row.FloatPictureResourceID, row.FloatPictureName, row.FloatPictureURL, "", resources) payload.FloatPicture = resourcePayloadWithLookup(row.FloatPictureResourceID, row.FloatPictureName, row.FloatPictureURL, "", resources)
payload.BackgroundCard = resourcePayloadWithLookup(row.BackgroundCardResourceID, row.BackgroundCardName, row.BackgroundCardURL, "", resources)
payload.EffectImage = resourcePayloadWithLookup(row.EffectImageResourceID, row.EffectImageName, row.EffectImageURL, "", resources)
return payload return payload
} }

View File

@ -1,253 +0,0 @@
SET @current_schema := DATABASE();
SET @add_vip_level_short_badge_resource_id_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'vip_level_config'
AND column_name = 'short_badge_resource_id'
),
'ALTER TABLE `vip_level_config` ADD COLUMN `short_badge_resource_id` bigint NOT NULL DEFAULT 0 COMMENT ''短徽章资源ID'' AFTER `badge_url`',
'SELECT 1'
);
PREPARE add_vip_level_short_badge_resource_id_stmt FROM @add_vip_level_short_badge_resource_id_sql;
EXECUTE add_vip_level_short_badge_resource_id_stmt;
DEALLOCATE PREPARE add_vip_level_short_badge_resource_id_stmt;
SET @add_vip_level_short_badge_name_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'vip_level_config'
AND column_name = 'short_badge_name'
),
'ALTER TABLE `vip_level_config` ADD COLUMN `short_badge_name` varchar(128) NOT NULL DEFAULT '''' COMMENT ''短徽章名称'' AFTER `short_badge_resource_id`',
'SELECT 1'
);
PREPARE add_vip_level_short_badge_name_stmt FROM @add_vip_level_short_badge_name_sql;
EXECUTE add_vip_level_short_badge_name_stmt;
DEALLOCATE PREPARE add_vip_level_short_badge_name_stmt;
SET @add_vip_level_short_badge_url_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'vip_level_config'
AND column_name = 'short_badge_url'
),
'ALTER TABLE `vip_level_config` ADD COLUMN `short_badge_url` varchar(512) NOT NULL DEFAULT '''' COMMENT ''短徽章资源URL'' AFTER `short_badge_name`',
'SELECT 1'
);
PREPARE add_vip_level_short_badge_url_stmt FROM @add_vip_level_short_badge_url_sql;
EXECUTE add_vip_level_short_badge_url_stmt;
DEALLOCATE PREPARE add_vip_level_short_badge_url_stmt;
SET @add_vip_level_background_card_resource_id_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'vip_level_config'
AND column_name = 'background_card_resource_id'
),
'ALTER TABLE `vip_level_config` ADD COLUMN `background_card_resource_id` bigint NOT NULL DEFAULT 0 COMMENT ''背景卡资源ID'' AFTER `float_picture_url`',
'SELECT 1'
);
PREPARE add_vip_level_background_card_resource_id_stmt FROM @add_vip_level_background_card_resource_id_sql;
EXECUTE add_vip_level_background_card_resource_id_stmt;
DEALLOCATE PREPARE add_vip_level_background_card_resource_id_stmt;
SET @add_vip_level_background_card_name_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'vip_level_config'
AND column_name = 'background_card_name'
),
'ALTER TABLE `vip_level_config` ADD COLUMN `background_card_name` varchar(128) NOT NULL DEFAULT '''' COMMENT ''背景卡名称'' AFTER `background_card_resource_id`',
'SELECT 1'
);
PREPARE add_vip_level_background_card_name_stmt FROM @add_vip_level_background_card_name_sql;
EXECUTE add_vip_level_background_card_name_stmt;
DEALLOCATE PREPARE add_vip_level_background_card_name_stmt;
SET @add_vip_level_background_card_url_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'vip_level_config'
AND column_name = 'background_card_url'
),
'ALTER TABLE `vip_level_config` ADD COLUMN `background_card_url` varchar(512) NOT NULL DEFAULT '''' COMMENT ''背景卡资源URL'' AFTER `background_card_name`',
'SELECT 1'
);
PREPARE add_vip_level_background_card_url_stmt FROM @add_vip_level_background_card_url_sql;
EXECUTE add_vip_level_background_card_url_stmt;
DEALLOCATE PREPARE add_vip_level_background_card_url_stmt;
SET @add_vip_level_effect_image_resource_id_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'vip_level_config'
AND column_name = 'effect_image_resource_id'
),
'ALTER TABLE `vip_level_config` ADD COLUMN `effect_image_resource_id` bigint NOT NULL DEFAULT 0 COMMENT ''动效图资源ID'' AFTER `background_card_url`',
'SELECT 1'
);
PREPARE add_vip_level_effect_image_resource_id_stmt FROM @add_vip_level_effect_image_resource_id_sql;
EXECUTE add_vip_level_effect_image_resource_id_stmt;
DEALLOCATE PREPARE add_vip_level_effect_image_resource_id_stmt;
SET @add_vip_level_effect_image_name_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'vip_level_config'
AND column_name = 'effect_image_name'
),
'ALTER TABLE `vip_level_config` ADD COLUMN `effect_image_name` varchar(128) NOT NULL DEFAULT '''' COMMENT ''动效图名称'' AFTER `effect_image_resource_id`',
'SELECT 1'
);
PREPARE add_vip_level_effect_image_name_stmt FROM @add_vip_level_effect_image_name_sql;
EXECUTE add_vip_level_effect_image_name_stmt;
DEALLOCATE PREPARE add_vip_level_effect_image_name_stmt;
SET @add_vip_level_effect_image_url_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'vip_level_config'
AND column_name = 'effect_image_url'
),
'ALTER TABLE `vip_level_config` ADD COLUMN `effect_image_url` varchar(512) NOT NULL DEFAULT '''' COMMENT ''动效图资源URL'' AFTER `effect_image_name`',
'SELECT 1'
);
PREPARE add_vip_level_effect_image_url_stmt FROM @add_vip_level_effect_image_url_sql;
EXECUTE add_vip_level_effect_image_url_stmt;
DEALLOCATE PREPARE add_vip_level_effect_image_url_stmt;
SET @add_user_vip_short_badge_resource_id_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'user_vip_state'
AND column_name = 'short_badge_resource_id'
),
'ALTER TABLE `user_vip_state` ADD COLUMN `short_badge_resource_id` bigint NOT NULL DEFAULT 0 COMMENT ''当前短徽章资源ID'' AFTER `badge_url`',
'SELECT 1'
);
PREPARE add_user_vip_short_badge_resource_id_stmt FROM @add_user_vip_short_badge_resource_id_sql;
EXECUTE add_user_vip_short_badge_resource_id_stmt;
DEALLOCATE PREPARE add_user_vip_short_badge_resource_id_stmt;
SET @add_user_vip_short_badge_name_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'user_vip_state'
AND column_name = 'short_badge_name'
),
'ALTER TABLE `user_vip_state` ADD COLUMN `short_badge_name` varchar(128) NOT NULL DEFAULT '''' COMMENT ''当前短徽章名称'' AFTER `short_badge_resource_id`',
'SELECT 1'
);
PREPARE add_user_vip_short_badge_name_stmt FROM @add_user_vip_short_badge_name_sql;
EXECUTE add_user_vip_short_badge_name_stmt;
DEALLOCATE PREPARE add_user_vip_short_badge_name_stmt;
SET @add_user_vip_short_badge_url_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'user_vip_state'
AND column_name = 'short_badge_url'
),
'ALTER TABLE `user_vip_state` ADD COLUMN `short_badge_url` varchar(512) NOT NULL DEFAULT '''' COMMENT ''当前短徽章资源URL'' AFTER `short_badge_name`',
'SELECT 1'
);
PREPARE add_user_vip_short_badge_url_stmt FROM @add_user_vip_short_badge_url_sql;
EXECUTE add_user_vip_short_badge_url_stmt;
DEALLOCATE PREPARE add_user_vip_short_badge_url_stmt;
SET @add_user_vip_background_card_resource_id_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'user_vip_state'
AND column_name = 'background_card_resource_id'
),
'ALTER TABLE `user_vip_state` ADD COLUMN `background_card_resource_id` bigint NOT NULL DEFAULT 0 COMMENT ''当前背景卡资源ID'' AFTER `float_picture_url`',
'SELECT 1'
);
PREPARE add_user_vip_background_card_resource_id_stmt FROM @add_user_vip_background_card_resource_id_sql;
EXECUTE add_user_vip_background_card_resource_id_stmt;
DEALLOCATE PREPARE add_user_vip_background_card_resource_id_stmt;
SET @add_user_vip_background_card_name_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'user_vip_state'
AND column_name = 'background_card_name'
),
'ALTER TABLE `user_vip_state` ADD COLUMN `background_card_name` varchar(128) NOT NULL DEFAULT '''' COMMENT ''当前背景卡名称'' AFTER `background_card_resource_id`',
'SELECT 1'
);
PREPARE add_user_vip_background_card_name_stmt FROM @add_user_vip_background_card_name_sql;
EXECUTE add_user_vip_background_card_name_stmt;
DEALLOCATE PREPARE add_user_vip_background_card_name_stmt;
SET @add_user_vip_background_card_url_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'user_vip_state'
AND column_name = 'background_card_url'
),
'ALTER TABLE `user_vip_state` ADD COLUMN `background_card_url` varchar(512) NOT NULL DEFAULT '''' COMMENT ''当前背景卡资源URL'' AFTER `background_card_name`',
'SELECT 1'
);
PREPARE add_user_vip_background_card_url_stmt FROM @add_user_vip_background_card_url_sql;
EXECUTE add_user_vip_background_card_url_stmt;
DEALLOCATE PREPARE add_user_vip_background_card_url_stmt;
SET @add_user_vip_effect_image_resource_id_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'user_vip_state'
AND column_name = 'effect_image_resource_id'
),
'ALTER TABLE `user_vip_state` ADD COLUMN `effect_image_resource_id` bigint NOT NULL DEFAULT 0 COMMENT ''当前动效图资源ID'' AFTER `background_card_url`',
'SELECT 1'
);
PREPARE add_user_vip_effect_image_resource_id_stmt FROM @add_user_vip_effect_image_resource_id_sql;
EXECUTE add_user_vip_effect_image_resource_id_stmt;
DEALLOCATE PREPARE add_user_vip_effect_image_resource_id_stmt;
SET @add_user_vip_effect_image_name_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'user_vip_state'
AND column_name = 'effect_image_name'
),
'ALTER TABLE `user_vip_state` ADD COLUMN `effect_image_name` varchar(128) NOT NULL DEFAULT '''' COMMENT ''当前动效图名称'' AFTER `effect_image_resource_id`',
'SELECT 1'
);
PREPARE add_user_vip_effect_image_name_stmt FROM @add_user_vip_effect_image_name_sql;
EXECUTE add_user_vip_effect_image_name_stmt;
DEALLOCATE PREPARE add_user_vip_effect_image_name_stmt;
SET @add_user_vip_effect_image_url_sql := IF(
NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = @current_schema
AND table_name = 'user_vip_state'
AND column_name = 'effect_image_url'
),
'ALTER TABLE `user_vip_state` ADD COLUMN `effect_image_url` varchar(512) NOT NULL DEFAULT '''' COMMENT ''当前动效图资源URL'' AFTER `effect_image_name`',
'SELECT 1'
);
PREPARE add_user_vip_effect_image_url_stmt FROM @add_user_vip_effect_image_url_sql;
EXECUTE add_user_vip_effect_image_url_stmt;
DEALLOCATE PREPARE add_user_vip_effect_image_url_stmt;