ソースを参照

refactor:缓存封装调整;

zhangchong 1 年間 前
コミット
7fa8cc996c

+ 3 - 0
.env.development

@@ -1,6 +1,9 @@
 # 本地环境
 VITE_MODE_NAME=development
 
+# 防止部署多套系统到同一域名不同目录时,变量共用的问题 设置不同的前缀
+VITE_STORAGE_NAME=hotline
+
 # # 基础请求地址
 VITE_API_URL=http://110.188.24.28:50100
 

+ 3 - 0
.env.production

@@ -1,6 +1,9 @@
 # 线上环境
 VITE_MODE_NAME=production
 
+# 防止部署多套系统到同一域名不同目录时,变量共用的问题 设置不同的前缀
+VITE_STORAGE_NAME=hotline
+
 # # 基础请求地址
 VITE_API_URL=http://110.188.24.28:50100
 

+ 3 - 0
.env.test

@@ -3,6 +3,9 @@ VITE_MODE_NAME=test
 # # 基础请求地址
 VITE_API_URL=http://110.188.24.28:50100
 
+# 防止部署多套系统到同一域名不同目录时,变量共用的问题 设置不同的前缀
+VITE_STORAGE_NAME=hotline
+
 # # 身份认证地址
 VITE_API_IDENTITY_URL=http://identity.fengwo.com
 

+ 2 - 2
src/api/system/parameter.ts

@@ -57,7 +57,7 @@ export const SetingsAdd = (data: object) => {
 // };
 /**
  * @description: 查询配置详情
- * @return {*}
+ * @param {string} id  配置id
  */
 export const setitngsDetail = (id:string) => {
 	return request({
@@ -67,7 +67,7 @@ export const setitngsDetail = (id:string) => {
 };
 /**
  * @description: 查询配置详情
- * @param {string} code
+ * @param {string} code 配置编码
  * @return {*}
  */
 export const getSettingByCode = (code:string): any => {

+ 3 - 3
src/components/Editor/index.vue

@@ -16,7 +16,7 @@ import '@wangeditor/editor/dist/css/style.css'; // 引入 css
 import { onBeforeUnmount, reactive, shallowRef, watch, nextTick } from 'vue';
 import { IDomEditor, Boot } from '@wangeditor/editor';
 import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
-import { Session } from '/@/utils/storage';
+import {Cookie, Session} from '/@/utils/storage';
 // import useUserStore from '@/store/modules/user'
 //  全局配置
 // 定义父组件传过来的值
@@ -73,7 +73,7 @@ state.editorConfig.MENU_CONF['uploadImage'] = {
 	metaWithUrl: false,
 	// 自定义增加 http  header
 	headers: {
-		Authorization: 'Bearer ' + Session.get('token'),
+		Authorization: 'Bearer ' + Cookie.get('token'),
 		userid: '',
 	},
 	// 跨域是否传递 cookie ,默认为 false
@@ -107,7 +107,7 @@ state.editorConfig.MENU_CONF['uploadVideo'] = {
 
 	// 自定义增加 http  header
 	headers: {
-		Authorization: 'Bearer ' + Session.get('token'),
+		Authorization: 'Bearer ' + Cookie.get('token'),
 		userid: '',
 	},
 

+ 4 - 2
src/components/IconSelector/index.vue

@@ -34,7 +34,7 @@
 </template>
 
 <script setup lang="ts" name="iconSelector">
-import {defineAsyncComponent, ref, reactive, onMounted, nextTick, computed, watch, PropType} from 'vue';
+import {defineAsyncComponent, ref, reactive, onMounted, nextTick, computed, watch, PropType, onBeforeUnmount} from 'vue';
 import type { TabsPaneContext } from 'element-plus';
 import initIconfont from '/@/utils/getStyleSheets';
 import '/@/theme/iconSelector.scss';
@@ -209,7 +209,9 @@ onMounted(() => {
   initFontIconData(initFontIconName());
   initResize();
   getInputWidth();
-  window.removeEventListener('resize', () => {},true);
+});
+onBeforeUnmount(() => {
+  window.removeEventListener('resize', () => {getInputWidth();},true);
 });
 // 监听双向绑定 modelValue 的变化
 watch(

+ 2 - 1
src/layout/lockScreen/index.vue

@@ -62,7 +62,7 @@
 <script setup lang="ts" name="layoutLockScreen">
 import { nextTick, onMounted, reactive, ref, onUnmounted } from 'vue';
 import { formatDate } from '/@/utils/formatTime';
-import { Local, Session } from '/@/utils/storage';
+import { Local, Session,Cookie } from '/@/utils/storage';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 import { ElMessage, ElMessageBox } from 'element-plus';
@@ -212,6 +212,7 @@ const fogetPwd = () => {
 			setLocalThemeConfig();
 			// 清除缓存/token等
 			Session.clear();
+      Cookie.clear();
 			window.location.reload();
 		})
 		.catch(() => {});

+ 14 - 14
src/layout/navBars/breadcrumb/breadcrumb.vue

@@ -2,20 +2,20 @@
 	<div v-if="isShowBreadcrumb" class="layout-navbars-breadcrumb">
 		<SvgIcon class="layout-navbars-breadcrumb-icon" :name="themeConfig.isCollapse ? 'ele-Expand' : 'ele-Fold'"
 			size="24" @click="onThemeConfigChange" color="var(--el-color-primary)" />
-		<el-breadcrumb class="layout-navbars-breadcrumb-hide" v-if="!userInfosConfig.showTelControl">
-			<transition-group name="breadcrumb">
-				<el-breadcrumb-item v-for="(v, k) in state.breadcrumbList" :key="!v.meta.tagsViewName ? v.meta.title : v.meta.tagsViewName">
-					<span v-if="k === state.breadcrumbList.length - 1" class="layout-navbars-breadcrumb-span">
-						<SvgIcon :name="v.meta.icon" class="layout-navbars-breadcrumb-iconfont" v-if="themeConfig.isBreadcrumbIcon" />
-						<span v-if="!v.meta.tagsViewName">{{ v.meta.title }}</span>
-						<span v-else>{{ v.meta.tagsViewName }}</span>
-					</span>
-					<a v-else @click.prevent="onBreadcrumbClick(v)">
-						<SvgIcon :name="v.meta.icon" class="layout-navbars-breadcrumb-iconfont" v-if="themeConfig.isBreadcrumbIcon" />{{ v.meta.title }}
-					</a>
-				</el-breadcrumb-item>
-			</transition-group>
-		</el-breadcrumb>
+<!--		<el-breadcrumb class="layout-navbars-breadcrumb-hide" v-if="!userInfosConfig.showTelControl">-->
+<!--			<transition-group name="breadcrumb">-->
+<!--				<el-breadcrumb-item v-for="(v, k) in state.breadcrumbList" :key="!v.meta.tagsViewName ? v.meta.title : v.meta.tagsViewName">-->
+<!--					<span v-if="k === state.breadcrumbList.length - 1" class="layout-navbars-breadcrumb-span">-->
+<!--						<SvgIcon :name="v.meta.icon" class="layout-navbars-breadcrumb-iconfont" v-if="themeConfig.isBreadcrumbIcon" />-->
+<!--						<span v-if="!v.meta.tagsViewName">{{ v.meta.title }}</span>-->
+<!--						<span v-else>{{ v.meta.tagsViewName }}</span>-->
+<!--					</span>-->
+<!--					<a v-else @click.prevent="onBreadcrumbClick(v)">-->
+<!--						<SvgIcon :name="v.meta.icon" class="layout-navbars-breadcrumb-iconfont" v-if="themeConfig.isBreadcrumbIcon" />{{ v.meta.title }}-->
+<!--					</a>-->
+<!--				</el-breadcrumb-item>-->
+<!--			</transition-group>-->
+<!--		</el-breadcrumb>-->
 	</div>
 </template>
 

+ 5 - 13
src/layout/navBars/breadcrumb/user.vue

@@ -71,20 +71,12 @@
 		<el-dialog v-model="dialogVisible" width="500px" draggable title="锁屏">
 			<el-form :model="state.ruleForm" ref="ruleFormRef">
 				<el-form-item label="锁屏密码" prop="pwd" :rules="[{ required: true, message: '请输入锁屏密码', trigger: 'blur' }]">
-					<el-input :type="isShowPassword ? 'text' : 'password'" placeholder="请输入密码" v-model="state.ruleForm.pwd" autocomplete="off">
+					<el-input show-password placeholder="请输入密码" v-model="state.ruleForm.pwd" autocomplete="off">
 						<template #prefix>
 							<el-icon class="el-input__icon">
 								<ele-Unlock />
 							</el-icon>
 						</template>
-						<template #suffix>
-							<i
-								class="iconfont el-input__icon login-content-password"
-								:class="isShowPassword ? 'icon-yincangmima' : 'icon-xianshimima'"
-								@click="isShowPassword = !isShowPassword"
-							>
-							</i>
-						</template>
 					</el-input>
 				</el-form-item>
 			</el-form>
@@ -103,7 +95,6 @@
 					<el-input
 						class="inputDeep"
 						clearable
-						type="password"
 						show-password
 						placeholder="请输旧就密码"
 						v-model="state.dutyForm.currentPassword"
@@ -120,7 +111,6 @@
 					<el-input
 						class="inputDeep"
 						clearable
-						type="password"
 						show-password
 						placeholder="请输入新密码"
 						v-model="state.dutyForm.newPassword"
@@ -177,7 +167,7 @@ import { storeToRefs } from 'pinia';
 import { useUserInfo } from '/@/stores/userInfo';
 import { useTelStatus } from '/@/stores/telStatus';
 import { useThemeConfig } from '/@/stores/themeConfig';
-import { Session, Local } from '/@/utils/storage';
+import {Session, Local, Cookie} from '/@/utils/storage';
 import mittBus from '/@/utils/mitt';
 import { VoiceInterfaceObject } from '/@/utils/PhoneScript';
 import { changePwd } from '/@/api/login/user';
@@ -267,7 +257,6 @@ const rules = reactive({
 	confirmPassword: [{ required: true, validator: checkConfirmPassword, trigger: 'blur' }],
 });
 const dialogVisible = ref(false);
-let isShowPassword = ref(false);
 // 设置分割样式
 const layoutUserFlexNum = computed(() => {
 	let num: string | number;
@@ -349,6 +338,7 @@ const onHandleCommandClick = (path: string) => {
 						// 清除缓存/token等
 						Local.clear();
 						Session.clear();
+            Cookie.clear();
 						// 使用 reload 时,不需要调用 resetRoute() 重置路由
 						window.location.reload();
 						// });
@@ -388,6 +378,7 @@ const onHandleCommandClick = (path: string) => {
 					// 清除缓存/token等
 					Local.clear();
 					Session.clear();
+          Cookie.clear();
 					// 使用 reload 时,不需要调用 resetRoute() 重置路由
 					window.location.reload();
 				})
@@ -464,6 +455,7 @@ const save = (formEl: FormInstance | undefined) => {
 					window.location.reload();
 					// 清楚缓存
 					Session.clear();
+          Cookie.clear();
 					Local.clear();
 				}, 1000);
 			})

+ 1 - 1
src/layout/navBars/tagsView/tagsView.vue

@@ -590,7 +590,7 @@ onUnmounted(() => {
 	// 取消监听布局配置开启 TagsView 共用
 	mittBus.off('openShareTagsView', () => {});
 	// 取消窗口 resize 监听
-	window.removeEventListener('resize', onSortableResize);
+	window.removeEventListener('resize', onSortableResize,true);
 });
 // 页面更新时
 onBeforeUpdate(() => {

+ 26 - 21
src/router/backEnd.ts

@@ -4,7 +4,7 @@ import pinia from '/@/stores/index';
 import { useUserInfo } from '/@/stores/userInfo';
 import { useAppConfig } from '/@/stores/appConfig';
 import { useRequestOldRoutes } from '/@/stores/requestOldRoutes';
-import { Session, Local } from '/@/utils/storage';
+import {Session, Local, Cookie} from '/@/utils/storage';
 import { NextLoading } from '/@/utils/loading';
 import { dynamicRoutes, notFoundAndNoPower } from '/@/router/route';
 import { formatFlatteningRoutes, formatTwoStageRoutes, router } from '/@/router/index';
@@ -63,24 +63,28 @@ const removeNull = (arr: any): Array<any> => {
 }
 // 获取系统配置
 const getAppConfigFn = async ()=> {
-	const IsRestApproval  =await  getSettingByCode('IsRestApproval'); //查询电话控件小休是否要进行审批
-	const IsRestApprovalValue = IsRestApproval.result?.settingValue.join('|') ?? false;
-	const IsRestApprovalValueBoolean = IsRestApprovalValue === 'true';
-
-	const IsAutoTalkingDeal = await getSettingByCode('IsAutoTalkingDeal'); //查询呼叫中心是否自动事后处理
-	const IsAutoTalkingDealValue = IsAutoTalkingDeal.result?.settingValue.join('|') ?? false;
-	const IsAutoTalkingDealValueBoolean = IsAutoTalkingDealValue === 'true';
-
-	const TalkingDealTime = await getSettingByCode('TalkingDealTime'); //查询自动事后处理时间
-	const TalkingDealTimeValue = TalkingDealTime.result?.settingValue.join('|') ?? 0;
-	let TalkingDealTimeValueNumber: number = Number(TalkingDealTimeValue);
-
-	console.log(`是否开启小休审批${IsRestApprovalValueBoolean},是否自动事后处理${IsAutoTalkingDealValueBoolean},自动事后处理时间${TalkingDealTimeValueNumber}秒`)
-	useAppConfig().setAppConfigInfo({
-		IsRestApproval:IsRestApprovalValueBoolean,
-		IsAutoTalkingDeal:IsAutoTalkingDealValueBoolean,
-		TalkingDealTime:TalkingDealTimeValueNumber
-	});
+	try {
+		const IsRestApproval  =await  getSettingByCode('IsRestApproval'); //查询电话控件小休是否要进行审批
+		const IsRestApprovalValue = IsRestApproval.result?.settingValue.join('|') ?? false;
+		const IsRestApprovalValueBoolean = IsRestApprovalValue === 'true';
+
+		const IsAutoTalkingDeal = await getSettingByCode('IsAutoTalkingDeal'); //查询呼叫中心是否自动事后处理
+		const IsAutoTalkingDealValue = IsAutoTalkingDeal.result?.settingValue.join('|') ?? false;
+		const IsAutoTalkingDealValueBoolean = IsAutoTalkingDealValue === 'true';
+
+		const TalkingDealTime = await getSettingByCode('TalkingDealTime'); //查询自动事后处理时间
+		const TalkingDealTimeValue = TalkingDealTime.result?.settingValue.join('|') ?? 0;
+		let TalkingDealTimeValueNumber: number = Number(TalkingDealTimeValue);
+
+		console.log(`是否开启小休审批${IsRestApprovalValueBoolean},是否自动事后处理${IsAutoTalkingDealValueBoolean},自动事后处理时间${TalkingDealTimeValueNumber}秒`)
+		useAppConfig().setAppConfigInfo({
+			IsRestApproval:IsRestApprovalValueBoolean,
+			IsAutoTalkingDeal:IsAutoTalkingDealValueBoolean,
+			TalkingDealTime:TalkingDealTimeValueNumber
+		});
+	}catch (e) {
+		console.log(e)
+	}
 }
 // 检查是否修改过密码 如果没有修改 跳转到修改密码页面
 const checkPwd = (): void => {
@@ -104,7 +108,7 @@ export async function initBackEndControlRoutes() {
 	// 界面 loading 动画开始执行
 	if (window.nextLoading === undefined) NextLoading.start();
 	// 无 token 停止执行下一步
-	if (!Session.get('token')) return false;
+	if (!Cookie.get('token')) return false;
 
 	let resRouter = null;
 	if (Local.get('requestOldRoutes')) { //获取到缓存
@@ -139,7 +143,8 @@ export async function initBackEndControlRoutes() {
 	// 检查是否修改过密码
 	checkPwd();
 	// 处理路由(component),替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由
-	dynamicRoutes[0].children = await backEndComponent(resRouter);
+	dynamicRoutes[0].children = await backEndComponent(resRouter); // 首页需要权限控制
+	// dynamicRoutes[0].children = dynamicRoutes[0].children?.concat(await backEndComponent(resRouter)); //首页如果不需要权限控制
 	// 添加动态路由
 	await setAddRoute();
 	// 设置路由到 vuex routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组

+ 2 - 2
src/router/frontEnd.ts

@@ -3,7 +3,7 @@ import { storeToRefs } from 'pinia';
 import { formatTwoStageRoutes, formatFlatteningRoutes, router } from '/@/router/index';
 import { dynamicRoutes, notFoundAndNoPower } from '/@/router/route';
 import pinia from '/@/stores/index';
-import { Session, Local } from '/@/utils/storage';
+import {Session, Local, Cookie} from '/@/utils/storage';
 import { useUserInfo } from '/@/stores/userInfo';
 import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
 import { useRoutesList } from '/@/stores/routesList';
@@ -30,7 +30,7 @@ export async function initFrontEndControlRoutes() {
 	// 界面 loading 动画开始执行
 	if (window.nextLoading === undefined) NextLoading.start();
 	// 无 token 停止执行下一步
-	if (!Session.get('token')) return false;
+	if (!Cookie.get('token')) return false;
 	// https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP
 	const authBtnList = Local.get('authBtn') ?? [];
 	await useUserInfo().setUserInfos(authBtnList);

+ 3 - 2
src/router/index.ts

@@ -6,7 +6,7 @@ import { storeToRefs } from 'pinia';
 import { useKeepALiveNames } from '/@/stores/keepAliveNames';
 import { useRoutesList } from '/@/stores/routesList';
 import { useThemeConfig } from '/@/stores/themeConfig';
-import { Local, Session } from '/@/utils/storage';
+import {Cookie, Local, Session} from '/@/utils/storage';
 import { staticRoutes, notFoundAndNoPower } from '/@/router/route';
 import { initFrontEndControlRoutes } from '/@/router/frontEnd';
 import { initBackEndControlRoutes } from '/@/router/backEnd';
@@ -95,7 +95,7 @@ const whiteList = ['/login', '/forgetPwd']//称为白名单,意思就是不需
 router.beforeEach(async (to, from, next) => {
 	NProgress.configure({ showSpinner: false });
 	if (to.meta.title) NProgress.start();
-	const token = Session.get('token');
+	const token = Cookie.get('token');
 	if (token) {
 		// 如果有token
 		if (to.path === '/login') {
@@ -130,6 +130,7 @@ router.beforeEach(async (to, from, next) => {
 			next();
 			Session.clear();
 			Local.clear();
+			Cookie.clear();
 			NProgress.done();
 		}
 	}

+ 0 - 14
src/stores/appConfig.ts

@@ -23,19 +23,5 @@ export const useAppConfig = defineStore('AppConfig', {
                 ...data
             };
         },
-    },
-    // 开启数据缓存
-    persist: {
-        enabled: true,
-        strategies: [
-            {
-                //key的名称
-                key: 'AppConfig',
-                //更改默认存储,我更改为localStorage
-                storage: localStorage,
-                // 可以选择哪些进入local存储,这样就不用全部都进去存储了
-                // 默认是全部进去存储
-            }
-        ]
     }
 })

+ 12 - 2
src/stores/telStatus.ts

@@ -91,12 +91,22 @@ export const useTelStatus = defineStore('telStatus', {
 		strategies: [
 			{
 				//key的名称
-				key: 'telStatus',
+				key: `${import.meta.env.VITE_STORAGE_NAME}_telStatusInfo`,
 				//更改默认存储,我更改为localStorage
 				storage: localStorage,
 				// 可以选择哪些进入local存储,这样就不用全部都进去存储了
 				// 默认是全部进去存储
-			}
+			},
+			// {
+			// 	key: `${import.meta.env.VITE_STORAGE_NAME}_base`,
+			// 	storage: localStorage,
+			// 	paths: ['isDutyOn','isRest']
+			// },
+			// {
+			// 	key: `${import.meta.env.VITE_STORAGE_NAME}_base2`,
+			// 	storage: sessionStorage,
+			// 	paths: ['telsNo']
+			// },
 		]
 	}
 });

+ 2 - 2
src/stores/themeConfig.ts

@@ -1,6 +1,6 @@
 import { defineStore } from 'pinia';
 import { ThemeConfigStates, ThemeConfigState } from './interface';
-import { Session } from '/@/utils/storage';
+import {Cookie, Session} from '/@/utils/storage';
 import { getImageUrl } from '/@/utils/tools';
 /**
  * @description 布局配置
@@ -99,7 +99,7 @@ export const useThemeConfig = defineStore('themeConfig', {
 			// 是否开启水印
 			isWatermark: true,
 			// 水印文案
-			watermarkText: Session.get('userName') ?? '',
+			watermarkText: Cookie.get('userName') ?? '',
 
 			/**
 			 * 其它设置

+ 2 - 2
src/stores/userInfo.ts

@@ -1,6 +1,6 @@
 import { defineStore } from 'pinia';
 import { UserInfosStates } from './interface';
-import { Session } from '/@/utils/storage';
+import {Cookie, Session} from '/@/utils/storage';
 import { getUserInfo } from "/@/api/login/user"
 
 /**
@@ -38,7 +38,7 @@ export const useUserInfo = defineStore('userInfo', {
 				this.userInfos.staffNo = userInfo.result.staffNo;
 				this.userInfos.defaultTelNo = userInfo.result.defaultTelNo;
 				this.userInfos.id = userInfo.result.id;
-				this.userInfos.token = Session.get('token');
+				this.userInfos.token = Cookie.get('token');
 				this.userInfos.photo = "";
 				//授权按钮
 				this.userInfos.showTelControl = buttons.includes('public:seat:panel'); // 查询是否有展示面板权限

+ 6 - 5
src/utils/PhoneScript.ts

@@ -253,7 +253,7 @@ export const VoiceInterfaceObject: any = {
 						this.SetIdle(); // 调用失败示闲
 					});
 			} else {
-				ElMessage.success('小休开始!');
+				// ElMessage.success('小休开始!');
 				// 设置电话状态小休中
 				useTelStatusStore.setPhoneControlState(TelStates.rest);
 				useTelStatusStore.setRest(RestStates.resting);
@@ -261,6 +261,7 @@ export const VoiceInterfaceObject: any = {
 				telRestAdd({ reason: restReason })
 					.then((res: any) => {
 						console.log('小休记录添加成功 开始休息', res);
+						ElMessage.success('小休开始!');
 					})
 					.catch((err: any) => {
 						console.log('小休记录添加失败 开始休息', err);
@@ -292,7 +293,6 @@ export const VoiceInterfaceObject: any = {
 	//示闲回调
 	Back_SetIdle: function (returnVal: { Params: string; Message: any }) {
 		if (returnVal.Params == '0') {
-			ElMessage.success('小休结束!');
 			// 设置休息状态 设置未正常状态
 			useTelStatusStore.setRest(RestStates.unRest);
 			// 设置话机状态 结束休息改为签入状态
@@ -300,6 +300,7 @@ export const VoiceInterfaceObject: any = {
 			telUnrestWex()
 				.then((res: any) => {
 					console.log('小休记录修改成功 结束休息', res);
+					ElMessage.success('小休结束!');
 				})
 				.catch((err: any) => {
 					console.log('小休记录修改失败 结束休息', err);
@@ -725,7 +726,7 @@ export const VoiceInterfaceObject: any = {
 			if (returnVal.Params == 0) {
 				ElNotification({
 					title: '自动开启事后处理成功',
-					message: `${returnVal.Message}${AppConfigInfo.value.TalkingDealTime},秒后自动结束事后处理,或者手动结束事后处理`,
+					message: `${returnVal.Message}${AppConfigInfo.value.TalkingDealTime}秒后自动结束事后处理,或者手动结束事后处理`,
 					type: 'success',
 					duration: time,
 				});
@@ -735,7 +736,7 @@ export const VoiceInterfaceObject: any = {
 				useTelStatusStore.setPhoneControlState(TelStates.onTalkingDeal);
 				setTimeout(() => {
 					this.EndTalkingDeal(); //自动结束事后,也可以手动调用该方法提前结束事后
-				}, time);
+				}, 10000);
 			}
 		} catch {
 			console.log('事后处理失败');
@@ -757,7 +758,7 @@ export const VoiceInterfaceObject: any = {
 			ElMessage(returnVal.Message);
 			// 设置事后处理
 			useTelStatusStore.setTalkingDeal(false);
-			// 设置话机状态 取消时候处理修改为空闲状态
+			// 设置话机状态 取消事后处理修改为空闲状态
 			useTelStatusStore.setPhoneControlState(TelStates.dutyOn);
 		} else {
 			console.info(returnVal.Message);

+ 8 - 7
src/utils/request.ts

@@ -1,6 +1,6 @@
 import axios, { AxiosInstance, AxiosResponse, AxiosError, AxiosRequestConfig } from 'axios';
 import { ElMessage, ElMessageBox, ElLoading, LoadingOptionsResolved } from 'element-plus';
-import { Session, Local } from '/@/utils/storage';
+import {Session, Local, Cookie} from '/@/utils/storage';
 import router from "/@/router/index"
 // 重复请求队列
 const pendingMap = new Map();
@@ -39,14 +39,14 @@ export default function myAxios(axiosConfig: any, customOptions?: any, loadingOp
 				}
 			}
 			// 在发送请求之前做些什么 token
-			if (Session.get('token')) {
-				(<any>config.headers)['Authorization'] = `Bearer ${Session.get('token')}`;
+			if (Cookie.get('token')) {
+				(<any>config.headers)['Authorization'] = `Bearer ${Cookie.get('token')}`;
 			}
 			if (config.baseURL === import.meta.env.VITE_WEX_API_URL) { // 维尔信登录
-				if (!Session.get('wexToken')) {
+				if (!Cookie.get('wexToken')) {
 					const res = await axios.post(import.meta.env.VITE_WEX_API_URL + '/login/token', {username: import.meta.env.VITE_WEX_DEFAULT_ACCOUNT, password: import.meta.env.VITE_WEX_DEFAULT_PASSWORD});
 						if (res.data.code === 200) {
-							Session.set('wexToken', res.data.data.token);
+							Cookie.set('wexToken', res.data.data.token);
 						}else{
 							ElMessage({
 								type: 'error',
@@ -54,7 +54,7 @@ export default function myAxios(axiosConfig: any, customOptions?: any, loadingOp
 							})
 						}
 				}
-				(<any>config.headers)['Token'] = `${Session.get('wexToken')}`;
+				(<any>config.headers)['Token'] = `${Cookie.get('wexToken')}`;
 			}
 			return config;
 		},
@@ -69,7 +69,7 @@ export default function myAxios(axiosConfig: any, customOptions?: any, loadingOp
 			custom_options.loading && closeLoading(custom_options); // 关闭loading
 			if (response.config.baseURL === import.meta.env.VITE_WEX_API_URL) { // 维尔信登录
 				if (response.data.code === 401) { // token过期
-					Session.remove('wexToken');
+					Cookie.remove('wexToken');
 					return myAxios(axiosConfig, customOptions, loadingOptions);
 				}
 			}
@@ -115,6 +115,7 @@ function httpErrorStatusHandle(error: any) {
 					ElMessageBox.alert('你已被登出,请重新登录', '提示', { type: 'warning' }).then(() => {
 						Session.clear(); // 清除浏览器全部临时缓存
 						Local.clear(); // 清除浏览器全部临时缓存
+						Cookie.clear(); // 清除浏览器全部临时缓存
 						router.replace(`/login?redirect=${router.currentRoute.value.path}&params=${JSON.stringify(router.currentRoute.value.query ? router.currentRoute.value.query : router.currentRoute.value.params)}`); // 去登录页
 						location.reload(); //刷新页面
 					}).catch((): void => { });

+ 2 - 2
src/utils/signalR.ts

@@ -1,7 +1,7 @@
 // 官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/signalr/javascript-client?view=aspnetcore-6.0&viewFallbackFrom=aspnetcore-2.2&tabs=visual-studio
 import * as signalR from '@microsoft/signalr';
 import { ElNotification } from 'element-plus';
-import { Session } from '/@/utils/storage';
+import {Cookie} from '/@/utils/storage';
 export default {
 	// signalR对象
 	SR: null as any,
@@ -10,7 +10,7 @@ export default {
 	baseUrl: import.meta.env.VITE_API_SOCKET_URL,
 	groupName:'',
 	init() {
-		const token = Session.get('token');
+		const token = Cookie.get('token');
 		const connection = new signalR.HubConnectionBuilder()
 			.withUrl(this.baseUrl, { accessTokenFactory: () => token, skipNegotiation: true, transport: 1 })
 			.withAutomaticReconnect() //自动重新连接

+ 29 - 10
src/utils/storage.ts

@@ -10,8 +10,7 @@ import Cookies from 'js-cookie';
 export const Local = {
 	// 防止部署多套系统到同一域名不同目录时,变量共用的问题(`__HOTLINE_NAME__`为 `package.json` 中的 `name`)
 	setKey(key: string) {
-		// @ts-ignore
-		return `${__HOTLINE_NAME__}:${key}`;
+		return `${import.meta.env.VITE_STORAGE_NAME}_${key}`;
 	},
 	// 设置永久缓存
 	set<T>(key: string, val: T) {
@@ -42,27 +41,47 @@ export const Local = {
 export const Session = {
 	// 设置临时缓存
 	set<T>(key: string, val: T) {
-		if (key === 'token') return Cookies.set(key, val);
-		if (key === 'userName') return Cookies.set(key,val);
 		window.sessionStorage.setItem(Local.setKey(key), JSON.stringify(val));
 	},
 	// 获取临时缓存
 	get(key: string) {
-		if (key === 'token') return Cookies.get(key);
-		if (key === 'userName') return Cookies.get(key);
 		let json = <string>window.sessionStorage.getItem(Local.setKey(key));
 		return JSON.parse(json);
 	},
 	// 移除临时缓存
 	remove(key: string) {
-		if (key === 'token') return Cookies.remove(key);
-		if (key === 'userName') return Cookies.remove(key);
 		window.sessionStorage.removeItem(Local.setKey(key));
 	},
 	// 移除全部临时缓存
 	clear() {
-		Cookies.remove('token');
-		Cookies.remove('userName');
 		window.sessionStorage.clear();
 	},
 };
+
+/**
+ * @description Cookies 浏览器临时缓存
+ * @method set 设置Cookies
+ * @method get 获取Cookies
+ * @method remove 移除Cookies
+ * @method clear 移除Cookies
+ */
+export const Cookie = {
+	// 设置临时缓存
+	set<T>(key: string, val: T) {
+		Cookies.set(Local.setKey(key), val);
+	},
+	// 获取临时缓存
+	get(key: string) {
+		return Cookies.get(Local.setKey(key));
+	},
+	// 移除临时缓存
+	remove(key: string) {
+		Cookies.remove(Local.setKey(key));
+	},
+	// 移除全部临时缓存
+	clear() {
+		Cookies.remove(Local.setKey('token'));
+		Cookies.remove(Local.setKey('user'));
+		Cookies.remove(Local.setKey('wexToken'));
+	},
+};

+ 2 - 1
src/views/error/401.vue

@@ -22,13 +22,14 @@
 </template>
 
 <script setup lang="ts" name="401">
-import { Session } from '/@/utils/storage';
+import { Session,Cookie } from '/@/utils/storage';
 import { getImageUrl } from "/@/utils/tools";
 
 const onSetAuth = () => {
 	// https://gitee.com/lyt-top/vue-next-admin/issues/I5C3JS
 	// 清除缓存/token等
 	Session.clear();
+  Cookie.clear();
 	// 使用 reload 时,不需要调用 resetRoute() 重置路由
 	window.location.reload();
 };

+ 2 - 1
src/views/forgetPwd/component/Forget-password.vue

@@ -79,7 +79,7 @@ import { reactive, ref } from 'vue';
 import { useRouter } from 'vue-router';
 import { ElNotification } from 'element-plus';
 import type { FormInstance } from 'element-plus';
-import { Session } from '/@/utils/storage';
+import {Cookie, Session} from '/@/utils/storage';
 import { changePwd } from '/@/api/login/user';
 // 修改密码参数类型
 interface ChangePwdState {
@@ -108,6 +108,7 @@ const onChangeConfirm = async (formEl: FormInstance | undefined) => {
 			.then(async () => {
 				// 清理清理缓存
 				Session.clear();
+        Cookie.clear();
 				await router.push('/');
 				ElNotification({
 					title: '成功',

+ 11 - 15
src/views/login/component/Account.vue

@@ -21,7 +21,7 @@
 			<el-input
 				class="inputDeep"
 				clearable
-				:type="state.isShowPassword ? 'text' : 'password'"
+        show-password
 				placeholder="请输入密码"
 				v-model="state.ruleForm.password"
 				@keyup.enter="onSignIn(ruleFormRef)"
@@ -32,14 +32,6 @@
 						<ele-Unlock />
 					</el-icon>
 				</template>
-				<template #suffix>
-					<i
-						class="iconfont el-input__icon login-content-password"
-						:class="state.isShowPassword ? 'icon-yincangmima' : 'icon-xianshimima'"
-						@click="state.isShowPassword = !state.isShowPassword"
-					>
-					</i>
-				</template>
 			</el-input>
 		</el-form-item>
 		<!-- <el-form-item class="login-animation3">
@@ -77,7 +69,7 @@ import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 import { initFrontEndControlRoutes } from '/@/router/frontEnd';
 import { initBackEndControlRoutes } from '/@/router/backEnd';
-import { Session, Local } from '/@/utils/storage';
+import {Session, Local, Cookie} from '/@/utils/storage';
 import { formatAxis } from '/@/utils/formatTime';
 import { NextLoading } from '/@/utils/loading';
 import Watermark from '/@/utils/watermark';
@@ -91,7 +83,6 @@ const { themeConfig } = storeToRefs(storesThemeConfig);
 const route = useRoute();
 const router = useRouter();
 const state = reactive<any>({
-	isShowPassword: false,
 	ruleForm: {
 		userName: '',
 		password: '',
@@ -129,10 +120,10 @@ const onSignIn = async (formEl: FormInstance | undefined) => {
 			.then(async (res: any) => {
 				//登录
 				// 存储 token 到浏览器缓存
-				Session.set('token', res.result);
+				Cookie.set('token', res.result);
 				const response = await wexLogin({ username: import.meta.env.VITE_WEX_DEFAULT_ACCOUNT, password: import.meta.env.VITE_WEX_DEFAULT_PASSWORD }); // wex登录
 				if (response.code === 200) {
-					Session.set('wexToken', response.data.token);
+          Cookie.set('wexToken', response.data.token);
 				}
 				if (!themeConfig.value.isRequestRoutes) {
 					// 前端控制路由,2、请注意执行顺序
@@ -161,6 +152,7 @@ const signInSuccess = (isNoPower: boolean | undefined) => {
 			type: 'warning',
 		});
 		Session.clear();
+    Cookie.clear();
 		Local.clear();
 	} else {
 		// 初始化登录成功时间问候语
@@ -179,13 +171,17 @@ const signInSuccess = (isNoPower: boolean | undefined) => {
 		themeConfig.value.isWatermark = true;
 		themeConfig.value.watermarkText = state.ruleForm.userName;
 		Watermark.set(state.ruleForm.userName);
-		Session.set('userName', state.ruleForm.userName);
+		Cookie.set('userName', state.ruleForm.userName);
 		setLocalThemeConfig();
 		// 登录成功提示
 		// 关闭 loading
 		state.loading = true;
 		const signInText = '欢迎回来!';
-		ElMessage.success(`${currentTimeInfo},${signInText}`);
+    ElNotification({
+      title: currentTimeInfo,
+      message: `${currentTimeInfo},${signInText}`,
+      type: 'success',
+    })
 		NextLoading.start();
 	}
 };

+ 2 - 1
src/views/resetPwd/component/Reset-password.vue

@@ -54,7 +54,7 @@
 import { reactive, computed, ref } from 'vue';
 import { useRouter } from 'vue-router';
 import { ElNotification } from 'element-plus';
-import { Session } from '/@/utils/storage';
+import {Cookie, Session} from '/@/utils/storage';
 import type { FormInstance } from 'element-plus';
 import { changeDefaultPwd } from '/@/api/login/user';
 import { storeToRefs } from 'pinia';
@@ -90,6 +90,7 @@ const onChangeConfirm = async (formEl: FormInstance | undefined) => {
 				//
 				// 清楚缓存
 				Session.clear();
+        Cookie.clear();
 				router.push('/');
 				ElNotification({
 					title: '成功',

+ 2 - 1
src/views/resetPwd/index.vue

@@ -18,7 +18,7 @@ import { defineAsyncComponent, onMounted } from 'vue';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 import { NextLoading } from '/@/utils/loading';
-import { Local, Session } from '/@/utils/storage';
+import {Cookie, Local, Session} from '/@/utils/storage';
 import Watermark from '/@/utils/watermark';
 import { useRouter } from 'vue-router';
 import { getImageUrl } from '/@/utils/tools';
@@ -32,6 +32,7 @@ const { themeConfig } = storeToRefs(storesThemeConfig);
 const router = useRouter();
 const backToLogin = () => {
 	Session.clear();
+  Cookie.clear();
 	Local.clear();
 	router.push('/');
 };

+ 1 - 4
vite.config.ts

@@ -60,10 +60,7 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
 				}
 			}
 		},
-		css: { preprocessorOptions: { css: { charset: false } } },
-		define: {
-			__HOTLINE_NAME__: JSON.stringify(process.env.npm_package_name),
-		}
+		css: { preprocessorOptions: { css: { charset: false } } }
 	};
 });
 export default viteConfig;