Commit 98942151 authored by 申中慧's avatar 申中慧

feat: 添加tailwindcss

parent e03076bf
Pipeline #201 failed with stages
......@@ -120,7 +120,8 @@ pnpm run build
- [x] devexpress的国际化
- [x] antd的国际化
- [x] react-inil的国际化
- [x] icon图标处理
- [x] ico图标配置
- [ ] 顶部页签功能
## Vite 打包
......
......@@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Cpas Cloud</title>
</head>
......
......@@ -39,7 +39,6 @@
"ahooks": "^3.7.5",
"amis": "^1.9.1-beta.17",
"antd": "^4.24.13",
"autoprefixer": "^9",
"axios": "^1.3.4",
"bignumber.js": "^9.1.2",
"bizcharts": "^3.5.3-beta.0",
......@@ -70,7 +69,6 @@
"numbro": "2.1.2",
"omit.js": "^2.0.2",
"pikaday": "1.8.2",
"postcss": "^8.4.21",
"postcss-less": "^6.0.0",
"prop-types": "^15.8.1",
"pubsub-js": "^1.9.4",
......@@ -117,6 +115,7 @@
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"@vitejs/plugin-react": "^4.0.4",
"autoprefixer": "^9.8.8",
"eslint": "^8.35.0",
"eslint-config-prettier": "^8.6.0",
"eslint-plugin-prettier": "^4.2.1",
......@@ -124,10 +123,12 @@
"husky": "^8.0.3",
"lint-staged": "^13.1.2",
"mockjs": "^1.1.0",
"postcss": "^8.4.29",
"prettier": "^2.8.4",
"qs": "^6.11.0",
"stylelint": "^15.2.0",
"stylelint-config-standard": "^30.0.1",
"tailwindcss": "^3.3.3",
"typescript": "^4.9.3",
"vite": "^4.1.0",
"vite-plugin-eslint": "^1.8.1",
......
......@@ -33,7 +33,7 @@ specifiers:
ahooks: ^3.7.5
amis: ^1.9.1-beta.17
antd: ^4.24.13
autoprefixer: ^9
autoprefixer: ^9.8.8
axios: ^1.3.4
bignumber.js: ^9.1.2
bizcharts: ^3.5.3-beta.0
......@@ -71,7 +71,7 @@ specifiers:
numbro: 2.1.2
omit.js: ^2.0.2
pikaday: 1.8.2
postcss: ^8.4.21
postcss: ^8.4.29
postcss-less: ^6.0.0
prettier: ^2.8.4
prop-types: ^15.8.1
......@@ -98,6 +98,7 @@ specifiers:
stylelint: ^15.2.0
stylelint-config-standard: ^30.0.1
swap-array: ^1.0.0
tailwindcss: ^3.3.3
typescript: ^4.9.3
vite: ^4.1.0
vite-plugin-eslint: ^1.8.1
......@@ -118,7 +119,6 @@ dependencies:
ahooks: 3.7.8_react@18.2.0
amis: 1.10.2_vnxzf5c44dqo4vncfl2mrh2gwm
antd: 4.24.14_biqbaboplfbrettd7655fr4n2y
autoprefixer: 9.8.8
axios: 1.5.0
bignumber.js: 9.1.2
bizcharts: 3.5.10_react@18.2.0
......@@ -149,7 +149,6 @@ dependencies:
numbro: 2.1.2
omit.js: 2.0.2
pikaday: 1.8.2
postcss: 8.4.29
postcss-less: 6.0.0_postcss@8.4.29
prop-types: 15.8.1
pubsub-js: 1.9.4
......@@ -196,6 +195,7 @@ devDependencies:
'@typescript-eslint/eslint-plugin': 5.62.0_negeeoqbi2ljvsevyuoae5nley
'@typescript-eslint/parser': 5.62.0_cgvy6hrg3pjeapqw5wnuqcmdo4
'@vitejs/plugin-react': 4.0.4_vite@4.4.9
autoprefixer: 9.8.8
eslint: 8.48.0
eslint-config-prettier: 8.10.0_eslint@8.48.0
eslint-plugin-prettier: 4.2.1_b7j5i5eung22avfvwixh6yzuzu
......@@ -203,10 +203,12 @@ devDependencies:
husky: 8.0.3
lint-staged: 13.3.0
mockjs: 1.1.0
postcss: 8.4.29
prettier: 2.8.8
qs: 6.11.2
stylelint: 15.10.3_typescript@4.9.5
stylelint-config-standard: 30.0.1_stylelint@15.10.3
tailwindcss: 3.3.3
typescript: 4.9.5
vite: 4.4.9_q7xhixpld7lmo2xfbcsk6cnlcy
vite-plugin-eslint: 1.8.1_eslint@8.48.0+vite@4.4.9
......@@ -218,6 +220,11 @@ packages:
resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
engines: {node: '>=0.10.0'}
/@alloc/quick-lru/5.2.0:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
dev: true
/@amap/amap-jsapi-loader/1.0.1:
resolution: {integrity: sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==}
dev: false
......@@ -3425,6 +3432,10 @@ packages:
scroll-into-view-if-needed: 2.2.31
dev: false
/any-promise/1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
dev: true
/anymatch/3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
......@@ -3481,6 +3492,10 @@ packages:
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
dev: true
/arg/5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
dev: true
/argparse/2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
......@@ -3622,7 +3637,7 @@ packages:
picocolors: 0.2.1
postcss: 7.0.39
postcss-value-parser: 4.2.0
dev: false
dev: true
/available-typed-arrays/1.0.5:
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
......@@ -3794,6 +3809,11 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
/camelcase-css/2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
dev: true
/camelcase-keys/6.2.2:
resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
engines: {node: '>=8'}
......@@ -4056,6 +4076,11 @@ packages:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
dev: false
/commander/4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
dev: true
/compare-func/2.0.0:
resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
dependencies:
......@@ -4658,6 +4683,10 @@ packages:
engines: {node: '>=6.0'}
dev: false
/didyoumean/1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
dev: true
/diff-sequences/26.6.2:
resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==}
engines: {node: '>= 10.14.2'}
......@@ -4674,6 +4703,10 @@ packages:
dependencies:
path-type: 4.0.0
/dlv/1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
dev: true
/doctrine/2.1.0:
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
engines: {node: '>=0.10.0'}
......@@ -5895,6 +5928,17 @@ packages:
dependencies:
is-glob: 4.0.3
/glob/7.1.6:
resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
inherits: 2.0.4
minimatch: 3.1.2
once: 1.4.0
path-is-absolute: 1.0.1
dev: true
/glob/7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
dependencies:
......@@ -6638,6 +6682,11 @@ packages:
engines: {node: '>= 10.14.2'}
dev: true
/jiti/1.20.0:
resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==}
hasBin: true
dev: true
/jquery-mousewheel/3.1.13:
resolution: {integrity: sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg==}
dev: false
......@@ -7452,6 +7501,14 @@ packages:
resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==}
dev: false
/mz/2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
dependencies:
any-promise: 1.3.0
object-assign: 4.1.1
thenify-all: 1.6.0
dev: true
/nano-css/5.3.5_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==}
peerDependencies:
......@@ -7549,7 +7606,7 @@ packages:
/normalize-range/0.1.2:
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
engines: {node: '>=0.10.0'}
dev: false
dev: true
/normalize.css/7.0.0:
resolution: {integrity: sha512-LYaFZxj2Q1Q9e1VJ0f6laG46Rt5s9URhKyckNaA2vZnL/0gwQHWhM7ALQkp3WBQKM5sXRLQ5Ehrfkp+E/ZiCRg==}
......@@ -7571,7 +7628,7 @@ packages:
/num2fraction/1.2.2:
resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==}
dev: false
dev: true
/numbro/2.1.2:
resolution: {integrity: sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==}
......@@ -7583,6 +7640,11 @@ packages:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
/object-hash/3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
dev: true
/object-inspect/1.12.3:
resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
......@@ -7831,7 +7893,7 @@ packages:
/picocolors/0.2.1:
resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==}
dev: false
dev: true
/picocolors/1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
......@@ -7846,6 +7908,11 @@ packages:
hasBin: true
dev: true
/pify/2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
dev: true
/pify/4.0.1:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
......@@ -7855,6 +7922,11 @@ packages:
resolution: {integrity: sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew==}
dev: false
/pirates/4.0.6:
resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
engines: {node: '>= 6'}
dev: true
/pkg-up/3.1.0:
resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
engines: {node: '>=8'}
......@@ -7880,6 +7952,28 @@ packages:
polyline-miter-util: 1.0.1
dev: false
/postcss-import/15.1.0_postcss@8.4.29:
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
peerDependencies:
postcss: ^8.0.0
dependencies:
postcss: 8.4.29
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.4
dev: true
/postcss-js/4.0.1_postcss@8.4.29:
resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
engines: {node: ^12 || ^14 || >= 16}
peerDependencies:
postcss: ^8.4.21
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.29
dev: true
/postcss-less/6.0.0_postcss@8.4.29:
resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==}
engines: {node: '>=12'}
......@@ -7889,6 +7983,33 @@ packages:
postcss: 8.4.29
dev: false
/postcss-load-config/4.0.1_postcss@8.4.29:
resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
engines: {node: '>= 14'}
peerDependencies:
postcss: '>=8.0.9'
ts-node: '>=9.0.0'
peerDependenciesMeta:
postcss:
optional: true
ts-node:
optional: true
dependencies:
lilconfig: 2.1.0
postcss: 8.4.29
yaml: 2.3.1
dev: true
/postcss-nested/6.0.1_postcss@8.4.29:
resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.2.14
dependencies:
postcss: 8.4.29
postcss-selector-parser: 6.0.13
dev: true
/postcss-resolve-nested-selector/0.1.1:
resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==}
dev: true
......@@ -7916,6 +8037,7 @@ packages:
/postcss-value-parser/4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
dev: true
/postcss/7.0.39:
resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==}
......@@ -7923,7 +8045,7 @@ packages:
dependencies:
picocolors: 0.2.1
source-map: 0.6.1
dev: false
dev: true
/postcss/8.4.29:
resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==}
......@@ -9285,6 +9407,12 @@ packages:
react: 18.2.0
dev: false
/read-cache/1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
dependencies:
pify: 2.3.0
dev: true
/read-pkg-up/7.0.1:
resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
engines: {node: '>=8'}
......@@ -10131,6 +10259,20 @@ packages:
resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==}
dev: false
/sucrase/3.34.0:
resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==}
engines: {node: '>=8'}
hasBin: true
dependencies:
'@jridgewell/gen-mapping': 0.3.3
commander: 4.1.1
glob: 7.1.6
lines-and-columns: 1.2.4
mz: 2.7.0
pirates: 4.0.6
ts-interface-checker: 0.1.13
dev: true
/supercluster/7.1.5:
resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==}
dependencies:
......@@ -10220,6 +10362,37 @@ packages:
strip-ansi: 6.0.1
dev: true
/tailwindcss/3.3.3:
resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==}
engines: {node: '>=14.0.0'}
hasBin: true
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
chokidar: 3.5.3
didyoumean: 1.2.2
dlv: 1.1.3
fast-glob: 3.3.1
glob-parent: 6.0.2
is-glob: 4.0.3
jiti: 1.20.0
lilconfig: 2.1.0
micromatch: 4.0.5
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.0.0
postcss: 8.4.29
postcss-import: 15.1.0_postcss@8.4.29
postcss-js: 4.0.1_postcss@8.4.29
postcss-load-config: 4.0.1_postcss@8.4.29
postcss-nested: 6.0.1_postcss@8.4.29
postcss-selector-parser: 6.0.13
resolve: 1.22.4
sucrase: 3.34.0
transitivePeerDependencies:
- ts-node
dev: true
/tapable/1.1.3:
resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==}
engines: {node: '>=6'}
......@@ -10271,6 +10444,19 @@ packages:
/text-table/0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
/thenify-all/1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'}
dependencies:
thenify: 3.3.1
dev: true
/thenify/3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
dependencies:
any-promise: 1.3.0
dev: true
/throttle-debounce/3.0.1:
resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==}
engines: {node: '>=10'}
......@@ -10360,6 +10546,10 @@ packages:
resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==}
dev: false
/ts-interface-checker/0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
dev: true
/ts-node/10.9.1_rfwflknpvvnwtwekos4ljeaw7m:
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
hasBin: true
......
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
\ No newline at end of file
......@@ -5,7 +5,7 @@
// @tailwind base;
// @tailwind components;
// @tailwind utilities;
@tailwind utilities;
:root {
--workbench-tabHeight: 35px;
......
import { exportExecl } from '@/utils/index'
import { ProColumns, ProFormInstance, ProTable, ProTableProps } from '@ant-design/pro-components'
import { Button } from 'antd'
import { forwardRef, useRef, useState, useEffect, useImperativeHandle } from 'react'
import type { FC } from 'react'
type IExcelTable = {
columns: ProColumns<any, 'text'>[]
/** 接口请求 */
requestFn: (params: any, sort?: any) => any
/** 导出接口 */
exportExeclReq?: (params: any) => any
/** toolBarRender */
toolBarRenderFn?: (params: any) => any
ref?: any
/** 设置选择的row */
setSelectedRows?: React.Dispatch<React.SetStateAction<any[]>>
/** 自定义导出 */
customExport?: (params: any) => any
/** 额外的勾选属性 */
extraRowSelection?: Record<string, any>
/** 初始值key选择 */
initRowKey?: any[]
/** 自定义state key */
customKeys?: any[]
setCustomKeys?: React.Dispatch<React.SetStateAction<any[]>>
} & ProTableProps<any, any>
const ExcelTable: FC<IExcelTable> = forwardRef((props, formRefMy: any) => {
const {
columns,
requestFn,
exportExeclReq,
toolBarRenderFn,
setSelectedRows,
customExport,
extraRowSelection,
initRowKey,
customKeys,
setCustomKeys,
...otherProps
} = props
const [selectedRowKeys, setSelectedRowKeys] = useState<any>(initRowKey || [])
const formRefin = useRef<ProFormInstance>(null)
const formRef = formRefMy || formRefin
const onSelectChange = (rowKeys: any[], selectedRows: any[]) => {
console.log('selectedRowKeys changed: ', rowKeys, selectedRows)
setSelectedRowKeys(rowKeys)
if (setCustomKeys) {
setCustomKeys(rowKeys)
}
if (setSelectedRows) {
setSelectedRows(selectedRows)
}
}
/** 自定义state key 赋予初始值 */
useEffect(() => {
if (initRowKey && setCustomKeys) {
setCustomKeys(initRowKey)
}
if (initRowKey && setSelectedRows) {
setSelectedRows(
initRowKey?.map(item => ({
id: item
}))
)
}
}, [initRowKey])
const onExport = async () => {
console.log(formRef?.current?.getFieldsValue())
if (customExport) {
customExport({
record: formRef?.current?.getFieldsValue(),
id__in:
(customKeys || selectedRowKeys)?.length > 0
? (customKeys || selectedRowKeys)?.join?.(',')
: undefined
})
} else {
const data = await exportExeclReq?.({
formData: formRef?.current?.getFieldsValue(),
is_export: true,
id__in:
(customKeys || selectedRowKeys)?.length > 0
? (customKeys || selectedRowKeys)?.join?.(',')
: undefined
})
exportExecl(data)
}
}
useImperativeHandle(formRefMy, () => ({
onExport: () => onExport()
}))
return (
<>
<ProTable
columns={columns}
formRef={formRef as any}
request={async (params = {}, sort) => {
const { current: pageNum, pageSize, ...otherParams } = params
const res = await requestFn({ pageNum, pageSize, ...otherParams }, sort)
console.log(res)
if (res?.code === 200) {
return {
total: res?.data?.total,
data: res?.data?.list,
success: true,
page: res?.data?.pageNum
}
}
return {
success: false
}
}}
rowKey="id"
rowSelection={{
// 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
// 注释该行则默认不显示下拉选项
// selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT],
preserveSelectedRowKeys: true,
selectedRowKeys: customKeys || selectedRowKeys,
onChange: onSelectChange,
...extraRowSelection
}}
search={{
labelWidth: 'auto',
optionRender: (searchConfig, formProps, dom) => [
dom[1],
<Button
key="reset"
onClick={() => {
const keyArr = (searchConfig as any)?.items?.map(
(item: { props: { name: any } }) => [item?.props?.name, undefined]
)
formProps?.form?.setFieldsValue(Object.fromEntries(new Map(keyArr).entries()))
formProps?.form?.submit()
}}
>
重置
</Button>
]
}}
bordered
form={{
// 由于配置了 transform,提交的参与与定义的不同这里需要转化一下
syncToUrl: (values, type) => {
if (type === 'get') {
return {
...values
// created_at: [values.startTime, values.endTime],
}
}
return values
}
}}
pagination={{
pageSize: 20,
showSizeChanger: true,
showQuickJumper: true
}}
dateFormatter="string"
toolBarRender={
toolBarRenderFn || exportExeclReq
? () => [
exportExeclReq && (
<Button key="out" onClick={onExport} type="primary">
导出数据
</Button>
),
...(toolBarRenderFn?.({ rowKeys: customKeys || selectedRowKeys }) || [])
]
: false
}
{...otherProps}
/>
</>
)
})
export default ExcelTable
import { Upload, Image } from 'antd'
import type { UploadProps } from 'antd'
import styles from '../index.module.less'
import { useEffect, useState } from 'react'
import { useAsyncEffect } from 'ahooks'
const FormUploadMy: React.FC<{
isDragger?: boolean
handleUpload: (info: any) => Promise<void>
uploadProps?: UploadProps
isVideo?: boolean
onChangePrercent: (info: any) => void
setUploading: React.Dispatch<React.SetStateAction<boolean>>
disabled?: boolean
/** upload的值 */
onChange?: any
fileList?: any
}> = ({
isDragger,
handleUpload,
uploadProps,
isVideo,
onChange,
setUploading,
disabled,
fileList,
onChangePrercent
}) => {
const [val, setVal] = useState<any[]>()
const [previewVisible, setPreviewVisible] = useState<boolean>(false)
const [previewImage, setPreviewImage] = useState<string>('')
useAsyncEffect(async () => {
if (fileList) {
setVal(
fileList?.map((item: string, index: number) => {
return {
uid: decodeURI(item) + index,
name: decodeURI(item),
status: 'done',
url: item,
file_link: item,
index
}
})
)
}
}, [])
useEffect(() => {
onChange?.(val?.map((item: any) => item?.file_link))
}, [val])
return isDragger ? (
<Upload.Dragger
customRequest={handleUpload}
maxCount={1}
fileList={val}
{...uploadProps}
className={isVideo ? styles.videoUpload : ''}
onChange={info => {
setVal(info?.fileList)
onChangePrercent(info)
}}
onRemove={() => setUploading(false)}
disabled={disabled}
/>
) : (
<>
<Upload
customRequest={handleUpload}
maxCount={1}
fileList={val}
{...uploadProps}
className={isVideo ? styles.videoUpload : ''}
onChange={info => {
setVal(info?.fileList)
onChangePrercent(info)
}}
onPreview={(file: any) => {
setPreviewImage(file?.file_link)
setPreviewVisible(true)
}}
onRemove={() => setUploading(false)}
disabled={disabled}
/>
<Image
style={{ display: 'none' }}
width={200}
preview={{
visible: previewVisible,
onVisibleChange: visible => setPreviewVisible(visible)
}}
src={previewImage}
/>
</>
)
}
export default FormUploadMy
.videoList {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 20px;
color: #1890ff;
cursor: pointer;
.left {
margin-right: 10px;
}
&:hover {
background-color: #f5f5f5;
}
}
import type { FormItemProps, UploadProps } from 'antd'
import { Form, message } from 'antd'
import type { FC } from 'react'
import { useState } from 'react'
import { useUpdate } from 'ahooks'
import { isNil } from 'lodash'
import FormUploadMy from './FormUploadMy'
import { uploadFile } from '@/apis'
type TFormUpload = {
/** FormItem属性 */
formItemProps?: FormItemProps
/** upload属性 */
uploadProps?: UploadProps
/** 必填 */
required?: boolean
/** 是否Dragger */
isDragger: boolean
/** 是否视频上传 */
isVideo?: boolean
disabled?: boolean
/** 文件上传额外处理 */
extraUploadFn?: (obj: any) => void
imgCount?: number
}
const FormUploadNew: FC<TFormUpload> = props => {
const {
formItemProps,
required,
uploadProps,
isDragger,
isVideo,
disabled,
extraUploadFn,
imgCount
} = props
let timer: any = null
const update = useUpdate()
/** 是否上传中 */
const [uploading, setUploading] = useState<boolean>(false)
/** 处理form.item valuePropName问题 */
const normFile = (e: any) => {
if (Array.isArray(e)) {
return e
}
return e && e?.fileList
}
const onChangePrercent = (info: any) => {
const { file } = info
file.percent = 0
if (file?.status === 'uploading') {
timer = setInterval(() => {
if (file.percent === 85 && timer) {
clearInterval(timer)
}
file.percent += 1
update()
}, 5000)
}
if (file?.status === 'done') {
file.percent = 100
}
}
const handleUpload = async (info: any) => {
setUploading(true)
const { file } = info
const formData = new FormData()
formData.append('file', file)
if (extraUploadFn) {
extraUploadFn({ info, formData })
setUploading(false)
info.onSuccess()
return
}
const res = await uploadFile(formData)
if (res?.code === 200) {
file.file_link = res?.data?.url
info.onSuccess()
} else {
info.onError('上传失败')
}
setUploading(false)
}
return (
<Form.Item
valuePropName="fileList"
getValueFromEvent={normFile}
rules={[
{ required: required, message: '请上传' },
() => ({
validator(_, value) {
if (uploadProps?.accept) {
if (!(value?.length > 0)) {
return Promise.resolve()
}
for (const item of value) {
const fileNameArr = item?.split('.')
if (
!uploadProps?.accept?.includes(
fileNameArr?.[fileNameArr?.length - 1]?.toLocaleLowerCase()
)
) {
return Promise.reject(new Error(`请选择${uploadProps?.accept}类型的文件`))
}
}
}
if (required && imgCount && value?.length !== imgCount) {
return Promise.reject(new Error(`请选择${imgCount}张图片`))
}
if (value?.[0]?.error) {
return Promise.reject(new Error(value?.[0]?.error))
}
if (uploading && isNil(uploadProps?.maxCount)) {
return Promise.reject(new Error('文件上传中'))
}
return Promise.resolve()
}
})
]}
required={required}
{...formItemProps}
>
<FormUploadMy
isDragger={isDragger}
handleUpload={handleUpload}
uploadProps={uploadProps}
isVideo={isVideo}
onChangePrercent={onChangePrercent}
setUploading={setUploading}
disabled={disabled}
/>
</Form.Item>
)
}
export default FormUploadNew
import React, { useContext, useState } from 'react'
import { Button } from 'antd'
import { Link, Navigate } from 'react-router-dom'
import { createSessionStorage } from '@/utils/Storage'
import NotFound from '@/components/NotFound'
const Auth = props => {
const { children, permission = true, path } = props
const cpasUserInfo = localStorage.getItem('cpasUserInfo')
console.log('🚀 ~ file: index.tsx:10 ~ Auth ~ curUser:', cpasUserInfo)
if (cpasUserInfo) {
// 有权限返回页面
if (permission) {
return <>{children}</>
}
return (
<NotFound
status="403"
title="403"
subTitle="对不起!暂无该页面访问权限!请联系管理员或更换账号登录"
extra={
<>
<Button type="primary">
<Link to="/login">重新登录</Link>
</Button>
</>
}
/>
)
}
return <Navigate replace to="/login" />
}
export default Auth
import Permission from './Permission'
export default {
Permission
}
import type { RequestConfig, RunTimeLayoutConfig } from 'umi';
import { getLocale, dynamic } from 'umi';
import type { InitState } from './layouts';
import { getRunTimeLayoutConfig, getSysName, loginPath } from './layouts';
import { } from '@ant-design/pro-layout';
import { history } from 'umi';
import RightContent from '@/components/RightContent';
import { reqInterceptor, errorHandler } from './services';
import { getCurProjectInfo } from './services/csService';
import getRTS, { getRTSMenus } from './layouts/runtimeSettings';
import PageTab, { AudTabPage } from '@/components/PageTab';
import MicroPage from '@/components/MicroPage';
import { isRunInFrame, isOpenFromPlatform } from './utils/env';
import WebFrame from '@/pages/web_frame';
import enMessages from 'devextreme/localization/messages/en.json';
import zhMessages from 'devextreme/localization/messages/zh.json';
import { locale, loadMessages } from 'devextreme/localization';
import _ from 'lodash';
import { lazy } from 'react';
import { getIsHideHeader, getIsMicroPage } from './utils/pub';
/** 获取用户信息比较慢的时候会展示一个 loading */
export const initialStateConfig = {
loading: <PageLoading />,
};
// window.setup = (locale) => {
// console.log('setup');
// // const { initialState, loading, error, refresh, setInitialState } = useModel('@@initialState');
// // setInitialState((state) => {
// // return { ...state, abc: 1 };
// // });
// setLocale(locale, true);
// };
/**
* @see https://umijs.org/zh-CN/plugins/plugin-initial-state
* */
export async function getInitialState(): Promise<InitState> {
let menuJsonData: any[];
devLocale();
const rts = await getRTS();
// eslint-disable-next-line prefer-const
menuJsonData = await getRTSMenus();
// 如果是登录页面,不执行
const pathName = history.location.pathname;
let curUser = null
let sessionCur = {
id: '',
zcbfid: '', //组成部分编号 zcbfid
zcbfName: '', //单位名称 customerName
ZcbfID: '', // 组成部分编号 (报告系统使用非驼峰写法字段)
sjxmbh: '', // 审计项目编号 getCurProjectInfo().projectCode
sjnd: '', // 审计年度
userCode: '', //登录用户
userName: '',
dbname: '',
dbName: '',
DBName: ''
};
try {
curUser = JSON.parse(window.localStorage?.getItem('cpasUserInfo') ?? '');
const data = JSON.parse(window.sessionStorage.electronParams).params;
if (data) {
sessionCur = data
}
} catch (error) {
console.log('error 获取storage用户信息', error);
}
const curDataPart = getCurProjectInfo() || {};
console.log('sessionCur', sessionCur);
const curPart = {
...sessionCur,
...curDataPart,
// 历史原因,报告系统迁移过来页面不统一,兼容使用字段
// dbname: sessionCur.dbname, // 202205188806-C00014
// DBName: sessionCur.DBName,
// sjxmbh: curDataPart.projectCode,
XMType: '',
// 测试
dbname: '202205188806-C00014', // 202205188806-C00014
DBName: '202205188806-C00014',
sjxmbh: curDataPart.projectCode,
zcbfid: '202205188806-C00014', //组成部分编号 zcbfid
ZcbfID: '202205188806-C00014', // 组成部分编号 (报告系统使用非驼峰写法字段)
};
console.log('🚀 ~ file: app.tsx:75 ~ getInitialState ~ curPart:', curPart);
// 修改本地session的存值
const electronSession = {
params: curPart,
session: "persist:local"
}
window.sessionStorage.setItem("electronParams", JSON.stringify(electronSession));
if (pathName === '/') history.push('/home');
if (pathName !== loginPath) {
const sysName = getSysName(pathName);
return {
settings: rts,
menuJson: menuJsonData,
curUser: curUser,
sysName,
curPart,
};
}
return {
settings: rts,
curUser: curUser,
menuJson: menuJsonData,
curPart, // 不知道是个啥,先注入
};
}
// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState }: any) => {
console.log(initialState, 'initialState-----');
AudTabPage.getInstance().initPages(initialState?.sysName);
let layoutConfig = {};
try {
layoutConfig = getRunTimeLayoutConfig(initialState);
} catch (error) {
console.log('error in getRunTimeLayoutConfig function', error);
}
// console.log(layoutConfig);
const inFrameLayout = isRunInFrame ? { hide: true, headerHeight: 0 } : {};
const isHideHeader = getIsHideHeader();
//通过配置url加参数,可以隐藏logo的头 如 "url": "http://localhost:8000?hideHeader=1", //不配置的知表示为显示
const inPlatformLayout = isHideHeader ? { hide: false, headerHeight: 0 } : {};
// const inPlatformLayout = isOpenFromPlatform ? { hide: true, headerHeight: 0 } : {};
console.log('layoutConfig', layoutConfig);
// 是否作为微应用使用,在本项目中即是否嵌套在iframe中
const isMicroPage = getIsMicroPage();
const isMicroPageLayout = isMicroPage
? {
hide: true,
headerHeight: 0,
childrenRender: initialState && initialState?.curUser ? MicroPage : undefined,
}
: {};
return {
...inFrameLayout,
...layoutConfig,
// siderWidth: typeof SIDER_WIDTH !== 'undefined' ? SIDER_WIDTH : 208,
//siderWidth: initialState && initialState.siderWidth === 0 ? 0 : 208,
siderWidth: 180,
// headerHeight: 43, // 48->43解决最外层有滚动条的问题 add by csb 20230221
headerHeight: 0, // 去掉logo,这里直接设置为0. add by szh 20230905
// siderWidth: 0,
childrenRender: initialState && initialState?.curUser ? PageTab : undefined,
rightContentRender: () => <RightContent />,//不要皮肤\登录\等信息
// footerRender: () => <Footer />,
// links: layoutLinks(),
menuHeaderRender: undefined,
// 自定义 403 页面
unAccessible: <div>unAccessible</div>,
...initialState?.settings,
...inPlatformLayout,
...isMicroPageLayout,
};
};
// 后端数据请求配置,具体看 './services/index.ts'
export const request: RequestConfig = {
requestInterceptors: [reqInterceptor],
// responseInterceptors: [resInterceptor],
errorHandler,
};
async function parseMenuRoute(mainRoute: any) {
const initPageByMenuJson = (menuData: any): void => {
for (let i = 0; i < menuData.length; i++) {
const menu = menuData[i];
const icon = menu.icon;
const appName = menu.label;
const appType = menu.type;
const app = menu.componentname || menu.path.substring(menu.path.lastIndexOf('/') + 1);
if (menu.children) {
mainRoute.unshift({
key: menu.path,
path: menu.path,
name: appName,
icon: icon,
closable: app !== 'home',
});
initPageByMenuJson(menu.children);
} else {
// console.log(menu);
if (appType === 'component') {
mainRoute.unshift({
key: menu.path,
path: menu.path,
name: appName,
icon: icon,
closable: app !== 'home',
hide: menu.hide,
component: require(`@/pages/${menu.componentname || app}/index`).default,
// component: lazy(() => import(`@/pages/${menu.componentname || app}/index`)),
// component: asyncComponent(app, `@/pages/${menu.componentname || app}/index`),
});
} else if (appType === 'web') {
mainRoute.unshift({
key: menu.path,
path: menu.path,
name: appName,
icon: icon,
closable: true,
component: <WebFrame url={menu.path} />,
});
}
}
}
};
const menuJson1 = (await getRTSMenus()) as any;
if (menuJson1.length) {
initPageByMenuJson(menuJson1);
}
}
// export async function render(oldRender: any) {
// menuJsonData = (await getRTSMenus()) as any;
// oldRender();
// }
// 原 { routes } 报错,所以使用以下方法
export async function patchRoutes(Routes: any) {
const { routes } = Routes;
// 这个时候的 icon 还是string,所以应该可以在这里修改图标
const mainRoute = routes[0].routes;
const mainIndex = _.findIndex(mainRoute, function (o: any) {
return o.flatMenu;
});
await parseMenuRoute(mainRoute[mainIndex].routes);
AudTabPage.getInstance().setRoutes(routes);
}
function devLocale() {
// dev extreme local setting
loadMessages(enMessages);
loadMessages(zhMessages);
const loca = getLocale();
locale(loca?.slice(0, 2) || 'zh');
}
// 覆写render 比如用于渲染之前做权限校验,
// https://v3.umijs.org/zh-CN/docs/runtime-config#patchroutes-routes-
export function render(oldRender: Function) {
oldRender();
}
// 在初始加载和路由切换时做一些事情。
export function onRouteChange({ routes, matchedRoutes, location, action }) {
// 通过pages和location.pathname对比,执行showPage操作
// audTabpage.showPage(location as unknown as Location);
// 显示 404 页
// if (matchedRoutes.length) {
// document.title = matchedRoutes[matchedRoutes.length - 1].route.title || '';
// }
}
......@@ -123,7 +123,7 @@ const LayoutPage: React.FC = () => {
const m = menus.map(({ icon, children, ...item }) => ({
...item,
icon: icon && IconMap[icon as string],
icon: icon && getIcon(icon),
children: children && loopMenuItem(children)
}))
......
......@@ -6,7 +6,6 @@ import LayoutPage from '@/layout'
import { SmileFilled } from '@ant-design/icons'
import { createSessionStorage } from '@/utils/Storage'
import WrapperRouteComponent from './config'
import { Space } from 'antd'
const NotFound = lazy(() => import('@/pages/404'))
const ChangePassword = lazy(() => import('../pages/user/ChangePd'))
......
/** @type {import('tailwindcss').Config} */
export default {
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {}
},
plugins: []
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment