This commit is contained in:
GGJ
2025-02-17 08:40:19 +08:00
15 changed files with 63 additions and 144 deletions

View File

@@ -1,112 +0,0 @@
import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { showFullScreenLoading, tryHideFullScreenLoading } from "@/components/Loading/fullScreen";
import { LOGIN_URL } from "@/config";
import { ElMessage } from "element-plus";
import { ResultData } from "@/api/interface";
import { ResultEnum } from "@/enums/httpEnum";
import { checkStatus } from "./helper/checkStatus";
import { useUserStore } from "@/stores/modules/user";
import router from "@/routers";
export interface CustomAxiosRequestConfig extends InternalAxiosRequestConfig {
loading?: boolean;
}
const config = {
// 默认地址请求地址,可在 .env.** 文件中修改
baseURL: import.meta.env.VITE_API_URL as string,
// 设置超时时间
timeout: ResultEnum.TIMEOUT as number,
// 跨域时候允许携带凭证
withCredentials: true,
// post请求指定数据类型以及编码
headers: { 'Content-Type': 'application/json;charset=utf-8' }
};
class RequestHttp {
service: AxiosInstance;
public constructor(config: AxiosRequestConfig) {
// 创建实例
this.service = axios.create(config);
/**
* @description 请求拦截器
* 客户端发送请求 -> [请求拦截器] -> 服务器
* token校验(JWT) : 接受服务器返回的 token,存储到 vuex/pinia/本地储存当中
*/
this.service.interceptors.request.use(
(config: CustomAxiosRequestConfig) => {
const userStore = useUserStore();
// 当前请求不需要显示 loading在 api 服务中通过指定的第三个参数: { loading: false } 来控制
config.loading ?? (config.loading = true);
config.loading && showFullScreenLoading();
if (config.headers && typeof config.headers.set === "function") {
config.headers.set("x-access-token", userStore.token);
}
return config;
},
(error: AxiosError) => {
return Promise.reject(error);
}
);
/**
* @description 响应拦截器
* 服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息
*/
this.service.interceptors.response.use(
(response: AxiosResponse) => {
const { data } = response;
const userStore = useUserStore();
tryHideFullScreenLoading();
// 登陆失效
if (data.code == ResultEnum.OVERDUE) {
userStore.setToken("");
router.replace(LOGIN_URL);
ElMessage.error(data.message);
return Promise.reject(data);
}
// 全局错误信息拦截(防止下载文件的时候返回数据流,没有 code 直接报错)
if (data.code && data.code !== ResultEnum.SUCCESS) {
ElMessage.error(data.message);
return Promise.reject(data);
}
// 成功请求(在页面上除非特殊情况,否则不用处理失败逻辑)
return data;
},
async (error: AxiosError) => {
const { response } = error;
tryHideFullScreenLoading();
// 请求超时 && 网络错误单独判断,没有 response
if (error.message.indexOf("timeout") !== -1) ElMessage.error("请求超时!请您稍后重试");
if (error.message.indexOf("Network Error") !== -1) ElMessage.error("网络错误!请您稍后重试");
// 根据服务器响应的错误状态码,做不同的处理
if (response) checkStatus(response.status);
// 服务器结果都没有返回(可能服务器错误可能客户端断网),断网处理:可以跳转到断网页面
if (!window.navigator.onLine) router.replace("/500");
return Promise.reject(error);
}
);
}
/**
* @description 常用请求方法封装
*/
get<T>(url: string, params?: object, _object = {}): Promise<ResultData<T>> {
return this.service.get(url, { params, ..._object });
}
post<T>(url: string, params?: object | string, _object = {}): Promise<ResultData<T>> {
return this.service.post(url, params, _object);
}
put<T>(url: string, params?: object, _object = {}): Promise<ResultData<T>> {
return this.service.put(url, params, _object);
}
delete<T>(url: string, params?: any, _object = {}): Promise<ResultData<T>> {
return this.service.delete(url, { params, ..._object });
}
download(url: string, params?: object, _object = {}): Promise<BlobPart> {
return this.service.post(url, params, { ..._object, responseType: "blob" });
}
}
export default new RequestHttp(config);

View File

@@ -1,5 +1,6 @@
{
"cSpell.words": [
"Analyse",
"CHNFACTOR",
"CHNPACTOR",
"Chns",

View File

@@ -39,13 +39,14 @@ class RequestHttp {
*/
this.service.interceptors.request.use(
(config: CustomAxiosRequestConfig) => {
isFirst = true
const userStore = useUserStore()
// 当前请求不需要显示 loading在 api 服务中通过指定的第三个参数: { loading: false } 来控制
config.loading ?? (config.loading = true)
config.loading && showFullScreenLoading()
if (config.headers && typeof config.headers.set === 'function') {
config.headers.set('Authorization', 'Bearer ' + userStore.accessToken)
config.headers.set('Refresh-Token', userStore.refreshToken)
config.headers.set('Is-Refresh-Token', userStore.isRefreshToken+"")
}
return config
},
@@ -67,11 +68,14 @@ class RequestHttp {
if(data.code === ResultEnum.ACCESSTOKEN_EXPIRED){
// 用长token去换短token
userStore.setAccessToken(userStore.refreshToken)
userStore.setIsRefreshToken(true)
const result = await refreshToken()
if (result) { //获取新token成功的话
// 有新的token后重新请求
userStore.setAccessToken(result.data.accessToken)
userStore.setRefreshToken(result.data.refreshToken)
userStore.setIsRefreshToken(false)
response.config.headers.Authorization = `Bearer ${result.data.accessToken}`//重新请求前需要将更新后的新token更换掉之前无效的token,不然会死循环
const resp = await this.service.request(response.config)
return resp
@@ -84,11 +88,10 @@ class RequestHttp {
console.log("登陆失效")
userStore.setAccessToken('')
userStore.setRefreshToken('')
userStore.setIsRefreshToken(false)
userStore.setUserInfo({ name: '' })
router.replace(LOGIN_URL)
if(data.code != ResultEnum.OVERDUE){//临时处理token失效弹窗多次
ElMessage.error(data.message)
}else if(isFirst){
await router.replace(LOGIN_URL)
if(isFirst){//临时处理token失效弹窗多次
ElMessage.error(data.message)
isFirst = false
}

View File

@@ -85,3 +85,8 @@ export const generateDevReport = (params: Device.ReqDevReportParams) => {
export const downloadDevData = (params: Device.ReqDevReportParams) => {
return http.download(`/report/downloadReport`, params)
}
export const staticsAnalyse = (params: { planId: string }) => {
return http.download(`/adPlan/analyse?planId=${params.planId}`)
}

View File

@@ -1,10 +1,16 @@
import http from '@/api'
import { type Dict } from '@/api/system/dictionary/interface'
import {c} from "vite/dist/node/types.d-aGj9QkWt";
//获取字典类型
export const getDictTreeList = (params: Dict.ResDictTree) => {
export const getDictTreeByCode = (params: Dict.ResDictTree) => {
const code = params.code || '';
return http.get(`/dictTree/getTreeByCode?code=${code}`)
}
export const getDictTreeByName = (params: Dict.ResDictTree) => {
const name = params.name || '';
return http.get(`/dictTree/getTree?keyword=${name}`, params)
return http.get(`/dictTree/getTreeByName?name=${name}`)
}
//添加字典类型

View File

@@ -77,6 +77,7 @@ const logout = () => {
userStore.setAccessToken("");
userStore.setRefreshToken("");
userStore.setUserInfo({name: ""});
userStore.setIsRefreshToken(false)
dictStore.setDictData([]);
modeStore.setCurrentMode('');
AppSceneStore.setCurrentMode('');

View File

@@ -27,7 +27,9 @@ export interface GlobalState {
/* UserState */
export interface UserState {
token: string;
accessToken: string;
refreshToken: string;
isRefreshToken: boolean;
userInfo: { name: string };
}

View File

@@ -8,6 +8,7 @@ export const useUserStore = defineStore({
state: (): UserState => ({
accessToken: "",
refreshToken: "",
isRefreshToken:false,
userInfo: { name: "admin" },
}),
getters: {},
@@ -19,6 +20,9 @@ export const useUserStore = defineStore({
setRefreshToken(refreshToken: string) {
this.refreshToken = refreshToken;
},
setIsRefreshToken(isRefreshToken: boolean) {
this.isRefreshToken = isRefreshToken;
},
// Set setUserInfo
setUserInfo(userInfo: UserState["userInfo"]) {
this.userInfo = userInfo;

View File

@@ -380,8 +380,8 @@ const open = async (_deviceId: string, chnNum: string, _scriptType: string | nul
chnList = resFormContent.chnList.map((item: { value: string, label: string }) => ({
value: item.value,
// label: item.value
label: item.label == '1' ? `${item.value}` : item.label == '2' ? `${item.value}(不符合)` : `${item.value}`
label: item.value
//label: item.label == '1' ? `${item.value}` : item.label == '2' ? `${item.value}(不符合)` : `${item.value}`
}))
let dataRuleName = dictStore.getDictData('Data_Rule').find(item => item.id == resFormContent.dataRule)?.name

View File

@@ -102,7 +102,7 @@ const columns = reactive<ColumnProps<AuditLog.ReqAuditLogParams>[]>([
},
},
{
prop: 'operate_Type',
prop: 'operateType',
label: '日志类型',
width: 100,
},

View File

@@ -428,10 +428,20 @@ const handleDevTypeChange = (value: string) => {
formContent.value.devVolt = dev.devVolt; // 默认值为1
formContent.value.icdId = dev.icd
formContent.value.power = dev.power
if(dev.name.includes('882B')){
formContent.value.ip = '172.17.102.220'
}else if(dev.name.includes('882A')){
formContent.value.ip = '172.17.102.221'
}else{
formContent.value.ip = '172.17.102.200'
}
} else {
formContent.value.devChns = 1; // 默认值为1
formContent.value.devCurr = 1; // 默认值为1
formContent.value.devVolt = 57.74; // 默认值为1
formContent.value.ip = '172.17.102.200'
}
}

View File

@@ -57,7 +57,7 @@
import { useDictStore } from '@/stores/modules/dict'
import { type ErrorSystem } from '@/api/device/interface/error';
import ErrorSystemDetailTable from '@/views/machine/errorSystem/components/errorSystemDetailTable.vue';
import {getDictTreeList} from '@/api/system/dictionary/dictTree'
import {getDictTreeByCode} from '@/api/system/dictionary/dictTree'
import { type Dict } from '@/api/system/dictionary/interface';
// 定义弹出组件元信息
const dialogFormRef = ref()
@@ -156,31 +156,31 @@ const handleTableDataUpdate = (newTableData: ErrorSystem.ErrorSystemDetail[]) =>
}
// 封装提取第二层节点的逻辑
const loadSecondLevelOptions = async () => {
const dictCode = '误差体系指标项'; // 替换为实际需要的字典代码
const dictCode2 = '脚本-误差'; // 替换为实际需要的字典代码
const dictCode = 'Err_Sys_Items'; // 替换为实际需要的字典代码
const dictCode2 = 'Script_Error'; // 替换为实际需要的字典代码
const resDictTree: Dict.ResDictTree = {
name: dictCode,
name: '',
id: '',
pid: '',
pids: '',
code: '',
code: dictCode,
sort: 0
};
const resDictTree2: Dict.ResDictTree = {
name: dictCode2,
name: '',
id: '',
pid: '',
pids: '',
code: '',
code: dictCode2,
sort: 0
};
// 并行请求两个字典树列表
const [result, result2] = await Promise.all([
getDictTreeList(resDictTree),
getDictTreeList(resDictTree2)
getDictTreeByCode(resDictTree),
getDictTreeByCode(resDictTree2)
]);
const allOptions = convertToOptions(result.data as Dict.ResDictTree[]);

View File

@@ -60,7 +60,7 @@ import { useDictStore } from '@/stores/modules/dict'
import TestScriptDetail from '@/views/machine/testScript/components/testScriptDetail.vue'
import { type TestScript } from '@/api/device/interface/testScript'
import type { Dict } from '@/api/system/dictionary/interface'
import { getDictTreeList } from '@/api/system/dictionary/dictTree'
import { getDictTreeByCode } from '@/api/system/dictionary/dictTree'
import type { CascaderOption } from 'element-plus'
const modeId = ref()
const secondLevelOptions: any[] = []
@@ -123,16 +123,16 @@ const save = () => {
// 打开弹窗,可能是新增,也可能是编辑
const open = async (sign: string, row: any, currentMode: string, id: string) => {
const dictCode = '测试脚本字典表' // 替换为实际需要的字典代码
const dictCode = 'Script_Indicator_Items' // 替换为实际需要的字典代码
const resDictTree: Dict.ResDictTree = {
name: dictCode,
name: '',
id: '',
pid: '',
pids: '',
code: '',
code: dictCode,
sort: 0
}
const result = await getDictTreeList(resDictTree)
const result = await getDictTreeByCode(resDictTree)
const allOptions = convertToOptions(result.data as Dict.ResDictTree[])
secondLevelOptions.push(...(allOptions[0]?.children || []))

View File

@@ -68,7 +68,7 @@ import ImportExcel from "@/components/ImportExcel/index.vue";
import {useDownload} from "@/hooks/useDownload";
import {getTestConfig } from '@/api/system/base/index'
import {type Base } from '@/api/system/base/interface'
import { getBoundPqDevList } from '@/api/plan/plan.ts'
import { getBoundPqDevList ,staticsAnalyse} from '@/api/plan/plan.ts'
// defineOptions({
// name: 'planList'
@@ -394,10 +394,9 @@ const showDeviceOpen = (row: Partial<Plan.ReqPlan> = {}) => {
const myDict = new Map<string, any[]>();
// 引用图表容器
const chartContainer = ref<HTMLElement | null>(null);
let myChart: echarts.ECharts | null = null;
const statisticalAnalysis = async (row: Partial<Plan.ReqPlan> = {}) => {
useDownload(staticsAnalyse,row.name+'分析结果', {planId:row.id}, false,'.xlsx')
// const response = await getTestConfig() as unknown as Base.ResTestConfig
// const maxTime= response.data.maxTime//检测最大次数
// const dev = await getBoundPqDevList({ 'planId': row.id })

View File

@@ -3,7 +3,7 @@
<ProTable
ref='proTable'
:columns='columns'
:request-api='getDictTreeList'
:request-api='getDictTreeByName'
:pagination="false"
>
@@ -29,7 +29,7 @@
import {useDictStore} from '@/stores/modules/dict'
import {useHandleData} from '@/hooks/useHandleData'
import {
getDictTreeList,
getDictTreeByName,
deleteDictTree,
} from '@/api/system/dictionary/dictTree'
import { reactive, ref } from 'vue'