Files
template-10490/utils/common.ts
2025-01-27 23:24:42 +08:00

218 lines
6.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { v4 as uuidv4 } from 'uuid';
import type {Company} from "~/api/system/company/model";
const route = useRoute();
/**需要进行持久化的数据:把需要持久化的数据放在下面这个对象中,才会持久化,不需要持久化的数据就不用放到这里了。 */
const enduring: { [key: string]: () => Ref<any> } = {
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<number>(0);
const path = ref<string>('');
const spm = ref<string>('');
const model = ref<string>('c');
const tid = d?.tenantId || localStorage.getItem('TID_ADMIN');
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://console.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<string>('');
const model = ref<string>('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')
}