import { v4 as uuidv4 } from 'uuid'; import type {Company} from "~/api/system/company/model"; const route = useRoute(); /**需要进行持久化的数据:把需要持久化的数据放在下面这个对象中,才会持久化,不需要持久化的数据就不用放到这里了。 */ const enduring: { [key: string]: () => Ref } = { useToken, useConfigInfo } //下面的俩函数在app.vue的onMounted中统一调用,或者在其它情况挂载后单独调用。 /**把所有指定数据保存到本地存储 * @param key 要保存的数据名。不填的话就是保存全部(一般不填,统一在页面关闭时保存。如果是特别重要的数据,就时不时单独保存一下即可。) */ export const setLocal = (key?: string) => { if (key) { console.log('只保存', key); const useKey = 'use' + key.slice(0, 1).toUpperCase() + key.slice(1).toLowerCase(); //首字母大写,其它全部转小写 const func = enduring[useKey]; if (!func) { console.log('没有找到', useKey, '对应的函数'); return; } localStorage.setItem(key, JSON.stringify(func().value)); } else { console.log('正在保存全部数据'); for (const key in enduring) { if (Object.prototype.hasOwnProperty.call(enduring, key)) { const element = enduring[key]; const setKey = key.toLowerCase().substring(3); //去掉前面的use ,其它全部转小写 try { localStorage.setItem(setKey, JSON.stringify(element().value)); } catch (error) { console.log(`在设置${setKey}的数据时出现错误`, error); } } } } }; /**从本地存储获取数据到state中 */ export const getLoacl = () => { for (const key in enduring) { if (Object.prototype.hasOwnProperty.call(enduring, key)) { const element = enduring[key]; const setKey = key.toLowerCase().substring(3); //去掉前面的use ,其它全部转小写 try { const localData = localStorage.getItem(setKey) || ''; if (localData) { element().value = JSON.parse(localData); console.log(setKey, '的本地存储数据获取成功', element().value); } } catch (error) { console.log(`在获取${setKey}的数据时出现错误`, error); } } } }; /** * 判断是否为整数 * @param num */ export const isInteger = (num: any) => { return /^-?\d+$/.test(num); } /** * 提取传参中的ID * param 12334.html * return 1234 * @param num */ export const getIdByParam = () => { const split = String(route.params.id).split('.') return split[0]; } /** * 提取传参中的ID * param 12334.html * return 1234 * @param num */ export const getIdBySpm = (index: number) => { console.log('split',route.query) const split = String(route.query.spm).split('.') return split[index]; } /** * 获取当前网址的Path部分 */ export const getPath = () => { return route.path; } /** * 跳转页面函数 * 携带用于统计用户行为的参数 * @param path /product/detail.html * @param id 128 * @param d 项目数据 * @param isOpen 是否新窗口打开 * @param isToken 是否登录控制台 * 拼接规则: {域名}{path}?spm=c.{用户ID}.{租户ID}.{栏目ID}.{商品ID}.{timestamp}&token={token} * @return https:///websoft.top/product/detail/128.html?spm=c.5.3057.10005.undefined&token=DDkr1PpE9DouIVMjLEMt9733QsgG7oNV */ export function openSpmUrl(p: string, d?: any, id = 0, isOpen?: boolean, isToken?: boolean): void { const config = useWebsite(); const itemId = ref(0); const path = ref(''); const spm = ref(''); const model = ref('c'); const tid = d?.tenantId || localStorage.getItem('TenantId'); const mid = config.value.loginUser?.merchantId || 0; const pid = d?.parentId || 0; const cid = d?.categoryId || 0; const uid = localStorage.getItem('UserId') || 0; const timestamp = ref(Date.now() / 1000); let token = ''; // TODO 登录控制台 if(isToken){ token = `&token=${localStorage.getItem('token')}`; } // TODO 判断模型 if(d?.articleId){ model.value = 'a'; } if(d?.goodsId){ model.value = 'g'; } if(d?.productId){ model.value = 'p'; } if(d?.appId){ model.value = 'app'; } if(d?.plugId){ model.value = 'plug'; } if(d?.itemId > 0){ path.value = d.path; itemId.value = d.itemId; }else { path.value = p; itemId.value = id; } if(d?.model === 'links'){ window.open(d.path,'_blank'); return; } // TODO 封装spm spm.value = `?spm=${model.value}.${tid}.${mid}.${pid}.${cid}.${itemId.value}.${uid}.${timestamp.value}${token}`; // TODO 账号密码 if(d?.account || d?.password){ spm.value += `&account=${d.account}&password=${d.password}`; } // TODO 新窗口打开 if(isOpen){ window.open(`${path.value}${spm.value}`,'_blank'); return; }else { window.open(`${path.value}${spm.value}`, '_top'); return; } } // 单点登录控制台 export function loginAdminByToken(): void { const user = useUser(); const uid = user.value?.userId; const tid = user.value?.tenantId; openSpmUrl(`https://${tid}.websoft.top/token-login`,undefined, uid, true,true) } // 单点登录开发者中心 export function loginDeveloperCenterByToken(item: Company): void { const user = useUser(); const tenantId = Number(user.value?.tenantId); const token = localStorage.getItem('token'); if(!token){ window.open(`https://${item.domain}`, '_blank') return; } openSpmUrl(`https://${item.domain}/token-login`,undefined, tenantId, true,true) } // 单点登录应用控制台 export function loginByToken(item: Company): void { const user = useUser(); const tenantId = Number(user.value?.tenantId); const token = localStorage.getItem('token'); window.open(`https://${item.domain}`, '_blank') } export function getSpmUrl(path: string, d?: any, id = 0): string { const config = useWebsite(); const spm = ref(''); const model = ref('c'); const tid = config.value.tenantId || 0; const mid = config.value.loginUser?.merchantId || 0; const pid = d?.parentId || 0; const cid = d?.categoryId || 0; const uid = config.value.loginUser?.userId || 0; const timestamp = ref(Date.now() / 1000); let token = uuidv4(); // TODO 封装spm spm.value = `?spm=${model.value}.${tid}.${mid}.${pid}.${cid}.${id}.${uid}.${timestamp.value}&token=${token}`; return `${path}${spm.value}` } export function openUrl(url: string) { window.open(url, '_blank') }