From 77a8969f7331244b6bc40c65bac7e50230ec2449 Mon Sep 17 00:00:00 2001 From: RockYang Date: Thu, 28 Aug 2025 11:07:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=97=E5=8A=9B=E9=85=8D=E7=BD=AE=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 + api/core/types/config.go | 18 ++++--- api/handler/admin/config_handler.go | 42 +++++++++++++++++ web/src/views/Dalle.vue | 34 ++++---------- web/src/views/admin/settings/PowerConfig.vue | 49 ++++++-------------- 5 files changed, 74 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8196cefa..5ec5f44d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ## v4.2.6 - 功能重构:重构移动端 UI,使用 tailwindcss 组件库,把 PC 端所有页面都在迁移到了移动端 +- 功能优化:重构 API 授权代码,采用中间件鉴权方式,实现更加精准的 API 鉴权 +- 功能优化:优化系统配置管理功能,把 OSS,支付,短信,邮件等配置全部迁移到管理后台,无需通过修改配置文档的方式修改 - 功能优化:优化 PC 端的 Suno 音乐,视频生成,以及即梦 AI 页面 UI - 功能优化:重构登录和注册页面,兼容移动端和 PC 端,并且所有的登录组件共用了同一套组件代码,大大降低维护成本 - 功能优化:管理后台增加模型批量删除功能 diff --git a/api/core/types/config.go b/api/core/types/config.go index 01e0cbac..a8a84c70 100644 --- a/api/core/types/config.go +++ b/api/core/types/config.go @@ -58,15 +58,11 @@ func (c RedisConfig) Url() string { } type BaseConfig struct { - Title string `json:"title,omitempty"` // 网站标题 - Slogan string `json:"slogan,omitempty"` // 网站 slogan - AdminTitle string `json:"admin_title,omitempty"` // 管理后台标题 - Logo string `json:"logo,omitempty"` // 圆形 Logo - BarLogo string `json:"bar_logo,omitempty"` // 条形 Logo - InitPower int `json:"init_power,omitempty"` // 新用户注册赠送算力值 - DailyPower int `json:"daily_power,omitempty"` // 每日签到赠送算力 - InvitePower int `json:"invite_power,omitempty"` // 邀请新用户赠送算力值 - VipMonthPower int `json:"vip_month_power,omitempty"` // VIP 会员每月赠送的算力值 + Title string `json:"title,omitempty"` // 网站标题 + Slogan string `json:"slogan,omitempty"` // 网站 slogan + AdminTitle string `json:"admin_title,omitempty"` // 管理后台标题 + Logo string `json:"logo,omitempty"` // 圆形 Logo + BarLogo string `json:"bar_logo,omitempty"` // 条形 Logo RegisterWays []string `json:"register_ways,omitempty"` // 注册方式:支持手机(mobile),邮箱注册(email),账号密码注册 EnabledRegister bool `json:"enabled_register,omitempty"` // 是否开放注册 @@ -74,10 +70,12 @@ type BaseConfig struct { OrderPayTimeout int `json:"order_pay_timeout,omitempty"` //订单支付超时时间 VipInfoText string `json:"vip_info_text,omitempty"` // 会员页面充值说明 + InitPower int `json:"init_power,omitempty"` // 新用户注册赠送算力值 + DailyPower int `json:"daily_power,omitempty"` // 每日签到赠送算力 + InvitePower int `json:"invite_power,omitempty"` // 邀请新用户赠送算力值 MjPower int `json:"mj_power,omitempty"` // MJ 绘画消耗算力 MjActionPower int `json:"mj_action_power,omitempty"` // MJ 操作(放大,变换)消耗算力 SdPower int `json:"sd_power,omitempty"` // SD 绘画消耗算力 - DallPower int `json:"dall_power,omitempty"` // DALL-E-3 绘图消耗算力 SunoPower int `json:"suno_power,omitempty"` // Suno 生成歌曲消耗算力 LumaPower int `json:"luma_power,omitempty"` // Luma 生成视频消耗算力 KeLingPowers map[string]int `json:"keling_powers,omitempty"` // 可灵生成视频消耗算力 diff --git a/api/handler/admin/config_handler.go b/api/handler/admin/config_handler.go index 4739e6e4..751fc439 100644 --- a/api/handler/admin/config_handler.go +++ b/api/handler/admin/config_handler.go @@ -90,6 +90,7 @@ func (h *ConfigHandler) RegisterRoutes() { rg.Use(middleware.AdminAuthMiddleware(h.App.Config.AdminSession.SecretKey, h.App.Redis)) { rg.POST("update/base", h.UpdateBase) + rg.POST("update/power", h.UpdatePower) rg.POST("update/notice", h.UpdateNotice) rg.POST("update/captcha", h.UpdateCaptcha) rg.POST("update/wx_login", h.UpdateWxLogin) @@ -136,6 +137,47 @@ func (h *ConfigHandler) UpdateBase(c *gin.Context) { resp.SUCCESS(c, data) } +// UpdatePower 更新系统配置 +func (h *ConfigHandler) UpdatePower(c *gin.Context) { + var data struct { + InitPower int `json:"init_power,omitempty"` // 新用户注册赠送算力值 + DailyPower int `json:"daily_power,omitempty"` // 每日签到赠送算力 + InvitePower int `json:"invite_power,omitempty"` // 邀请新用户赠送算力值 + MjPower int `json:"mj_power,omitempty"` // MJ 绘画消耗算力 + MjActionPower int `json:"mj_action_power,omitempty"` // MJ 操作(放大,变换)消耗算力 + SdPower int `json:"sd_power,omitempty"` // SD 绘画消耗算力 + SunoPower int `json:"suno_power,omitempty"` // Suno 生成歌曲消耗算力 + LumaPower int `json:"luma_power,omitempty"` // Luma 生成视频消耗算力 + KeLingPowers map[string]int `json:"keling_powers,omitempty"` // 可灵生成视频消耗算力 + AdvanceVoicePower int `json:"advance_voice_power,omitempty"` // 高级语音对话消耗算力 + PromptPower int `json:"prompt_power,omitempty"` // 生成提示词消耗算力 + } + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + + h.sysConfig.Base.InitPower = data.InitPower + h.sysConfig.Base.DailyPower = data.DailyPower + h.sysConfig.Base.InvitePower = data.InvitePower + h.sysConfig.Base.MjPower = data.MjPower + h.sysConfig.Base.MjActionPower = data.MjActionPower + h.sysConfig.Base.SdPower = data.SdPower + h.sysConfig.Base.SunoPower = data.SunoPower + h.sysConfig.Base.LumaPower = data.LumaPower + h.sysConfig.Base.KeLingPowers = data.KeLingPowers + h.sysConfig.Base.AdvanceVoicePower = data.AdvanceVoicePower + h.sysConfig.Base.PromptPower = data.PromptPower + + err := h.Update(types.ConfigKeySystem, h.sysConfig.Base) + if err != nil { + resp.ERROR(c, err.Error()) + return + } + + resp.SUCCESS(c, h.sysConfig.Base) +} + // UpdateNotice 更新公告配置 func (h *ConfigHandler) UpdateNotice(c *gin.Context) { var data struct { diff --git a/web/src/views/Dalle.vue b/web/src/views/Dalle.vue index d7e60f99..189a07ab 100644 --- a/web/src/views/Dalle.vue +++ b/web/src/views/Dalle.vue @@ -101,18 +101,6 @@ 生成中... - -
- - 每次绘图消耗 {{ dallPower }}算力, - 当前可用 - {{ power }}算力 - - -
@@ -122,7 +110,8 @@ > - {{ isGenerating ? '创作中...' : '立即生成' }} + 创作中... + 立即生成({{ dallPower }}算力)
@@ -347,8 +336,8 @@ const allowPulling = ref(true) // 是否允许轮询 const downloadPulling = ref(false) // 下载轮询 const tastPullHandler = ref(null) const downloadPullHandler = ref(null) -const power = ref(0) -const dallPower = ref(0) // 画一张 SD 图片消耗算力 +const userPower = ref(0) +const dallPower = ref(0) const clipboard = ref(null) const userId = ref(0) const selectedModel = ref(null) @@ -364,14 +353,6 @@ onMounted(() => { showMessageError('复制失败!') }) - getSystemInfo() - .then((res) => { - dallPower.value = res.data['dall_power'] - }) - .catch((e) => { - showMessageError('获取系统配置失败:' + e.message) - }) - // 获取模型列表 httpGet('/api/dall/models') .then((res) => { @@ -398,7 +379,7 @@ onUnmounted(() => { const initData = () => { checkSession() .then((user) => { - power.value = user['power'] + userPower.value = user['power'] userId.value = user.id isLogin.value = true page.value = 0 @@ -511,7 +492,7 @@ const generate = () => { httpPost('/api/dall/image', params.value) .then(() => { ElMessage.success('任务执行成功!') - power.value -= dallPower.value + userPower.value -= dallPower.value // 追加任务列表 runningJobs.value.push({ prompt: params.value.prompt, @@ -589,7 +570,8 @@ const generatePrompt = () => { } const changeModel = (model) => { - if (model.value.startsWith('dall')) { + dallPower.value = model.power + if (model.name.startsWith('dall')) { sizes.value = dalleSizes } else { sizes.value = fluxSizes diff --git a/web/src/views/admin/settings/PowerConfig.vue b/web/src/views/admin/settings/PowerConfig.vue index e9552bdc..6b2c4773 100644 --- a/web/src/views/admin/settings/PowerConfig.vue +++ b/web/src/views/admin/settings/PowerConfig.vue @@ -18,12 +18,6 @@ placeholder="邀请新用户注册赠送算力" /> - - -