merge conflicts for v4.0.5

This commit is contained in:
RockYang
2024-05-21 11:30:40 +08:00
181 changed files with 5241 additions and 1437 deletions

View File

@@ -284,15 +284,8 @@ const changePlatform = () => {
<style lang="stylus" scoped>
.list {
.opt-box {
padding-bottom: 10px;
display: flex;
justify-content flex-end
.el-icon {
margin-right: 5px;
}
.handle-box {
margin-bottom 20px
}
.copy-key {
@@ -303,6 +296,12 @@ const changePlatform = () => {
.el-select {
width: 100%
}
.pagination {
padding 20px 0
display flex
justify-content righ
}
}
.el-form {

View File

@@ -178,7 +178,7 @@
import {onMounted, ref} from "vue";
import {httpGet, httpPost} from "@/utils/http";
import {ElMessage} from "element-plus";
import {dateFormat, processContent, removeArrayItem} from "@/utils/libs";
import {dateFormat, processContent} from "@/utils/libs";
import {Search} from "@element-plus/icons-vue";
import 'highlight.js/styles/a11y-dark.css'
import hl from "highlight.js";
@@ -343,8 +343,8 @@ const showMessages = (row) => {
<style lang="stylus" scoped>
.chat-list {
.handle-box {
margin-bottom 20px
.handle-input {
max-width 150px;
margin-right 10px;
@@ -365,6 +365,12 @@ const showMessages = (row) => {
width: 100%
}
.pagination {
padding 20px 0
display flex
justify-content right
}
.chat-box {
overflow-y: auto;
overflow-x hidden

View File

@@ -350,13 +350,14 @@ const remove = function (row) {
@import "@/assets/css/admin/form.styl";
.model-list {
.opt-box {
padding-bottom: 10px;
display: flex;
justify-content flex-end
.handle-box {
margin-bottom 20px
}
.el-icon {
margin-right: 5px;
.cell {
.copy-model {
margin-left 6px
cursor pointer
}
}
@@ -371,5 +372,11 @@ const remove = function (row) {
width: 100%
}
.pagination {
padding 20px 0
display flex
justify-content right
}
}
</style>

View File

@@ -1,5 +1,5 @@
<template>
<div class="container role-list" v-loading="loading">
<div class="container function" v-loading="loading">
<div class="handle-box">
<el-button type="primary" :icon="Plus" @click="addRow">新增</el-button>
</div>
@@ -296,15 +296,9 @@ const generateToken = () => {
</script>
<style lang="stylus" scoped>
.role-list {
.opt-box {
padding-bottom: 10px;
display flex;
justify-content flex-end
.el-icon {
margin-right 5px;
}
.function {
.handle-box {
margin-bottom 20px
}
.param-line {
@@ -334,5 +328,11 @@ const generateToken = () => {
text-align center
}
}
.pagination {
padding 20px 0
display flex
justify-content right
}
}
</style>

View File

@@ -1,10 +1,10 @@
<template>
<div class="admin-home" v-if="isLogin">
<admin-sidebar/>
<admin-sidebar v-model:theme="theme"/>
<div class="content-box" :class="{ 'content-collapse': sidebar.collapse }">
<admin-header/>
<admin-tags/>
<div class="content">
<admin-header v-model:theme="theme" @changeTheme="changeTheme"/>
<admin-tags v-model:theme="theme"/>
<div :class="'content '+theme" :style="{height:contentHeight+'px'}">
<router-view v-slot="{ Component }">
<transition name="move" mode="out-in">
<keep-alive :include="tags.nameList">
@@ -25,10 +25,13 @@ import AdminTags from "@/components/admin/AdminTags.vue";
import {useRouter} from "vue-router";
import {checkAdminSession} from "@/action/session";
import {ref} from "vue";
import {getAdminTheme, setAdminTheme} from "@/store/system";
const sidebar = useSidebarStore();
const tags = useTagsStore();
const isLogin = ref(false)
const contentHeight = window.innerHeight - 80
const theme = ref(getAdminTheme())
// 获取会话信息
const router = useRouter();
@@ -37,10 +40,20 @@ checkAdminSession().then(() => {
}).catch(() => {
router.replace('/admin/login')
})
const changeTheme = (value) => {
if (value) {
theme.value = 'dark'
} else {
theme.value = 'light'
}
setAdminTheme(theme.value)
}
</script>
<style scoped lang="stylus">
@import '@/assets/css/main.css';
@import '@/assets/css/color-dark.css';
@import '@/assets/css/color-dark.styl';
@import '@/assets/css/main.styl';
@import '@/assets/iconfont/iconfont.css';
</style>

View File

@@ -63,19 +63,19 @@ const fetchList = function (_page, _pageSize) {
<style lang="stylus" scoped>
.list {
.opt-box {
padding-bottom: 10px;
display flex;
justify-content flex-start
.el-icon {
margin-right: 5px;
}
.handle-box {
margin-bottom 20px
}
.el-select {
width: 100%
}
.pagination {
padding 20px 0
display flex
justify-content right
}
}
</style>

View File

@@ -74,7 +74,6 @@ import {httpGet, httpPost} from "@/utils/http";
import {ElMessage, ElMessageBox} from "element-plus";
import {dateFormat, removeArrayItem} from "@/utils/libs";
import {Plus} from "@element-plus/icons-vue";
import {Sortable} from "sortablejs";
// 变量定义
const items = ref([])
@@ -170,19 +169,19 @@ const remove = function (row) {
<style lang="stylus" scoped>
.list {
.opt-box {
padding-bottom: 10px;
display flex;
justify-content flex-end
.el-icon {
margin-right: 5px;
}
.handle-box {
margin-bottom 20px
}
.el-select {
width: 100%
}
.pagination {
padding 20px 0
display flex
justify-content right
}
}
</style>

View File

@@ -129,6 +129,7 @@ const remove = function (row) {
.order {
.handle-box {
margin-bottom 20px
.handle-input {
max-width 150px;
margin-right 10px;
@@ -149,5 +150,11 @@ const remove = function (row) {
width: 100%
}
.pagination {
padding 20px 0
display flex
justify-content right
}
}
</style>

View File

@@ -68,7 +68,7 @@
<script setup>
import {onMounted, ref} from "vue";
import {httpGet, httpPost} from "@/utils/http";
import {httpPost} from "@/utils/http";
import {ElMessage} from "element-plus";
import {dateFormat} from "@/utils/libs";
import {Search} from "@element-plus/icons-vue";
@@ -135,6 +135,7 @@ const fetchData = () => {
<style lang="stylus" scoped>
.power-log {
.handle-box {
margin-bottom 20px
.handle-input {
max-width 150px;
margin-right 10px;
@@ -155,5 +156,12 @@ const fetchData = () => {
width: 100%
}
.pagination {
padding 20px 0
display flex
width 100%
justify-content right
}
}
</style>

View File

@@ -207,6 +207,14 @@ const remove = function (row) {
<style lang="stylus" scoped>
.product {
.handle-box {
margin-bottom 20px
.handle-input {
max-width 150px;
margin-right 10px;
}
}
.opt-box {
padding-bottom: 10px;
@@ -222,5 +230,11 @@ const remove = function (row) {
width: 100%
}
.pagination {
padding 20px 0
display flex
justify-content right
}
}
</style>

View File

@@ -82,6 +82,14 @@ const remove = function (row) {
<style lang="stylus" scoped>
.list {
.handle-box {
margin-bottom 20px
.handle-input {
max-width 150px;
margin-right 10px;
}
}
.opt-box {
padding-bottom: 10px;
@@ -97,5 +105,11 @@ const remove = function (row) {
width: 100%
}
.pagination {
padding 20px 0
display flex
justify-content right
}
}
</style>

View File

@@ -322,6 +322,15 @@ const uploadImg = (file) => {
<style lang="stylus" scoped>
.role-list {
.handle-box {
margin-bottom 20px
.handle-input {
max-width 150px;
margin-right 10px;
}
}
.opt-box {
padding-bottom: 10px;
display flex;
@@ -360,5 +369,11 @@ const uploadImg = (file) => {
text-align center
}
}
.pagination {
padding 20px 0
display flex
justify-content right
}
}
</style>

View File

@@ -258,6 +258,52 @@
<Menu/>
</el-tab-pane>
<el-tab-pane label="授权激活" name="license">
<div class="container">
<el-descriptions
v-if="license.is_active"
class="margin-top"
title="授权信息"
:column="3"
border
>
<el-descriptions-item :span="3" :width="150">
<template #label>
<div class="cell-item">License Key</div>
</template>
{{ license.key }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">到期时间</div>
</template>
{{ dateFormat(license.expired_at) }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">用户人数</div>
</template>
{{ license.user_num }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<div class="cell-item">机器码</div>
</template>
{{ license.machine_id }}
</el-descriptions-item>
</el-descriptions>
<el-form :model="system" label-width="150px" label-position="right">
<el-form-item label="许可授权码" prop="license">
<el-input v-model="licenseKey"/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="active">立即激活</el-button>
</el-form-item>
</el-form>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
@@ -271,6 +317,7 @@ import {InfoFilled, UploadFilled} from "@element-plus/icons-vue";
import MdEditor from "md-editor-v3";
import 'md-editor-v3/lib/style.css';
import Menu from "@/views/admin/Menu.vue";
import {dateFormat} from "@/utils/libs";
const activeName = ref('basic')
const system = ref({models: []})
@@ -279,6 +326,7 @@ const systemFormRef = ref(null)
const models = ref([])
const openAIModels = ref([])
const notice = ref("")
const license = ref({is_active: false})
onMounted(() => {
// 加载系统配置
@@ -302,8 +350,17 @@ onMounted(() => {
ElMessage.error("获取模型失败:" + e.message)
})
fetchLicense()
})
const fetchLicense = () => {
httpGet("/api/admin/config/get/license").then(res => {
license.value = res.data
}).catch(e => {
ElMessage.error("获取 License 失败:" + e.message)
})
}
const rules = reactive({
title: [{required: true, message: '请输入网站标题', trigger: 'blur',}],
admin_title: [{required: true, message: '请输入控制台标题', trigger: 'blur',}],
@@ -331,6 +388,20 @@ const save = function (key) {
}
}
// 激活授权
const licenseKey = ref("")
const active = () => {
if (licenseKey.value === "") {
return ElMessage.error("请输入授权码")
}
httpPost("/api/admin/active", {license: licenseKey.value}).then(res => {
ElMessage.success("授权成功,机器编码为:" + res.data)
fetchLicense()
}).catch(e => {
ElMessage.error(e.message)
})
}
const configKey = ref("")
const beforeUpload = (key) => {
configKey.value = key
@@ -375,10 +446,9 @@ const onUploadImg = (files, callback) => {
}).catch(e => {
ElMessage.error('图片上传失败:' + e.message)
})
};
</script>
<style lang="stylus" scoped>
@@ -389,10 +459,9 @@ const onUploadImg = (files, callback) => {
.el-tabs {
width 100%
background-color #ffffff
background-color var(--el-bg-color)
padding 10px 20px 40px 20px
border: 1px solid #ddd;
border-radius: 5px
border: 1px solid var(--el-border-color);
.container {
.el-form {
@@ -425,6 +494,10 @@ const onUploadImg = (files, callback) => {
}
}
.el-descriptions {
margin-bottom 20px
}
.el-alert {
margin-bottom 15px;
}

View File

@@ -73,7 +73,7 @@
<el-input v-model="user.username" autocomplete="off"/>
</el-form-item>
<el-form-item v-if="add" label="密码" prop="password">
<el-input v-model="user.password" autocomplete="off"/>
<el-input v-model="user.password" autocomplete="off" placeholder="8-16"/>
</el-form-item>
<el-form-item label="剩余算力" prop="power">
<el-input v-model.number="user.power" autocomplete="off" placeholder="0"/>
@@ -186,8 +186,17 @@ const models = ref([])
const showUserEditDialog = ref(false)
const showResetPassDialog = ref(false)
const rules = reactive({
username: [{required: true, message: '请输入账号', trigger: 'change',}],
password: [{required: true, message: '请输入密码', trigger: 'change',}],
username: [{required: true, message: '请输入账号', trigger: 'blur',}],
password: [
{
required: true,
validator: (rule, value) => {
return !(value.length > 16 || value.length < 8);
}, message: '密码必须为8-16',
trigger: 'blur'
}
],
calls: [
{required: true, message: '请输入提问次数'},
{type: 'number', message: '请输入有效数字'},
@@ -323,6 +332,7 @@ const doResetPass = () => {
.user-list {
.handle-box {
margin-bottom 20px
.handle-input {
max-width 150px;
margin-right 10px;
@@ -341,6 +351,11 @@ const doResetPass = () => {
}
}
.pagination {
padding 20px 0
display flex
}
.el-select {
width: 100%
}