xto-fronted 0.4.102 → 0.4.103

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.
Files changed (144) hide show
  1. package/dist/{index-3ekBp4iW.js → index-BlN5yXBT.js} +2 -2
  2. package/dist/{index-BKj-34y6.js → index-BsPaXQak.js} +2 -2
  3. package/dist/{index-CJSTBnGF.js → index-CNx4xpUG.js} +981 -971
  4. package/dist/{index-BK4Mut6H.js → index-DEChud2_.js} +2 -2
  5. package/dist/{index-B5DLfOYb.js → index-DdACCkye.js} +23 -23
  6. package/dist/index.js +1 -1
  7. package/dist/stores/app.d.ts +8 -2
  8. package/dist/stores/auth.d.ts +2 -2
  9. package/dist/style.css +1 -1
  10. package/package.json +94 -94
  11. package/src/App.vue +48 -48
  12. package/src/api/index.ts +7 -7
  13. package/src/assets/styles/_dark.scss +639 -639
  14. package/src/assets/styles/_root.scss +183 -183
  15. package/src/assets/styles/_variables.scss +69 -69
  16. package/src/assets/styles/index.scss +460 -460
  17. package/src/components/Layout/Header.vue +2 -2
  18. package/src/components/Layout/MixTopMenu.vue +1185 -1185
  19. package/src/components/Layout/Sidebar.vue +229 -229
  20. package/src/components/Layout/SidebarMenuItem.vue +163 -163
  21. package/src/components/Layout/TopMenu.vue +1177 -1177
  22. package/src/components/Layout/index.vue +199 -199
  23. package/src/composables/useI18n.ts +43 -43
  24. package/src/index.ts +114 -100
  25. package/src/router/layoutRoute.ts +70 -70
  26. package/src/stores/app.ts +9 -0
  27. package/src/stores/index.ts +15 -15
  28. package/src/stores/locale.ts +66 -66
  29. package/src/stores/user.ts +0 -2
  30. package/src/types/api.d.ts +0 -1
  31. package/src/types/json-bigint.d.ts +18 -18
  32. package/src/types/xto.d.ts +172 -172
  33. package/src/utils/request.ts +184 -184
  34. package/src/views/dashboard/index.vue +545 -545
  35. package/src/views/error/403.vue +251 -251
  36. package/src/views/error/404.vue +253 -253
  37. package/src/views/login/index.vue +586 -586
  38. package/src/views/system/menu/index.vue +690 -690
  39. package/src/views/system/role/index.vue +583 -583
  40. package/src/views/system/user/index.vue +655 -655
  41. package/vite.config.ts +139 -139
  42. package/dist/assets/404-C9Uh6Uu-.css +0 -1
  43. package/dist/assets/404-fVB40gfP.js +0 -1
  44. package/dist/assets/404-zjGLLssH.js +0 -1
  45. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +0 -1
  46. package/dist/assets/index-B2Y_ySNp.js +0 -2
  47. package/dist/assets/index-B5xc4gQB.css +0 -1
  48. package/dist/assets/index-B75sburk.js +0 -1
  49. package/dist/assets/index-BBdRdMfs.js +0 -1
  50. package/dist/assets/index-BDgOY6Rp.js +0 -1
  51. package/dist/assets/index-BIoRANs0.js +0 -1
  52. package/dist/assets/index-BRR97dc6.js +0 -1
  53. package/dist/assets/index-Bz0BgZQ1.js +0 -1
  54. package/dist/assets/index-CAdztNsv.css +0 -1
  55. package/dist/assets/index-CCXrcISf.css +0 -1
  56. package/dist/assets/index-CDPHn9Pd.js +0 -1
  57. package/dist/assets/index-CfpZmcpk.css +0 -1
  58. package/dist/assets/index-Cpew6d-v.css +0 -1
  59. package/dist/assets/index-CwJSA85U.js +0 -1
  60. package/dist/assets/index-CwRA10ac.js +0 -1
  61. package/dist/assets/index-D8NDxq9d.js +0 -1
  62. package/dist/assets/index-DEB6-Iv_.js +0 -2
  63. package/dist/assets/index-DM4Ezclc.css +0 -1
  64. package/dist/assets/index-DYv7nImj.css +0 -1
  65. package/dist/assets/index-Dm3Gq6SY.js +0 -1
  66. package/dist/assets/index-DxbgF-OR.js +0 -1
  67. package/dist/assets/index-RUdXk1fA.css +0 -1
  68. package/dist/assets/index-_xB0udHf.js +0 -1
  69. package/dist/assets/index-t-2Y0KhA.css +0 -1
  70. package/dist/assets/vendor-CUVPinTg.js +0 -13
  71. package/dist/assets/vue-vendor-Bpie-0gH.js +0 -29
  72. package/dist/assets/vue-vendor-DeJXJVbN.js +0 -29
  73. package/dist/assets/xto-base-C3XNcx7i.js +0 -1
  74. package/dist/assets/xto-base-CL2NKZJJ.css +0 -1
  75. package/dist/assets/xto-base-PwLGsxxb.js +0 -1
  76. package/dist/assets/xto-business--V1F5Gwb.css +0 -1
  77. package/dist/assets/xto-core-B1Ho_Ytu.js +0 -1
  78. package/dist/assets/xto-core-CtL4zKiV.js +0 -1
  79. package/dist/assets/xto-data-Coeo_ZYH.js +0 -1
  80. package/dist/assets/xto-data-MxZsiJgi.css +0 -1
  81. package/dist/assets/xto-data-bCXQa7fT.js +0 -1
  82. package/dist/assets/xto-feedback-Bxx38c3P.css +0 -1
  83. package/dist/assets/xto-feedback-CFysasJi.js +0 -1
  84. package/dist/assets/xto-feedback-CPydp0kn.js +0 -1
  85. package/dist/assets/xto-form-Cu6q3VLG.css +0 -1
  86. package/dist/assets/xto-form-DBlhgyXp.js +0 -1
  87. package/dist/assets/xto-form-bywohdAf.js +0 -1
  88. package/dist/assets/xto-layout-BDD6sSlM.css +0 -1
  89. package/dist/assets/xto-navigation-Bbdpine9.js +0 -1
  90. package/dist/assets/xto-navigation-I2o1CycT.js +0 -1
  91. package/dist/assets/xto-navigation-XfpyMpEo.css +0 -1
  92. package/dist/index-58aI1w0v.js +0 -515
  93. package/dist/index-A_B_Ap_A.js +0 -4240
  94. package/dist/index-B-lMqzxZ.js +0 -479
  95. package/dist/index-B6s_uLJE.js +0 -189
  96. package/dist/index-BAmYUT0G.js +0 -189
  97. package/dist/index-BJlOXgu5.js +0 -515
  98. package/dist/index-BMQao91y.js +0 -189
  99. package/dist/index-BRvi9qW-.js +0 -515
  100. package/dist/index-BVGW4DDQ.js +0 -189
  101. package/dist/index-BXg94yA2.js +0 -515
  102. package/dist/index-BYAkZ2gD.js +0 -641
  103. package/dist/index-BfXnrw05.js +0 -515
  104. package/dist/index-Bmb0rt9C.js +0 -641
  105. package/dist/index-Bmf0YbVq.js +0 -189
  106. package/dist/index-C1BnOFy7.js +0 -3145
  107. package/dist/index-C1j4f3mM.js +0 -479
  108. package/dist/index-C2-a5KSQ.js +0 -4233
  109. package/dist/index-C3K89jzC.js +0 -515
  110. package/dist/index-C92NkXAn.js +0 -479
  111. package/dist/index-CAHSv7LK.js +0 -4285
  112. package/dist/index-CVH7bDsl.js +0 -4285
  113. package/dist/index-Ccp6zfq-.js +0 -4290
  114. package/dist/index-CeZ0CSSs.js +0 -641
  115. package/dist/index-Cf8E7FM1.js +0 -4270
  116. package/dist/index-CgyQqbdx.js +0 -189
  117. package/dist/index-ChowNrlU.js +0 -641
  118. package/dist/index-CvQgEgUM.js +0 -641
  119. package/dist/index-D25KzR0I.js +0 -479
  120. package/dist/index-D4LWXVnG.js +0 -515
  121. package/dist/index-DCApv1oX.js +0 -641
  122. package/dist/index-DCBIjLHy.js +0 -515
  123. package/dist/index-DEYOivza.js +0 -641
  124. package/dist/index-DHH8Os_2.js +0 -189
  125. package/dist/index-DReodgBw.js +0 -4233
  126. package/dist/index-DTRJONCd.js +0 -515
  127. package/dist/index-DgffG7KK.js +0 -641
  128. package/dist/index-DjERNRXX.js +0 -515
  129. package/dist/index-DjXyzwL0.js +0 -479
  130. package/dist/index-DkOqM4e2.js +0 -3147
  131. package/dist/index-Ds8IV04t.js +0 -189
  132. package/dist/index-LSdsO2Ox.js +0 -479
  133. package/dist/index-UJixTdep.js +0 -479
  134. package/dist/index-WPRGF_GX.js +0 -189
  135. package/dist/index-WPWzllES.js +0 -641
  136. package/dist/index-Wl2Qg26t.js +0 -3147
  137. package/dist/index-dk0diNwi.js +0 -479
  138. package/dist/index-gBlRG4kk.js +0 -479
  139. package/dist/index-mVol7F2K.js +0 -479
  140. package/dist/index-xWU3J3OH.js +0 -641
  141. package/dist/index-zKJLxthI.js +0 -189
  142. package/dist/index.es.js +0 -95
  143. package/dist/index.html +0 -28
  144. package/dist/index.umd.js +0 -8
@@ -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