xto-fronted 0.4.93 → 0.4.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/404-C9Uh6Uu-.css +1 -0
- package/dist/assets/404-zjGLLssH.js +1 -0
- package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
- package/dist/assets/index-B5xc4gQB.css +1 -0
- package/dist/assets/index-BDgOY6Rp.js +1 -0
- package/dist/assets/index-BIoRANs0.js +1 -0
- package/dist/assets/index-BRR97dc6.js +1 -0
- package/dist/assets/index-Bz0BgZQ1.js +1 -0
- package/dist/assets/index-CAdztNsv.css +1 -0
- package/dist/assets/index-CCXrcISf.css +1 -0
- package/dist/assets/index-CfpZmcpk.css +1 -0
- package/dist/assets/index-CwJSA85U.js +1 -0
- package/dist/assets/index-CwRA10ac.js +1 -0
- package/dist/assets/index-D8NDxq9d.js +1 -0
- package/dist/assets/index-DEB6-Iv_.js +2 -0
- package/dist/assets/index-DM4Ezclc.css +1 -0
- package/dist/assets/index-DYv7nImj.css +1 -0
- package/dist/assets/index-t-2Y0KhA.css +1 -0
- package/dist/assets/vendor-CUVPinTg.js +13 -0
- package/dist/assets/vue-vendor-DeJXJVbN.js +29 -0
- package/dist/assets/xto-base-CL2NKZJJ.css +1 -0
- package/dist/assets/xto-base-PwLGsxxb.js +1 -0
- package/dist/assets/xto-business--V1F5Gwb.css +1 -0
- package/dist/assets/xto-core-CtL4zKiV.js +1 -0
- package/dist/assets/xto-data-MxZsiJgi.css +1 -0
- package/dist/assets/xto-data-bCXQa7fT.js +1 -0
- package/dist/assets/xto-feedback-Bxx38c3P.css +1 -0
- package/dist/assets/xto-feedback-CPydp0kn.js +1 -0
- package/dist/assets/xto-form-Cu6q3VLG.css +1 -0
- package/dist/assets/xto-form-bywohdAf.js +1 -0
- package/dist/assets/xto-layout-BDD6sSlM.css +1 -0
- package/dist/assets/xto-navigation-Bbdpine9.js +1 -0
- package/dist/assets/xto-navigation-XfpyMpEo.css +1 -0
- package/dist/components/Layout/MixTopMenu.vue.d.ts +6 -1
- package/dist/components/Layout/Sidebar.vue.d.ts +2 -0
- package/dist/components/Layout/TopMenu.vue.d.ts +6 -1
- package/dist/components/Layout/index.vue.d.ts +6 -1
- package/dist/{index-D59X6HmM.js → index-3ekBp4iW.js} +2 -2
- package/dist/{index-Cp8kqjtv.js → index-58aI1w0v.js} +2 -2
- package/dist/{index-me_Uu2lk.js → index-A_B_Ap_A.js} +1560 -1590
- package/dist/{index-lJrh5CFc.js → index-B5DLfOYb.js} +23 -23
- package/dist/index-BAmYUT0G.js +189 -0
- package/dist/{index-B4U8Dy2W.js → index-BK4Mut6H.js} +2 -2
- package/dist/index-BRvi9qW-.js +515 -0
- package/dist/index-BVGW4DDQ.js +189 -0
- package/dist/index-BXg94yA2.js +515 -0
- package/dist/index-Bmf0YbVq.js +189 -0
- package/dist/index-C2-a5KSQ.js +4233 -0
- package/dist/index-CAHSv7LK.js +4285 -0
- package/dist/index-CeZ0CSSs.js +641 -0
- package/dist/index-Cf8E7FM1.js +4270 -0
- package/dist/index-CgyQqbdx.js +189 -0
- package/dist/index-ChowNrlU.js +641 -0
- package/dist/index-D25KzR0I.js +479 -0
- package/dist/index-DCBIjLHy.js +515 -0
- package/dist/index-DEYOivza.js +641 -0
- package/dist/index-DReodgBw.js +4233 -0
- package/dist/index-DjERNRXX.js +515 -0
- package/dist/index-LSdsO2Ox.js +479 -0
- package/dist/index-UJixTdep.js +479 -0
- package/dist/index-gBlRG4kk.js +479 -0
- package/dist/index-xWU3J3OH.js +641 -0
- package/dist/index.es.js +1 -1
- package/dist/index.html +28 -0
- package/dist/index.umd.js +8 -8
- package/dist/style.css +1 -1
- package/package.json +91 -91
- package/src/App.vue +48 -48
- package/src/assets/styles/_dark.scss +639 -639
- package/src/assets/styles/_root.scss +183 -183
- package/src/assets/styles/_variables.scss +69 -69
- package/src/assets/styles/index.scss +460 -460
- package/src/components/Layout/MixTopMenu.vue +8 -1
- package/src/components/Layout/Sidebar.vue +200 -198
- package/src/components/Layout/SidebarMenuItem.vue +158 -158
- package/src/components/Layout/TopMenu.vue +1177 -1170
- package/src/components/Layout/index.vue +199 -192
- package/src/composables/useI18n.ts +43 -43
- package/src/index.ts +100 -100
- package/src/router/layoutRoute.ts +59 -59
- package/src/stores/index.ts +15 -15
- package/src/stores/locale.ts +66 -66
- package/src/types/json-bigint.d.ts +18 -18
- package/src/types/xto.d.ts +172 -172
- package/src/utils/request.ts +184 -184
- package/src/views/dashboard/index.vue +545 -545
- package/src/views/error/403.vue +251 -251
- package/src/views/error/404.vue +253 -253
- package/src/views/login/index.vue +586 -586
- package/src/views/system/menu/index.vue +690 -690
- package/src/views/system/role/index.vue +583 -583
- package/src/views/system/user/index.vue +655 -655
package/src/utils/request.ts
CHANGED
|
@@ -1,184 +1,184 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Axios 请求封装
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
|
|
6
|
-
import { getToken, getTokenType, clearToken } from './auth'
|
|
7
|
-
import { Message } from '@xto/feedback'
|
|
8
|
-
import JSONBig from 'json-bigint'
|
|
9
|
-
|
|
10
|
-
// 配置 json-bigint 将大整数转为字符串,避免 JavaScript Number 精度丢失
|
|
11
|
-
const JSONBigString = JSONBig({ storeAsString: true })
|
|
12
|
-
|
|
13
|
-
// 响应数据接口(Euler 框架 Result 格式)
|
|
14
|
-
export interface ApiResponse<T = unknown> {
|
|
15
|
-
code: number
|
|
16
|
-
data: T
|
|
17
|
-
message: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// 分页参数(Euler 框架格式)
|
|
21
|
-
export interface PageParams {
|
|
22
|
-
pageNo: number
|
|
23
|
-
pageSize: number
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// 分页响应(Euler 框架格式)
|
|
27
|
-
export interface PageResponse<T> {
|
|
28
|
-
records: T[]
|
|
29
|
-
total: number
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// 运行时 API 基础 URL
|
|
33
|
-
let runtimeApiBaseUrl: string | undefined
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* 设置运行时 API 基础 URL
|
|
37
|
-
* 用于 Nacos 动态配置场景
|
|
38
|
-
*/
|
|
39
|
-
export function setApiBaseUrl(url: string) {
|
|
40
|
-
runtimeApiBaseUrl = url
|
|
41
|
-
// 更新已有实例的 baseURL
|
|
42
|
-
if (request) {
|
|
43
|
-
request.defaults.baseURL = url
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// 创建 axios 实例
|
|
48
|
-
const createRequest = (): AxiosInstance => {
|
|
49
|
-
const instance = axios.create({
|
|
50
|
-
timeout: 30000,
|
|
51
|
-
headers: {
|
|
52
|
-
'Content-Type': 'application/json'
|
|
53
|
-
},
|
|
54
|
-
// 使用 json-bigint 解析响应数据,避免大整数精度丢失
|
|
55
|
-
transformResponse: [
|
|
56
|
-
(data) => {
|
|
57
|
-
if (typeof data === 'string') {
|
|
58
|
-
try {
|
|
59
|
-
return JSONBigString.parse(data)
|
|
60
|
-
} catch (e) {
|
|
61
|
-
return data
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return data
|
|
65
|
-
}
|
|
66
|
-
]
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
// 请求拦截器 - 动态设置 baseURL
|
|
70
|
-
instance.interceptors.request.use(
|
|
71
|
-
(config: InternalAxiosRequestConfig) => {
|
|
72
|
-
// 优先使用运行时配置的 baseURL
|
|
73
|
-
const baseUrl = runtimeApiBaseUrl || import.meta.env.VITE_API_BASE_URL
|
|
74
|
-
if (baseUrl && !config.baseURL) {
|
|
75
|
-
config.baseURL = baseUrl
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const token = getToken()
|
|
79
|
-
const tokenType = getTokenType() || 'Bearer'
|
|
80
|
-
if (token) {
|
|
81
|
-
config.headers.Authorization = `${tokenType} ${token}`
|
|
82
|
-
}
|
|
83
|
-
return config
|
|
84
|
-
},
|
|
85
|
-
(error) => {
|
|
86
|
-
return Promise.reject(error)
|
|
87
|
-
}
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
// 响应拦截器
|
|
91
|
-
instance.interceptors.response.use(
|
|
92
|
-
(response: AxiosResponse<ApiResponse>) => {
|
|
93
|
-
const { data } = response
|
|
94
|
-
|
|
95
|
-
// Euler 框架返回 Result 包装格式,成功时直接返回 data.data 中的实际数据
|
|
96
|
-
if (data.code === 200 || data.code === 0) {
|
|
97
|
-
return data.data as any
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Token 过期或无效(code: 9121)
|
|
101
|
-
if (data.code === 9121) {
|
|
102
|
-
Message.error('登录已过期,请重新登录')
|
|
103
|
-
clearToken()
|
|
104
|
-
window.location.href = '/login'
|
|
105
|
-
return Promise.reject(new Error(data.message || 'EXPIRED OR INVALID TOKEN'))
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// 业务错误
|
|
109
|
-
Message.error(data.message || '请求失败')
|
|
110
|
-
return Promise.reject(new Error(data.message || '请求失败'))
|
|
111
|
-
},
|
|
112
|
-
(error) => {
|
|
113
|
-
const { response } = error
|
|
114
|
-
|
|
115
|
-
if (response) {
|
|
116
|
-
// 检查响应体中的 code
|
|
117
|
-
const { data } = response
|
|
118
|
-
if (data?.code === 9121) {
|
|
119
|
-
Message.error('登录已过期,请重新登录')
|
|
120
|
-
clearToken()
|
|
121
|
-
window.location.href = '/login'
|
|
122
|
-
return Promise.reject(error)
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
switch (response.status) {
|
|
126
|
-
case 401:
|
|
127
|
-
Message.error('登录已过期,请重新登录')
|
|
128
|
-
clearToken()
|
|
129
|
-
window.location.href = '/login'
|
|
130
|
-
break
|
|
131
|
-
case 403:
|
|
132
|
-
Message.error('没有权限访问')
|
|
133
|
-
break
|
|
134
|
-
case 404:
|
|
135
|
-
Message.error('请求资源不存在')
|
|
136
|
-
break
|
|
137
|
-
case 500:
|
|
138
|
-
Message.error('服务器错误')
|
|
139
|
-
break
|
|
140
|
-
default:
|
|
141
|
-
Message.error(response.data?.message || '请求失败')
|
|
142
|
-
}
|
|
143
|
-
} else {
|
|
144
|
-
Message.error('网络连接失败')
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return Promise.reject(error)
|
|
148
|
-
}
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
return instance
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const request = createRequest()
|
|
155
|
-
|
|
156
|
-
// 请求方法 - 直接返回实际数据,无需手动解包
|
|
157
|
-
export const http = {
|
|
158
|
-
get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {
|
|
159
|
-
return request.get(url, config)
|
|
160
|
-
},
|
|
161
|
-
|
|
162
|
-
post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
|
163
|
-
return request.post(url, data, config)
|
|
164
|
-
},
|
|
165
|
-
|
|
166
|
-
put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
|
167
|
-
return request.put(url, data, config)
|
|
168
|
-
},
|
|
169
|
-
|
|
170
|
-
patch<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
|
171
|
-
return request.patch(url, data, config)
|
|
172
|
-
},
|
|
173
|
-
|
|
174
|
-
delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {
|
|
175
|
-
return request.delete(url, config)
|
|
176
|
-
},
|
|
177
|
-
|
|
178
|
-
// 文件下载 - 返回 Blob 对象
|
|
179
|
-
download(url: string, config?: AxiosRequestConfig): Promise<Blob> {
|
|
180
|
-
return request.get(url, { ...config, responseType: 'blob' })
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export default request
|
|
1
|
+
/**
|
|
2
|
+
* Axios 请求封装
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
|
|
6
|
+
import { getToken, getTokenType, clearToken } from './auth'
|
|
7
|
+
import { Message } from '@xto/feedback'
|
|
8
|
+
import JSONBig from 'json-bigint'
|
|
9
|
+
|
|
10
|
+
// 配置 json-bigint 将大整数转为字符串,避免 JavaScript Number 精度丢失
|
|
11
|
+
const JSONBigString = JSONBig({ storeAsString: true })
|
|
12
|
+
|
|
13
|
+
// 响应数据接口(Euler 框架 Result 格式)
|
|
14
|
+
export interface ApiResponse<T = unknown> {
|
|
15
|
+
code: number
|
|
16
|
+
data: T
|
|
17
|
+
message: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// 分页参数(Euler 框架格式)
|
|
21
|
+
export interface PageParams {
|
|
22
|
+
pageNo: number
|
|
23
|
+
pageSize: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// 分页响应(Euler 框架格式)
|
|
27
|
+
export interface PageResponse<T> {
|
|
28
|
+
records: T[]
|
|
29
|
+
total: number
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 运行时 API 基础 URL
|
|
33
|
+
let runtimeApiBaseUrl: string | undefined
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 设置运行时 API 基础 URL
|
|
37
|
+
* 用于 Nacos 动态配置场景
|
|
38
|
+
*/
|
|
39
|
+
export function setApiBaseUrl(url: string) {
|
|
40
|
+
runtimeApiBaseUrl = url
|
|
41
|
+
// 更新已有实例的 baseURL
|
|
42
|
+
if (request) {
|
|
43
|
+
request.defaults.baseURL = url
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 创建 axios 实例
|
|
48
|
+
const createRequest = (): AxiosInstance => {
|
|
49
|
+
const instance = axios.create({
|
|
50
|
+
timeout: 30000,
|
|
51
|
+
headers: {
|
|
52
|
+
'Content-Type': 'application/json'
|
|
53
|
+
},
|
|
54
|
+
// 使用 json-bigint 解析响应数据,避免大整数精度丢失
|
|
55
|
+
transformResponse: [
|
|
56
|
+
(data) => {
|
|
57
|
+
if (typeof data === 'string') {
|
|
58
|
+
try {
|
|
59
|
+
return JSONBigString.parse(data)
|
|
60
|
+
} catch (e) {
|
|
61
|
+
return data
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return data
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
// 请求拦截器 - 动态设置 baseURL
|
|
70
|
+
instance.interceptors.request.use(
|
|
71
|
+
(config: InternalAxiosRequestConfig) => {
|
|
72
|
+
// 优先使用运行时配置的 baseURL
|
|
73
|
+
const baseUrl = runtimeApiBaseUrl || import.meta.env.VITE_API_BASE_URL
|
|
74
|
+
if (baseUrl && !config.baseURL) {
|
|
75
|
+
config.baseURL = baseUrl
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const token = getToken()
|
|
79
|
+
const tokenType = getTokenType() || 'Bearer'
|
|
80
|
+
if (token) {
|
|
81
|
+
config.headers.Authorization = `${tokenType} ${token}`
|
|
82
|
+
}
|
|
83
|
+
return config
|
|
84
|
+
},
|
|
85
|
+
(error) => {
|
|
86
|
+
return Promise.reject(error)
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
// 响应拦截器
|
|
91
|
+
instance.interceptors.response.use(
|
|
92
|
+
(response: AxiosResponse<ApiResponse>) => {
|
|
93
|
+
const { data } = response
|
|
94
|
+
|
|
95
|
+
// Euler 框架返回 Result 包装格式,成功时直接返回 data.data 中的实际数据
|
|
96
|
+
if (data.code === 200 || data.code === 0) {
|
|
97
|
+
return data.data as any
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Token 过期或无效(code: 9121)
|
|
101
|
+
if (data.code === 9121) {
|
|
102
|
+
Message.error('登录已过期,请重新登录')
|
|
103
|
+
clearToken()
|
|
104
|
+
window.location.href = '/login'
|
|
105
|
+
return Promise.reject(new Error(data.message || 'EXPIRED OR INVALID TOKEN'))
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// 业务错误
|
|
109
|
+
Message.error(data.message || '请求失败')
|
|
110
|
+
return Promise.reject(new Error(data.message || '请求失败'))
|
|
111
|
+
},
|
|
112
|
+
(error) => {
|
|
113
|
+
const { response } = error
|
|
114
|
+
|
|
115
|
+
if (response) {
|
|
116
|
+
// 检查响应体中的 code
|
|
117
|
+
const { data } = response
|
|
118
|
+
if (data?.code === 9121) {
|
|
119
|
+
Message.error('登录已过期,请重新登录')
|
|
120
|
+
clearToken()
|
|
121
|
+
window.location.href = '/login'
|
|
122
|
+
return Promise.reject(error)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
switch (response.status) {
|
|
126
|
+
case 401:
|
|
127
|
+
Message.error('登录已过期,请重新登录')
|
|
128
|
+
clearToken()
|
|
129
|
+
window.location.href = '/login'
|
|
130
|
+
break
|
|
131
|
+
case 403:
|
|
132
|
+
Message.error('没有权限访问')
|
|
133
|
+
break
|
|
134
|
+
case 404:
|
|
135
|
+
Message.error('请求资源不存在')
|
|
136
|
+
break
|
|
137
|
+
case 500:
|
|
138
|
+
Message.error('服务器错误')
|
|
139
|
+
break
|
|
140
|
+
default:
|
|
141
|
+
Message.error(response.data?.message || '请求失败')
|
|
142
|
+
}
|
|
143
|
+
} else {
|
|
144
|
+
Message.error('网络连接失败')
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return Promise.reject(error)
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
return instance
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const request = createRequest()
|
|
155
|
+
|
|
156
|
+
// 请求方法 - 直接返回实际数据,无需手动解包
|
|
157
|
+
export const http = {
|
|
158
|
+
get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {
|
|
159
|
+
return request.get(url, config)
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
|
163
|
+
return request.post(url, data, config)
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
|
167
|
+
return request.put(url, data, config)
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
patch<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
|
|
171
|
+
return request.patch(url, data, config)
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {
|
|
175
|
+
return request.delete(url, config)
|
|
176
|
+
},
|
|
177
|
+
|
|
178
|
+
// 文件下载 - 返回 Blob 对象
|
|
179
|
+
download(url: string, config?: AxiosRequestConfig): Promise<Blob> {
|
|
180
|
+
return request.get(url, { ...config, responseType: 'blob' })
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export default request
|