mirror of
				https://github.com/yangjian102621/geekai.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	add cache for getting user info and system configs
This commit is contained in:
		@@ -7,6 +7,8 @@
 | 
			
		||||
* 功能优化:更新数据库失败时候显示具体的的报错信息
 | 
			
		||||
* Bug修复:修复管理后台对话详情页内容显示异常问题
 | 
			
		||||
* 功能优化:管理后台新增清空所有未支付订单的功能
 | 
			
		||||
* 功能优化:给会话信息和系统配置数据加上缓存功能,减少 http 请求
 | 
			
		||||
* 功能新增:移除微信机器人收款功能,增加卡密功能,支持用户使用卡密兑换算力
 | 
			
		||||
 | 
			
		||||
## v4.1.1
 | 
			
		||||
* Bug修复:修复 GPT 模型 function call 调用后没有输出的问题
 | 
			
		||||
 
 | 
			
		||||
@@ -166,7 +166,8 @@ type SystemConfig struct {
 | 
			
		||||
	SdNegPrompt string `json:"sd_neg_prompt"` // SD 默认反向提示词
 | 
			
		||||
	MjMode      string `json:"mj_mode"`       // midjourney 默认的API模式,relax, fast, turbo
 | 
			
		||||
 | 
			
		||||
	IndexBgURL string `json:"index_bg_url"` // 前端首页背景图片
 | 
			
		||||
	IndexNavs  []int  `json:"index_navs"`   // 首页显示的导航菜单
 | 
			
		||||
	Copyright  string `json:"copyright"`    // 版权信息
 | 
			
		||||
	IndexBgURL  string `json:"index_bg_url"`  // 前端首页背景图片
 | 
			
		||||
	IndexNavs   []int  `json:"index_navs"`    // 首页显示的导航菜单
 | 
			
		||||
	Copyright   string `json:"copyright"`     // 版权信息
 | 
			
		||||
	MarkMapText string `json:"mark_map_text"` // 思维导入的默认文本
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
import {httpGet} from "@/utils/http";
 | 
			
		||||
 | 
			
		||||
export function checkSession() {
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        httpGet('/api/user/session').then(res => {
 | 
			
		||||
            resolve(res.data)
 | 
			
		||||
        }).catch(err => {
 | 
			
		||||
            reject(err)
 | 
			
		||||
        })
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function checkAdminSession() {
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        httpGet('/api/admin/session').then(res => {
 | 
			
		||||
            resolve(res)
 | 
			
		||||
        }).catch(err => {
 | 
			
		||||
            reject(err)
 | 
			
		||||
        })
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
import {ref} from "vue";
 | 
			
		||||
import {httpGet} from "@/utils/http";
 | 
			
		||||
import {showMessageError} from "@/utils/dialog";
 | 
			
		||||
import {getLicenseInfo, getSystemInfo} from "@/store/cache";
 | 
			
		||||
 | 
			
		||||
const title = ref("")
 | 
			
		||||
const version = ref(process.env.VUE_APP_VERSION)
 | 
			
		||||
@@ -30,14 +31,14 @@ const props = defineProps({
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// 获取系统配置
 | 
			
		||||
httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
getSystemInfo().then(res => {
 | 
			
		||||
  title.value = res.data.title??process.env.VUE_APP_TITLE
 | 
			
		||||
  copyRight.value = res.data.copyright.length>1?res.data.copyright:'极客学长 © 2023 - '+new Date().getFullYear()+' All rights reserved.'
 | 
			
		||||
}).catch(e => {
 | 
			
		||||
  showMessageError("获取系统配置失败:" + e.message)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
httpGet("/api/config/license").then(res => {
 | 
			
		||||
getLicenseInfo().then(res => {
 | 
			
		||||
  license.value = res.data
 | 
			
		||||
}).catch(e => {
 | 
			
		||||
  showMessageError("获取 License 失败:" + e.message)
 | 
			
		||||
 
 | 
			
		||||
@@ -221,14 +221,15 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script setup>
 | 
			
		||||
import {nextTick, onUnmounted, ref, watch} from "vue"
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {ref, watch} from "vue"
 | 
			
		||||
import {httpPost} from "@/utils/http";
 | 
			
		||||
import {ElMessage} from "element-plus";
 | 
			
		||||
import {setUserToken} from "@/store/session";
 | 
			
		||||
import {validateEmail, validateMobile} from "@/utils/validate";
 | 
			
		||||
import {Checked, Close, Iphone, Lock, Message} from "@element-plus/icons-vue";
 | 
			
		||||
import SendMsg from "@/components/SendMsg.vue";
 | 
			
		||||
import {arrayContains} from "@/utils/libs";
 | 
			
		||||
import {getSystemInfo} from "@/store/cache";
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line no-undef
 | 
			
		||||
const props = defineProps({
 | 
			
		||||
@@ -256,7 +257,7 @@ const wxImg = ref("/images/wx.png")
 | 
			
		||||
// eslint-disable-next-line no-undef
 | 
			
		||||
const emits = defineEmits(['hide', 'success']);
 | 
			
		||||
 | 
			
		||||
httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
getSystemInfo().then(res => {
 | 
			
		||||
  if (res.data) {
 | 
			
		||||
    const registerWays = res.data['register_ways']
 | 
			
		||||
    if (arrayContains(registerWays, "mobile")) {
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ import {ElMessage} from "element-plus";
 | 
			
		||||
import {Plus} from "@element-plus/icons-vue";
 | 
			
		||||
import Compressor from "compressorjs";
 | 
			
		||||
import {dateFormat} from "@/utils/libs";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession} from "@/store/cache";
 | 
			
		||||
 | 
			
		||||
const user = ref({
 | 
			
		||||
  vip: false,
 | 
			
		||||
 
 | 
			
		||||
@@ -56,8 +56,8 @@
 | 
			
		||||
<script setup>
 | 
			
		||||
 | 
			
		||||
import {onMounted, ref} from "vue";
 | 
			
		||||
import {httpGet} from "@/utils/http";
 | 
			
		||||
import {ElMessage} from "element-plus";
 | 
			
		||||
import {getSystemInfo} from "@/store/cache";
 | 
			
		||||
 | 
			
		||||
const title = ref(process.env.VUE_APP_TITLE)
 | 
			
		||||
const version = ref(process.env.VUE_APP_VERSION)
 | 
			
		||||
@@ -99,7 +99,7 @@ const capabilities = ref([
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    title.value = res.data.title
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
    ElMessage.error("获取系统配置失败:" + e.message)
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@
 | 
			
		||||
import {useTagsStore} from '@/store/tags';
 | 
			
		||||
import {onBeforeRouteUpdate, useRoute, useRouter} from 'vue-router';
 | 
			
		||||
import {ArrowDown, Close} from "@element-plus/icons-vue";
 | 
			
		||||
import {checkAdminSession} from "@/action/session";
 | 
			
		||||
import {checkAdminSession} from "@/store/cache";
 | 
			
		||||
import {ElMessageBox} from "element-plus";
 | 
			
		||||
import {computed} from "vue";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										90
									
								
								web/src/store/cache.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								web/src/store/cache.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
			
		||||
import {httpGet} from "@/utils/http";
 | 
			
		||||
import Storage from "good-storage";
 | 
			
		||||
import {showMessageError} from "@/utils/dialog";
 | 
			
		||||
 | 
			
		||||
const userDataKey = "USER_INFO_CACHE_KEY"
 | 
			
		||||
const adminDataKey = "ADMIN_INFO_CACHE_KEY"
 | 
			
		||||
const systemInfoKey = "SYSTEM_INFO_CACHE_KEY"
 | 
			
		||||
const licenseInfoKey = "LICENSE_INFO_CACHE_KEY"
 | 
			
		||||
export function checkSession() {
 | 
			
		||||
    const item = Storage.get(userDataKey) ?? {expire:0, data:null}
 | 
			
		||||
    if (item.expire > Date.now()) {
 | 
			
		||||
        return Promise.resolve(item.data)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        httpGet('/api/user/session').then(res => {
 | 
			
		||||
            item.data = res.data
 | 
			
		||||
            // cache expires after 5 minutes
 | 
			
		||||
            item.expire = Date.now() + 1000 * 60 * 5
 | 
			
		||||
            Storage.set(userDataKey, item)
 | 
			
		||||
            resolve(item.data)
 | 
			
		||||
        }).catch(err => {
 | 
			
		||||
            Storage.remove(userDataKey)
 | 
			
		||||
            reject(err)
 | 
			
		||||
        })
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function removeUserInfo() {
 | 
			
		||||
    Storage.remove(userDataKey)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function checkAdminSession() {
 | 
			
		||||
    const item = Storage.get(adminDataKey) ?? {expire:0, data:null}
 | 
			
		||||
    if (item.expire > Date.now()) {
 | 
			
		||||
        return Promise.resolve(item.data)
 | 
			
		||||
    }
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        httpGet('/api/admin/session').then(res => {
 | 
			
		||||
            item.data = res.data
 | 
			
		||||
            // cache expires after 10 minutes
 | 
			
		||||
            item.expire = Date.now() + 1000 * 60 * 10
 | 
			
		||||
            Storage.set(adminDataKey, item)
 | 
			
		||||
            resolve(item.data)
 | 
			
		||||
        }).catch(err => {
 | 
			
		||||
            reject(err)
 | 
			
		||||
        })
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function removeAdminInfo() {
 | 
			
		||||
    Storage.remove(adminDataKey)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function getSystemInfo() {
 | 
			
		||||
    const item = Storage.get(systemInfoKey) ?? {expire:0, data:null}
 | 
			
		||||
    if (item.expire > Date.now()) {
 | 
			
		||||
        return Promise.resolve(item.data)
 | 
			
		||||
    }
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        httpGet('/api/config/get?key=system').then(res => {
 | 
			
		||||
            item.data = res
 | 
			
		||||
            // cache expires after 10 minutes
 | 
			
		||||
            item.expire = Date.now() + 1000 * 60 * 10
 | 
			
		||||
            Storage.set(systemInfoKey, item)
 | 
			
		||||
            resolve(item.data)
 | 
			
		||||
        }).catch(err => {
 | 
			
		||||
            reject(err)
 | 
			
		||||
        })
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function getLicenseInfo() {
 | 
			
		||||
    const item = Storage.get(licenseInfoKey) ?? {expire:0, data:null}
 | 
			
		||||
    if (item.expire > Date.now()) {
 | 
			
		||||
        return Promise.resolve(item.data)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        httpGet('/api/config/license').then(res => {
 | 
			
		||||
            item.data = res
 | 
			
		||||
            // cache expires after 10 minutes
 | 
			
		||||
            item.expire = Date.now() + 1000 * 60 * 60
 | 
			
		||||
            Storage.set(licenseInfoKey, item)
 | 
			
		||||
            resolve(item.data)
 | 
			
		||||
        }).catch(err => {
 | 
			
		||||
            reject(err)
 | 
			
		||||
        })
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
import Storage from 'good-storage'
 | 
			
		||||
 | 
			
		||||
const CHAT_CONFIG_KEY = process.env.VUE_APP_KEY_PREFIX + "chat_config"
 | 
			
		||||
 | 
			
		||||
export function getChatConfig() {
 | 
			
		||||
    return Storage.get(CHAT_CONFIG_KEY)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function setChatConfig(chatConfig) {
 | 
			
		||||
    Storage.set(CHAT_CONFIG_KEY, chatConfig)
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
import {randString} from "@/utils/libs";
 | 
			
		||||
import Storage from "good-storage";
 | 
			
		||||
import {removeAdminInfo, removeUserInfo} from "@/store/cache";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * storage handler
 | 
			
		||||
@@ -22,6 +23,7 @@ export function setUserToken(token) {
 | 
			
		||||
 | 
			
		||||
export function removeUserToken() {
 | 
			
		||||
    Storage.remove(UserTokenKey)
 | 
			
		||||
    removeUserInfo()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function getAdminToken() {
 | 
			
		||||
@@ -34,4 +36,5 @@ export function setAdminToken(token) {
 | 
			
		||||
 | 
			
		||||
export function removeAdminToken() {
 | 
			
		||||
    Storage.remove(AdminTokenKey)
 | 
			
		||||
    removeAdminInfo()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,6 @@ axios.interceptors.response.use(
 | 
			
		||||
            } else {
 | 
			
		||||
                removeUserToken()
 | 
			
		||||
            }
 | 
			
		||||
            console.log(error.response.data)
 | 
			
		||||
            error.response.data.message = "请先登录"
 | 
			
		||||
            return Promise.reject(error.response.data)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -59,7 +59,7 @@
 | 
			
		||||
import {onMounted, ref} from "vue"
 | 
			
		||||
import {ElMessage} from "element-plus";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession} from "@/store/cache";
 | 
			
		||||
import {arrayContains, removeArrayItem, substr} from "@/utils/libs";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import {useSharedStore} from "@/store/sharedata";
 | 
			
		||||
 
 | 
			
		||||
@@ -213,7 +213,7 @@ import {getSessionId, getUserToken, removeUserToken} from "@/store/session";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import Welcome from "@/components/Welcome.vue";
 | 
			
		||||
import {useSharedStore} from "@/store/sharedata";
 | 
			
		||||
import FileSelect from "@/components/FileSelect.vue";
 | 
			
		||||
@@ -221,6 +221,7 @@ import FileList from "@/components/FileList.vue";
 | 
			
		||||
import ChatSetting from "@/components/ChatSetting.vue";
 | 
			
		||||
import BackTop from "@/components/BackTop.vue";
 | 
			
		||||
import {showMessageError} from "@/utils/dialog";
 | 
			
		||||
import hl from "highlight.js";
 | 
			
		||||
 | 
			
		||||
const title = ref('ChatGPT-智能助手');
 | 
			
		||||
const models = ref([])
 | 
			
		||||
@@ -259,12 +260,18 @@ if (isMobile()) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 获取系统配置
 | 
			
		||||
httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
getSystemInfo().then(res => {
 | 
			
		||||
  title.value = res.data.title
 | 
			
		||||
}).catch(e => {
 | 
			
		||||
  ElMessage.error("获取系统配置失败:" + e.message)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const md = require('markdown-it')({
 | 
			
		||||
  breaks: true,
 | 
			
		||||
  html: true,
 | 
			
		||||
  linkify: true,
 | 
			
		||||
  typographer: true
 | 
			
		||||
});
 | 
			
		||||
// 获取系统公告
 | 
			
		||||
httpGet("/api/config/get?key=notice").then(res => {
 | 
			
		||||
  try {
 | 
			
		||||
 
 | 
			
		||||
@@ -208,7 +208,7 @@ import {Delete, InfoFilled, Picture} from "@element-plus/icons-vue";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {ElMessage, ElMessageBox, ElNotification} from "element-plus";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {useSharedStore} from "@/store/sharedata";
 | 
			
		||||
import TaskList from "@/components/TaskList.vue";
 | 
			
		||||
import BackTop from "@/components/BackTop.vue";
 | 
			
		||||
@@ -263,7 +263,7 @@ onMounted(() => {
 | 
			
		||||
    ElMessage.error('复制失败!');
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    dallPower.value = res.data["dall_power"]
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
    ElMessage.error("获取系统配置失败:" + e.message)
 | 
			
		||||
 
 | 
			
		||||
@@ -138,7 +138,7 @@ import {onMounted, ref, watch} from "vue";
 | 
			
		||||
import {httpGet} from "@/utils/http";
 | 
			
		||||
import {ElMessage} from "element-plus";
 | 
			
		||||
import {UserFilled} from "@element-plus/icons-vue";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getLicenseInfo, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {removeUserToken} from "@/store/session";
 | 
			
		||||
import LoginDialog from "@/components/LoginDialog.vue";
 | 
			
		||||
import {useSharedStore} from "@/store/sharedata";
 | 
			
		||||
@@ -185,7 +185,7 @@ const changeNav = (item) => {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    logo.value = res.data.logo
 | 
			
		||||
    title.value = res.data.title
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
@@ -204,7 +204,7 @@ onMounted(() => {
 | 
			
		||||
    ElMessage.error("获取系统菜单失败:" + e.message)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  httpGet("/api/config/license").then(res => {
 | 
			
		||||
  getLicenseInfo().then(res => {
 | 
			
		||||
    license.value = res.data
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
    license.value = {de_copy: false}
 | 
			
		||||
 
 | 
			
		||||
@@ -608,7 +608,7 @@ import Compressor from "compressorjs";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {ElMessage, ElMessageBox, ElNotification} from "element-plus";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import {getSessionId} from "@/store/session";
 | 
			
		||||
import {copyObj, removeArrayItem} from "@/utils/libs";
 | 
			
		||||
@@ -802,7 +802,7 @@ const initData = () => {
 | 
			
		||||
 | 
			
		||||
const mjPower = ref(1)
 | 
			
		||||
const mjActionPower = ref(1)
 | 
			
		||||
httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
getSystemInfo().then(res => {
 | 
			
		||||
  mjPower.value = res.data["mj_power"]
 | 
			
		||||
  mjActionPower.value = res.data["mj_action_power"]
 | 
			
		||||
}).catch(e => {
 | 
			
		||||
 
 | 
			
		||||
@@ -491,7 +491,7 @@ import {Delete, DocumentCopy, InfoFilled, Orange, Picture} from "@element-plus/i
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {ElMessage, ElMessageBox, ElNotification} from "element-plus";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import {getSessionId} from "@/store/session";
 | 
			
		||||
import {useSharedStore} from "@/store/sharedata";
 | 
			
		||||
@@ -600,7 +600,7 @@ onMounted(() => {
 | 
			
		||||
    ElMessage.error('复制失败!');
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    sdPower.value = res.data.sd_power
 | 
			
		||||
    params.value.neg_prompt = res.data.sd_neg_prompt
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ import FooterBar from "@/components/FooterBar.vue";
 | 
			
		||||
import {httpGet} from "@/utils/http";
 | 
			
		||||
import {ElMessage} from "element-plus";
 | 
			
		||||
import {isMobile} from "@/utils/libs";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getLicenseInfo, getSystemInfo} from "@/store/cache";
 | 
			
		||||
 | 
			
		||||
const router = useRouter()
 | 
			
		||||
 | 
			
		||||
@@ -131,7 +131,7 @@ const color = btnColors.value[Math.floor(Math.random() * btnColors.value.length)
 | 
			
		||||
const theme = ref({bgColor: "#ffffff", btnBgColor: color.bgColor, btnTextColor: color.textColor, textColor: "#ffffff", imageBg:true})
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    title.value = res.data.title
 | 
			
		||||
    logo.value = res.data.logo
 | 
			
		||||
    if (res.data.index_bg_url === 'color') {
 | 
			
		||||
@@ -155,7 +155,7 @@ onMounted(() => {
 | 
			
		||||
    ElMessage.error("获取系统配置失败:" + e.message)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  httpGet("/api/config/license").then(res => {
 | 
			
		||||
  getLicenseInfo().then(res => {
 | 
			
		||||
    license.value = res.data
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
    license.value = {de_copy: false}
 | 
			
		||||
 
 | 
			
		||||
@@ -93,7 +93,7 @@ import {httpGet} from "@/utils/http";
 | 
			
		||||
import {ElMessage} from "element-plus";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import InviteList from "@/components/InviteList.vue";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {useSharedStore} from "@/store/sharedata";
 | 
			
		||||
 | 
			
		||||
const inviteURL = ref("")
 | 
			
		||||
@@ -141,7 +141,7 @@ const initData = () => {
 | 
			
		||||
      ElMessage.error("获取邀请码失败:" + e.message)
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
    getSystemInfo().then(res => {
 | 
			
		||||
      invitePower.value = res.data["invite_power"]
 | 
			
		||||
    }).catch(e => {
 | 
			
		||||
      ElMessage.error("获取系统配置失败:" + e.message)
 | 
			
		||||
 
 | 
			
		||||
@@ -69,7 +69,7 @@ import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import FooterBar from "@/components/FooterBar.vue";
 | 
			
		||||
import {isMobile} from "@/utils/libs";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getLicenseInfo, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {setUserToken} from "@/store/session";
 | 
			
		||||
import ResetPass from "@/components/ResetPass.vue";
 | 
			
		||||
import {showMessageError} from "@/utils/dialog";
 | 
			
		||||
@@ -85,14 +85,14 @@ const wechatLoginURL = ref('')
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  // 获取系统配置
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    logo.value = res.data.logo
 | 
			
		||||
    title.value = res.data.title
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
    showMessageError("获取系统配置失败:" + e.message)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  httpGet("/api/config/license").then(res => {
 | 
			
		||||
  getLicenseInfo().then(res => {
 | 
			
		||||
    licenseConfig.value = res.data
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
    showMessageError("获取 License 配置:" + e.message)
 | 
			
		||||
 
 | 
			
		||||
@@ -94,10 +94,10 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script setup>
 | 
			
		||||
import {nextTick, onMounted, onUnmounted, ref} from 'vue';
 | 
			
		||||
import {nextTick, onUnmounted, ref} from 'vue';
 | 
			
		||||
import {Markmap} from 'markmap-view';
 | 
			
		||||
import {Transformer} from 'markmap-lib';
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {httpGet} from "@/utils/http";
 | 
			
		||||
import {ElMessage} from "element-plus";
 | 
			
		||||
import {Download} from "@element-plus/icons-vue";
 | 
			
		||||
@@ -126,29 +126,20 @@ const models = ref([])
 | 
			
		||||
const modelID = ref(0)
 | 
			
		||||
const loading = ref(false)
 | 
			
		||||
 | 
			
		||||
httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  title.value = res.data.title??process.env.VUE_APP_TITLE
 | 
			
		||||
  text.value = `# ${title.value}
 | 
			
		||||
 | 
			
		||||
- 完整的开源系统,前端应用和后台管理系统皆可开箱即用。
 | 
			
		||||
- 基于 Websocket 实现,完美的打字机体验。
 | 
			
		||||
- 内置了各种预训练好的角色应用,轻松满足你的各种聊天和应用需求。
 | 
			
		||||
- 支持 OPenAI,Azure,文心一言,讯飞星火,清华 ChatGLM等多个大语言模型。
 | 
			
		||||
- 支持 MidJourney / Stable Diffusion AI 绘画集成,开箱即用。
 | 
			
		||||
- 支持使用个人微信二维码作为充值收费的支付渠道,无需企业支付通道。
 | 
			
		||||
- 已集成支付宝支付功能,微信支付,支持多种会员套餐和点卡购买功能。
 | 
			
		||||
- 集成插件 API 功能,可结合大语言模型的 function 功能开发各种强大的插件。
 | 
			
		||||
`
 | 
			
		||||
getSystemInfo().then(res => {
 | 
			
		||||
  text.value = res.data['mark_map_text']
 | 
			
		||||
  content.value = text.value
 | 
			
		||||
  initData()
 | 
			
		||||
  try {
 | 
			
		||||
    markMap.value = Markmap.create(svgRef.value)
 | 
			
		||||
    const {el} = Toolbar.create(markMap.value);
 | 
			
		||||
    document.getElementById('toolbar').append(el);
 | 
			
		||||
    update()
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    console.error(e)
 | 
			
		||||
  }
 | 
			
		||||
  nextTick(() => {
 | 
			
		||||
    try {
 | 
			
		||||
      markMap.value = Markmap.create(svgRef.value)
 | 
			
		||||
      const {el} = Toolbar.create(markMap.value);
 | 
			
		||||
      document.getElementById('toolbar').append(el);
 | 
			
		||||
      update()
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      console.error(e)
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
}).catch(e => {
 | 
			
		||||
  ElMessage.error("获取系统配置失败:" + e.message)
 | 
			
		||||
})
 | 
			
		||||
@@ -184,6 +175,10 @@ const update = () => {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const processContent = (text) => {
 | 
			
		||||
  if (!text) {
 | 
			
		||||
    return text
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const arr = []
 | 
			
		||||
  const lines = text.split("\n")
 | 
			
		||||
  for (let line of lines) {
 | 
			
		||||
 
 | 
			
		||||
@@ -160,7 +160,7 @@ import {ElMessage} from "element-plus";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import ItemList from "@/components/ItemList.vue";
 | 
			
		||||
import {InfoFilled, SuccessFilled} from "@element-plus/icons-vue";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import UserProfile from "@/components/UserProfile.vue";
 | 
			
		||||
import PasswordDialog from "@/components/PasswordDialog.vue";
 | 
			
		||||
import BindMobile from "@/components/ResetAccount.vue";
 | 
			
		||||
@@ -216,7 +216,7 @@ onMounted(() => {
 | 
			
		||||
    ElMessage.error("获取产品套餐失败:" + e.message)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    rewardImg.value = res.data['reward_img']
 | 
			
		||||
    enableReward.value = res.data['enabled_reward']
 | 
			
		||||
    orderPayInfoText.value = res.data['order_pay_info_text']
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@ import {Search} from "@element-plus/icons-vue";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import {ElMessage} from "element-plus";
 | 
			
		||||
import {httpPost} from "@/utils/http";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession} from "@/store/cache";
 | 
			
		||||
 | 
			
		||||
const items = ref([])
 | 
			
		||||
const total = ref(0)
 | 
			
		||||
 
 | 
			
		||||
@@ -181,6 +181,7 @@ import {arrayContains} from "@/utils/libs";
 | 
			
		||||
import {setUserToken} from "@/store/session";
 | 
			
		||||
import {validateEmail, validateMobile} from "@/utils/validate";
 | 
			
		||||
import {showMessageError, showMessageOK} from "@/utils/dialog";
 | 
			
		||||
import {getLicenseInfo, getSystemInfo} from "@/store/cache";
 | 
			
		||||
 | 
			
		||||
const router = useRouter();
 | 
			
		||||
const title = ref('');
 | 
			
		||||
@@ -201,7 +202,7 @@ const activeName = ref("mobile")
 | 
			
		||||
const wxImg = ref("/images/wx.png")
 | 
			
		||||
const licenseConfig = ref({})
 | 
			
		||||
 | 
			
		||||
httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
getSystemInfo().then(res => {
 | 
			
		||||
  if (res.data) {
 | 
			
		||||
    title.value = res.data.title
 | 
			
		||||
    logo.value = res.data.logo
 | 
			
		||||
@@ -226,7 +227,7 @@ httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  ElMessage.error("获取系统配置失败:" + e.message)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
httpGet("/api/config/license").then(res => {
 | 
			
		||||
getLicenseInfo().then(res => {
 | 
			
		||||
  licenseConfig.value = res.data
 | 
			
		||||
}).catch(e => {
 | 
			
		||||
  showMessageError("获取 License 配置:" + e.message)
 | 
			
		||||
 
 | 
			
		||||
@@ -277,7 +277,7 @@ import {compact} from "lodash";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {showMessageError, showMessageOK} from "@/utils/dialog";
 | 
			
		||||
import Generating from "@/components/ui/Generating.vue";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession} from "@/store/cache";
 | 
			
		||||
import {ElMessage, ElMessageBox} from "element-plus";
 | 
			
		||||
import {formatTime} from "@/utils/libs";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ import AdminHeader from "@/components/admin/AdminHeader.vue";
 | 
			
		||||
import AdminSidebar from "@/components/admin/AdminSidebar.vue";
 | 
			
		||||
import AdminTags from "@/components/admin/AdminTags.vue";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import {checkAdminSession} from "@/action/session";
 | 
			
		||||
import {checkAdminSession} from "@/store/cache";
 | 
			
		||||
import {ref} from "vue";
 | 
			
		||||
import {getAdminTheme, setAdminTheme} from "@/store/system";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -53,7 +53,7 @@ import {ElMessage} from "element-plus";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import FooterBar from "@/components/FooterBar.vue";
 | 
			
		||||
import {setAdminToken} from "@/store/session";
 | 
			
		||||
import {checkAdminSession} from "@/action/session";
 | 
			
		||||
import {checkAdminSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
 | 
			
		||||
const router = useRouter();
 | 
			
		||||
const title = ref('Geek-AI Console');
 | 
			
		||||
@@ -67,7 +67,7 @@ checkAdminSession().then(() => {
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
// 加载系统配置
 | 
			
		||||
httpGet('/api/config/get?key=system').then(res => {
 | 
			
		||||
getSystemInfo().then(res => {
 | 
			
		||||
  title.value = res.data.admin_title
 | 
			
		||||
  logo.value = res.data.logo
 | 
			
		||||
}).catch(e => {
 | 
			
		||||
 
 | 
			
		||||
@@ -363,7 +363,14 @@
 | 
			
		||||
          </div>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      </el-tab-pane>
 | 
			
		||||
 | 
			
		||||
      <el-tab-pane label="思维导图" name="mark_map">
 | 
			
		||||
        <md-editor class="mgb20" v-model="system['mark_map_text']" @on-upload-img="onUploadImg"/>
 | 
			
		||||
        <el-form-item>
 | 
			
		||||
          <div style="padding-top: 10px;margin-left: 150px;">
 | 
			
		||||
            <el-button type="primary" @click="save('system')">保存</el-button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </el-form-item>
 | 
			
		||||
      </el-tab-pane>
 | 
			
		||||
      <el-tab-pane label="菜单配置" name="menu">
 | 
			
		||||
        <Menu/>
 | 
			
		||||
      </el-tab-pane>
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,7 @@
 | 
			
		||||
import {ref} from "vue";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {showConfirmDialog, showFailToast, showSuccessToast} from "vant";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession} from "@/store/cache";
 | 
			
		||||
import {router} from "@/router";
 | 
			
		||||
import {removeArrayItem, showLoginDialog} from "@/utils/libs";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -132,7 +132,7 @@ import 'highlight.js/styles/a11y-dark.css'
 | 
			
		||||
import ChatPrompt from "@/components/mobile/ChatPrompt.vue";
 | 
			
		||||
import ChatReply from "@/components/mobile/ChatReply.vue";
 | 
			
		||||
import {getSessionId, getUserToken} from "@/store/session";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession} from "@/store/cache";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import {showLoginDialog} from "@/utils/dialog";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -76,7 +76,7 @@
 | 
			
		||||
<script setup>
 | 
			
		||||
import {onMounted, ref} from "vue";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import {arrayContains, removeArrayItem, showLoginDialog, substr} from "@/utils/libs";
 | 
			
		||||
import {showNotify} from "vant";
 | 
			
		||||
@@ -91,7 +91,7 @@ const roles = ref([])
 | 
			
		||||
const slogan = ref('你有多大想象力,AI就有多大创造力!')
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    title.value = res.data.title
 | 
			
		||||
    if (res.data.slogan) {
 | 
			
		||||
      slogan.value = res.data.slogan
 | 
			
		||||
 
 | 
			
		||||
@@ -160,7 +160,7 @@ import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import Compressor from 'compressorjs';
 | 
			
		||||
import {dateFormat, isWeChatBrowser, showLoginDialog} from "@/utils/libs";
 | 
			
		||||
import {ElMessage} from "element-plus";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession} from "@/store/cache";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import {removeUserToken} from "@/store/session";
 | 
			
		||||
import bus from '@/store/eventbus'
 | 
			
		||||
@@ -210,7 +210,7 @@ onMounted(() => {
 | 
			
		||||
    showFailToast("获取产品套餐失败:" + e.message)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    vipMonthPower.value = res.data['vip_month_power']
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
    showFailToast("获取系统配置失败:" + e.message)
 | 
			
		||||
 
 | 
			
		||||
@@ -165,7 +165,7 @@ import {onMounted, onUnmounted, ref} from "vue"
 | 
			
		||||
import {Delete} from "@element-plus/icons-vue";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession} from "@/store/cache";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import {getSessionId} from "@/store/session";
 | 
			
		||||
import {
 | 
			
		||||
@@ -286,7 +286,7 @@ onMounted(() => {
 | 
			
		||||
    showNotify({type: 'danger', message: '复制失败', duration: 2000})
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    dallPower.value = res.data.dall_power
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
    showNotify({type: "danger", message: "获取系统配置失败:" + e.message})
 | 
			
		||||
 
 | 
			
		||||
@@ -280,7 +280,7 @@ import {showConfirmDialog, showFailToast, showImagePreview, showNotify, showSucc
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import Compressor from "compressorjs";
 | 
			
		||||
import {getSessionId} from "@/store/session";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import {Delete} from "@element-plus/icons-vue";
 | 
			
		||||
import {showLoginDialog} from "@/utils/libs";
 | 
			
		||||
@@ -366,7 +366,7 @@ onUnmounted(() => {
 | 
			
		||||
 | 
			
		||||
const mjPower = ref(1)
 | 
			
		||||
const mjActionPower = ref(1)
 | 
			
		||||
httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
getSystemInfo().then(res => {
 | 
			
		||||
  mjPower.value = res.data["mj_power"]
 | 
			
		||||
  mjActionPower.value = res.data["mj_action_power"]
 | 
			
		||||
}).catch(e => {
 | 
			
		||||
 
 | 
			
		||||
@@ -217,7 +217,7 @@ import {onMounted, onUnmounted, ref} from "vue"
 | 
			
		||||
import {Delete} from "@element-plus/icons-vue";
 | 
			
		||||
import {httpGet, httpPost} from "@/utils/http";
 | 
			
		||||
import Clipboard from "clipboard";
 | 
			
		||||
import {checkSession} from "@/action/session";
 | 
			
		||||
import {checkSession, getSystemInfo} from "@/store/cache";
 | 
			
		||||
import {useRouter} from "vue-router";
 | 
			
		||||
import {getSessionId} from "@/store/session";
 | 
			
		||||
import {
 | 
			
		||||
@@ -349,7 +349,7 @@ onMounted(() => {
 | 
			
		||||
    showNotify({type: 'danger', message: '复制失败', duration: 2000})
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  httpGet("/api/config/get?key=system").then(res => {
 | 
			
		||||
  getSystemInfo().then(res => {
 | 
			
		||||
    sdPower.value = res.data.sd_power
 | 
			
		||||
    params.value.neg_prompt = res.data.sd_neg_prompt
 | 
			
		||||
  }).catch(e => {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user