优化后端可以编辑皮肤等等
This commit is contained in:
@@ -16,3 +16,36 @@ type UpdateRequest struct {
|
||||
Value string `json:"value" binding:"required"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
type PublishOptionsDTO struct {
|
||||
ServerOptions []string `json:"server_options"`
|
||||
FaceOptions []string `json:"face_options"`
|
||||
RankOptions []string `json:"rank_options"`
|
||||
InsuranceOptions []string `json:"insurance_options"`
|
||||
LevelOptions []string `json:"level_options"`
|
||||
LoginMethodOptions []string `json:"login_method_options"`
|
||||
RegionOptions []string `json:"region_options"`
|
||||
SkinGroups []PublishOptionGroup `json:"skin_groups"`
|
||||
QuantityItems []PublishQuantityItem `json:"quantity_items"`
|
||||
ScreenshotSlots []PublishScreenshotSlot `json:"screenshot_slots"`
|
||||
}
|
||||
|
||||
type PublishOptionGroup struct {
|
||||
Key string `json:"key"`
|
||||
Title string `json:"title"`
|
||||
Options []string `json:"options"`
|
||||
}
|
||||
|
||||
type PublishQuantityItem struct {
|
||||
Key string `json:"key"`
|
||||
Label string `json:"label"`
|
||||
Price string `json:"price"`
|
||||
Placeholder string `json:"placeholder,omitempty"`
|
||||
}
|
||||
|
||||
type PublishScreenshotSlot struct {
|
||||
Key string `json:"key"`
|
||||
Label string `json:"label"`
|
||||
Required bool `json:"required"`
|
||||
Hint string `json:"hint"`
|
||||
}
|
||||
|
||||
@@ -27,6 +27,15 @@ func (h *Handler) List(c *gin.Context) {
|
||||
response.OK(c, gin.H{"items": items})
|
||||
}
|
||||
|
||||
func (h *Handler) PublishOptions(c *gin.Context) {
|
||||
options, err := h.service.PublishOptions()
|
||||
if err != nil {
|
||||
writeConfigError(c, err)
|
||||
return
|
||||
}
|
||||
response.OK(c, options)
|
||||
}
|
||||
|
||||
func (h *Handler) Update(c *gin.Context) {
|
||||
adminID, ok := currentAdminID(c)
|
||||
if !ok {
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
package systemconfig
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
const publishOptionsConfigKey = "listing.publish_options"
|
||||
|
||||
func defaultPublishOptionsConfigValue() string {
|
||||
raw, err := json.Marshal(DefaultPublishOptions())
|
||||
if err != nil {
|
||||
return "{}"
|
||||
}
|
||||
return string(raw)
|
||||
}
|
||||
|
||||
func DefaultPublishOptions() PublishOptionsDTO {
|
||||
return PublishOptionsDTO{
|
||||
ServerOptions: []string{"QQ", "微信", "Steam"},
|
||||
FaceOptions: []string{"是", "否"},
|
||||
RankOptions: []string{"青铜", "白银", "黄金", "铂金", "钻石", "黑鹰", "三角洲巅峰"},
|
||||
InsuranceOptions: []string{"2*1", "2*2", "2*3", "3*3"},
|
||||
LevelOptions: []string{"1级", "2级", "3级", "4级", "5级", "6级", "7级"},
|
||||
LoginMethodOptions: []string{"扫码", "账号密码"},
|
||||
RegionOptions: []string{
|
||||
"北京", "天津", "河北", "山西", "内蒙古", "辽宁", "吉林", "黑龙江",
|
||||
"上海", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南",
|
||||
"湖北", "湖南", "广东", "广西", "海南", "重庆", "四川", "贵州",
|
||||
"云南", "陕西", "甘肃", "青海", "宁夏", "新疆", "西藏", "香港",
|
||||
"澳门", "台湾",
|
||||
},
|
||||
SkinGroups: []PublishOptionGroup{
|
||||
{
|
||||
Key: "melee",
|
||||
Title: "近战皮肤",
|
||||
Options: []string{
|
||||
"坠星者", "暗星", "龙牙", "信条", "怜悯", "赤枭", "影锋", "黑海", "北极星", "电锯惊魂", "处刑者",
|
||||
},
|
||||
},
|
||||
{
|
||||
Key: "operator",
|
||||
Title: "干员皮肤",
|
||||
Options: []string{
|
||||
"威龙-凌霄戍卫", "红狼-蚀金玫瑰", "露娜-黑天际线", "蛊-能天使午夜邮差",
|
||||
"骇爪-维什戴尔", "骇爪-水墨云图", "威龙-吴彦祖", "威龙-铁面判官",
|
||||
"威龙-壮志凌云", "威龙-蛟龙特战队", "蜂医-送葬人", "蜂医-危险物质",
|
||||
"蜂医-黑鹰坠落", "牧羊人-街头之星", "牧羊人-黑鹰坠落", "乌鲁鲁-黑鹰坠落",
|
||||
"红狼-黑鹰坠落", "无名-夜鹰", "深蓝-不破誓约", "红狼-电锯惊魂",
|
||||
"露娜-古墓丽影劳拉", "赛伊德",
|
||||
},
|
||||
},
|
||||
{
|
||||
Key: "weapon",
|
||||
Title: "武器皮肤",
|
||||
Options: []string{
|
||||
"M7棱镜攻势S2", "腾龙气象感应", "MP7电玩高手S2", "M250电玩高手S2",
|
||||
"AS Val悬赏令", "K416命运", "M4A1棱镜攻势", "SCAR-H电玩高手",
|
||||
"QBZ95王牌之剑", "AUG气象感应", "Vector美杜莎", "KC17-造物纪元",
|
||||
},
|
||||
},
|
||||
},
|
||||
QuantityItems: []PublishQuantityItem{
|
||||
{Key: "awmAmmo", Label: "AWM子弹", Price: "0.8元/发"},
|
||||
{Key: "helmet6", Label: "6头数量", Price: "2元/个"},
|
||||
{Key: "armor6", Label: "6甲数量", Price: "3元/个"},
|
||||
{Key: "kit5", Label: "5级全装套数量", Price: "5元/个"},
|
||||
{Key: "armor6Ammo", Label: "6甲子弹", Price: "0.26元/发"},
|
||||
{Key: "gridCard9", Label: "9格体验卡", Price: "5元/张", Placeholder: "如果是赛季9格,此处填0即可"},
|
||||
},
|
||||
ScreenshotSlots: []PublishScreenshotSlot{
|
||||
{Key: "coin", Label: "纯币截图", Required: true, Hint: "请上传纯币截图(必传)"},
|
||||
{Key: "gameId", Label: "游戏ID截图", Required: true, Hint: "请上传游戏ID截图(必传)"},
|
||||
{Key: "totalAsset", Label: "总资产截图", Required: true, Hint: "请上传总资产截图(必传)"},
|
||||
{Key: "tencentSecurity", Label: "腾讯安全中心截图", Required: true, Hint: "请上传腾讯安全中心截图(必传)"},
|
||||
{Key: "skin", Label: "皮肤截图", Required: false, Hint: "请上传皮肤截图(选传)"},
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -38,6 +38,7 @@ var defaultConfigs = []defaultConfig{
|
||||
{Key: "settlement.platform_fee_rate", Value: "0.00", Description: "平台抽成比例"},
|
||||
{Key: "settlement.owner_cycle_days", Value: "0", Description: "号主结算周期天数"},
|
||||
{Key: "withdraw.min_amount", Value: "100", Description: "提现最低金额预留"},
|
||||
{Key: publishOptionsConfigKey, Value: defaultPublishOptionsConfigValue(), Description: "发布页选项配置 JSON"},
|
||||
}
|
||||
|
||||
func NewRepository(db *gorm.DB) *Repository {
|
||||
@@ -59,6 +60,17 @@ func (r *Repository) List() ([]ConfigDTO, error) {
|
||||
return items, nil
|
||||
}
|
||||
|
||||
func (r *Repository) FindValue(key string) (string, error) {
|
||||
if err := r.ensureDefaults(); err != nil {
|
||||
return "", err
|
||||
}
|
||||
var row model.SystemConfig
|
||||
if err := r.db.Where("`key` = ?", key).First(&row).Error; err != nil {
|
||||
return "", err
|
||||
}
|
||||
return row.Value, nil
|
||||
}
|
||||
|
||||
func (r *Repository) Update(actorID uint64, key string, req UpdateRequest, meta AuditMeta) (*ConfigDTO, error) {
|
||||
var row model.SystemConfig
|
||||
err := r.db.Transaction(func(tx *gorm.DB) error {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package systemconfig
|
||||
|
||||
import "errors"
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrDependencyUnavailable = errors.New("dependency unavailable")
|
||||
@@ -22,6 +25,22 @@ func (s *Service) List() ([]ConfigDTO, error) {
|
||||
return s.repo.List()
|
||||
}
|
||||
|
||||
func (s *Service) PublishOptions() (*PublishOptionsDTO, error) {
|
||||
if s.repo == nil {
|
||||
return nil, ErrDependencyUnavailable
|
||||
}
|
||||
value, err := s.repo.FindValue(publishOptionsConfigKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
options := DefaultPublishOptions()
|
||||
if err := json.Unmarshal([]byte(value), &options); err != nil {
|
||||
options = DefaultPublishOptions()
|
||||
}
|
||||
normalizePublishOptions(&options)
|
||||
return &options, nil
|
||||
}
|
||||
|
||||
func (s *Service) Update(actorID uint64, key string, req UpdateRequest, meta AuditMeta) (*ConfigDTO, error) {
|
||||
if s.repo == nil {
|
||||
return nil, ErrDependencyUnavailable
|
||||
@@ -31,3 +50,37 @@ func (s *Service) Update(actorID uint64, key string, req UpdateRequest, meta Aud
|
||||
}
|
||||
return s.repo.Update(actorID, key, req, meta)
|
||||
}
|
||||
|
||||
func normalizePublishOptions(options *PublishOptionsDTO) {
|
||||
defaults := DefaultPublishOptions()
|
||||
if len(options.ServerOptions) == 0 {
|
||||
options.ServerOptions = defaults.ServerOptions
|
||||
}
|
||||
if len(options.FaceOptions) == 0 {
|
||||
options.FaceOptions = defaults.FaceOptions
|
||||
}
|
||||
if len(options.RankOptions) == 0 {
|
||||
options.RankOptions = defaults.RankOptions
|
||||
}
|
||||
if len(options.InsuranceOptions) == 0 {
|
||||
options.InsuranceOptions = defaults.InsuranceOptions
|
||||
}
|
||||
if len(options.LevelOptions) == 0 {
|
||||
options.LevelOptions = defaults.LevelOptions
|
||||
}
|
||||
if len(options.LoginMethodOptions) == 0 {
|
||||
options.LoginMethodOptions = defaults.LoginMethodOptions
|
||||
}
|
||||
if len(options.RegionOptions) == 0 {
|
||||
options.RegionOptions = defaults.RegionOptions
|
||||
}
|
||||
if len(options.SkinGroups) == 0 {
|
||||
options.SkinGroups = defaults.SkinGroups
|
||||
}
|
||||
if len(options.QuantityItems) == 0 {
|
||||
options.QuantityItems = defaults.QuantityItems
|
||||
}
|
||||
if len(options.ScreenshotSlots) == 0 {
|
||||
options.ScreenshotSlots = defaults.ScreenshotSlots
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user