重构主体工作完成

This commit is contained in:
RockYang
2024-03-15 18:35:10 +08:00
61 changed files with 1043 additions and 1097 deletions

View File

@@ -2,9 +2,10 @@
display: flex;
width: 100%;
}
.el-form-item__content .tip-input .input {
width: 100%;
.el-form-item__content .tip-input .el-input {
width: 50%;
}
.el-form-item__content .tip-input .info {
margin-left: 6px;
margin-top: 2px;
}

View File

@@ -3,12 +3,13 @@
display flex
width 100%
.input {
width 100%
.el-input {
width 50%
}
.info {
margin-left 6px
margin-top 2px
}
}

View File

@@ -342,14 +342,14 @@ onMounted(() => {
})
// 获取系统配置
httpGet("/api/admin/config/get?key=system").then(res => {
httpGet("/api/config/get?key=system").then(res => {
title.value = res.data.title
}).catch(e => {
ElMessage.error("获取系统配置失败:" + e.message)
})
// 获取系统公告
httpGet("/api/admin/config/get?key=notice").then(res => {
httpGet("/api/config/get?key=notice").then(res => {
notice.value = md.render(res.data['content'])
const oldNotice = localStorage.getItem(noticeKey.value);
// 如果公告有更新,则显示公告

View File

@@ -129,7 +129,7 @@ onMounted(() => {
ElMessage.error("获取邀请码失败:" + e.message)
})
httpGet("/api/admin/config/get?key=system").then(res => {
httpGet("/api/config/get?key=system").then(res => {
inviteChatCalls.value = res.data["invite_chat_calls"]
inviteImgCalls.value = res.data["invite_img_calls"]
}).catch(e => {

View File

@@ -227,7 +227,7 @@ onMounted(() => {
router.push("/login")
})
httpGet("/api/admin/config/get?key=system").then(res => {
httpGet("/api/config/get?key=system").then(res => {
rewardImg.value = res.data['reward_img']
enableReward.value = res.data['enabled_reward']
orderPayInfoText.value = res.data['order_pay_info_text']

View File

@@ -142,7 +142,7 @@ const wxImg = ref("/images/wx.png")
const ways = []
const placeholder = ref("用户名:")
httpGet("/api/admin/config/get?key=system").then(res => {
httpGet("/api/config/get?key=system").then(res => {
if (res.data) {
const registerWays = res.data['register_ways']
if (arrayContains(registerWays, "mobile")) {

View File

@@ -3,7 +3,7 @@
<div class="handle-box">
<el-button type="primary" :icon="Plus" @click="add">新增</el-button>
<a href="https://gpt.bemore.lol" target="_blank" style="margin-left: 10px">
<a href="https://api.chat-plus.net" target="_blank" style="margin-left: 10px">
<el-button type="success" :icon="ShoppingCart" @click="add" plain>购买API-KEY</el-button>
</a>
</div>
@@ -12,13 +12,20 @@
<el-table :data="items" :row-key="row => row.id" table-layout="auto">
<el-table-column prop="platform" label="所属平台"/>
<el-table-column prop="name" label="名称"/>
<el-table-column prop="value" label="KEY">
<el-table-column prop="value" label="API KEY">
<template #default="scope">
<el-tooltip class="box-item"
effect="dark"
:content="scope.row.api_url"
placement="top">{{ scope.row.value }}
</el-tooltip>
<span>{{ substr(scope.row.value, 20) }}</span>
<el-icon class="copy-key" :data-clipboard-text="scope.row.value">
<DocumentCopy/>
</el-icon>
</template>
</el-table-column>
<el-table-column prop="api_url" label="API URL">
<template #default="scope">
<span>{{ substr(scope.row.api_url, 30) }}</span>
<el-icon class="copy-key" :data-clipboard-text="scope.row.api_url">
<DocumentCopy/>
</el-icon>
</template>
</el-table-column>
<el-table-column prop="type" label="用途">
@@ -27,11 +34,7 @@
<el-tag v-else-if="scope.row.type === 'img'" type="success">绘图</el-tag>
</template>
</el-table-column>
<el-table-column prop="use_proxy" label="使用代理">
<template #default="scope">
<el-switch v-model="scope.row['use_proxy']" @change="set('use_proxy',scope.row)"/>
</template>
</el-table-column>
<el-table-column prop="proxy_url" label="代理地址"/>
<el-table-column label="最后使用时间">
<template #default="scope">
@@ -99,18 +102,8 @@
placeholder="如果你用了第三方的 API 中转这里填写中转地址"/>
</el-form-item>
<el-form-item label="使用代理" prop="use_proxy">
<el-switch v-model="item.use_proxy"/>
<el-tooltip
effect="dark"
content="是否使用代理访问 API URLOpenAI 官方API需要开启代理访问"
raw-content
placement="right"
>
<el-icon>
<InfoFilled/>
</el-icon>
</el-tooltip>
<el-form-item label="代理地址" prop="proxy_url">
<el-input v-model="item.proxy_url" autocomplete="off"/>
</el-form-item>
<el-form-item label="启用状态" prop="enable">
@@ -129,11 +122,12 @@
</template>
<script setup>
import {reactive, ref} from "vue";
import {onMounted, onUnmounted, reactive, ref} from "vue";
import {httpGet, httpPost} from "@/utils/http";
import {ElMessage} from "element-plus";
import {dateFormat, disabledDate, removeArrayItem} from "@/utils/libs";
import {InfoFilled, Plus, ShoppingCart} from "@element-plus/icons-vue";
import {dateFormat, disabledDate, removeArrayItem, substr} from "@/utils/libs";
import {DocumentCopy, InfoFilled, Plus, ShoppingCart} from "@element-plus/icons-vue";
import ClipboardJS from "clipboard";
// 变量定义
const items = ref([])
@@ -150,10 +144,10 @@ const formRef = ref(null)
const title = ref("")
const platforms = ref([
{
name: "OpenAIChatGPT",
name: "OpenAI/中转ChatGPT",
value: "OpenAI",
api_url: "https://gpt.bemore.lol/v1/chat/completions",
img_url: "https://gpt.bemore.lol/v1/images/generations"
api_url: "https://api.chat-plus.net/v1/chat/completions",
img_url: "https://api.chat-plus.net/v1/images/generations"
},
{
name: "【讯飞】星火大模型",
@@ -186,6 +180,23 @@ const types = ref([
{name: "绘画", value: "img"},
])
const clipboard = ref(null)
onMounted(() => {
clipboard.value = new ClipboardJS('.copy-key');
clipboard.value.on('success', () => {
ElMessage.success('复制成功!');
})
clipboard.value.on('error', () => {
ElMessage.error('复制失败!');
})
})
onUnmounted(() => {
clipboard.value.destroy()
})
// 获取数据
httpGet('/api/admin/apikey/list').then((res) => {
if (res.data) {
@@ -269,7 +280,6 @@ const changePlatform = () => {
}
}
</script>
<style lang="stylus" scoped>
@@ -285,6 +295,11 @@ const changePlatform = () => {
}
}
.copy-key {
margin-left 5px
cursor pointer
}
.el-select {
width: 100%
}

View File

@@ -25,8 +25,18 @@
<el-table :data="data.chat.items" :row-key="row => row.id" table-layout="auto">
<el-table-column prop="user_id" label="账户ID"/>
<el-table-column prop="username" label="账户"/>
<el-table-column prop="title" label=""/>
<el-table-column label="">
<template #default="scope">
<el-avatar :size="30" :src="scope.row.role.icon"/>
</template>
</el-table-column>
<el-table-column label="角色">
<template #default="scope">
<span>{{ scope.row.role.name }}</span>
</template>
</el-table-column>
<el-table-column prop="model" label="模型"/>
<el-table-column prop="title" label="标题"/>
<el-table-column prop="msg_num" label="消息数量"/>
<el-table-column prop="token" label="消耗算力"/>

View File

@@ -14,7 +14,10 @@
</el-table-column>
<el-table-column prop="name" label="模型名称"/>
<el-table-column prop="value" label="模型值"/>
<el-table-column prop="weight" label="对话权重"/>
<el-table-column prop="power" label="费率"/>
<el-table-column prop="max_tokens" label="最大响应长度"/>
<el-table-column prop="max_context" label="最大上下文长度"/>
<el-table-column prop="temperature" label="创意度"/>
<el-table-column prop="enabled" label="启用状态">
<template #default="scope">
<el-switch v-model="scope.row['enabled']" @change="modelSet('enabled',scope.row)"/>
@@ -69,16 +72,15 @@
<el-input v-model="item.value" autocomplete="off"/>
</el-form-item>
<el-form-item label="对话权重" prop="weight">
<el-form-item label="费率" prop="weight">
<template #default>
<div class="tip-input">
<el-input-number :min="1" v-model="item.weight" autocomplete="off"/>
<el-input-number :min="1" v-model="item.power" autocomplete="off"/>
<div class="info">
<el-tooltip
class="box-item"
effect="dark"
content="对话权重每次对话扣减多少次对话额度"
content="每次对话扣减多少单位算力"
placement="right"
>
<el-icon>
@@ -90,11 +92,78 @@
</template>
</el-form-item>
<el-form-item label="最长响应" prop="max_tokens">
<el-input v-model.number="item.max_tokens" autocomplete="off" placeholder="模型最大响应长度"/>
</el-form-item>
<el-form-item label="最大上下文" prop="max_context">
<div class="tip-input">
<el-input v-model.number="item.max_context" autocomplete="off" placeholder="模型最大上下文长度"/>
<div class="info">
<el-tooltip
class="box-item"
effect="dark"
raw-content
content="gpt-3.5-turbo:4096 <br/>
gpt-3.5-turbo-16k: 16384 <br/>
gpt-4: 8192 <br/>
gpt-4-32k: 32768 <br/>
chatglm_pro: 32768 <br/>
chatglm_std: 16384 <br/>
chatglm_lite: 4096 <br/>
qwen-turbo: 8192 <br/>
qwen-plus: 32768 <br/>
文心一言: 8192 <br/>
星火1.0: 4096 <br/>
星火2.0-星火3.5: 8192"
placement="right"
>
<el-icon>
<InfoFilled/>
</el-icon>
</el-tooltip>
</div>
</div>
</el-form-item>
<el-form-item label="创意度" prop="temperature">
<div class="tip-input">
<el-input v-model="item.temperature" autocomplete="off" placeholder="模型创意度"/>
<div class="info">
<el-tooltip
class="box-item"
effect="dark"
content="OpenAI 0-2其他模型 0-1"
placement="right"
>
<el-icon>
<InfoFilled/>
</el-icon>
</el-tooltip>
</div>
</div>
</el-form-item>
<el-form-item label="启用状态" prop="enable">
<el-switch v-model="item.enabled"/>
</el-form-item>
<el-form-item label="开放状态" prop="open">
<el-switch v-model="item.open"/>
<div class="tip-input">
<el-switch v-model="item.open"/>
<div class="info">
<el-tooltip
class="box-item"
effect="dark"
raw-content
content="开放后该模型将对所有用户可见<br/> 如果模型没有启用则当前设置无效"
placement="right"
>
<el-icon>
<InfoFilled/>
</el-icon>
</el-tooltip>
</div>
</div>
</el-form-item>
</el-form>

View File

@@ -28,9 +28,9 @@
<el-table-column prop="username" label="下单用户"/>
<el-table-column prop="subject" label="产品名称"/>
<el-table-column prop="amount" label="订单金额"/>
<el-table-column label="调用次数">
<el-table-column label="充值算力">
<template #default="scope">
<span>{{ scope.row.remark?.calls }}</span>
<span>{{ scope.row.remark?.power }}</span>
</template>
</el-table-column>

View File

@@ -20,8 +20,7 @@
<span v-else>{{ scope.row.days }}</span>
</template>
</el-table-column>
<el-table-column prop="calls" label="对话次数"/>
<el-table-column prop="img_calls" label="绘图次数"/>
<el-table-column prop="power" label="算力"/>
<el-table-column prop="sales" label="销量"/>
<el-table-column prop="enabled" label="启用状态">
<template #default="scope">
@@ -71,12 +70,8 @@
<el-input v-model.number="item.days" autocomplete="off" placeholder="会员有效期()"/>
</el-form-item>
<el-form-item label="对话次数" prop="calls">
<el-input v-model.number="item.calls" autocomplete="off" placeholder="增加对话次数"/>
</el-form-item>
<el-form-item label="绘图次数" prop="img_calls">
<el-input v-model.number="item.img_calls" autocomplete="off" placeholder="增加绘图次数"/>
<el-form-item label="算力" prop="power">
<el-input v-model.number="item.power" autocomplete="off" placeholder="增加算力值"/>
</el-form-item>
<el-form-item label="启用状态" prop="enable">

View File

@@ -11,23 +11,30 @@
<el-form-item label="控制台标题" prop="admin_title">
<el-input v-model="system['admin_title']"/>
</el-form-item>
<el-form-item label="注册赠送对话次数" prop="user_init_calls">
<el-input v-model.number="system['init_chat_calls']" placeholder="新用户注册赠送对话次数"/>
<el-form-item label="网站 LOGO" prop="logo">
<el-input v-model="system['logo']" placeholder="网站LOGO图片">
<template #append>
<el-upload
:auto-upload="true"
:show-file-list="false"
@click="beforeUpload('logo')"
:http-request="uploadImg"
>
<el-icon class="uploader-icon">
<UploadFilled/>
</el-icon>
</el-upload>
</template>
</el-input>
</el-form-item>
<el-form-item label="注册赠送绘图次数" prop="init_img_calls">
<el-input v-model.number="system['init_img_calls']" placeholder="新用户注册赠送绘图次数"/>
<el-form-item label="注册赠送算力" prop="init_power">
<el-input v-model.number="system['init_power']" placeholder="新用户注册赠送算力"/>
</el-form-item>
<el-form-item label="邀请赠送对话次数" prop="invite_chat_calls">
<el-input v-model.number="system['invite_chat_calls']" placeholder="邀请新用户注册赠送对话次数"/>
<el-form-item label="邀请赠送算力" prop="invite_power">
<el-input v-model.number="system['invite_power']" placeholder="邀请新用户注册赠送算力"/>
</el-form-item>
<el-form-item label="邀请赠送绘图次数" prop="invite_img_calls">
<el-input v-model.number="system['invite_img_calls']" placeholder="邀请新用户注册赠送绘图次数"/>
</el-form-item>
<el-form-item label="VIP每月对话次数" prop="vip_month_calls">
<el-input v-model.number="system['vip_month_calls']" placeholder="VIP用户每月赠送对话次数"/>
</el-form-item>
<el-form-item label="VIP每月绘图次数" prop="vip_month_img_calls">
<el-input v-model.number="system['vip_month_img_calls']" placeholder="VIP用户每月赠送绘图次数"/>
<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 label="开放注册" prop="enabled_register">
@@ -66,11 +73,9 @@
</el-form-item>
<div v-if="system['enabled_reward']">
<el-form-item label="单次对话价格" prop="chat_call_price">
<el-input v-model="system['chat_call_price']" placeholder="众筹金额跟对话次数的兑换比例"/>
</el-form-item>
<el-form-item label="单次绘图价格" prop="img_call_price">
<el-input v-model="system['img_call_price']" placeholder="众筹金额跟绘图次数的兑换比例"/>
<el-form-item label="算力单价" prop="power_price">
<el-input v-model="system['power_price']"
placeholder="单位算力的价格,比如设置 0.1 表示捐赠1元钱可以得到10个单位算力"/>
</el-form-item>
<el-form-item label="收款二维码" prop="reward_img">
<el-input v-model="system['reward_img']" placeholder="众筹收款二维码地址">
@@ -165,82 +170,21 @@
</div>
</template>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="save('system')">保存</el-button>
</el-form-item>
</el-form>
</div>
</el-tab-pane>
<el-tab-pane label="模型配置" name="chat">
<div class="container">
<el-form :model="chat" label-position="right" label-width="150px" ref="chatFormRef" :rules="rules">
<el-form-item label="开启聊天上下文">
<el-switch v-model="chat['enable_context']"/>
</el-form-item>
<el-form-item label="保存聊天记录">
<el-switch v-model="chat['enable_history']"/>
<el-switch v-model="system['enable_context']"/>
</el-form-item>
<el-form-item label="会话上下文深度">
<div style="width:100%">
<el-input-number v-model="chat['context_deep']" :min="0" :max="10"/>
<el-input-number v-model="system['context_deep']" :min="0" :max="10"/>
</div>
<div class="tip" style="margin-top: 10px; ">会话上下文深度在老会话中继续会话默认加载多少条聊天记录作为上下文如果设置为
0
则不加载聊天记录仅仅使用当前角色的上下文该配置参数最好设置需要为偶数否则将无法兼容百度的 API
</div>
</el-form-item>
<el-divider content-position="center">OpenAI</el-divider>
<el-form-item label="模型创意度">
<el-slider v-model="chat['open_ai']['temperature']" :max="2" :step="0.1"/>
<div class="tip">值越大 AI 回答越发散值越小回答越保守建议保持默认值</div>
</el-form-item>
<el-form-item label="最大响应长度">
<el-input v-model.number="chat['open_ai']['max_tokens']" placeholder="回复的最大字数最大4096"/>
</el-form-item>
<el-divider content-position="center">Azure</el-divider>
<el-form-item label="模型创意度">
<el-slider v-model="chat['azure']['temperature']" :max="2" :step="0.1"/>
<div class="tip">值越大 AI 回答越发散值越小回答越保守建议保持默认值</div>
</el-form-item>
<el-form-item label="最大响应长度">
<el-input v-model.number="chat['azure']['max_tokens']" placeholder="回复的最大字数最大4096"/>
</el-form-item>
<el-divider content-position="center">ChatGLM</el-divider>
<el-form-item label="模型创意度">
<el-slider v-model="chat['chat_gml']['temperature']" :max="1" :step="0.01"/>
<div class="tip">值越大 AI 回答越发散值越小回答越保守建议保持默认值</div>
</el-form-item>
<el-form-item label="最大响应长度">
<el-input v-model.number="chat['chat_gml']['max_tokens']" placeholder="回复的最大字数最大4096"/>
</el-form-item>
<el-divider content-position="center">文心一言</el-divider>
<el-form-item label="模型创意度">
<el-slider v-model="chat['baidu']['temperature']" :max="1" :step="0.01"/>
<div class="tip">值越大 AI 回答越发散值越小回答越保守建议保持默认值</div>
</el-form-item>
<el-form-item label="最大响应长度">
<el-input v-model.number="chat['baidu']['max_tokens']" placeholder="回复的最大字数最大4096"/>
</el-form-item>
<el-divider content-position="center">讯飞星火</el-divider>
<el-form-item label="模型创意度">
<el-slider v-model="chat['xun_fei']['temperature']" :max="1" :step="0.1"/>
<div class="tip">值越大 AI 回答越发散值越小回答越保守建议保持默认值</div>
</el-form-item>
<el-form-item label="最大响应长度">
<el-input v-model.number="chat['xun_fei']['max_tokens']" placeholder="回复的最大字数最大4096"/>
</el-form-item>
<el-divider content-position="center">AI绘图</el-divider>
<el-form-item label="DALL-E3出图数量">
<el-input v-model.number="chat['dall_img_num']" placeholder="调用 DALL E3 API 传入的出图数量"/>
</el-form-item>
<el-form-item style="text-align: right">
<el-button type="primary" @click="save('chat')">保存</el-button>
<el-form-item>
<el-button type="primary" @click="save('system')">保存</el-button>
</el-form-item>
</el-form>
</div>

View File

@@ -17,9 +17,7 @@
<el-image v-if="scope.row.vip" :src="vipImg" style="height: 20px;position: relative; top:5px; left: 5px"/>
</template>
</el-table-column>
<el-table-column prop="calls" label="剩余对话次数"/>
<el-table-column prop="img_calls" label="剩余绘图次数"/>
<el-table-column prop="total_tokens" label="累计消耗tokens"/>
<el-table-column prop="power" label="剩余算力"/>
<el-table-column label="状态" width="80">
<template #default="scope">
<el-tag v-if="scope.row.status" type="success">正常</el-tag>
@@ -76,11 +74,8 @@
<el-form-item v-if="add" label="密码" prop="password">
<el-input v-model="user.password" autocomplete="off"/>
</el-form-item>
<el-form-item label="对话次数" prop="calls">
<el-input v-model.number="user.calls" autocomplete="off" placeholder="0"/>
</el-form-item>
<el-form-item label="绘图次数" prop="img_calls">
<el-input v-model.number="user['img_calls']" autocomplete="off" placeholder="0"/>
<el-form-item label="剩余算力" prop="power">
<el-input v-model.number="user.power" autocomplete="off" placeholder="0"/>
</el-form-item>
<el-form-item label="有效期" prop="expired_time">

View File

@@ -149,7 +149,7 @@ onMounted(() => {
showFailToast("获取产品套餐失败:" + e.message)
})
httpGet("/api/admin/config/get?key=system").then(res => {
httpGet("/api/config/get?key=system").then(res => {
vipMonthCalls.value = res.data['vip_month_calls']
vipMonthImgCalls.value = res.data['vip_month_img_calls']
}).catch(e => {