mirror of
https://github.com/yangjian102621/geekai.git
synced 2026-04-21 10:34:26 +08:00
算力配置完成
This commit is contained in:
@@ -3,6 +3,8 @@
|
||||
## v4.2.6
|
||||
|
||||
- 功能重构:重构移动端 UI,使用 tailwindcss 组件库,把 PC 端所有页面都在迁移到了移动端
|
||||
- 功能优化:重构 API 授权代码,采用中间件鉴权方式,实现更加精准的 API 鉴权
|
||||
- 功能优化:优化系统配置管理功能,把 OSS,支付,短信,邮件等配置全部迁移到管理后台,无需通过修改配置文档的方式修改
|
||||
- 功能优化:优化 PC 端的 Suno 音乐,视频生成,以及即梦 AI 页面 UI
|
||||
- 功能优化:重构登录和注册页面,兼容移动端和 PC 端,并且所有的登录组件共用了同一套组件代码,大大降低维护成本
|
||||
- 功能优化:管理后台增加模型批量删除功能
|
||||
|
||||
@@ -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"` // 可灵生成视频消耗算力
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user