fix: 一些基本功能
This commit is contained in:
@@ -6,5 +6,5 @@ import { requestClient } from '#/api/request';
|
||||
* 获取用户所有菜单
|
||||
*/
|
||||
export async function getAllMenusApi() {
|
||||
return requestClient.get<RouteRecordStringComponent[]>('/menu/all');
|
||||
return requestClient.get<RouteRecordStringComponent[]>('auth/menu');
|
||||
}
|
||||
|
||||
17
apps/web-antd/src/api/core/upload.ts
Normal file
17
apps/web-antd/src/api/core/upload.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
/**
|
||||
* 文件上传
|
||||
* @param data
|
||||
*/
|
||||
export async function uploadFile(data: any) {
|
||||
return requestClient.upload('upload/image', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过文件id集合获取文件信息
|
||||
* @param data
|
||||
*/
|
||||
export async function getFileInfoByIds(data: any) {
|
||||
return requestClient.post('/sys/fileInfo/getFileInfoByIds', data);
|
||||
}
|
||||
@@ -6,5 +6,5 @@ import { requestClient } from '#/api/request';
|
||||
* 获取用户信息
|
||||
*/
|
||||
export async function getUserInfoApi() {
|
||||
return requestClient.get<UserInfo>('/user/info');
|
||||
return requestClient.get<UserInfo>('auth/my-info');
|
||||
}
|
||||
|
||||
@@ -17,9 +17,25 @@ import { message } from 'ant-design-vue';
|
||||
import { useAuthStore } from '#/store';
|
||||
|
||||
import { refreshTokenApi } from './core';
|
||||
import {Base64} from "js-base64";
|
||||
|
||||
const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
|
||||
|
||||
const arr = new Set([
|
||||
'accept_tel',
|
||||
'doctor',
|
||||
'express_mobile',
|
||||
'id_card',
|
||||
'idcard',
|
||||
'mobile',
|
||||
'password',
|
||||
'patient_mobile',
|
||||
'phone',
|
||||
]);
|
||||
|
||||
// 敏感数据
|
||||
const sensitiveData = new Set(['id_card', 'idcard']);
|
||||
|
||||
function createRequestClient(baseURL: string) {
|
||||
const client = new RequestClient({
|
||||
baseURL,
|
||||
@@ -65,6 +81,15 @@ function createRequestClient(baseURL: string) {
|
||||
|
||||
config.headers.Authorization = formatToken(accessStore.accessToken);
|
||||
config.headers['Accept-Language'] = preferences.app.locale;
|
||||
// 加密
|
||||
// eslint-disable-next-line eqeqeq
|
||||
if (config.data != null) {
|
||||
config.data = getRes(config.data, false);
|
||||
}
|
||||
// eslint-disable-next-line eqeqeq
|
||||
if (config.params != null) {
|
||||
config.params = getRes(config.params, false);
|
||||
}
|
||||
return config;
|
||||
},
|
||||
});
|
||||
@@ -74,9 +99,29 @@ function createRequestClient(baseURL: string) {
|
||||
fulfilled: (response) => {
|
||||
const { data: responseData, status } = response;
|
||||
|
||||
const { code, data } = responseData;
|
||||
if (status >= 200 && status < 400 && code === 0) {
|
||||
return data;
|
||||
// 这里吧 data 换成了 result
|
||||
const { code, result } = responseData;
|
||||
// 判断返回状态码
|
||||
if (status >= 200 && status < 400) {
|
||||
switch (code) {
|
||||
case 0: {
|
||||
// 解密
|
||||
// eslint-disable-next-line eqeqeq
|
||||
if (result != null) {
|
||||
return getRes(result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
case 401: {
|
||||
// 401 错误,需要重新登录
|
||||
return doReAuthenticate();
|
||||
}
|
||||
case 403:
|
||||
case 404:
|
||||
case 500: {
|
||||
throw Object.assign({}, response, { response });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw Object.assign({}, response, { response });
|
||||
@@ -112,3 +157,119 @@ function createRequestClient(baseURL: string) {
|
||||
export const requestClient = createRequestClient(apiURL);
|
||||
|
||||
export const baseRequestClient = new RequestClient({ baseURL: apiURL });
|
||||
|
||||
/**
|
||||
* 加解密方法
|
||||
* @param obj
|
||||
* @param isDecode
|
||||
*/
|
||||
function getRes(obj: any, isDecode = true) {
|
||||
try {
|
||||
for (const key in obj) {
|
||||
if (Array.isArray(obj[key])) {
|
||||
obj[key] = getRes(obj[key]);
|
||||
} else if (typeof obj[key] === 'object') {
|
||||
obj[key] = getRes(obj[key]);
|
||||
} else {
|
||||
// 判断obj[key]是否在arr中
|
||||
if (arr.has(key)) {
|
||||
let aseFile = '';
|
||||
aseFile = isDecode
|
||||
? customBase64Decode(obj[key])
|
||||
: customBase64Encode(obj[key]);
|
||||
const isGarbled =
|
||||
// eslint-disable-next-line no-control-regex
|
||||
/[\u0000-\u0008\v\f\u000E-\u001F\u007F-\u00FF\u{E000}-\u{F8FF}]/u.test(
|
||||
aseFile,
|
||||
);
|
||||
if (isGarbled) {
|
||||
aseFile = obj[key];
|
||||
}
|
||||
if (isDecode && sensitiveData.has(key)) {
|
||||
// 数据脱敏,自动匹配姓名、手机号、身份证
|
||||
switch (key) {
|
||||
// case 'accept_name':
|
||||
// case 'express_name':
|
||||
// case 'express_region':
|
||||
// case 'patient': {
|
||||
// // 保留前两个字符,其余用星号代替
|
||||
// aseFile = aseFile.slice(0, 1).padEnd(aseFile.length, '*');
|
||||
// break;
|
||||
// }
|
||||
// case 'express_mobile':
|
||||
// case 'mobile': {
|
||||
// // 保留前三位和后四位,中间用星号代替
|
||||
// aseFile =
|
||||
// aseFile.slice(0, 3).padEnd(aseFile.length - 4, '*') +
|
||||
// aseFile.slice(-4);
|
||||
// break;
|
||||
// }
|
||||
case 'id_card':
|
||||
case 'idcard': {
|
||||
// 保留前六位和后四位,中间用星号代替
|
||||
aseFile =
|
||||
aseFile.slice(0, 6).padEnd(aseFile.length - 4, '*') +
|
||||
aseFile.slice(-4);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
// 默认情况下,全部用星号代替
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
obj[key] = aseFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
} catch (error) {
|
||||
console.error('错误', error);
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解密
|
||||
* @param data
|
||||
*/
|
||||
function customBase64Decode(data: string) {
|
||||
// return data
|
||||
try {
|
||||
// 第一次Base64解码
|
||||
const decodedFirst = Base64.decode(data);
|
||||
// 截取从第30个字符开始往后的内容
|
||||
const subStr = decodedFirst.slice(30);
|
||||
// 第二次Base64解码
|
||||
const base64 = Base64.decode(subStr);
|
||||
return base64.length > 0 ? base64 : data;
|
||||
} catch (error) {
|
||||
console.error(`解码Base64字符串【${data}】时发生错误`, error);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 加密
|
||||
* @param data
|
||||
*/
|
||||
function customBase64Encode(data: string) {
|
||||
// eslint-disable-next-line eqeqeq
|
||||
if (data == null || data === '') return data;
|
||||
// return data
|
||||
try {
|
||||
// 和加密方法差不多但是是要生成30个随机字符
|
||||
let randomString = '';
|
||||
for (let i = 0; i < 30; i++) {
|
||||
const randomChar = String.fromCodePoint(
|
||||
Math.floor(Math.random() * (126 - 32 + 1)) + 32,
|
||||
);
|
||||
randomString += randomChar;
|
||||
}
|
||||
const encoded = Base64.encode(data);
|
||||
return Base64.encode(randomString + encoded);
|
||||
} catch (error) {
|
||||
console.error(`加密字符串【${data}】时发生错误`, error);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user