算力配置完成

This commit is contained in:
RockYang
2025-08-28 11:07:19 +08:00
parent b3b1981264
commit 77a8969f73
5 changed files with 74 additions and 71 deletions

View File

@@ -3,6 +3,8 @@
## v4.2.6
- 功能重构:重构移动端 UI使用 tailwindcss 组件库,把 PC 端所有页面都在迁移到了移动端
- 功能优化:重构 API 授权代码,采用中间件鉴权方式,实现更加精准的 API 鉴权
- 功能优化:优化系统配置管理功能,把 OSS支付短信邮件等配置全部迁移到管理后台无需通过修改配置文档的方式修改
- 功能优化:优化 PC 端的 Suno 音乐,视频生成,以及即梦 AI 页面 UI
- 功能优化:重构登录和注册页面,兼容移动端和 PC 端,并且所有的登录组件共用了同一套组件代码,大大降低维护成本
- 功能优化:管理后台增加模型批量删除功能

View File

@@ -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"` // 可灵生成视频消耗算力

View File

@@ -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 {

View File

@@ -101,18 +101,6 @@
<span v-else>生成中...</span>
</el-button>
</div>
<div class="text-info">
<el-row :gutter="10">
<el-text type="primary"
>每次绘图消耗 <el-text type="warning">{{ dallPower }}算力</el-text></el-text
>
<el-text type="primary"
>当前可用
<el-text type="warning"> {{ power }}算力</el-text>
</el-text>
</el-row>
</div>
</el-form>
</div>
<div class="py-4">
@@ -122,7 +110,8 @@
>
<i v-if="isGenerating" class="iconfont icon-loading animate-spin"></i>
<i v-else class="iconfont icon-chuangzuo"></i>
<span>{{ isGenerating ? '创作中...' : '立即生成' }}</span>
<span v-if="isGenerating">创作中...</span>
<span v-else>立即生成({{ dallPower }}算力)</span>
</button>
</div>
</div>
@@ -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

View File

@@ -18,12 +18,6 @@
placeholder="邀请新用户注册赠送算力"
/>
</el-form-item>
<el-form-item label="VIP每月赠送算力" prop="vip_month_power">
<el-input
v-model.number="system['vip_month_power']"
placeholder="VIP用户每月赠送算力"
/>
</el-form-item>
<el-form-item>
<template #label>
<div class="label-title">
@@ -62,27 +56,6 @@
placeholder="使用Stable-Diffusion画一张图消耗算力"
/>
</el-form-item>
<el-form-item>
<template #label>
<div class="label-title">
DALL-E-3算力
<el-tooltip
effect="dark"
content="使用DALL-E-3画一张图消耗算力"
raw-content
placement="right"
>
<el-icon>
<InfoFilled />
</el-icon>
</el-tooltip>
</div>
</template>
<el-input
v-model.number="system['dall_power']"
placeholder="使用DALL-E-3画一张图消耗算力"
/>
</el-form-item>
<el-form-item label="Suno 算力" prop="suno_power">
<el-input
v-model.number="system['suno_power']"
@@ -175,7 +148,6 @@ import { ElMessage } from 'element-plus'
import { onMounted, reactive, ref } from 'vue'
const system = ref({})
const configBak = ref({})
const systemFormRef = ref(null)
onMounted(() => {
@@ -197,7 +169,6 @@ onMounted(() => {
'kling-v1_pro_5': 420,
'kling-v1_pro_10': 840,
}
configBak.value = copyObj(system.value)
})
.catch((e) => {
ElMessage.error('加载系统配置失败: ' + e.message)
@@ -209,10 +180,18 @@ const rules = reactive({})
const save = function () {
systemFormRef.value.validate((valid) => {
if (valid) {
httpPost('/api/admin/config/update', {
key: 'system',
config: system.value,
config_bak: configBak.value,
httpPost('/api/admin/config/update/power', {
init_power: system.value.init_power,
invite_power: system.value.invite_power,
daily_power: system.value.daily_power,
mj_power: system.value.mj_power,
sd_power: system.value.sd_power,
dall_power: system.value.dall_power,
suno_power: system.value.suno_power,
luma_power: system.value.luma_power,
keling_powers: system.value.keling_powers,
advance_voice_power: system.value.advance_voice_power,
prompt_power: system.value.prompt_power,
})
.then(() => {
ElMessage.success('操作成功!')
@@ -226,8 +205,8 @@ const save = function () {
</script>
<style lang="scss" scoped>
@use '../../../assets/css/admin/form.scss' as *;
@use '../../../assets/css/main.scss' as *;
@use '@/assets/css/admin/form.scss' as *;
@use '@/assets/css/main.scss' as *;
.power-config {
display: flex;