@gx-design-vue/create-gx-cli 0.1.10 → 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (179) hide show
  1. package/package.json +2 -1
  2. package/template-gx-design-thin/.editorconfig +19 -0
  3. package/template-gx-design-thin/.env +4 -0
  4. package/template-gx-design-thin/.env.development +15 -0
  5. package/template-gx-design-thin/.env.production +28 -0
  6. package/template-gx-design-thin/.eslintignore +16 -0
  7. package/template-gx-design-thin/.prettierignore +9 -0
  8. package/template-gx-design-thin/LICENSE +21 -0
  9. package/template-gx-design-thin/README.md +112 -0
  10. package/template-gx-design-thin/build/constant.ts +1 -0
  11. package/template-gx-design-thin/build/generate/generateModifyVars.ts +14 -0
  12. package/template-gx-design-thin/build/rollupOptions/index.ts +22 -0
  13. package/template-gx-design-thin/build/util/hash.ts +17 -0
  14. package/template-gx-design-thin/build/util/index.ts +131 -0
  15. package/template-gx-design-thin/build/vite/cdn.ts +63 -0
  16. package/template-gx-design-thin/build/vite/optimizer.ts +26 -0
  17. package/template-gx-design-thin/build/vite/plugin/appConfig.ts +91 -0
  18. package/template-gx-design-thin/build/vite/plugin/autoImport.ts +26 -0
  19. package/template-gx-design-thin/build/vite/plugin/compress.ts +31 -0
  20. package/template-gx-design-thin/build/vite/plugin/html.ts +39 -0
  21. package/template-gx-design-thin/build/vite/plugin/index.ts +75 -0
  22. package/template-gx-design-thin/build/vite/plugin/mock.ts +14 -0
  23. package/template-gx-design-thin/build/vite/plugin/pwa.ts +31 -0
  24. package/template-gx-design-thin/build/vite/plugin/visualizer.ts +14 -0
  25. package/template-gx-design-thin/build/vite/plugin/viteMock/client.ts +88 -0
  26. package/template-gx-design-thin/build/vite/plugin/viteMock/createMockServer.ts +271 -0
  27. package/template-gx-design-thin/build/vite/plugin/viteMock/index.ts +69 -0
  28. package/template-gx-design-thin/build/vite/plugin/viteMock/types.ts +48 -0
  29. package/template-gx-design-thin/build/vite/plugin/viteMock/utils.ts +48 -0
  30. package/template-gx-design-thin/build/vite/plugin/viteNotice.ts +40 -0
  31. package/template-gx-design-thin/commitlint.config.cjs +32 -0
  32. package/template-gx-design-thin/config/default/defaultSettings.ts +78 -0
  33. package/template-gx-design-thin/config/default/network.ts +10 -0
  34. package/template-gx-design-thin/config/default/proxy.ts +47 -0
  35. package/template-gx-design-thin/config/default/theme.ts +3 -0
  36. package/template-gx-design-thin/config/index.ts +11 -0
  37. package/template-gx-design-thin/eslint.config.js +51 -0
  38. package/template-gx-design-thin/index.html +42 -0
  39. package/template-gx-design-thin/mock/_createProductionServer.ts +19 -0
  40. package/template-gx-design-thin/mock/_util.ts +33 -0
  41. package/template-gx-design-thin/mock/config/menu.ts +21 -0
  42. package/template-gx-design-thin/mock/config/user.ts +123 -0
  43. package/template-gx-design-thin/mock/datasSource/system/menu.ts +10 -0
  44. package/template-gx-design-thin/mock/datasSource/user/account.ts +30 -0
  45. package/template-gx-design-thin/mock/datasSource/user/index.ts +47 -0
  46. package/template-gx-design-thin/mock/util/crypto.ts +23 -0
  47. package/template-gx-design-thin/mock/util/table.ts +92 -0
  48. package/template-gx-design-thin/mock/util/utils.ts +73 -0
  49. package/template-gx-design-thin/package.json +129 -0
  50. package/template-gx-design-thin/pnpm-lock.yaml +12575 -0
  51. package/template-gx-design-thin/prettier.config.cjs +18 -0
  52. package/template-gx-design-thin/public/resource/css/index.css +119 -0
  53. package/template-gx-design-thin/public/resource/css/normalize.css +396 -0
  54. package/template-gx-design-thin/public/resource/img/favicon.ico +0 -0
  55. package/template-gx-design-thin/public/resource/img/logo.png +0 -0
  56. package/template-gx-design-thin/public/resource/img/pro_icon.svg +1 -0
  57. package/template-gx-design-thin/public/resource/img/pwa-192x192.png +0 -0
  58. package/template-gx-design-thin/public/resource/img/pwa-512x512.png +0 -0
  59. package/template-gx-design-thin/src/App.vue +42 -0
  60. package/template-gx-design-thin/src/assets/error_images/403.png +0 -0
  61. package/template-gx-design-thin/src/assets/error_images/404.png +0 -0
  62. package/template-gx-design-thin/src/assets/error_images/cloud.png +0 -0
  63. package/template-gx-design-thin/src/assets/login_images/login_background.svg +1 -0
  64. package/template-gx-design-thin/src/assets/logo.png +0 -0
  65. package/template-gx-design-thin/src/assets/menu_font/iconfont.css +94 -0
  66. package/template-gx-design-thin/src/assets/menu_font/iconfont.eot +0 -0
  67. package/template-gx-design-thin/src/assets/menu_font/iconfont.js +1 -0
  68. package/template-gx-design-thin/src/assets/menu_font/iconfont.json +142 -0
  69. package/template-gx-design-thin/src/assets/menu_font/iconfont.svg +1 -0
  70. package/template-gx-design-thin/src/assets/menu_font/iconfont.ttf +0 -0
  71. package/template-gx-design-thin/src/assets/menu_font/iconfont.woff +0 -0
  72. package/template-gx-design-thin/src/assets/menu_font/iconfont.woff2 +0 -0
  73. package/template-gx-design-thin/src/assets/menu_font/index.less +94 -0
  74. package/template-gx-design-thin/src/assets/public_icon/iconfont.css +42 -0
  75. package/template-gx-design-thin/src/assets/public_icon/iconfont.eot +0 -0
  76. package/template-gx-design-thin/src/assets/public_icon/iconfont.js +1 -0
  77. package/template-gx-design-thin/src/assets/public_icon/iconfont.json +51 -0
  78. package/template-gx-design-thin/src/assets/public_icon/iconfont.svg +1 -0
  79. package/template-gx-design-thin/src/assets/public_icon/iconfont.ttf +0 -0
  80. package/template-gx-design-thin/src/assets/public_icon/iconfont.woff +0 -0
  81. package/template-gx-design-thin/src/assets/public_icon/iconfont.woff2 +0 -0
  82. package/template-gx-design-thin/src/assets/public_icon/index.less +42 -0
  83. package/template-gx-design-thin/src/assets/public_images/nodata.svg +1 -0
  84. package/template-gx-design-thin/src/common/global.ts +4 -0
  85. package/template-gx-design-thin/src/components/GDesign/Result/index.tsx +144 -0
  86. package/template-gx-design-thin/src/components/GDesign/Result/style.less +140 -0
  87. package/template-gx-design-thin/src/components/GDesign/utils/index.ts +7 -0
  88. package/template-gx-design-thin/src/components/GlobalLayout/Confirm/index.ts +21 -0
  89. package/template-gx-design-thin/src/components/GlobalLayout/Empty/index.vue +18 -0
  90. package/template-gx-design-thin/src/components/GlobalLayout/RightContent/index.tsx +126 -0
  91. package/template-gx-design-thin/src/components/GlobalLayout/RightContent/style.ts +77 -0
  92. package/template-gx-design-thin/src/components/GlobalLayout/Spin/index.tsx +30 -0
  93. package/template-gx-design-thin/src/components/PageLoading/index.tsx +51 -0
  94. package/template-gx-design-thin/src/components/index.ts +6 -0
  95. package/template-gx-design-thin/src/core/ant-design/index.ts +10 -0
  96. package/template-gx-design-thin/src/core/gx-admin-design/index.ts +6 -0
  97. package/template-gx-design-thin/src/core/gx-design/index.ts +6 -0
  98. package/template-gx-design-thin/src/core/gx-pro-design/index.ts +8 -0
  99. package/template-gx-design-thin/src/core/index.ts +84 -0
  100. package/template-gx-design-thin/src/design/ant-design/index.less +4 -0
  101. package/template-gx-design-thin/src/design/ant-design/layout.less +22 -0
  102. package/template-gx-design-thin/src/design/ant-design/menu.less +48 -0
  103. package/template-gx-design-thin/src/design/ant-design/spin.less +23 -0
  104. package/template-gx-design-thin/src/design/ant-design/tooltip.less +7 -0
  105. package/template-gx-design-thin/src/design/color.less +1 -0
  106. package/template-gx-design-thin/src/design/config.less +5 -0
  107. package/template-gx-design-thin/src/design/imageEditor.less +180 -0
  108. package/template-gx-design-thin/src/design/index.less +95 -0
  109. package/template-gx-design-thin/src/design/mixin.less +65 -0
  110. package/template-gx-design-thin/src/design/normalize.less +391 -0
  111. package/template-gx-design-thin/src/design/root.less +3 -0
  112. package/template-gx-design-thin/src/hooks/core/index.ts +3 -0
  113. package/template-gx-design-thin/src/hooks/core/useRequest/index.ts +118 -0
  114. package/template-gx-design-thin/src/hooks/event/index.ts +3 -0
  115. package/template-gx-design-thin/src/hooks/event/useClipboard.ts +15 -0
  116. package/template-gx-design-thin/src/hooks/web/index.ts +5 -0
  117. package/template-gx-design-thin/src/hooks/web/useThemeStyle.ts +16 -0
  118. package/template-gx-design-thin/src/layout/BasicLayout.vue +123 -0
  119. package/template-gx-design-thin/src/layout/BlankLayout.vue +5 -0
  120. package/template-gx-design-thin/src/layout/ContentView.vue +50 -0
  121. package/template-gx-design-thin/src/layout/IframeView.vue +1 -0
  122. package/template-gx-design-thin/src/layout/UserLayout.vue +7 -0
  123. package/template-gx-design-thin/src/main.ts +34 -0
  124. package/template-gx-design-thin/src/plugins/index.ts +2 -0
  125. package/template-gx-design-thin/src/router/guard/index.ts +83 -0
  126. package/template-gx-design-thin/src/router/guard/permissions.ts +70 -0
  127. package/template-gx-design-thin/src/router/guard/stateGuard.ts +10 -0
  128. package/template-gx-design-thin/src/router/helper/routeHelper.ts +231 -0
  129. package/template-gx-design-thin/src/router/helper/utils.ts +19 -0
  130. package/template-gx-design-thin/src/router/index.ts +31 -0
  131. package/template-gx-design-thin/src/router/routes/index.ts +86 -0
  132. package/template-gx-design-thin/src/router/routes/modules/dataSource.ts +12 -0
  133. package/template-gx-design-thin/src/services/common/index.ts +11 -0
  134. package/template-gx-design-thin/src/services/systemCenter/index.ts +1 -0
  135. package/template-gx-design-thin/src/services/systemCenter/menu.ts +9 -0
  136. package/template-gx-design-thin/src/services/userCenter/account.ts +42 -0
  137. package/template-gx-design-thin/src/services/userCenter/index.ts +28 -0
  138. package/template-gx-design-thin/src/store/index.ts +32 -0
  139. package/template-gx-design-thin/src/store/modules/dict.ts +28 -0
  140. package/template-gx-design-thin/src/store/modules/global.ts +42 -0
  141. package/template-gx-design-thin/src/store/modules/permission.ts +19 -0
  142. package/template-gx-design-thin/src/store/modules/routes.ts +113 -0
  143. package/template-gx-design-thin/src/store/modules/tabsRouter.ts +76 -0
  144. package/template-gx-design-thin/src/store/modules/user.ts +136 -0
  145. package/template-gx-design-thin/src/utils/accessToken.ts +80 -0
  146. package/template-gx-design-thin/src/utils/crypto/base64.ts +101 -0
  147. package/template-gx-design-thin/src/utils/crypto/index.ts +57 -0
  148. package/template-gx-design-thin/src/utils/env.ts +50 -0
  149. package/template-gx-design-thin/src/utils/fetchFile.ts +81 -0
  150. package/template-gx-design-thin/src/utils/index.ts +123 -0
  151. package/template-gx-design-thin/src/utils/pageTitle.ts +20 -0
  152. package/template-gx-design-thin/src/utils/request/XHR.ts +139 -0
  153. package/template-gx-design-thin/src/utils/request/axiosCancel.ts +69 -0
  154. package/template-gx-design-thin/src/utils/request/checkStatus.ts +25 -0
  155. package/template-gx-design-thin/src/utils/request/index.ts +144 -0
  156. package/template-gx-design-thin/src/utils/request/typings.ts +171 -0
  157. package/template-gx-design-thin/src/utils/storage.ts +199 -0
  158. package/template-gx-design-thin/src/utils/uploadFile.ts +27 -0
  159. package/template-gx-design-thin/src/utils/util.ts +198 -0
  160. package/template-gx-design-thin/src/utils/validate.ts +216 -0
  161. package/template-gx-design-thin/src/views/Iframe/index.vue +76 -0
  162. package/template-gx-design-thin/src/views/Page/one.vue +13 -0
  163. package/template-gx-design-thin/src/views/Page/two.vue +13 -0
  164. package/template-gx-design-thin/src/views/exception/403/index.vue +7 -0
  165. package/template-gx-design-thin/src/views/exception/404/index.vue +9 -0
  166. package/template-gx-design-thin/src/views/user/login/index.vue +109 -0
  167. package/template-gx-design-thin/src/views/user/login/style.less +38 -0
  168. package/template-gx-design-thin/tsconfig.json +46 -0
  169. package/template-gx-design-thin/types/ant-design-import.d.ts +99 -0
  170. package/template-gx-design-thin/types/auto-imports.d.ts +81 -0
  171. package/template-gx-design-thin/types/components.d.ts +24 -0
  172. package/template-gx-design-thin/types/config.d.ts +44 -0
  173. package/template-gx-design-thin/types/global.d.ts +97 -0
  174. package/template-gx-design-thin/types/mock.d.ts +16 -0
  175. package/template-gx-design-thin/types/module.d.ts +20 -0
  176. package/template-gx-design-thin/types/response.d.ts +15 -0
  177. package/template-gx-design-thin/unocss.config.ts +101 -0
  178. package/template-gx-design-thin/vite.config.ts +120 -0
  179. package/template-gx-design-thin/yarn.lock +9492 -0
@@ -0,0 +1,57 @@
1
+ import 'crypto-js/enc-utf8'
2
+ import 'crypto-js/tripledes'
3
+ import 'crypto-js/sha1'
4
+ import * as CryptoJS from 'crypto-js/core'
5
+ import CryptoProJS from 'crypto-js'
6
+ import { isJSONStr } from '@/utils/validate'
7
+ import { isArray, isObject } from '@gx-design-vue/pro-utils'
8
+
9
+ const key = '1234123412ABCDEF' // 十六位十六进制数作为密钥
10
+
11
+ /**
12
+ * 登录密码加密
13
+ * @param password
14
+ * @returns {string}
15
+ */
16
+ export const encodePassword = (password: string) => {
17
+ const key = CryptoProJS.enc.Utf8.parse('8QONwyJtHesysWpM')
18
+ const passwordENC = CryptoProJS.AES.encrypt(password, key, {
19
+ mode: CryptoProJS.mode.ECB,
20
+ padding: CryptoProJS.pad.Pkcs7
21
+ })
22
+ const encodePW = passwordENC.ciphertext.toString()
23
+ return encodePW
24
+ }
25
+
26
+ // 加密方法
27
+ export function Encrypt(word) {
28
+ let str: string | object = word
29
+ if (isObject(word) || isArray(word)) {
30
+ str = JSON.stringify(word)
31
+ }
32
+ const keyHex = CryptoJS.enc.Utf8.parse(key)
33
+ const ivHex = CryptoJS.enc.Utf8.parse(key)
34
+ const encrypted = CryptoJS.DES.encrypt(str, keyHex, {
35
+ iv: ivHex,
36
+ mode: CryptoJS.mode.CBC,
37
+ padding: CryptoJS.pad.Pkcs7
38
+ })
39
+ return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
40
+ }
41
+
42
+ // 解密方法
43
+ export function Decrypt(word) {
44
+ const keyHex = CryptoJS.enc.Utf8.parse(key)
45
+ const ivHex = CryptoJS.enc.Utf8.parse(key)
46
+ const decrypted = CryptoJS.DES.decrypt({
47
+ ciphertext: CryptoJS.enc.Base64.parse(word)
48
+ }, keyHex, {
49
+ iv: ivHex,
50
+ mode: CryptoJS.mode.CBC,
51
+ padding: CryptoJS.pad.Pkcs7
52
+ })
53
+ const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8)
54
+ return isJSONStr(decryptedStr.toString())
55
+ ? JSON.parse(decryptedStr.toString())
56
+ : decryptedStr.toString()
57
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @Author gx12358
3
+ * @DateTime 2022/4/1
4
+ * @lastTime 2022/4/1
5
+ * @description 环境:本地开发环境
6
+ */
7
+ export function isDev(): boolean {
8
+ return typeViteEnv('VITE_APP_ENV') === 'dev'
9
+ }
10
+
11
+ /**
12
+ * @Author gx12358
13
+ * @DateTime 2022/4/1
14
+ * @lastTime 2022/4/1
15
+ * @description 环境:正式
16
+ */
17
+ export function isPro(): boolean {
18
+ return typeViteEnv('VITE_USE_MODE') === 'pro'
19
+ }
20
+
21
+ /**
22
+ * @Author gx12358
23
+ * @DateTime 2022/4/1
24
+ * @lastTime 2022/4/1
25
+ * @description 环境:非本地开发环境
26
+ */
27
+ export function isBuild(): boolean {
28
+ return typeViteEnv('VITE_NODE_ENV') === 'production'
29
+ }
30
+
31
+ /**
32
+ * @Author gx12358
33
+ * @DateTime 2022/4/1
34
+ * @lastTime 2022/4/1
35
+ * @description 当前联调环境
36
+ */
37
+ export function currentMode() {
38
+ return typeViteEnv('VITE_USE_MODE')
39
+ }
40
+
41
+ export function typeViteEnv<T extends keyof ViteEnv>(key: T): ViteEnv[T] | undefined {
42
+ let value: any = (import.meta as any).env[key]
43
+
44
+ if (value && typeof value === 'string') {
45
+ value = value.replace(/\\n/g, '\n') as ViteEnv[T]
46
+ value = value === 'true' ? true : value === 'false' ? false : value
47
+ }
48
+
49
+ return value
50
+ }
@@ -0,0 +1,81 @@
1
+ import type { Method } from 'axios'
2
+ import { message } from 'ant-design-vue'
3
+ import { defaultSettings } from '@gx-config'
4
+ import { tansParams } from '@/utils/util'
5
+ import { typeViteEnv } from '@/utils/env'
6
+
7
+ const { tokenName } = defaultSettings
8
+
9
+ export interface DownLoadRequestConfig<D = any> {
10
+ url: string;
11
+ method?: Method | string;
12
+ headers?: HeadersInit;
13
+ data?: D;
14
+ params?: any;
15
+ name?: string; // 下载的名称
16
+ direct?: boolean; // 是否直接使用url进行请求
17
+ read?: boolean; // 返回下载地址,不下载
18
+ showTip?: boolean; // 展示下载中字样
19
+ }
20
+
21
+ export default async function fetchFile(options: DownLoadRequestConfig): Promise<boolean | string> {
22
+ const user = useStoreUser()
23
+ if (options.showTip) {
24
+ message.loading({
25
+ content: `下载中,请耐心等待。。。。`,
26
+ key: 'updatable',
27
+ duration: 0
28
+ })
29
+ }
30
+ const opations: RequestInit = {
31
+ method: options.method,
32
+ headers: {
33
+ 'Content-Type': 'application/json',
34
+ ...options.headers
35
+ }
36
+ }
37
+ if (!options.direct)
38
+ options.url = `${typeViteEnv('VITE_BASE_URL')}${options.url}`
39
+ if (user.accessToken && !options.direct)
40
+ opations.headers[tokenName] = `${user.accessToken}`
41
+ if (options.params) {
42
+ let url = options.url + '?' + tansParams(options.params)
43
+ url = url.slice(0, -1)
44
+ options.url = url
45
+ }
46
+ if (options.method === 'post' && options.data) {
47
+ opations.body = JSON.stringify(options.data)
48
+ }
49
+ const response = await fetch(options.url, opations)
50
+ const fileName = options.name
51
+ ? options.name
52
+ : response.headers.get('content-disposition')
53
+ ? response.headers.get('content-disposition').split(';')[1].split('=')[1]
54
+ : ''
55
+ const blobResponse = await response.blob()
56
+ if (blobResponse) {
57
+ const a = window.document.createElement('a')
58
+ const downUrl = window.URL.createObjectURL(blobResponse)
59
+ if (options.read)
60
+ return downUrl
61
+ a.href = downUrl
62
+ a.download = `${decodeURI(fileName)}`
63
+ a.click()
64
+ if (options.showTip) {
65
+ message.success({
66
+ content: `下载成功`,
67
+ key: 'updatable'
68
+ })
69
+ }
70
+ window.URL.revokeObjectURL(downUrl)
71
+ return true
72
+ } else {
73
+ if (options.showTip) {
74
+ message.success({
75
+ content: `下载失败`,
76
+ key: 'updatable'
77
+ })
78
+ }
79
+ return false
80
+ }
81
+ }
@@ -0,0 +1,123 @@
1
+ import PropTypes from 'ant-design-vue/es/_util/vue-types'
2
+
3
+ export { PropTypes }
4
+
5
+ /**
6
+ * @author gx12358 2539306317@qq.com
7
+ * @description 将url请求参数转为json格式
8
+ * @param url
9
+ * @returns {{}|any}
10
+ */
11
+ export function paramObj(url) {
12
+ const search = url.split('?')[1]
13
+ if (!search) {
14
+ return {}
15
+ }
16
+ return JSON.parse(`{"${decodeURIComponent(search)
17
+ .replace(/"/g, '\\"')
18
+ .replace(/&/g, '","')
19
+ .replace(/=/g, '":"')
20
+ .replace(/\+/g, ' ')}"}`)
21
+ }
22
+
23
+ /**
24
+ * @author gx12358 2539306317@qq.com
25
+ * @description 父子关系的数组转换成树形结构数据
26
+ * @param data
27
+ * @returns {*}
28
+ */
29
+ export function translateDataToTree(data) {
30
+ const parent = data.filter(
31
+ value => value.parentId === 'undefined' || value.parentId == null
32
+ )
33
+ const children = data.filter(
34
+ value => value.parentId !== 'undefined' && value.parentId != null
35
+ )
36
+ const translator = (parent, children) => {
37
+ parent.forEach((parent) => {
38
+ children.forEach((current, index) => {
39
+ if (current.parentId === parent.id) {
40
+ const temp = JSON.parse(JSON.stringify(children))
41
+ temp.splice(index, 1)
42
+ translator([ current ], temp)
43
+ typeof parent.children !== 'undefined'
44
+ ? parent.children.push(current)
45
+ : (parent.children = [ current ])
46
+ }
47
+ })
48
+ })
49
+ }
50
+ translator(parent, children)
51
+ return parent
52
+ }
53
+
54
+ /**
55
+ * @author gx12358 2539306317@qq.com
56
+ * @description 树形结构数据转换成父子关系的数组
57
+ * @param data
58
+ * @returns {[]}
59
+ */
60
+ export function translateTreeToData(data) {
61
+ const result: any[] = []
62
+ data.forEach((item) => {
63
+ const loop = (data) => {
64
+ result.push({
65
+ id: data.id,
66
+ name: data.name,
67
+ parentId: data.parentId
68
+ })
69
+ const child = data.children
70
+ if (child) {
71
+ for (let i = 0; i < child.length; i++) {
72
+ loop(child[i])
73
+ }
74
+ }
75
+ }
76
+ loop(item)
77
+ })
78
+ return result
79
+ }
80
+
81
+ /**
82
+ * @author gx12358 2539306317@qq.com
83
+ * @description 10位时间戳转换
84
+ * @param time
85
+ * @returns {string}
86
+ */
87
+ export function tenBitTimestamp(time) {
88
+ const date = new Date(time * 1000)
89
+ const y = date.getFullYear()
90
+ let m: any = date.getMonth() + 1
91
+ m = m < 10 ? '' + m : m
92
+ let d: any = date.getDate()
93
+ d = d < 10 ? '' + d : d
94
+ let h: any = date.getHours()
95
+ h = h < 10 ? '0' + h : h
96
+ let minute: any = date.getMinutes()
97
+ let second: any = date.getSeconds()
98
+ minute = minute < 10 ? '0' + minute : minute
99
+ second = second < 10 ? '0' + second : second
100
+ return y + '年' + m + '月' + d + '日 ' + h + ':' + minute + ':' + second // 组合
101
+ }
102
+
103
+ /**
104
+ * @author gx12358 2539306317@qq.com
105
+ * @description 13位时间戳转换
106
+ * @param time
107
+ * @returns {string}
108
+ */
109
+ export function thirteenBitTimestamp(time) {
110
+ const date = new Date(time / 1)
111
+ const y = date.getFullYear()
112
+ let m: any = date.getMonth() + 1
113
+ m = m < 10 ? '' + m : m
114
+ let d: any = date.getDate()
115
+ d = d < 10 ? '' + d : d
116
+ let h: any = date.getHours()
117
+ h = h < 10 ? '0' + h : h
118
+ let minute: any = date.getMinutes()
119
+ let second: any = date.getSeconds()
120
+ minute = minute < 10 ? '0' + minute : minute
121
+ second = second < 10 ? '0' + second : second
122
+ return y + '年' + m + '月' + d + '日 ' + h + ':' + minute + ':' + second // 组合
123
+ }
@@ -0,0 +1,20 @@
1
+ import { defaultSettings } from '@gx-config'
2
+
3
+ const { title, titleReverse, titleSeparator } = defaultSettings
4
+
5
+ /**
6
+ * @author gx12358 2539306317@qq.com
7
+ * @description 设置标题
8
+ * @param pageTitle
9
+ * @returns {string}
10
+ */
11
+ export default function getPageTitle(pageTitle: string) {
12
+ let newTitles: string[] = []
13
+ if (pageTitle)
14
+ newTitles.push(pageTitle)
15
+ if (title)
16
+ newTitles.push(title)
17
+ if (titleReverse)
18
+ newTitles = newTitles.reverse()
19
+ return newTitles.join(titleSeparator)
20
+ }
@@ -0,0 +1,139 @@
1
+ import type { AxiosError } from 'axios'
2
+ import axios from 'axios'
3
+ import { cloneDeep } from 'lodash-es'
4
+ import qs from 'qs'
5
+ import { isFunction } from '@gx-design-vue/pro-utils'
6
+ import type { GAxiosInstance, GAxiosOptions, GAxiosResponse } from './typings'
7
+ import { ContentTypeEnum, RequestEnum } from './typings'
8
+ import { AxiosCanceler } from './axiosCancel'
9
+
10
+ export const getPendingUrl = (config: GAxiosOptions) => config.cancelKey || [ config.method, config.url ].join(
11
+ '&')
12
+
13
+ /**
14
+ * @Author gx12358
15
+ * @DateTime 2023/1/6
16
+ * @lastTime 2023/1/6
17
+ * @description 重新定义axios
18
+ */
19
+ export class GAxios {
20
+ private axiosInstance: GAxiosInstance
21
+ private readonly options: GAxiosOptions
22
+
23
+ constructor(options: GAxiosOptions) {
24
+ this.options = options
25
+ this.axiosInstance = axios.create(options) as GAxiosInstance
26
+ this.setupInterceptors()
27
+ }
28
+
29
+ /**
30
+ * @description: Interceptor configuration 拦截器配置
31
+ */
32
+ private setupInterceptors() {
33
+ const {
34
+ requestInterceptors,
35
+ requestInterceptorsCatch,
36
+ responseInterceptors,
37
+ responseInterceptorsCatch
38
+ } = this.options
39
+
40
+ const axiosCanceler = new AxiosCanceler(this.options.ignoreCancelToken)
41
+
42
+ this.axiosInstance.interceptors.request.use<GAxiosOptions>((config) => {
43
+ const { cancelCallBackHook } = config
44
+ axiosCanceler.addPending(config)
45
+ if (cancelCallBackHook) {
46
+ cancelCallBackHook({
47
+ reset: axiosCanceler.reset,
48
+ cancel: (key?: string) => axiosCanceler.removePending(config, key),
49
+ cancelAll: axiosCanceler.removeAllPending
50
+ })
51
+ }
52
+ if (requestInterceptors && isFunction(requestInterceptors)) {
53
+ config = requestInterceptors(config)
54
+ }
55
+ return config
56
+ }, undefined)
57
+
58
+ // Request interceptor error capture
59
+ requestInterceptorsCatch && isFunction(requestInterceptorsCatch) && this.axiosInstance.interceptors.request.use(
60
+ undefined,
61
+ requestInterceptorsCatch
62
+ )
63
+
64
+ // Response result interceptor processing
65
+ this.axiosInstance.interceptors.response.use((res: GAxiosResponse) => {
66
+ res && axiosCanceler.removePending(res.config)
67
+ if (responseInterceptors && isFunction(responseInterceptors)) {
68
+ return responseInterceptors(res)
69
+ }
70
+ return res
71
+ }, undefined)
72
+
73
+ // Response result interceptor error capture
74
+ responseInterceptorsCatch && isFunction(responseInterceptorsCatch) && this.axiosInstance.interceptors.response.use(
75
+ undefined,
76
+ (error) => {
77
+ axiosCanceler.removePending(error.config)
78
+
79
+ return responseInterceptorsCatch(this.axiosInstance, error)
80
+ }
81
+ )
82
+ }
83
+
84
+ // support form-data
85
+ supportFormData(config: GAxiosOptions) {
86
+ const headers = config.headers || this.options.headers
87
+ const contentType = headers?.['Content-Type'] || headers?.['content-type']
88
+
89
+ if (contentType !== ContentTypeEnum.FORM_URLENCODED || !Reflect.has(
90
+ config,
91
+ 'data'
92
+ ) || config.method?.toUpperCase() === RequestEnum.GET) {
93
+ return config
94
+ }
95
+
96
+ return {
97
+ ...config,
98
+ data: qs.stringify(config.data, { arrayFormat: 'brackets' })
99
+ }
100
+ }
101
+
102
+ request<T = ResponseResult | boolean>(config: GAxiosOptions): Promise<T> {
103
+ let conf: GAxiosOptions = cloneDeep(config)
104
+
105
+ const opt: GAxiosOptions = Object.assign({}, this.options, conf)
106
+
107
+ const { beforeRequestHook, requestCatchHook, transformResponseHook } = opt
108
+ if (beforeRequestHook && isFunction(beforeRequestHook)) {
109
+ conf = beforeRequestHook(opt)
110
+ }
111
+
112
+ conf = this.supportFormData(opt)
113
+
114
+ return new Promise((resolve) => {
115
+ this.axiosInstance
116
+ .request<any, GAxiosResponse>(conf)
117
+ .then((res: GAxiosResponse) => {
118
+ if (transformResponseHook && isFunction(transformResponseHook)) {
119
+ try {
120
+ const ret = transformResponseHook(res, config)
121
+ resolve(ret)
122
+ } catch (err) {
123
+ resolve(false as any)
124
+ return
125
+ }
126
+ return
127
+ }
128
+ resolve(res as unknown as Promise<T>)
129
+ })
130
+ .catch((e: Error | AxiosError) => {
131
+ if (requestCatchHook && isFunction(requestCatchHook)) {
132
+ resolve(requestCatchHook(e) as any)
133
+ return
134
+ }
135
+ resolve(false as any)
136
+ })
137
+ })
138
+ }
139
+ }
@@ -0,0 +1,69 @@
1
+ import type { Canceler } from 'axios'
2
+ import axios from 'axios'
3
+ import { isFunction } from '@gx-design-vue/pro-utils'
4
+ import type { GAxiosOptions } from './typings'
5
+
6
+ export const getPendingUrl = (
7
+ config: GAxiosOptions,
8
+ key?: string
9
+ ) => key || config.cancelKey || [ config.method, config.url ].join('&')
10
+
11
+ export class AxiosCanceler {
12
+ ignoreCancelToken: boolean
13
+ pendingMap: Map<string, Canceler>
14
+
15
+ constructor(ignoreCancel?: boolean) {
16
+ this.pendingMap = new Map<string, Canceler>()
17
+
18
+ this.ignoreCancelToken = ignoreCancel
19
+ }
20
+
21
+ /**
22
+ * Add request
23
+ * @param {Object} config
24
+ */
25
+ addPending(config: GAxiosOptions) {
26
+ !this.ignoreCancelToken && this.removePending(config)
27
+
28
+ const url = getPendingUrl(config)
29
+ config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
30
+ if (!this.pendingMap.has(url)) {
31
+ // If there is no current request in pending, add it
32
+ this.pendingMap.set(url, cancel)
33
+ }
34
+ })
35
+ }
36
+
37
+ /**
38
+ * @description: Clear all pending
39
+ */
40
+ removeAllPending() {
41
+ this.pendingMap.forEach((cancel) => {
42
+ cancel && isFunction(cancel) && cancel()
43
+ })
44
+ this.pendingMap.clear()
45
+ }
46
+
47
+ /**
48
+ * Removal request
49
+ * @param {Object} config
50
+ */
51
+ removePending(config: GAxiosOptions, key?: string) {
52
+ const url = getPendingUrl(config, key)
53
+
54
+ if (this.pendingMap.has(url)) {
55
+ // If there is a current request identifier in pending,
56
+ // the current request needs to be cancelled and removed
57
+ const cancel = this.pendingMap.get(url)
58
+ cancel && cancel(url)
59
+ this.pendingMap.delete(url)
60
+ }
61
+ }
62
+
63
+ /**
64
+ * @description: reset
65
+ */
66
+ reset(): void {
67
+ this.pendingMap = new Map<string, Canceler>()
68
+ }
69
+ }
@@ -0,0 +1,25 @@
1
+ import { useStoreUser } from '@/store'
2
+ import { message } from 'ant-design-vue'
3
+ import { router } from '@/router'
4
+
5
+ /**
6
+ * @author gx12358 2539306317@qq.com
7
+ * @description 处理code异常
8
+ * @param {*} code
9
+ * @param {*} msg
10
+ */
11
+ export const handleCode = (code: number, msg: string) => {
12
+ const user = useStoreUser()
13
+ switch (code) {
14
+ case 401:
15
+ user.resetPermissions()
16
+ router.push({ path: '/user/login' })
17
+ break
18
+ case 403:
19
+ router.push({ path: '/exception/403' })
20
+ break
21
+ default:
22
+ message.error(msg || '后端接口异常')
23
+ break
24
+ }
25
+ }