docs: add dashboard image

This commit is contained in:
RockYang 2023-08-07 20:07:05 +08:00
parent da806b9492
commit c1155a4338
6 changed files with 14 additions and 12 deletions

View File

@ -30,6 +30,8 @@
### 管理后台 ### 管理后台
![ChatGPT admin](docs/imgs/admin_dashboard.png)
![ChatGPT admin](docs/imgs/admin_config.png) ![ChatGPT admin](docs/imgs/admin_config.png)
![ChatGPT admin](docs/imgs/admin_user.png) ![ChatGPT admin](docs/imgs/admin_user.png)
@ -100,7 +102,8 @@ ChatGPT 的服务。
## Docker 快速部署 ## Docker 快速部署
> 鉴于最新不少网友反馈在部署的时候遇到一些问题,大部分问题都是相同的,所以我这边做了一个视频教程 [五分钟部署自己的 ChatGPT 服务](https://www.bilibili.com/video/BV1H14y1B7Qw/)。 >
鉴于最新不少网友反馈在部署的时候遇到一些问题,大部分问题都是相同的,所以我这边做了一个视频教程 [五分钟部署自己的 ChatGPT 服务](https://www.bilibili.com/video/BV1H14y1B7Qw/)。
> 习惯看视频教程的朋友可以去看视频教程,视频的语速比较慢,建议 2 倍速观看。 > 习惯看视频教程的朋友可以去看视频教程,视频的语速比较慢,建议 2 倍速观看。
V3.0.0 版本以后已经支持使用容器部署了,跳过所有的繁琐的环境准备,一条命令就可以轻松部署上线。 V3.0.0 版本以后已经支持使用容器部署了,跳过所有的繁琐的环境准备,一条命令就可以轻松部署上线。

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="dashboard"> <div class="dashboard" v-loading="loading">
<el-row class="mgb20" :gutter="20"> <el-row class="mgb20" :gutter="20">
<el-col :span="6"> <el-col :span="6">
<el-card shadow="hover" :body-style="{ padding: '0px' }"> <el-card shadow="hover" :body-style="{ padding: '0px' }">
@ -64,12 +64,14 @@ import {httpGet} from "@/utils/http";
import {ElMessage} from "element-plus"; import {ElMessage} from "element-plus";
const stats = ref({users: 0, chats: 0, tokens: 0, rewards: 0}) const stats = ref({users: 0, chats: 0, tokens: 0, rewards: 0})
const loading = ref(true)
httpGet('/api/admin/dashboard/stats').then((res) => { httpGet('/api/admin/dashboard/stats').then((res) => {
stats.value.users = res.data.users stats.value.users = res.data.users
stats.value.chats = res.data.chats stats.value.chats = res.data.chats
stats.value.tokens = res.data.tokens stats.value.tokens = res.data.tokens
stats.value.rewards = res.data.rewards stats.value.rewards = res.data.rewards
loading.value = false
}).catch((e) => { }).catch((e) => {
ElMessage.error("获取统计数据失败:" + e.message) ElMessage.error("获取统计数据失败:" + e.message)
}) })

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="container role-list"> <div class="container role-list" v-loading="loading">
<div class="handle-box"> <div class="handle-box">
<el-button type="primary" :icon="Plus" @click="addRole">新增</el-button> <el-button type="primary" :icon="Plus" @click="addRole">新增</el-button>
</div> </div>
@ -158,6 +158,7 @@ const sortedTableData = ref([])
const role = ref({context: []}) const role = ref({context: []})
const formRef = ref(null) const formRef = ref(null)
const editRow = ref({}) const editRow = ref({})
const loading = ref(true)
const rules = reactive({ const rules = reactive({
name: [{required: true, message: '请输入用户名', trigger: 'blur',}], name: [{required: true, message: '请输入用户名', trigger: 'blur',}],
@ -174,6 +175,7 @@ const rules = reactive({
httpGet('/api/admin/role/list').then((res) => { httpGet('/api/admin/role/list').then((res) => {
tableData.value = res.data tableData.value = res.data
sortedTableData.value = copyObj(tableData.value) sortedTableData.value = copyObj(tableData.value)
loading.value = false
}).catch(() => { }).catch(() => {
ElMessage.error("获取聊天角色失败"); ElMessage.error("获取聊天角色失败");
}) })

View File

@ -88,7 +88,7 @@
</template> </template>
<script setup> <script setup>
import {nextTick, onMounted, reactive, ref} from "vue"; import {onMounted, reactive, ref} from "vue";
import {httpGet, httpPost} from "@/utils/http"; import {httpGet, httpPost} from "@/utils/http";
import {ElMessage, ElMessageBox} from "element-plus"; import {ElMessage, ElMessageBox} from "element-plus";
import {Plus} from "@element-plus/icons-vue"; import {Plus} from "@element-plus/icons-vue";
@ -118,13 +118,11 @@ onMounted(() => {
// //
httpGet('/api/admin/config/get?key=chat').then(res => { httpGet('/api/admin/config/get?key=chat').then(res => {
chat.value = res.data chat.value = res.data
loading.value = false
}).catch(e => { }).catch(e => {
ElMessage.error("加载聊天配置失败: " + e.message) ElMessage.error("加载聊天配置失败: " + e.message)
}) })
nextTick(() => {
loading.value = false
})
}) })
const rules = reactive({ const rules = reactive({

View File

@ -149,7 +149,7 @@
</template> </template>
<script setup> <script setup>
import {nextTick, onMounted, reactive, ref} from "vue"; import {onMounted, reactive, ref} from "vue";
import {httpGet, httpPost} from "@/utils/http"; import {httpGet, httpPost} from "@/utils/http";
import {ElMessage, ElMessageBox} from "element-plus"; import {ElMessage, ElMessageBox} from "element-plus";
import {dateFormat, disabledDate, removeArrayItem} from "@/utils/libs"; import {dateFormat, disabledDate, removeArrayItem} from "@/utils/libs";
@ -189,10 +189,6 @@ onMounted(() => {
}).catch(() => { }).catch(() => {
ElMessage.error("获取聊天角色失败"); ElMessage.error("获取聊天角色失败");
}) })
nextTick(() => {
loading.value = false
})
}) })
const fetchUserList = function (page, pageSize) { const fetchUserList = function (page, pageSize) {
@ -210,6 +206,7 @@ const fetchUserList = function (page, pageSize) {
users.value.page = res.data.page users.value.page = res.data.page
user.value.page_size = res.data.page_size user.value.page_size = res.data.page_size
} }
loading.value = false
}).catch(() => { }).catch(() => {
ElMessage.error('加载用户列表失败') ElMessage.error('加载用户列表失败')
}) })