Commit c72433774ceb72810cb4b3d33a6d76205bcf4ebf

Authored by ww
1 parent 310dafe8

feat: 项目环境配置, 新增登录相关,新增环境变量

1 # Proxy 1 # Proxy
2 VITE_GLOB_PROXY = [["/api", "http://222.180.200.114:48080/api"]] 2 VITE_GLOB_PROXY = [["/api", "http://222.180.200.114:48080/api"]]
3 3
  4 +# Api prefix
  5 +VITE_GLOB_API_URL = /api
  6 +
  7 +#
  8 +VITE_GLOB_API_URL_PREFIX = /yt
  9 +
4 # 内容安全协议 10 # 内容安全协议
5 VITE_GLOB_CONTENT_SECURITY_POLICY = false 11 VITE_GLOB_CONTENT_SECURITY_POLICY = false
1 # Proxy 1 # Proxy
2 VITE_GLOB_PROXY = [["/api", "http://222.180.200.114:48080/api"]] 2 VITE_GLOB_PROXY = [["/api", "http://222.180.200.114:48080/api"]]
3 3
  4 +# Api prefix
  5 +VITE_GLOB_API_URL = /api
  6 +
  7 +VITE_GLOB_API_URL_PREFIX = /yt
  8 +
4 # 内容安全协议 9 # 内容安全协议
5 VITE_GLOB_CONTENT_SECURITY_POLICY = true 10 VITE_GLOB_CONTENT_SECURITY_POLICY = true
@@ -2,22 +2,27 @@ module.exports = { @@ -2,22 +2,27 @@ module.exports = {
2 root: true, 2 root: true,
3 parser: 'vue-eslint-parser', 3 parser: 'vue-eslint-parser',
4 globals: { 4 globals: {
5 - postMessage: true 5 + postMessage: true,
6 }, 6 },
7 parserOptions: { 7 parserOptions: {
8 parser: '@typescript-eslint/parser', 8 parser: '@typescript-eslint/parser',
9 sourceType: 'module', 9 sourceType: 'module',
10 ecmaFeatures: { 10 ecmaFeatures: {
11 jsx: true, 11 jsx: true,
12 - tsx: true  
13 - } 12 + tsx: true,
  13 + },
14 }, 14 },
15 env: { 15 env: {
16 - node: true, 16 + 'node': true,
17 // The Follow config only works with eslint-plugin-vue v8.0.0+ 17 // The Follow config only works with eslint-plugin-vue v8.0.0+
18 - 'vue/setup-compiler-macros': true 18 + 'vue/setup-compiler-macros': true,
19 }, 19 },
20 - extends: ['plugin:vue/vue3-essential', 'eslint:recommended'], 20 + extends: [
  21 + 'plugin:vue/vue3-essential',
  22 + 'eslint:recommended',
  23 + 'plugin:import/typescript',
  24 + 'plugin:@typescript-eslint/recommended',
  25 + ],
21 rules: { 26 rules: {
22 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 27 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
23 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 28 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
@@ -25,6 +30,6 @@ module.exports = { @@ -25,6 +30,6 @@ module.exports = {
25 'vue/no-unused-vars': 'off', 30 'vue/no-unused-vars': 'off',
26 'vue/multi-word-component-names': 'off', 31 'vue/multi-word-component-names': 'off',
27 'vue/valid-template-root': 'off', 32 'vue/valid-template-root': 'off',
28 - 'vue/no-mutating-props': 'off'  
29 - } 33 + 'vue/no-mutating-props': 'off',
  34 + },
30 } 35 }
1 -import { getGlobalConfigName } from "./getGlobConfigName";  
2 -  
3 -  
4 -export function getAppEnvConfig() {  
5 - const ENV_NAME = getGlobalConfigName(import.meta.env);  
6 -  
7 - const ENV = (import.meta.env.DEV  
8 - ? // Get the global configuration (the configuration will be extracted independently when packaging)  
9 - (import.meta.env as unknown as GlobEnvConfig)  
10 - : window[ENV_NAME as any]) as unknown as GlobEnvConfig;  
11 - const {  
12 - VITE_GLOB_APP_TITLE,  
13 - VITE_GLOB_APP_SHORT_NAME,  
14 - VITE_GLOB_CONTENT_SECURITY_POLICY,  
15 - } = ENV;  
16 -  
17 - if (!/^[a-zA-Z\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) {  
18 - console.warn(  
19 - `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`  
20 - );  
21 - }  
22 -  
23 - return {  
24 - VITE_GLOB_APP_TITLE,  
25 - VITE_GLOB_APP_SHORT_NAME,  
26 - VITE_GLOB_CONTENT_SECURITY_POLICY,  
27 - };  
28 -}  
29 -  
30 -export const useGlobSetting = (): Readonly<GlobConfig> => {  
31 - const {  
32 - VITE_GLOB_APP_TITLE,  
33 - VITE_GLOB_APP_SHORT_NAME,  
34 - VITE_GLOB_CONTENT_SECURITY_POLICY,  
35 - } = getAppEnvConfig();  
36 -  
37 - if (!/[a-zA-Z\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) {  
38 - console.warn(  
39 - `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`  
40 - );  
41 - }  
42 -  
43 - // Take global configuration  
44 - const glob: Readonly<GlobConfig> = {  
45 - title: VITE_GLOB_APP_TITLE,  
46 - securityPolicy: VITE_GLOB_CONTENT_SECURITY_POLICY,  
47 - };  
48 -  
49 - return glob as Readonly<GlobConfig>;  
50 -};  
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53 "@types/node": "^16.11.26", 53 "@types/node": "^16.11.26",
54 "@types/qs": "^6.9.7", 54 "@types/qs": "^6.9.7",
55 "@types/three": "^0.144.0", 55 "@types/three": "^0.144.0",
56 - "@typescript-eslint/eslint-plugin": "^5.18.0", 56 + "@typescript-eslint/eslint-plugin": "^5.28.0",
57 "@typescript-eslint/parser": "^5.18.0", 57 "@typescript-eslint/parser": "^5.18.0",
58 "@vicons/carbon": "^0.12.0", 58 "@vicons/carbon": "^0.12.0",
59 "@vicons/ionicons5": "~0.11.0", 59 "@vicons/ionicons5": "~0.11.0",
@@ -12,7 +12,7 @@ specifiers: @@ -12,7 +12,7 @@ specifiers:
12 '@types/node': ^16.11.26 12 '@types/node': ^16.11.26
13 '@types/qs': ^6.9.7 13 '@types/qs': ^6.9.7
14 '@types/three': ^0.144.0 14 '@types/three': ^0.144.0
15 - '@typescript-eslint/eslint-plugin': ^5.18.0 15 + '@typescript-eslint/eslint-plugin': ^5.28.0
16 '@typescript-eslint/parser': ^5.18.0 16 '@typescript-eslint/parser': ^5.18.0
17 '@vicons/carbon': ^0.12.0 17 '@vicons/carbon': ^0.12.0
18 '@vicons/ionicons5': ~0.11.0 18 '@vicons/ionicons5': ~0.11.0
@@ -7,14 +7,11 @@ export const useGlobSetting = (): Readonly<GlobConfig> => { @@ -7,14 +7,11 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
7 VITE_GLOB_API_URL, 7 VITE_GLOB_API_URL,
8 VITE_GLOB_APP_SHORT_NAME, 8 VITE_GLOB_APP_SHORT_NAME,
9 VITE_GLOB_API_URL_PREFIX, 9 VITE_GLOB_API_URL_PREFIX,
10 - VITE_GLOB_UPLOAD_URL,  
11 - VITE_GLOB_CONFIGURATION, 10 + VITE_GLOB_UPLOAD_URL,
12 VITE_GLOB_WEB_SOCKET, 11 VITE_GLOB_WEB_SOCKET,
13 - VITE_GLOB_CONTENT_SECURITY_POLICY,  
14 - VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,  
15 - VITE_GLOB_ALARM_NOTIFY_DURATION, 12 + VITE_GLOB_CONTENT_SECURITY_POLICY,
16 } = getAppEnvConfig(); 13 } = getAppEnvConfig();
17 - 14 +
18 if (!/[a-zA-Z_]*/.test(VITE_GLOB_APP_SHORT_NAME)) { 15 if (!/[a-zA-Z_]*/.test(VITE_GLOB_APP_SHORT_NAME)) {
19 console.warn( 16 console.warn(
20 `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.` 17 `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`
@@ -27,12 +24,10 @@ export const useGlobSetting = (): Readonly<GlobConfig> => { @@ -27,12 +24,10 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
27 apiUrl: VITE_GLOB_API_URL, 24 apiUrl: VITE_GLOB_API_URL,
28 shortName: VITE_GLOB_APP_SHORT_NAME, 25 shortName: VITE_GLOB_APP_SHORT_NAME,
29 urlPrefix: VITE_GLOB_API_URL_PREFIX, 26 urlPrefix: VITE_GLOB_API_URL_PREFIX,
30 - uploadUrl: VITE_GLOB_UPLOAD_URL,  
31 - configurationPrefix: VITE_GLOB_CONFIGURATION, 27 + uploadUrl: VITE_GLOB_UPLOAD_URL,
32 socketUrl: VITE_GLOB_WEB_SOCKET, 28 socketUrl: VITE_GLOB_WEB_SOCKET,
33 securityPolicy: VITE_GLOB_CONTENT_SECURITY_POLICY, 29 securityPolicy: VITE_GLOB_CONTENT_SECURITY_POLICY,
34 - alarmNotifyDuration: VITE_GLOB_ALARM_NOTIFY_DURATION,  
35 - alarmPollingInterval: VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME,  
36 }; 30 };
  31 +
37 return glob as Readonly<GlobConfig>; 32 return glob as Readonly<GlobConfig>;
38 }; 33 };
@@ -14,7 +14,7 @@ export const groupTitle = "分组" @@ -14,7 +14,7 @@ export const groupTitle = "分组"
14 // 主题配置 14 // 主题配置
15 export const theme = { 15 export const theme = {
16 // 默认是否开启深色主题 16 // 默认是否开启深色主题
17 - darkTheme: true, 17 + darkTheme: false,
18 //默认主题色 18 //默认主题色
19 appTheme: '#51d6a9', 19 appTheme: '#51d6a9',
20 appThemeDetail: null, 20 appThemeDetail: null,
@@ -12,7 +12,7 @@ import { @@ -12,7 +12,7 @@ import {
12 RefreshTokenParams, 12 RefreshTokenParams,
13 SmsLoginParams, 13 SmsLoginParams,
14 } from '@/api/external/sys/model/userModel'; 14 } from '@/api/external/sys/model/userModel';
15 -import { doRefreshToken, loginApi } from '@/api/external/sys/user'; 15 +import { doRefreshToken, getMyInfo, loginApi } from '@/api/external/sys/user';
16 import router from '@/router'; 16 import router from '@/router';
17 import { createLocalStorage } from '@/utils/external/cache'; 17 import { createLocalStorage } from '@/utils/external/cache';
18 import { useI18n } from 'vue-i18n'; 18 import { useI18n } from 'vue-i18n';
@@ -133,12 +133,25 @@ export const useUserStore = defineStore({ @@ -133,12 +133,25 @@ export const useUserStore = defineStore({
133 try { 133 try {
134 const { goHome = true, mode, ...loginParams } = params; 134 const { goHome = true, mode, ...loginParams } = params;
135 const data = await loginApi(loginParams, mode); 135 const data = await loginApi(loginParams, mode);
  136 + return this.process(data, goHome);
136 } catch (error) { 137 } catch (error) {
137 return Promise.reject(error); 138 return Promise.reject(error);
138 } 139 }
139 }, 140 },
140 async process(data: LoginResultModel, goHome?: boolean) { 141 async process(data: LoginResultModel, goHome?: boolean) {
  142 + const { token, refreshToken } = data;
  143 + this.storeToken(token, refreshToken);
  144 + // get user info
  145 + const userInfo = await this.getMyUserInfoAction();
141 146
  147 + const sessionTimeout = this.sessionTimeout;
  148 + if (sessionTimeout) {
  149 + this.setSessionTimeout(false);
  150 + } else if (goHome) {
  151 +
  152 + await router.replace(userInfo.homePath || PageEnum.BASE_HOME);
  153 + }
  154 + return userInfo;
142 }, 155 },
143 async smsCodelogin( 156 async smsCodelogin(
144 params: SmsLoginParams & { 157 params: SmsLoginParams & {
@@ -149,7 +162,12 @@ export const useUserStore = defineStore({ @@ -149,7 +162,12 @@ export const useUserStore = defineStore({
149 162
150 }, 163 },
151 async getMyUserInfoAction() { 164 async getMyUserInfoAction() {
152 - 165 + const userInfo = await getMyInfo();
  166 + this.setUserInfo(userInfo);
  167 + const { roles } = userInfo;
  168 + const roleList = roles.map((item) => item) as RoleEnum[];
  169 + this.setRoleList(roleList);
  170 + return userInfo;
153 }, 171 },
154 /** 172 /**
155 * @description: logout 173 * @description: logout
1 import type { GlobEnvConfig } from '/#/external/config'; 1 import type { GlobEnvConfig } from '/#/external/config';
2 -  
3 -import pkg from '../../../../package.json';  
4 -import { getGlobalConfigName } from 'build/external/globConfig/getGlobConfigName'; 2 +
  3 +import pkg from '../../../../package.json';
  4 +import { getGlobalConfigName } from '../../../../build/external/globConfig/getGlobConfigName';
5 5
6 export function getCommonStoragePrefix() { 6 export function getCommonStoragePrefix() {
7 const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig(); 7 const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig();
@@ -18,8 +18,9 @@ export function getAppEnvConfig() { @@ -18,8 +18,9 @@ export function getAppEnvConfig() {
18 18
19 const ENV = (import.meta.env.DEV 19 const ENV = (import.meta.env.DEV
20 ? // Get the global configuration (the configuration will be extracted independently when packaging) 20 ? // Get the global configuration (the configuration will be extracted independently when packaging)
21 - (import.meta.env as unknown as GlobEnvConfig) 21 + (import.meta.env as unknown as GlobEnvConfig)
22 : window[ENV_NAME as any]) as unknown as GlobEnvConfig; 22 : window[ENV_NAME as any]) as unknown as GlobEnvConfig;
  23 +
23 const { 24 const {
24 VITE_GLOB_APP_TITLE, 25 VITE_GLOB_APP_TITLE,
25 VITE_GLOB_API_URL, 26 VITE_GLOB_API_URL,
1 import type { ErrorMessageMode } from '/#/external/axios'; 1 import type { ErrorMessageMode } from '/#/external/axios';
2 import { useUserStoreWithOut } from '@/store/external/module/user'; 2 import { useUserStoreWithOut } from '@/store/external/module/user';
3 -import { useI18n } from 'vue-i18n';  
4 -import { useMessage } from 'naive-ui';  
5 3
6 -const { error } = useMessage()  
7 export function checkStatus( 4 export function checkStatus(
8 status: number, 5 status: number,
9 msg: string, 6 msg: string,
10 errorMessageMode: ErrorMessageMode = 'message' 7 errorMessageMode: ErrorMessageMode = 'message'
11 -): void {  
12 - const { t } = useI18n(); 8 +): void {
13 const userStore = useUserStoreWithOut(); 9 const userStore = useUserStoreWithOut();
14 let errMessage = msg; 10 let errMessage = msg;
15 switch (status) { 11 switch (status) {
@@ -20,8 +16,9 @@ export function checkStatus( @@ -20,8 +16,9 @@ export function checkStatus(
20 // Jump to the login page if not logged in, and carry the path of the current page 16 // Jump to the login page if not logged in, and carry the path of the current page
21 // Return to the current page after successful login. This step needs to be operated on the login page. 17 // Return to the current page after successful login. This step needs to be operated on the login page.
22 case 401: 18 case 401:
23 - errMessage = '';  
24 - userStore.logout() 19 + errMessage = '没有权限';
  20 + userStore.setToken(undefined);
  21 + userStore.setSessionTimeout(true);
25 break; 22 break;
26 case 403: 23 case 403:
27 errMessage = '未授权'; 24 errMessage = '未授权';
@@ -56,8 +53,10 @@ export function checkStatus( @@ -56,8 +53,10 @@ export function checkStatus(
56 break; 53 break;
57 default: 54 default:
58 } 55 }
59 - if (errMessage) { 56 +
  57 + if (errMessage) {
60 if (errorMessageMode === 'message') { 58 if (errorMessageMode === 'message') {
  59 + const { error } = window['$message']
61 error(errMessage); 60 error(errMessage);
62 } 61 }
63 } 62 }
@@ -14,12 +14,10 @@ import { setObjToUrlParams, deepMerge } from '@/utils/external'; @@ -14,12 +14,10 @@ import { setObjToUrlParams, deepMerge } from '@/utils/external';
14 import { joinTimestamp, formatRequestDate } from './helper'; 14 import { joinTimestamp, formatRequestDate } from './helper';
15 import { PageEnum } from '@/enums/external/pageEnum'; 15 import { PageEnum } from '@/enums/external/pageEnum';
16 import router from '@/router'; 16 import router from '@/router';
17 -import { useDialog } from 'naive-ui';  
18 17
19 const globSetting = useGlobSetting(); 18 const globSetting = useGlobSetting();
20 const urlPrefix = globSetting.urlPrefix; 19 const urlPrefix = globSetting.urlPrefix;
21 20
22 -const { success, error } = useDialog()  
23 /** 21 /**
24 * @description: 数据处理,方便区分多种处理方式 22 * @description: 数据处理,方便区分多种处理方式
25 */ 23 */
@@ -47,6 +45,7 @@ const transform: AxiosTransform = { @@ -47,6 +45,7 @@ const transform: AxiosTransform = {
47 if (apiUrl && isString(apiUrl)) { 45 if (apiUrl && isString(apiUrl)) {
48 config.url = `${apiUrl}${config.url}`; 46 config.url = `${apiUrl}${config.url}`;
49 } 47 }
  48 +
50 const params = config.params || {}; 49 const params = config.params || {};
51 const data = config.data || false; 50 const data = config.data || false;
52 formatDate && data && !isString(data) && formatRequestDate(data); 51 formatDate && data && !isString(data) && formatRequestDate(data);
  1 +/**
  2 + * @description use to function capture await throw error
  3 + * @param promise
  4 + * @param errorExt - Additional Information you can pass to the err object
  5 + */
  6 +export function to<T, E = any>(
  7 + promise: Promise<T>,
  8 + errorExt?: string
  9 +): Promise<[Nullable<E>, T | undefined]> {
  10 + return promise
  11 + .then((data) => [null, data] as [null, T])
  12 + .catch((err) => {
  13 + if (errorExt) {
  14 + const parsedError = Object.assign({}, err, errorExt)
  15 + return [parsedError, undefined]
  16 + }
  17 + return [err, undefined]
  18 + });
  19 +}
  1 +import { PageEnum } from "@/enums/pageEnum"
  2 +import { useUserStore } from "@/store/external/module/user"
  3 +import { cryptoEncode, routerTurnByName, setLocalStorage } from "@/utils"
  4 +import { to } from "@/utils/external/to"
  5 +import { StorageEnum } from '@/enums/storageEnum'
  6 +import { ref } from "vue"
  7 +
  8 +export const useLogin = () => {
  9 + const userStore = useUserStore()
  10 + const t = window['$t']
  11 + const loading = ref(false)
  12 +
  13 + const login = async (params: Record<'password' | 'username', string>) => {
  14 + loading.value = true
  15 + const [err, data] = await to<AwaitToResult<typeof userStore['login']>>(userStore.login({
  16 + ...params,
  17 + mode: 'message'
  18 + }))
  19 + loading.value = false
  20 + if (err) {
  21 + return
  22 + }
  23 +
  24 + setLocalStorage(
  25 + StorageEnum.GO_LOGIN_INFO_STORE,
  26 + cryptoEncode(
  27 + JSON.stringify(params)
  28 + )
  29 + )
  30 +
  31 + window['$message'].success(`${t('login.login_success')}!`)
  32 + routerTurnByName(PageEnum.BASE_HOME_NAME, true)
  33 + }
  34 +
  35 + return { login, loading }
  36 +}
@@ -24,18 +24,9 @@ @@ -24,18 +24,9 @@
24 </layout-header> 24 </layout-header>
25 <div class="go-login"> 25 <div class="go-login">
26 <div class="go-login-carousel"> 26 <div class="go-login-carousel">
27 - <n-carousel  
28 - autoplay  
29 - dot-type="line"  
30 - :interval="Number(carouselInterval)"  
31 - >  
32 - <img  
33 - v-for="(item, i) in carouselImgList"  
34 - :key="i"  
35 - class="go-login-carousel-img"  
36 - :src="getImageUrl(item, 'login')"  
37 - alt="image"  
38 - /> 27 + <n-carousel autoplay dot-type="line" :interval="Number(carouselInterval)">
  28 + <img v-for="(item, i) in carouselImgList" :key="i" class="go-login-carousel-img"
  29 + :src="getImageUrl(item, 'login')" alt="image" />
39 </n-carousel> 30 </n-carousel>
40 </div> 31 </div>
41 <div class="login-account"> 32 <div class="login-account">
@@ -43,24 +34,11 @@ @@ -43,24 +34,11 @@
43 <n-collapse-transition :appear="true" :show="show"> 34 <n-collapse-transition :appear="true" :show="show">
44 <n-card class="login-account-card" :title="$t('login.desc')"> 35 <n-card class="login-account-card" :title="$t('login.desc')">
45 <div class="login-account-top"> 36 <div class="login-account-top">
46 - <img  
47 - class="login-account-top-logo"  
48 - src="~@/assets/images/login/input.png"  
49 - alt="展示图片"  
50 - /> 37 + <img class="login-account-top-logo" src="~@/assets/images/login/input.png" alt="展示图片" />
51 </div> 38 </div>
52 - <n-form  
53 - ref="formRef"  
54 - label-placement="left"  
55 - size="large"  
56 - :model="formInline"  
57 - :rules="rules"  
58 - > 39 + <n-form ref="formRef" label-placement="left" size="large" :model="formInline" :rules="rules">
59 <n-form-item path="username"> 40 <n-form-item path="username">
60 - <n-input  
61 - v-model:value="formInline.username"  
62 - :placeholder="$t('global.form_account')"  
63 - > 41 + <n-input v-model:value="formInline.username" :placeholder="$t('global.form_account')">
64 <template #prefix> 42 <template #prefix>
65 <n-icon size="18"> 43 <n-icon size="18">
66 <PersonOutlineIcon></PersonOutlineIcon> 44 <PersonOutlineIcon></PersonOutlineIcon>
@@ -69,12 +47,8 @@ @@ -69,12 +47,8 @@
69 </n-input> 47 </n-input>
70 </n-form-item> 48 </n-form-item>
71 <n-form-item path="password"> 49 <n-form-item path="password">
72 - <n-input  
73 - v-model:value="formInline.password"  
74 - type="password"  
75 - show-password-on="click"  
76 - :placeholder="$t('global.form_password')"  
77 - > 50 + <n-input v-model:value="formInline.password" type="password" show-password-on="click"
  51 + :placeholder="$t('global.form_password')">
78 <template #prefix> 52 <template #prefix>
79 <n-icon size="18"> 53 <n-icon size="18">
80 <LockClosedOutlineIcon></LockClosedOutlineIcon> 54 <LockClosedOutlineIcon></LockClosedOutlineIcon>
@@ -92,14 +66,9 @@ @@ -92,14 +66,9 @@
92 </div> 66 </div>
93 </n-form-item> 67 </n-form-item>
94 <n-form-item> 68 <n-form-item>
95 - <n-button  
96 - type="primary"  
97 - @click="handleSubmit"  
98 - size="large"  
99 - :loading="loading"  
100 - block  
101 - >{{ $t('login.form_button') }}</n-button  
102 - > 69 + <!-- YUN_TENG loading修改 -->
  70 + <n-button type="primary" @click="handleSubmit" size="large" :loading="loginLoading" block>{{
  71 + $t('login.form_button') }}</n-button>
103 </n-form-item> 72 </n-form-item>
104 </n-form> 73 </n-form>
105 </n-card> 74 </n-card>
@@ -127,6 +96,7 @@ import { PageEnum } from '@/enums/pageEnum' @@ -127,6 +96,7 @@ import { PageEnum } from '@/enums/pageEnum'
127 import { icon } from '@/plugins' 96 import { icon } from '@/plugins'
128 import { StorageEnum } from '@/enums/storageEnum' 97 import { StorageEnum } from '@/enums/storageEnum'
129 import { routerTurnByName, cryptoEncode, setLocalStorage } from '@/utils' 98 import { routerTurnByName, cryptoEncode, setLocalStorage } from '@/utils'
  99 +import { useLogin } from './external/useLogin'
130 const { GO_LOGIN_INFO_STORE } = StorageEnum 100 const { GO_LOGIN_INFO_STORE } = StorageEnum
131 101
132 const { PersonOutlineIcon, LockClosedOutlineIcon } = icon.ionicons5 102 const { PersonOutlineIcon, LockClosedOutlineIcon } = icon.ionicons5
@@ -203,6 +173,9 @@ const shuffleHandle = () => { @@ -203,6 +173,9 @@ const shuffleHandle = () => {
203 }, carouselInterval) 173 }, carouselInterval)
204 } 174 }
205 175
  176 +// YUN_TENG 登录钩子
  177 +const { login, loading: loginLoading } = useLogin()
  178 +
206 // 点击事件 179 // 点击事件
207 const handleSubmit = (e: Event) => { 180 const handleSubmit = (e: Event) => {
208 e.preventDefault() 181 e.preventDefault()
@@ -210,17 +183,20 @@ const handleSubmit = (e: Event) => { @@ -210,17 +183,20 @@ const handleSubmit = (e: Event) => {
210 if (!errors) { 183 if (!errors) {
211 const { username, password } = formInline 184 const { username, password } = formInline
212 loading.value = true 185 loading.value = true
213 - setLocalStorage(  
214 - GO_LOGIN_INFO_STORE,  
215 - cryptoEncode(  
216 - JSON.stringify({  
217 - username,  
218 - password,  
219 - })  
220 - )  
221 - )  
222 - window['$message'].success(`${t('login.login_success')}!`)  
223 - routerTurnByName(PageEnum.BASE_HOME_NAME, true) 186 + // YUN_TENG 登录接口
  187 + await login({ username, password })
  188 + // setLocalStorage(
  189 + // GO_LOGIN_INFO_STORE,
  190 + // cryptoEncode(
  191 + // JSON.stringify({
  192 + // username,
  193 + // password,
  194 + // })
  195 + // )
  196 + // )
  197 + // window['$message'].success(`${t('login.login_success')}!`)
  198 + // routerTurnByName(PageEnum.BASE_HOME_NAME, true)
  199 +
224 } else { 200 } else {
225 window['$message'].error(`${t('login.login_message')}!`) 201 window['$message'].error(`${t('login.login_message')}!`)
226 } 202 }
@@ -243,10 +219,12 @@ $carousel-image-height: 60vh; @@ -243,10 +219,12 @@ $carousel-image-height: 60vh;
243 * { 219 * {
244 box-sizing: border-box; 220 box-sizing: border-box;
245 } 221 }
  222 +
246 @include go(login-box) { 223 @include go(login-box) {
247 height: $go-login-height; 224 height: $go-login-height;
248 overflow: hidden; 225 overflow: hidden;
249 @include background-image('background-image'); 226 @include background-image('background-image');
  227 +
250 &-header { 228 &-header {
251 display: flex; 229 display: flex;
252 justify-content: space-between; 230 justify-content: space-between;
@@ -254,6 +232,7 @@ $carousel-image-height: 60vh; @@ -254,6 +232,7 @@ $carousel-image-height: 60vh;
254 padding: 0 40px; 232 padding: 0 40px;
255 height: $--header-height; 233 height: $--header-height;
256 } 234 }
  235 +
257 &-divider { 236 &-divider {
258 margin: 0; 237 margin: 0;
259 padding-top: 0; 238 padding-top: 0;
@@ -267,20 +246,24 @@ $carousel-image-height: 60vh; @@ -267,20 +246,24 @@ $carousel-image-height: 60vh;
267 margin-top: -$--header-height; 246 margin-top: -$--header-height;
268 height: $go-login-height; 247 height: $go-login-height;
269 width: 100vw; 248 width: 100vw;
  249 +
270 &-carousel { 250 &-carousel {
271 width: $carousel-width; 251 width: $carousel-width;
272 margin-top: 100px; 252 margin-top: 100px;
273 min-width: 500px; 253 min-width: 500px;
  254 +
274 &-img { 255 &-img {
275 display: block; 256 display: block;
276 margin: 0 auto; 257 margin: 0 auto;
277 height: $carousel-image-height; 258 height: $carousel-image-height;
278 } 259 }
279 } 260 }
  261 +
280 .login-account { 262 .login-account {
281 display: flex; 263 display: flex;
282 flex-direction: column; 264 flex-direction: column;
283 margin: 0 160px; 265 margin: 0 160px;
  266 +
284 &-container { 267 &-container {
285 width: $width; 268 width: $width;
286 } 269 }
@@ -316,15 +299,18 @@ $carousel-image-height: 60vh; @@ -316,15 +299,18 @@ $carousel-image-height: 60vh;
316 width: 100vw; 299 width: 100vw;
317 height: 100vh; 300 height: 100vh;
318 background: url('@/assets/images/login/login-bg.png') no-repeat 0 -120px; 301 background: url('@/assets/images/login/login-bg.png') no-repeat 0 -120px;
  302 +
319 .bg-slot { 303 .bg-slot {
320 width: $carousel-width; 304 width: $carousel-width;
321 } 305 }
  306 +
322 .bg-img-box { 307 .bg-img-box {
323 position: relative; 308 position: relative;
324 display: flex; 309 display: flex;
325 flex-wrap: wrap; 310 flex-wrap: wrap;
326 width: 770px; 311 width: 770px;
327 margin-right: -20px; 312 margin-right: -20px;
  313 +
328 &-li { 314 &-li {
329 img { 315 img {
330 margin-right: 20px; 316 margin-right: 20px;
@@ -337,12 +323,15 @@ $carousel-image-height: 60vh; @@ -337,12 +323,15 @@ $carousel-image-height: 60vh;
337 } 323 }
338 } 324 }
339 } 325 }
  326 +
340 @media only screen and (max-width: 1200px) { 327 @media only screen and (max-width: 1200px) {
  328 +
341 .bg-img-box, 329 .bg-img-box,
342 .bg-slot, 330 .bg-slot,
343 .go-login-carousel { 331 .go-login-carousel {
344 display: none !important; 332 display: none !important;
345 } 333 }
  334 +
346 .go-login-box-footer { 335 .go-login-box-footer {
347 position: relative; 336 position: relative;
348 } 337 }
@@ -10,16 +10,41 @@ @@ -10,16 +10,41 @@
10 "resolveJsonModule": true, 10 "resolveJsonModule": true,
11 "esModuleInterop": true, 11 "esModuleInterop": true,
12 "skipLibCheck": true, 12 "skipLibCheck": true,
13 - "lib": ["es6", "ESNext", "dom"],  
14 - "types": ["vite/client"], 13 + "lib": [
  14 + "es6",
  15 + "ESNext",
  16 + "dom"
  17 + ],
  18 + "types": [
  19 + "vite/client"
  20 + ],
  21 + "typeRoots": [
  22 + "./node_modules/@types/",
  23 + "./types"
  24 + ],
15 "paths": { 25 "paths": {
16 - "@/*": ["src/*"],  
17 - "/#/*": ["types/*"] 26 + "@/*": [
  27 + "src/*"
  28 + ],
  29 + "/#/*": [
  30 + "types/*"
  31 + ]
18 }, 32 },
19 "noImplicitAny": true, //不允许使用any 33 "noImplicitAny": true, //不允许使用any
20 // "strictNullChecks": true, //不允许使用null 34 // "strictNullChecks": true, //不允许使用null
21 "noImplicitThis": true //不允许往this上面挂属性 35 "noImplicitThis": true //不允许往this上面挂属性
22 }, 36 },
23 - "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "types/**/*", "build/**/*"],  
24 - "exclude": ["node_modules", "dist", "**/*.js"] 37 + "include": [
  38 + "src/**/*.ts",
  39 + "src/**/*.d.ts",
  40 + "src/**/*.tsx",
  41 + "src/**/*.vue",
  42 + "types/**/*",
  43 + "build/**/*"
  44 + ],
  45 + "exclude": [
  46 + "node_modules",
  47 + "dist",
  48 + "**/*.js"
  49 + ]
25 } 50 }
@@ -146,14 +146,8 @@ export interface GlobConfig { @@ -146,14 +146,8 @@ export interface GlobConfig {
146 urlPrefix?: string; 146 urlPrefix?: string;
147 // Project abbreviation 147 // Project abbreviation
148 shortName: string; 148 shortName: string;
149 - // configuration center proxy prefix  
150 - configurationPrefix: string;  
151 // socket url 149 // socket url
152 socketUrl: string; 150 socketUrl: string;
153 - // alarm notify alarm duration  
154 - alarmNotifyDuration: string;  
155 - // alarm notify polling interval  
156 - alarmPollingInterval: string;  
157 // upgrade your http policy to https 151 // upgrade your http policy to https
158 securityPolicy: string; 152 securityPolicy: string;
159 } 153 }
@@ -168,14 +162,8 @@ export interface GlobEnvConfig { @@ -168,14 +162,8 @@ export interface GlobEnvConfig {
168 VITE_GLOB_APP_SHORT_NAME: string; 162 VITE_GLOB_APP_SHORT_NAME: string;
169 // Upload url 163 // Upload url
170 VITE_GLOB_UPLOAD_URL?: string; 164 VITE_GLOB_UPLOAD_URL?: string;
171 - // configuration  
172 - VITE_GLOB_CONFIGURATION: string;  
173 // socket 165 // socket
174 VITE_GLOB_WEB_SOCKET: string; 166 VITE_GLOB_WEB_SOCKET: string;
175 - // force transform http to https  
176 - VITE_GLOB_CONTENT_SECURITY_POLICY: string;  
177 - // notify polling interval time  
178 - VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME: string;  
179 // notify duration 167 // notify duration
180 VITE_GLOB_ALARM_NOTIFY_DURATION: string; 168 VITE_GLOB_ALARM_NOTIFY_DURATION: string;
181 } 169 }
1 import type { 1 import type {
  2 + ComponentPublicInstance,
2 ComponentRenderProxy, 3 ComponentRenderProxy,
  4 + FunctionalComponent,
3 VNode, 5 VNode,
4 VNodeChild, 6 VNodeChild,
5 - ComponentPublicInstance,  
6 - FunctionalComponent,  
7 PropType as VuePropType, 7 PropType as VuePropType,
8 -} from 'vue'; 8 +} from 'vue'
9 9
10 declare global { 10 declare global {
11 const __APP_INFO__: { 11 const __APP_INFO__: {
12 pkg: { 12 pkg: {
13 - name: string;  
14 - version: string;  
15 - dependencies: Recordable<string>;  
16 - devDependencies: Recordable<string>;  
17 - };  
18 - lastBuildTime: string;  
19 - }; 13 + name: string
  14 + version: string
  15 + dependencies: Recordable<string>
  16 + devDependencies: Recordable<string>
  17 + }
  18 + lastBuildTime: string
  19 + }
20 // declare interface Window { 20 // declare interface Window {
21 // // Global vue app instance 21 // // Global vue app instance
22 // __APP__: App<Element>; 22 // __APP__: App<Element>;
23 // } 23 // }
24 24
25 // vue 25 // vue
26 - declare type PropType<T> = VuePropType<T>;  
27 - declare type VueNode = VNodeChild | JSX.Element; 26 + declare type PropType<T> = VuePropType<T>
  27 + declare type VueNode = VNodeChild | JSX.Element
28 28
29 export type Writable<T> = { 29 export type Writable<T> = {
30 -readonly [P in keyof T]: T[P]; 30 -readonly [P in keyof T]: T[P];
31 - }; 31 + }
32 32
33 - declare type Nullable<T> = T | null;  
34 - declare type NonNullable<T> = T extends null | undefined ? never : T;  
35 - declare type Recordable<T = any> = Record<string, T>;  
36 - declare type ReadonlyRecordable<T = any> = {  
37 - readonly [key: string]: T;  
38 - };  
39 - declare type Indexable<T = any> = {  
40 - [key: string]: T;  
41 - }; 33 + declare type Nullable<T> = T | null
  34 + declare type NonNullable<T> = T extends null | undefined ? never : T
  35 + declare type Recordable<T = any> = Record<string, T>
  36 + type ReadonlyRecordable<T> = Readonly<Record<string, T>>
  37 + type Indexable<T> = Record<string, T>
42 declare type DeepPartial<T> = { 38 declare type DeepPartial<T> = {
43 [P in keyof T]?: DeepPartial<T[P]>; 39 [P in keyof T]?: DeepPartial<T[P]>;
44 - };  
45 - declare type TimeoutHandle = ReturnType<typeof setTimeout>;  
46 - declare type IntervalHandle = ReturnType<typeof setInterval>; 40 + }
  41 + declare type TimeoutHandle = ReturnType<typeof setTimeout>
  42 + declare type IntervalHandle = ReturnType<typeof setInterval>
47 43
48 declare interface ChangeEvent extends Event { 44 declare interface ChangeEvent extends Event {
49 - target: HTMLInputElement; 45 + target: HTMLInputElement
50 } 46 }
51 47
52 declare interface WheelEvent { 48 declare interface WheelEvent {
53 - path?: EventTarget[]; 49 + path?: EventTarget[]
54 } 50 }
55 interface ImportMetaEnv extends ViteEnv { 51 interface ImportMetaEnv extends ViteEnv {
56 - __: unknown; 52 + __: unknown
57 } 53 }
58 54
59 declare interface ViteEnv { 55 declare interface ViteEnv {
60 - VITE_PORT: number;  
61 - VITE_GLOB_USE_MOCK: boolean;  
62 - VITE_USE_PWA: boolean;  
63 - VITE_GLOB_PUBLIC_PATH: string;  
64 - VITE_PROXY: [string, string][];  
65 - VITE_GLOB_APP_TITLE: string;  
66 - VITE_GLOB_APP_SHORT_NAME: string;  
67 - VITE_USE_CDN: boolean;  
68 - VITE_GLOB_DROP_CONSOLE: boolean;  
69 - VITE_GLOB_BUILD_COMPRESS: 'gzip' | 'brotli' | 'none';  
70 - VITE_GLOB_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean;  
71 - VITE_LEGACY: boolean;  
72 - VITE_GLOB_USE_IMAGEMIN: boolean;  
73 - VITE_GENERATE_UI: string;  
74 - VITE_GLOB_CONTENT_SECURITY_POLICY: boolean;  
75 - VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME: number;  
76 - VITE_GLOB_ALARM_NOTIFY_DURATION: number; 56 + VITE_PORT: number
  57 + VITE_GLOB_USE_MOCK: boolean
  58 + VITE_USE_PWA: boolean
  59 + VITE_GLOB_PUBLIC_PATH: string
  60 + VITE_PROXY: [string, string][]
  61 + VITE_GLOB_APP_TITLE: string
  62 + VITE_GLOB_APP_SHORT_NAME: string
  63 + VITE_USE_CDN: boolean
  64 + VITE_GLOB_DROP_CONSOLE: boolean
  65 + VITE_GLOB_BUILD_COMPRESS: 'gzip' | 'brotli' | 'none'
  66 + VITE_GLOB_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean
  67 + VITE_LEGACY: boolean
  68 + VITE_GLOB_USE_IMAGEMIN: boolean
  69 + VITE_GENERATE_UI: string
  70 + VITE_GLOB_CONTENT_SECURITY_POLICY: boolean
  71 + VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME: number
  72 + VITE_GLOB_ALARM_NOTIFY_DURATION: number
77 } 73 }
78 74
79 - declare function parseInt(s: string | number, radix?: number): number; 75 + declare function parseInt(s: string | number, radix?: number): number
80 76
81 - declare function parseFloat(string: string | number): number; 77 + declare function parseFloat(string: string | number): number
82 78
83 namespace JSX { 79 namespace JSX {
84 // tslint:disable no-empty-interface 80 // tslint:disable no-empty-interface
85 - type Element = VNode; 81 + type Element = VNode
86 // tslint:disable no-empty-interface 82 // tslint:disable no-empty-interface
87 - type ElementClass = ComponentRenderProxy; 83 + type ElementClass = ComponentRenderProxy
88 interface ElementAttributesProperty { 84 interface ElementAttributesProperty {
89 - $props: any;  
90 - }  
91 - interface IntrinsicElements {  
92 - [elem: string]: any;  
93 - }  
94 - interface IntrinsicAttributes {  
95 - [elem: string]: any; 85 + $props: any
96 } 86 }
  87 +
  88 + type IntrinsicElements = Record<string, any>
  89 + type IntrinsicAttributes = Record<string, any>
97 } 90 }
  91 +
  92 + type AwaitToResult<T> = Awaited<ReturnType<T>>
98 } 93 }
99 94
100 declare module 'vue' { 95 declare module 'vue' {
101 export type JSXComponent<Props = any> = 96 export type JSXComponent<Props = any> =
102 - | { new (): ComponentPublicInstance<Props> }  
103 - | FunctionalComponent<Props>; 97 + | { new(): ComponentPublicInstance<Props> }
  98 + | FunctionalComponent<Props>
104 } 99 }
@@ -16,8 +16,8 @@ function pathResolve(dir: string) { @@ -16,8 +16,8 @@ function pathResolve(dir: string) {
16 export default defineConfig(({ mode, command }) => { 16 export default defineConfig(({ mode, command }) => {
17 17
18 const root = process.cwd() 18 const root = process.cwd()
19 -  
20 - const env = loadEnv(mode, root) 19 +
  20 + const env = loadEnv(mode, root)
21 21
22 const viteEnv = parseEnv(env) 22 const viteEnv = parseEnv(env)
23 23