diff --git a/components.d.ts b/components.d.ts index 38d81e3..a856585 100644 --- a/components.d.ts +++ b/components.d.ts @@ -8,6 +8,7 @@ export {} declare module '@vue/runtime-core' { export interface GlobalComponents { Countup: typeof import('./src/components/countup.vue')['default'] + ElAlert: typeof import('element-plus/es')['ElAlert'] ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElButton: typeof import('element-plus/es')['ElButton'] ElCalendar: typeof import('element-plus/es')['ElCalendar'] diff --git a/src/api/user.ts b/src/api/user.ts index 1ec02e7..3935434 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -114,6 +114,19 @@ export const AdminDeleteUserRequestService = (Data) => { }) } +export const GetUserTokenService = (Data) => { + const params = new URLSearchParams(); + for (let key in Data) { + params.append(key, Data[key]) + } + let token = localStorage.getItem("token") || ""; + return request.post('/user/gen_user_token', params,{ + headers: { + 'token': token, + } + }) +} + export const UpdateUserCatalogueService = (Data) => { const params = new URLSearchParams(); diff --git a/src/components/menu.ts b/src/components/menu.ts index 5ebfc5e..ea4dbaf 100644 --- a/src/components/menu.ts +++ b/src/components/menu.ts @@ -97,12 +97,6 @@ export const menuData: Menus[] = [ index: '/vpn-tunnel', title: '隧道配置', }, - { - id: '754', - pid: '75', - index: '/vpn-client', - title: 'VPN客户端UI', - } ], }, { @@ -270,6 +264,12 @@ export const menuData: Menus[] = [ index: '/gen-prompt', title: '提示词生成', }, + { + id: '754', + icon: 'Connection', + index: '/vpn-client', + title: 'VPN客户端UI', + }, // { // id: '57', // icon: 'ChatDotSquare', diff --git a/src/store/permiss.ts b/src/store/permiss.ts index f47dea1..3f25481 100644 --- a/src/store/permiss.ts +++ b/src/store/permiss.ts @@ -66,7 +66,7 @@ export const usePermissStore = defineStore("permiss", { "753", //VPN隧道管理 "754", //VPN客户端UI ], - user: ["0", "8", "7", "9", "51" ,"53","55" ,"56", "57", "58", "59", "61", "71", "75", "754"], + user: ["0", "8", "7", "9", "51" ,"53","55" ,"56", "57", "58", "59", "61", "71", "754"], }, }; }, diff --git a/src/views/system/user.vue b/src/views/system/user.vue index 7ea40dc..c7988ca 100644 --- a/src/views/system/user.vue +++ b/src/views/system/user.vue @@ -74,6 +74,9 @@ 添加用户组 + + 获取token + + + + + + + + + + + 秒 (默认3600秒) + + + + 秒 (默认86400秒) + + + + 获取Token + + + + + 获取结果 + + + + 复制 + + + + 复制 + + + + + + + + + @@ -99,7 +155,7 @@ import { ElMessage } from 'element-plus'; import { CirclePlusFilled } from '@element-plus/icons-vue'; import { UserInfo } from '@/types/user'; import { fetchUserData } from '@/api'; -import { SearchUserService,AdminAddUserRequestService,UpdateUserCatalogueService,AdminDeleteUserRequestService,AdminAddUserGroupRequestService } from "@/api/user"; +import { SearchUserService,AdminAddUserRequestService,UpdateUserCatalogueService,AdminDeleteUserRequestService,AdminAddUserGroupRequestService,GetUserTokenService } from "@/api/user"; import {GetUserInfoService} from "@/api/user"; import {updateUserInfoService} from "@/api/user"; import TableCustom from '@/components/table-custom.vue'; @@ -131,11 +187,77 @@ const query = reactive({ name: '', }); +const getTokenVisible = ref(false); + +const getTokenParams = ref({ + "expire_in": 3600, + "refresh_expire_in": 86400, + "user_id": 0, +}) + +const tokenLoading = ref(false) +const tokenResult = ref(null) +const tokenError = ref('') + +const getTokenCode = async () => { + tokenLoading.value = true + tokenError.value = '' + tokenResult.value = null + + try { + const response = await GetUserTokenService({ + user_id: getTokenParams.value.user_id, + expire_in: getTokenParams.value.expire_in, + refresh_expire_in: getTokenParams.value.refresh_expire_in + }) + + if (response["code"] === 0) { + tokenResult.value = response.data + ElMessage.success('获取Token成功') + } else { + tokenError.value = '获取失败: ' + response["message"] + ElMessage.error(tokenError.value) + } + } catch (error) { + console.error('获取Token失败:', error) + tokenError.value = '获取Token失败: ' + error.message + ElMessage.error(tokenError.value) + } finally { + tokenLoading.value = false + } +} + +const copyToClipboard = async (text) => { + try { + await navigator.clipboard.writeText(text) + ElMessage.success('已复制到剪贴板') + } catch (err) { + console.error('复制失败:', err) + ElMessage.error('复制失败') + } +} + +const closeTokenDialog = () => { + tokenResult.value = null + tokenError.value = '' + getTokenParams.value = { + "expire_in": 3600, + "refresh_expire_in": 86400, + "user_id": 0, + } +} + const showUserTreeVisibale = async () => { await GetAllDefaultUsers(); visible_system.value = true; }; +const show_get_token_visible = (data) => { + currentNode.value = data; + getTokenVisible.value = true; + getTokenParams.value.user_id = data.id; +}; + const updateUserCatalogue = async (data) => { try { diff --git a/src/views/system/vpn-online-connect.vue b/src/views/system/vpn-online-connect.vue index 089c9ad..ada911e 100644 --- a/src/views/system/vpn-online-connect.vue +++ b/src/views/system/vpn-online-connect.vue @@ -170,8 +170,11 @@ const connectToServer = async (server: VPNServer) => { if (response && response["code"] === 0) { ElMessage.success('VPN连接成功!') + } else if (response && response["code"] === 20){ + //设置已在线 + ElMessage.error(response["message"]) } else { - ElMessage.error(response["message"] || 'VPN连接失败') + ElMessage.error(response["message"]) } } catch (error) { if (error !== 'cancel') {