修复antd兼容性,日志详情自动滚动

This commit is contained in:
whyour 2023-01-11 22:03:44 +08:00
parent 443c581955
commit 2e3c3274c7
12 changed files with 459 additions and 336 deletions

View File

@ -42,7 +42,8 @@
"monaco-editor",
"rc-field-form",
"@types/lodash.merge",
"rollup"
"rollup",
"styled-components"
],
"allowedVersions": {
"react": "18",
@ -90,7 +91,7 @@
},
"devDependencies": {
"@ant-design/icons": "^4.7.0",
"@ant-design/pro-layout": "^6.33.1",
"@ant-design/pro-layout": "6.38.22",
"@monaco-editor/react": "4.4.6",
"@react-hook/resize-observer": "^1.2.6",
"@sentry/react": "^7.12.1",
@ -114,10 +115,10 @@
"@types/sockjs": "^0.3.33",
"@types/sockjs-client": "^1.5.1",
"@types/uuid": "^8.3.4",
"@umijs/max": "^4.0.21",
"@umijs/max": "^4.0.42",
"@umijs/ssr-darkreader": "^4.9.45",
"ansi-to-react": "^6.1.6",
"antd": "^4.23.0",
"antd": "^4.24.7",
"antd-img-crop": "^4.2.3",
"codemirror": "^5.65.2",
"compression-webpack-plugin": "9.2.0",

View File

@ -2,7 +2,7 @@ lockfileVersion: 5.4
specifiers:
'@ant-design/icons': ^4.7.0
'@ant-design/pro-layout': ^6.33.1
'@ant-design/pro-layout': 6.38.22
'@monaco-editor/react': 4.4.6
'@otplib/preset-default': ^12.0.1
'@react-hook/resize-observer': ^1.2.6
@ -29,10 +29,10 @@ specifiers:
'@types/sockjs': ^0.3.33
'@types/sockjs-client': ^1.5.1
'@types/uuid': ^8.3.4
'@umijs/max': ^4.0.21
'@umijs/max': ^4.0.42
'@umijs/ssr-darkreader': ^4.9.45
ansi-to-react: ^6.1.6
antd: ^4.23.0
antd: ^4.24.7
antd-img-crop: ^4.2.3
body-parser: ^1.19.2
celebrate: ^15.0.1
@ -157,7 +157,7 @@ devDependencies:
'@types/sockjs': 0.3.33
'@types/sockjs-client': 1.5.1
'@types/uuid': 8.3.4
'@umijs/max': 4.0.41_u7gqvy2j7ayrx2yacupeqg5dii
'@umijs/max': 4.0.42_u7gqvy2j7ayrx2yacupeqg5dii
'@umijs/ssr-darkreader': 4.9.45
ansi-to-react: 6.1.6_biqbaboplfbrettd7655fr4n2y
antd: 4.24.7_biqbaboplfbrettd7655fr4n2y
@ -689,6 +689,17 @@ packages:
resize-observer-polyfill: 1.5.1
dev: true
/@antfu/install-pkg/0.1.1:
resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==}
dependencies:
execa: 5.1.1
find-up: 5.0.0
dev: true
/@antfu/utils/0.7.2:
resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==}
dev: true
/@babel/cli/7.20.7_@babel+core@7.20.7:
resolution: {integrity: sha512-WylgcELHB66WwQqItxNILsMlaTd8/SO6SgTTjMp4uCI7P4QyH1r3nqgFmO3BfM4AtfniHgFMH3EpYFj/zynBkQ==}
engines: {node: '>=6.9.0'}
@ -2980,6 +2991,29 @@ packages:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true
/@iconify-json/fa/1.1.3:
resolution: {integrity: sha512-Cmzx42MZ2kTOLNGFlplEEvFXPsHkofoIX7iO+XZggyUpLjJjf/3AJS01NzNDoDhol9OZEUz7I0syGtuAjfOv4w==}
dependencies:
'@iconify/types': 2.0.0
dev: true
/@iconify/types/2.0.0:
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
dev: true
/@iconify/utils/2.0.9:
resolution: {integrity: sha512-ropNqaeamoxZvXxvaTJXrI0MrqdWdDVIs/mW7/sEQbNi0aXYUGL2iuLs1da3QR163gyG63kiyTsqw2oQYamw3Q==}
dependencies:
'@antfu/install-pkg': 0.1.1
'@antfu/utils': 0.7.2
'@iconify/types': 2.0.0
debug: 4.3.4
kolorist: 1.6.0
local-pkg: 0.4.2
transitivePeerDependencies:
- supports-color
dev: true
/@istanbuljs/load-nyc-config/1.1.0:
resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
engines: {node: '>=8'}
@ -3114,7 +3148,7 @@ packages:
react:
optional: true
dependencies:
'@babel/runtime': 7.18.9
'@babel/runtime': 7.20.7
hoist-non-react-statics: 3.3.2
react: 18.1.0
react-is: 16.13.1
@ -3129,7 +3163,7 @@ packages:
react:
optional: true
dependencies:
'@babel/runtime': 7.18.9
'@babel/runtime': 7.20.7
hoist-non-react-statics: 3.3.2
react: 18.2.0
react-is: 16.13.1
@ -3572,7 +3606,7 @@ packages:
postcss:
optional: true
dependencies:
'@babel/core': 7.18.9
'@babel/core': 7.20.7
postcss: 8.4.20
postcss-syntax: 0.36.2_postcss@8.4.20
transitivePeerDependencies:
@ -4317,21 +4351,21 @@ packages:
eslint-visitor-keys: 3.3.0
dev: true
/@umijs/ast/4.0.41:
resolution: {integrity: sha512-hZRzGDyBOHwO8/NUMa8FH4u3Z6Y2btFv8tHXiKP5W/YBZukYS4BzhpwZyVn3nrBnfg0WFOKNuT4xGAE3LrRZ3Q==}
/@umijs/ast/4.0.42:
resolution: {integrity: sha512-wY2c2cNytjIGRlRbS6sZb0zIXTAYTJJSvQJvZNGI1KkgTBfn2Nn3yyQBmJ4W5k73ZYI/+EyKuJsdVxjiNZYtdA==}
dependencies:
'@umijs/bundler-utils': 4.0.41
'@umijs/bundler-utils': 4.0.42
transitivePeerDependencies:
- supports-color
dev: true
/@umijs/babel-preset-umi/4.0.41:
resolution: {integrity: sha512-GQTYhqRWcjmgC7KKmWSG4al2YeV2KVXvkoCxM6Q4LJ3veqCo+aOyBXhILRJQ0jm3A3jGRXI2y6QqMAm8A3v3mQ==}
/@umijs/babel-preset-umi/4.0.42:
resolution: {integrity: sha512-zhaJGYNffvgTMpKCBdntHedLGb8TQxfblv6U4gdHhwTaiyKaEfROpZXXoQBrCErnNB2fBcIbH+BJRHXkqwnXhg==}
dependencies:
'@babel/runtime': 7.18.9
'@bloomberg/record-tuple-polyfill': 0.0.4
'@umijs/bundler-utils': 4.0.41
'@umijs/utils': 4.0.41
'@umijs/bundler-utils': 4.0.42
'@umijs/utils': 4.0.42
babel-plugin-styled-components: 2.0.7
core-js: 3.22.4
transitivePeerDependencies:
@ -4339,12 +4373,12 @@ packages:
- supports-color
dev: true
/@umijs/bundler-esbuild/4.0.41:
resolution: {integrity: sha512-F7LsDjBF7SFCaf9M7AMLHpE7vTtPTk/ZUeV+fxKVMUFPQ6KsIuW6MobBe9lJLzbSFSbXkmsW29J5JV4Z8JnYxQ==}
/@umijs/bundler-esbuild/4.0.42:
resolution: {integrity: sha512-Bt+9oQjxiV26NZbSbTdb2rnXwdFjf8PbH682ozBe+SAuoWXh4UqnxXItDgs193hvhCfdf+O4HlhxfdrLNB5olg==}
hasBin: true
dependencies:
'@umijs/bundler-utils': 4.0.41
'@umijs/utils': 4.0.41
'@umijs/bundler-utils': 4.0.42
'@umijs/utils': 4.0.42
enhanced-resolve: 5.9.3
postcss: 8.4.20
postcss-flexbugs-fixes: 5.0.2_postcss@8.4.20
@ -4353,10 +4387,10 @@ packages:
- supports-color
dev: true
/@umijs/bundler-utils/4.0.41:
resolution: {integrity: sha512-4eDvbeam1PV7Hbns+z8S4P/ILXi+UIWhoMY1tN4N4y78VNjyKmMQMvUp0UKeNLsxBGMvWtFpn7DLqcON/49OhA==}
/@umijs/bundler-utils/4.0.42:
resolution: {integrity: sha512-cXhMyCiSK/Otg5nkeDJuDeRS84KqFoSR14BTtKkRCH6N3Dk9Xp2q8zXne9DNdQx7HUvb6s1pmA6Pc9S1mzNp5g==}
dependencies:
'@umijs/utils': 4.0.41
'@umijs/utils': 4.0.42
esbuild: 0.15.18
regenerate: 1.4.2
regenerate-unicode-properties: 10.0.1
@ -4365,13 +4399,13 @@ packages:
- supports-color
dev: true
/@umijs/bundler-vite/4.0.41_@types+node@17.0.45:
resolution: {integrity: sha512-zOhvsEW2D6wYnNs5Dfy+uSiDU7nrKe2Txk3m/iiLovjLOuujz99/brr1CnE5yDnCw7RDRgHa1sYesKnrP4KsPw==}
/@umijs/bundler-vite/4.0.42_@types+node@17.0.45:
resolution: {integrity: sha512-14pkpFyczSPBf9VCptCGupPIu9Nobvn9RdG5PY+j6pSNOHNooKNBCxjK/PqlR5gEuSiDdp4qGP2mZdAiMW3dNQ==}
hasBin: true
dependencies:
'@svgr/core': 6.2.1
'@umijs/bundler-utils': 4.0.41
'@umijs/utils': 4.0.41
'@umijs/bundler-utils': 4.0.42
'@umijs/utils': 4.0.42
'@vitejs/plugin-react': 2.2.0_vite@3.2.5
less: 4.1.2
postcss-preset-env: 7.5.0
@ -4388,8 +4422,8 @@ packages:
- terser
dev: true
/@umijs/bundler-webpack/4.0.41_cdwcylzbt7apydvbx5kbqfz4va:
resolution: {integrity: sha512-l/7dzIN4ZJyniDdeqk96FepPApJhqUWGgERHu1UiXDh/aYoO2Gn+M/V2ZqOU2Mg42JcRFddnEqWtqriJDS2WTQ==}
/@umijs/bundler-webpack/4.0.42_cdwcylzbt7apydvbx5kbqfz4va:
resolution: {integrity: sha512-cu4xdGRPHuLnyHvzFg6eq7t07M/rTynOC9vr2ih40iw5Z8WSZyqzgRAJ94len63GL0twPh/9GMjzwvCXR5xUCQ==}
hasBin: true
dependencies:
'@parcel/css': 1.9.0
@ -4398,11 +4432,11 @@ packages:
'@svgr/plugin-jsx': 6.5.1_@svgr+core@6.2.1
'@svgr/plugin-svgo': 6.5.1_@svgr+core@6.2.1
'@types/hapi__joi': 17.1.8
'@umijs/babel-preset-umi': 4.0.41
'@umijs/bundler-utils': 4.0.41
'@umijs/babel-preset-umi': 4.0.42
'@umijs/bundler-utils': 4.0.42
'@umijs/case-sensitive-paths-webpack-plugin': 1.0.1
'@umijs/mfsu': 4.0.41
'@umijs/utils': 4.0.41
'@umijs/mfsu': 4.0.42
'@umijs/utils': 4.0.42
cors: 2.8.5
css-loader: 6.7.1_webpack@5.75.0
es5-imcompatible-versions: 0.1.77
@ -4431,11 +4465,11 @@ packages:
resolution: {integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==}
dev: true
/@umijs/core/4.0.41:
resolution: {integrity: sha512-WC+/w1a7/SRbfqdY61dMPLU19bgsVVQ2nADR84zHdgYoHNtDlXCFoI3SibUM+qp0sAOK4HX4mR8gRhjmnOGhzw==}
/@umijs/core/4.0.42:
resolution: {integrity: sha512-ZWC8ApIg8uz1pOlJLcNQveYdT+zXmJCN0plQN61dUuNT/zkwOnCdjjYr6uO+icYEXqGG/CQdcPFaZReerfmC+Q==}
dependencies:
'@umijs/bundler-utils': 4.0.41
'@umijs/utils': 4.0.41
'@umijs/bundler-utils': 4.0.42
'@umijs/utils': 4.0.42
transitivePeerDependencies:
- supports-color
dev: true
@ -4447,19 +4481,19 @@ packages:
/@umijs/history/5.3.1:
resolution: {integrity: sha512-/e0cEGrR2bIWQD7pRl3dl9dcyRGeC9hoW0OCvUTT/hjY0EfUrkd6G8ZanVghPMpDuY5usxq9GVcvrT8KNXLWvA==}
dependencies:
'@babel/runtime': 7.18.9
'@babel/runtime': 7.20.7
query-string: 6.14.1
dev: true
/@umijs/lint/4.0.41_d6a4x3x3q3loe4v2ypyqhqerii:
resolution: {integrity: sha512-t6iV1akxEKKGjYd2q879kMAPNgmha/BgsFS4UBC1XABXWVZ/gO2r8qlWyrt/uxC0VcBTz/6z2ETNrtFQWuqtQQ==}
/@umijs/lint/4.0.42_d6a4x3x3q3loe4v2ypyqhqerii:
resolution: {integrity: sha512-7dqFHIzy5nMfx6iQIf6zkXuSAmLf5TNE5SdJmK0eYc+uqe6PKkflXJ8+9J5tgMyrqCf0wc3Ilu6p6X6cwsVC2Q==}
dependencies:
'@babel/core': 7.18.9
'@babel/eslint-parser': 7.18.9_bpusarfwcbgnjqmbezm4jkv5ie
'@stylelint/postcss-css-in-js': 0.38.0_britvnvafsaqvp7ihzdwtiasju
'@typescript-eslint/eslint-plugin': 5.36.1_io33vsxv4zn7xocr4vz7s2wm74
'@typescript-eslint/parser': 5.36.1_oy7hgmlo6357d5kkcjbkfgtg4q
'@umijs/babel-preset-umi': 4.0.41
'@umijs/babel-preset-umi': 4.0.42
eslint-plugin-jest: 26.1.5_lbrcujwrxgiqp3xcbsvhvbrrwy
eslint-plugin-react: 7.29.4_eslint@8.15.0
eslint-plugin-react-hooks: 4.5.0_eslint@8.15.0
@ -4480,16 +4514,16 @@ packages:
- typescript
dev: true
/@umijs/max/4.0.41_u7gqvy2j7ayrx2yacupeqg5dii:
resolution: {integrity: sha512-QjNVMMZWsuaGDoL7hdHdxmrZUZbEdZSK+Wl7lGVYHKA0GyMcz7lCUKRj/ck84pLtP0inJpF3Pigqzidldw/GnQ==}
/@umijs/max/4.0.42_u7gqvy2j7ayrx2yacupeqg5dii:
resolution: {integrity: sha512-YBi9sR7r3s2y9F73E94PUX51ytz9q1Mt6ZPMVSqLX7XaPUDr77+/vR7DXtsASCZvR8XcoWBYxJFKDSIzCmNUOQ==}
hasBin: true
dependencies:
'@umijs/lint': 4.0.41_d6a4x3x3q3loe4v2ypyqhqerii
'@umijs/plugins': 4.0.41_ol4gf5ysdgp6msy6qgsp7snw2u
'@umijs/lint': 4.0.42_d6a4x3x3q3loe4v2ypyqhqerii
'@umijs/plugins': 4.0.42_ol4gf5ysdgp6msy6qgsp7snw2u
antd: 4.24.7_biqbaboplfbrettd7655fr4n2y
eslint: 8.15.0
stylelint: 14.8.2
umi: 4.0.41_h4ojpibysiaer7lth2s4sljnlm
umi: 4.0.42_h4ojpibysiaer7lth2s4sljnlm
transitivePeerDependencies:
- '@babel/core'
- '@babel/helper-module-imports'
@ -4535,32 +4569,32 @@ packages:
- webpack-plugin-serve
dev: true
/@umijs/mfsu/4.0.41:
resolution: {integrity: sha512-EoXJcrjccZY2epZRTEDpt8ytZYyZGZROd/VtnpuLsGayMn8LjNQPdOE8AfpEDXpxuCDpQgxhQ0IVc5iivZzZUQ==}
/@umijs/mfsu/4.0.42:
resolution: {integrity: sha512-5xghD/Ba7+soWxkVzSRXp9xsecqmtEG0AM704Z8FoykyRHPDoI53epIzJgu8AFHM/VMBtilgYt1w5RH5Xq8UCg==}
dependencies:
'@umijs/bundler-esbuild': 4.0.41
'@umijs/bundler-utils': 4.0.41
'@umijs/utils': 4.0.41
'@umijs/bundler-esbuild': 4.0.42
'@umijs/bundler-utils': 4.0.42
'@umijs/utils': 4.0.42
enhanced-resolve: 5.9.3
is-equal: 1.6.4
transitivePeerDependencies:
- supports-color
dev: true
/@umijs/plugin-run/4.0.41:
resolution: {integrity: sha512-y0Oe23XvzHkzmHKlLkt5RNOfxDOYcOQ1hMe8qf97mXmb8XnKAGISqLqqZm5n4ZPwCKP0aC/ZxJOKUKV+vVzq7w==}
/@umijs/plugin-run/4.0.42:
resolution: {integrity: sha512-FSU/ZSP5dvzC3a4WM21Li+qkiYncVSw0appovegiIXWmHfRASk6OscqldItMFBUHmAaJ9Vpxzxr/FZbZaNeYsA==}
dependencies:
tsx: 3.12.1
dev: true
/@umijs/plugins/4.0.41_ol4gf5ysdgp6msy6qgsp7snw2u:
resolution: {integrity: sha512-csfnvB+L6vPnZMy68hkn0/s8YQpT7hsLKZufhu47AxHdPZxHp+DbVe64Wti1ZNKtHGV821FGCjBBb91q/MithA==}
/@umijs/plugins/4.0.42_ol4gf5ysdgp6msy6qgsp7snw2u:
resolution: {integrity: sha512-H9KXiGkkoAUIi4Cwx7d3g33COLdMN4+fbO/PIl52xDb18Gafi4hylHnEjPnttNUz8YhW5S+4BMS8UzisqIhjbw==}
dependencies:
'@ahooksjs/use-request': 2.8.15_react@18.2.0
'@ant-design/antd-theme-variable': 1.0.0
'@ant-design/icons': 4.8.0_biqbaboplfbrettd7655fr4n2y
'@ant-design/pro-components': 2.3.49_b6pt25ruzstflsuamv2lnyq45m
'@umijs/bundler-utils': 4.0.41
'@umijs/bundler-utils': 4.0.42
'@umijs/valtio': 1.0.2_react@18.2.0
antd-dayjs-webpack-plugin: 1.0.6_dayjs@1.11.7
axios: 0.27.2
@ -4600,22 +4634,25 @@ packages:
- vite
dev: true
/@umijs/preset-umi/4.0.41_wbbmjm6mucxohffaoliigwhyze:
resolution: {integrity: sha512-qD9TpV9VCKjkmzBTmLYozjg7hkXCnoibruppLC4XGvKsUG4ohcWdT0+dt9/GiT3hW57AZYXjNwkPTfZ2CPazTw==}
/@umijs/preset-umi/4.0.42_wbbmjm6mucxohffaoliigwhyze:
resolution: {integrity: sha512-yV2c4HieaAPChCHRfiy2kf95WJ7TytEJVmM7hjUTbd8LotQxxcg2yrHZyhnoF2QRIuYl9g3mr+JbFs0PKrCaAA==}
dependencies:
'@umijs/ast': 4.0.41
'@umijs/babel-preset-umi': 4.0.41
'@umijs/bundler-utils': 4.0.41
'@umijs/bundler-vite': 4.0.41_@types+node@17.0.45
'@umijs/bundler-webpack': 4.0.41_cdwcylzbt7apydvbx5kbqfz4va
'@umijs/core': 4.0.41
'@iconify-json/fa': 1.1.3
'@iconify/utils': 2.0.9
'@svgr/core': 6.2.1
'@umijs/ast': 4.0.42
'@umijs/babel-preset-umi': 4.0.42
'@umijs/bundler-utils': 4.0.42
'@umijs/bundler-vite': 4.0.42_@types+node@17.0.45
'@umijs/bundler-webpack': 4.0.42_cdwcylzbt7apydvbx5kbqfz4va
'@umijs/core': 4.0.42
'@umijs/did-you-know': 1.0.1
'@umijs/history': 5.3.1
'@umijs/mfsu': 4.0.41
'@umijs/plugin-run': 4.0.41
'@umijs/renderer-react': 4.0.41_ef5jwxihqo6n7gxfmzogljlgcm
'@umijs/server': 4.0.41
'@umijs/utils': 4.0.41
'@umijs/mfsu': 4.0.42
'@umijs/plugin-run': 4.0.42
'@umijs/renderer-react': 4.0.42_ef5jwxihqo6n7gxfmzogljlgcm
'@umijs/server': 4.0.42
'@umijs/utils': 4.0.42
babel-plugin-dynamic-import-node: 2.3.3
click-to-react-component: 1.0.8_2wivdsbsvmk3pblmocpmpqwn2e
core-js: 3.22.4
@ -4653,8 +4690,8 @@ packages:
- webpack-plugin-serve
dev: true
/@umijs/renderer-react/4.0.41_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-ZaA3exTIgh5FeOoIQRvILZPYpxxMRWnxAO6xxWtVDypNrbGxTdd5EostNb9+3E9naKFFFY98k8bopz6xkjcc4g==}
/@umijs/renderer-react/4.0.42_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-tZTzBPSneiFafMkxyt2r+qrtA1F/gbSil1Ez/3e5anBIrTPaKkLL9dJzS1cEDkxRc+KTSroBQBCIf/crQcORkg==}
peerDependencies:
react: '>=16.8 || 18'
react-dom: '>=16.8 || 18'
@ -4673,8 +4710,8 @@ packages:
react-router-dom: 6.3.0_biqbaboplfbrettd7655fr4n2y
dev: true
/@umijs/renderer-react/4.0.41_ef5jwxihqo6n7gxfmzogljlgcm:
resolution: {integrity: sha512-ZaA3exTIgh5FeOoIQRvILZPYpxxMRWnxAO6xxWtVDypNrbGxTdd5EostNb9+3E9naKFFFY98k8bopz6xkjcc4g==}
/@umijs/renderer-react/4.0.42_ef5jwxihqo6n7gxfmzogljlgcm:
resolution: {integrity: sha512-tZTzBPSneiFafMkxyt2r+qrtA1F/gbSil1Ez/3e5anBIrTPaKkLL9dJzS1cEDkxRc+KTSroBQBCIf/crQcORkg==}
peerDependencies:
react: '>=16.8 || 18'
react-dom: '>=16.8 || 18'
@ -4702,10 +4739,10 @@ packages:
memoize-one: 5.2.1
dev: true
/@umijs/server/4.0.41:
resolution: {integrity: sha512-HMIdlABrt/zxzECzFtKDS+HncFPCq7t0AkusOQH4I7YTC7CjNH+mXQWSYjabnHn2d4/E7rG8vWxybH9sli0QFw==}
/@umijs/server/4.0.42:
resolution: {integrity: sha512-HvwqjO0eYrf7PJWiKe67/SC1qVQrLahjmsRzg1gefCj+j6RYjd7mq8stc1yFnrmnoUhTTN7t71Q+x6h7bxM3nA==}
dependencies:
'@umijs/bundler-utils': 4.0.41
'@umijs/bundler-utils': 4.0.42
history: 5.3.0
react: 18.1.0
react-dom: 18.1.0_react@18.1.0
@ -4718,12 +4755,12 @@ packages:
resolution: {integrity: sha512-XlcwzSYQ/SRZpHdwIyMDS4FOGX5kP4U/2g2mykyn/iPQTK4xTiQAyBu6UnnDnn7d5P8s7Atzh1C7H0ETNOypJg==}
dev: true
/@umijs/test/4.0.41:
resolution: {integrity: sha512-PgG2mNcujbKsWq0NU5F+8FU47Zw47slayAd19ngI1Skk2FoNpRBM0BkXjcL+migWn0c+tSAHgdjXESzHt1PhXw==}
/@umijs/test/4.0.42:
resolution: {integrity: sha512-+/a7v3VeB6Z7DdSRcj9sazeVM0yHKtlpVGfCrcZLbUemZ5AERsSOc0jdj5wknVjslTbXpQ4Jesf1nmnOEmZE6g==}
dependencies:
'@babel/plugin-transform-modules-commonjs': 7.18.6
'@jest/types': 27.5.1
'@umijs/bundler-utils': 4.0.41
'@umijs/bundler-utils': 4.0.42
babel-jest: 28.1.3
esbuild: 0.15.18
identity-obj-proxy: 3.0.0
@ -4745,8 +4782,8 @@ packages:
react: 18.2.0
dev: true
/@umijs/utils/4.0.41:
resolution: {integrity: sha512-hN6CVFetpdvHA/8QE/RxWBkGhb2by93nFKo9CA9qVTKtxfwdJziYHszpicZUI0bEA13YNpHrf7vdndOnjJpHVg==}
/@umijs/utils/4.0.42:
resolution: {integrity: sha512-67GEzaV+6aLVxvbO5xtbSY3I3aBwvrETd8fpCOS+tnZSzFOt5qh5ffU8FFXhPAiBrsv0jrt9Wk9IIi+S3ulLdg==}
dependencies:
chokidar: 3.5.3
pino: 7.11.0
@ -5524,6 +5561,9 @@ packages:
resolution: {integrity: sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==}
peerDependencies:
styled-components: '>= 2'
peerDependenciesMeta:
styled-components:
optional: true
dependencies:
'@babel/helper-annotate-as-pure': 7.18.6
'@babel/helper-module-imports': 7.18.6
@ -7573,6 +7613,21 @@ packages:
strip-eof: 1.0.0
dev: true
/execa/5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
dependencies:
cross-spawn: 7.0.3
get-stream: 6.0.1
human-signals: 2.1.0
is-stream: 2.0.1
merge-stream: 2.0.0
npm-run-path: 4.0.1
onetime: 5.1.2
signal-exit: 3.0.7
strip-final-newline: 2.0.0
dev: true
/execa/6.1.0:
resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -8322,7 +8377,7 @@ packages:
/history/5.3.0:
resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==}
dependencies:
'@babel/runtime': 7.18.9
'@babel/runtime': 7.20.7
dev: true
/hmac-drbg/1.0.1:
@ -8479,6 +8534,11 @@ packages:
transitivePeerDependencies:
- supports-color
/human-signals/2.1.0:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
engines: {node: '>=10.17.0'}
dev: true
/human-signals/3.0.1:
resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==}
engines: {node: '>=12.20.0'}
@ -8889,7 +8949,6 @@ packages:
/is-stream/2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
dev: false
/is-stream/3.0.0:
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
@ -9229,6 +9288,10 @@ packages:
resolution: {integrity: sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==}
dev: true
/kolorist/1.6.0:
resolution: {integrity: sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==}
dev: true
/kuler/2.0.0:
resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
dev: false
@ -9340,6 +9403,11 @@ packages:
json5: 2.2.3
dev: true
/local-pkg/0.4.2:
resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==}
engines: {node: '>=14'}
dev: true
/localforage/1.10.0:
resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==}
dependencies:
@ -10029,6 +10097,13 @@ packages:
path-key: 2.0.1
dev: true
/npm-run-path/4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
dependencies:
path-key: 3.1.1
dev: true
/npm-run-path/5.1.0:
resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -12607,7 +12682,7 @@ packages:
react-dom:
optional: true
dependencies:
'@babel/runtime': 7.18.9
'@babel/runtime': 7.20.7
invariant: 2.2.4
prop-types: 15.8.1
react: 18.2.0
@ -12627,7 +12702,7 @@ packages:
react-dom:
optional: true
dependencies:
'@babel/runtime': 7.18.9
'@babel/runtime': 7.20.7
invariant: 2.2.4
prop-types: 15.8.1
react: 18.1.0
@ -13838,6 +13913,11 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/strip-final-newline/2.0.0:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
dev: true
/strip-final-newline/3.0.0:
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
engines: {node: '>=12'}
@ -14436,21 +14516,21 @@ packages:
qs: 6.11.0
dev: true
/umi/4.0.41_h4ojpibysiaer7lth2s4sljnlm:
resolution: {integrity: sha512-0yViucWZPtliPeoczh0sH3MV665s9B7rD2l8rbUCqyduX1NN/D12IE6BD5USH6+FcMjxIxF8DyAX0PhUiLsOyQ==}
/umi/4.0.42_h4ojpibysiaer7lth2s4sljnlm:
resolution: {integrity: sha512-ItsrutcdOKWYKcB5aPZHk4gD9kodC/l4C9x5/9gwzN38AfEaojM5YtVFoGhZQeFcD3aBYYf/kegiUdJtdfErYA==}
engines: {node: '>=14'}
hasBin: true
dependencies:
'@babel/runtime': 7.18.9
'@umijs/bundler-utils': 4.0.41
'@umijs/bundler-webpack': 4.0.41_cdwcylzbt7apydvbx5kbqfz4va
'@umijs/core': 4.0.41
'@umijs/lint': 4.0.41_d6a4x3x3q3loe4v2ypyqhqerii
'@umijs/preset-umi': 4.0.41_wbbmjm6mucxohffaoliigwhyze
'@umijs/renderer-react': 4.0.41_biqbaboplfbrettd7655fr4n2y
'@umijs/server': 4.0.41
'@umijs/test': 4.0.41
'@umijs/utils': 4.0.41
'@umijs/bundler-utils': 4.0.42
'@umijs/bundler-webpack': 4.0.42_cdwcylzbt7apydvbx5kbqfz4va
'@umijs/core': 4.0.42
'@umijs/lint': 4.0.42_d6a4x3x3q3loe4v2ypyqhqerii
'@umijs/preset-umi': 4.0.42_wbbmjm6mucxohffaoliigwhyze
'@umijs/renderer-react': 4.0.42_biqbaboplfbrettd7655fr4n2y
'@umijs/server': 4.0.42
'@umijs/test': 4.0.42
'@umijs/utils': 4.0.42
prettier-plugin-organize-imports: 2.3.4_xwureqoch7frpr2i35ruxzci5i
prettier-plugin-packagejson: 2.3.0_prettier@2.8.1
transitivePeerDependencies:

View File

@ -10,6 +10,7 @@ import {
ContainerOutlined,
} from '@ant-design/icons';
import IconFont from '@/components/iconfont';
import { BasicLayoutProps } from '@ant-design/pro-layout';
export default {
route: {
@ -93,4 +94,4 @@ export default {
contentWidth: 'Fixed',
splitMenus: false,
siderWidth: 180,
} as any;
} as BasicLayoutProps;

View File

@ -25,6 +25,7 @@ import {
Popover,
Descriptions,
Tooltip,
MenuProps,
} from 'antd';
// @ts-ignore
import SockJS from 'sockjs-client';
@ -222,9 +223,6 @@ export default function () {
}
if (['/login', '/initialization', '/error'].includes(location.pathname)) {
document.title = `${
(config.documentTitleMap as any)[location.pathname]
} - `;
if (systemInfo?.isInitialized && location.pathname === '/initialization') {
history.push('/crontab');
}
@ -251,13 +249,17 @@ export default function () {
!navigator.userAgent.includes('Chrome');
const isQQBrowser = navigator.userAgent.includes('QQBrowser');
const menu = (
<Menu
className="side-menu-user-drop-menu"
items={[{ label: '退出登录', key: 'logout', icon: <LogoutOutlined /> }]}
onClick={logout}
/>
);
const menu: MenuProps = {
items: [
{
label: '退出登录',
className: 'side-menu-user-drop-menu',
onClick: logout,
key: 'logout',
icon: <LogoutOutlined />,
},
],
};
return loading ? (
<PageLoading />
) : (
@ -266,6 +268,7 @@ export default function () {
loading={loading}
ErrorBoundary={Sentry.ErrorBoundary}
logo={<Image preview={false} src="https://qn.whyour.cn/logo.png" />}
// @ts-ignore
title={
<>
<span style={{ fontSize: 16 }}></span>
@ -308,16 +311,15 @@ export default function () {
return <Link to={menuItemProps.path}>{defaultDom}</Link>;
}}
pageTitleRender={(props, pageName, info) => {
if (info && typeof info.pageName === 'string') {
return `${info.pageName} - 控制面板`;
}
return '控制面板';
const title =
(config.documentTitleMap as any)[location.pathname] || '未找到';
return `${title} - 控制面板`;
}}
onCollapse={setCollapsed}
collapsed={collapsed}
rightContentRender={() =>
ctx.isPhone && (
<Dropdown overlay={menu} placement="bottomRight" trigger={['click']}>
<Dropdown menu={menu} placement="bottomRight" trigger={['click']}>
<span className="side-menu-user-wrapper">
<Avatar
shape="square"
@ -339,7 +341,7 @@ export default function () {
}}
>
{!collapsed && !ctx.isPhone && (
<Dropdown overlay={menu} placement="topLeft" trigger={['hover']}>
<Dropdown menu={menu} placement="topLeft" trigger={['hover']}>
<span className="side-menu-user-wrapper">
<Avatar
shape="square"

18
src/pages/404.tsx Normal file
View File

@ -0,0 +1,18 @@
import React from 'react';
import { Button, Result, Typography } from 'antd';
const { Link } = Typography;
const NotFound: React.FC = () => (
<Result
status="404"
title="404"
extra={
<Button type="primary">
<Link href="/"></Link>
</Button>
}
/>
);
export default NotFound;

View File

@ -14,6 +14,7 @@ import {
Popover,
Tabs,
TablePaginationConfig,
MenuProps,
} from 'antd';
import {
ClockCircleOutlined,
@ -684,15 +685,13 @@ const Crontab = () => {
arrow={{ pointAtCenter: true }}
placement="bottomRight"
trigger={['click']}
overlay={
<Menu
items={getMenuItems(record)}
onClick={({ key, domEvent }) => {
domEvent.stopPropagation();
action(key, record, index);
}}
/>
}
menu={{
items: getMenuItems(record),
onClick: ({ key, domEvent }) => {
domEvent.stopPropagation();
action(key, record, index);
},
}}
>
<a onClick={(e) => e.stopPropagation()}>
<EllipsisOutlined />
@ -889,41 +888,39 @@ const Crontab = () => {
}
};
const menu = (
<Menu
onClick={({ key, domEvent }) => {
domEvent.stopPropagation();
viewAction(key);
}}
items={[
...[...enabledCronViews].slice(4).map((x) => ({
label: (
<Space style={{ display: 'flex', justifyContent: 'space-between' }}>
<span>{x.name}</span>
{viewConf?.id === x.id && (
<CheckOutlined style={{ color: '#1890ff' }} />
)}
</Space>
),
key: x.id,
icon: <UnorderedListOutlined />,
})),
{
type: 'divider',
},
{
label: '新建视图',
key: 'new',
icon: <PlusOutlined />,
},
{
label: '视图管理',
key: 'manage',
icon: <SettingOutlined />,
},
]}
/>
);
const menu: MenuProps = {
onClick: ({ key, domEvent }) => {
domEvent.stopPropagation();
viewAction(key);
},
items: [
...[...enabledCronViews].slice(4).map((x) => ({
label: (
<Space style={{ display: 'flex', justifyContent: 'space-between' }}>
<span>{x.name}</span>
{viewConf?.id === x.id && (
<CheckOutlined style={{ color: '#1890ff' }} />
)}
</Space>
),
key: x.id,
icon: <UnorderedListOutlined />,
})),
{
type: 'divider' as 'group',
},
{
label: '新建视图',
key: 'new',
icon: <PlusOutlined />,
},
{
label: '视图管理',
key: 'manage',
icon: <SettingOutlined />,
},
],
};
const getCronViews = () => {
setLoading(true);
@ -975,7 +972,7 @@ const Crontab = () => {
className={`crontab-view ${moreMenuActive ? 'more-active' : ''}`}
tabBarExtraContent={
<Dropdown
overlay={menu}
menu={menu}
trigger={['click']}
overlayStyle={{ minWidth: 200 }}
>

View File

@ -1,4 +1,4 @@
import React, { useEffect, useState } from 'react';
import React, { useEffect, useRef, useState } from 'react';
import { Modal, message, Input, Form, Statistic, Button } from 'antd';
import { request } from '@/utils/http';
import config from '@/utils/config';
@ -34,7 +34,6 @@ const CronLogModal = ({
const [loading, setLoading] = useState<any>(true);
const [executing, setExecuting] = useState<any>(true);
const [isPhone, setIsPhone] = useState(false);
const [theme, setTheme] = useState<string>('');
const getCronLog = (isFirst?: boolean) => {
if (isFirst) {
@ -49,10 +48,14 @@ const CronLogModal = ({
) {
const log = data as string;
setValue(log || '暂无日志');
setExecuting(
log && !logEnded(log) && !log.includes('重启面板'),
);
if (log && !logEnded(log) && !log.includes('重启面板')) {
const hasNext = log && !logEnded(log) && !log.includes('重启面板');
setExecuting(hasNext);
setTimeout(() => {
document
.querySelector('#log-flag')!
.scrollIntoView({ behavior: 'smooth' });
});
if (hasNext) {
setTimeout(() => {
getCronLog();
}, 2000);
@ -155,6 +158,7 @@ const CronLogModal = ({
{value}
</pre>
)}
<div id="log-flag"></div>
</Modal>
);
};

View File

@ -11,6 +11,7 @@ import {
Dropdown,
Menu,
Empty,
MenuProps,
} from 'antd';
import config from '@/utils/config';
import { PageContainer } from '@ant-design/pro-layout';
@ -66,7 +67,8 @@ const Script = () => {
const [isEditing, setIsEditing] = useState(false);
const editorRef = useRef<any>(null);
const [isAddFileModalVisible, setIsAddFileModalVisible] = useState(false);
const [isRenameFileModalVisible, setIsRenameFileModalVisible] = useState(false);
const [isRenameFileModalVisible, setIsRenameFileModalVisible] =
useState(false);
const [currentNode, setCurrentNode] = useState<any>();
const [expandedKeys, setExpandedKeys] = useState<string[]>([]);
@ -293,12 +295,12 @@ const Script = () => {
const renameFile = () => {
setIsRenameFileModalVisible(true);
}
};
const handleRenameFileCancel = () => {
setIsRenameFileModalVisible(false);
getScripts(false);
}
};
const addFile = () => {
setIsAddFileModalVisible(true);
@ -402,46 +404,44 @@ const Script = () => {
}
};
const menu = isEditing ? (
<Menu
items={[
{ label: '保存', key: 'save', icon: <PlusOutlined /> },
{ label: '退出编辑', key: 'exit', icon: <EditOutlined /> },
]}
onClick={({ key, domEvent }) => {
domEvent.stopPropagation();
action(key);
}}
/>
) : (
<Menu
items={[
{ label: '新建', key: 'add', icon: <PlusOutlined /> },
{
label: '编辑',
key: 'edit',
icon: <EditOutlined />,
disabled: !select,
const menu: MenuProps = isEditing
? {
items: [
{ label: '保存', key: 'save', icon: <PlusOutlined /> },
{ label: '退出编辑', key: 'exit', icon: <EditOutlined /> },
],
onClick: ({ key, domEvent }) => {
domEvent.stopPropagation();
action(key);
},
{
label: '重命名',
key: 'rename',
icon: <IconFont type="ql-icon-rename" />,
disabled: !select,
}
: {
items: [
{ label: '新建', key: 'add', icon: <PlusOutlined /> },
{
label: '编辑',
key: 'edit',
icon: <EditOutlined />,
disabled: !select,
},
{
label: '重命名',
key: 'rename',
icon: <IconFont type="ql-icon-rename" />,
disabled: !select,
},
{
label: '删除',
key: 'delete',
icon: <DeleteOutlined />,
disabled: !select,
},
],
onClick: ({ key, domEvent }) => {
domEvent.stopPropagation();
menuAction(key);
},
{
label: '删除',
key: 'delete',
icon: <DeleteOutlined />,
disabled: !select,
},
]}
onClick={({ key, domEvent }) => {
domEvent.stopPropagation();
menuAction(key);
}}
/>
);
};
return (
<PageContainer
@ -464,7 +464,7 @@ const Script = () => {
allowClear
onSelect={onSelect}
/>,
<Dropdown overlay={menu} trigger={['click']}>
<Dropdown menu={menu} trigger={['click']}>
<Button type="primary" icon={<EllipsisOutlined />} />
</Dropdown>,
]

View File

@ -17,7 +17,6 @@ import {
import config from '@/utils/config';
import { PageContainer } from '@ant-design/pro-layout';
import { request } from '@/utils/http';
import * as DarkReader from '@umijs/ssr-darkreader';
import AppModal from './appModal';
import {
EditOutlined,
@ -27,18 +26,13 @@ import {
import SecuritySettings from './security';
import LoginLog from './loginLog';
import NotificationSetting from './notification';
import CheckUpdate from './checkUpdate';
import Other from './other';
import About from './about';
import { useOutletContext } from '@umijs/max';
import { SharedContext } from '@/layouts';
import './index.less';
const { Text } = Typography;
const optionsWithDisabled = [
{ label: '亮色', value: 'light' },
{ label: '暗色', value: 'dark' },
{ label: '跟随系统', value: 'auto' },
];
const Setting = () => {
const {
@ -121,37 +115,12 @@ const Setting = () => {
];
const [loading, setLoading] = useState(true);
const defaultTheme = localStorage.getItem('qinglong_dark_theme') || 'auto';
const [dataSource, setDataSource] = useState<any[]>([]);
const [isModalVisible, setIsModalVisible] = useState(false);
const [editedApp, setEditedApp] = useState<any>();
const [tabActiveKey, setTabActiveKey] = useState('security');
const [loginLogData, setLoginLogData] = useState<any[]>([]);
const [notificationInfo, setNotificationInfo] = useState<any>();
const [logRemoveFrequency, setLogRemoveFrequency] = useState<number>();
const [form] = Form.useForm();
const {
enable: enableDarkMode,
disable: disableDarkMode,
exportGeneratedCSS: collectCSS,
setFetchMethod,
auto: followSystemColorScheme,
} = DarkReader || {};
const themeChange = (e: any) => {
const _theme = e.target.value;
localStorage.setItem('qinglong_dark_theme', e.target.value);
setFetchMethod(fetch);
if (_theme === 'dark') {
enableDarkMode({});
} else if (_theme === 'light') {
disableDarkMode();
} else {
followSystemColorScheme({});
}
reloadTheme();
};
const getApps = () => {
setLoading(true);
@ -276,8 +245,6 @@ const Setting = () => {
getLoginLog();
} else if (activeKey === 'notification') {
getNotification();
} else if (activeKey === 'other') {
getLogRemoveFrequency();
}
};
@ -294,37 +261,6 @@ const Setting = () => {
});
};
const getLogRemoveFrequency = () => {
request
.get(`${config.apiPrefix}system/log/remove`)
.then(({ code, data }) => {
if (code === 200 && data.info) {
const { frequency } = data.info;
setLogRemoveFrequency(frequency);
}
})
.catch((error: any) => {
console.log(error);
});
};
const updateRemoveLogFrequency = () => {
setTimeout(() => {
request
.put(`${config.apiPrefix}system/log/remove`, {
data: { frequency: logRemoveFrequency },
})
.then(({ code, data }) => {
if (code === 200) {
message.success('更新成功');
}
})
.catch((error: any) => {
console.log(error);
});
});
};
return (
<PageContainer
className="ql-container-wrapper ql-container-wrapper-has-tab ql-setting-container"
@ -382,46 +318,11 @@ const Setting = () => {
key: 'other',
label: '其他设置',
children: (
<Form layout="vertical" form={form}>
<Form.Item
label="主题设置"
name="theme"
initialValue={defaultTheme}
>
<Radio.Group
options={optionsWithDisabled}
onChange={themeChange}
value={defaultTheme}
optionType="button"
buttonStyle="solid"
/>
</Form.Item>
<Form.Item
label="日志删除频率"
name="frequency"
tooltip="每x天自动删除x天以前的日志"
>
<Input.Group compact>
<InputNumber
addonBefore="每"
addonAfter="天"
style={{ width: 150 }}
min={0}
value={logRemoveFrequency}
onChange={(value) => setLogRemoveFrequency(value)}
/>
<Button type="primary" onClick={updateRemoveLogFrequency}>
</Button>
</Input.Group>
</Form.Item>
<Form.Item label="检查更新" name="update">
<CheckUpdate
systemInfo={systemInfo}
socketMessage={socketMessage}
/>
</Form.Item>
</Form>
<Other
reloadTheme={reloadTheme}
socketMessage={socketMessage}
systemInfo={systemInfo}
/>
),
},
{

120
src/pages/setting/other.tsx Normal file
View File

@ -0,0 +1,120 @@
import React, { useState, useEffect } from 'react';
import { Button, InputNumber, Form, Radio, message, Input } from 'antd';
import * as DarkReader from '@umijs/ssr-darkreader';
import config from '@/utils/config';
import { request } from '@/utils/http';
import CheckUpdate from './checkUpdate';
import { SharedContext } from '@/layouts';
import './index.less';
const optionsWithDisabled = [
{ label: '亮色', value: 'light' },
{ label: '暗色', value: 'dark' },
{ label: '跟随系统', value: 'auto' },
];
const Other = ({
systemInfo,
socketMessage,
reloadTheme,
}: Pick<SharedContext, 'socketMessage' | 'reloadTheme' | 'systemInfo'>) => {
const defaultTheme = localStorage.getItem('qinglong_dark_theme') || 'auto';
const [logRemoveFrequency, setLogRemoveFrequency] = useState<number | null>();
const [form] = Form.useForm();
const {
enable: enableDarkMode,
disable: disableDarkMode,
exportGeneratedCSS: collectCSS,
setFetchMethod,
auto: followSystemColorScheme,
} = DarkReader || {};
const themeChange = (e: any) => {
const _theme = e.target.value;
localStorage.setItem('qinglong_dark_theme', e.target.value);
setFetchMethod(fetch);
if (_theme === 'dark') {
enableDarkMode({});
} else if (_theme === 'light') {
disableDarkMode();
} else {
followSystemColorScheme({});
}
reloadTheme();
};
const getLogRemoveFrequency = () => {
request
.get(`${config.apiPrefix}system/log/remove`)
.then(({ code, data }) => {
if (code === 200 && data.info) {
const { frequency } = data.info;
setLogRemoveFrequency(frequency);
}
})
.catch((error: any) => {
console.log(error);
});
};
const updateRemoveLogFrequency = () => {
setTimeout(() => {
request
.put(`${config.apiPrefix}system/log/remove`, {
data: { frequency: logRemoveFrequency },
})
.then(({ code, data }) => {
if (code === 200) {
message.success('更新成功');
}
})
.catch((error: any) => {
console.log(error);
});
});
};
useEffect(() => {
getLogRemoveFrequency();
}, []);
return (
<Form layout="vertical" form={form}>
<Form.Item label="主题设置" name="theme" initialValue={defaultTheme}>
<Radio.Group
options={optionsWithDisabled}
onChange={themeChange}
value={defaultTheme}
optionType="button"
buttonStyle="solid"
/>
</Form.Item>
<Form.Item
label="日志删除频率"
name="frequency"
tooltip="每x天自动删除x天以前的日志"
>
<Input.Group compact>
<InputNumber
addonBefore="每"
addonAfter="天"
style={{ width: 150 }}
min={0}
value={logRemoveFrequency}
onChange={(value) => setLogRemoveFrequency(value)}
/>
<Button type="primary" onClick={updateRemoveLogFrequency}>
</Button>
</Input.Group>
</Form.Item>
<Form.Item label="检查更新" name="update">
<CheckUpdate systemInfo={systemInfo} socketMessage={socketMessage} />
</Form.Item>
</Form>
);
};
export default Other;

View File

@ -427,28 +427,26 @@ const Subscription = () => {
arrow={{ pointAtCenter: true }}
placement="bottomRight"
trigger={['click']}
overlay={
<Menu
items={[
{ label: '编辑', key: 'edit', icon: <EditOutlined /> },
{
label: record.is_disabled === 1 ? '启用' : '禁用',
key: 'enableOrDisable',
icon:
record.is_disabled === 1 ? (
<CheckCircleOutlined />
) : (
<StopOutlined />
),
},
{ label: '删除', key: 'delete', icon: <DeleteOutlined /> },
]}
onClick={({ key, domEvent }) => {
domEvent.stopPropagation();
action(key, record, index);
}}
/>
}
menu={{
items: [
{ label: '编辑', key: 'edit', icon: <EditOutlined /> },
{
label: record.is_disabled === 1 ? '启用' : '禁用',
key: 'enableOrDisable',
icon:
record.is_disabled === 1 ? (
<CheckCircleOutlined />
) : (
<StopOutlined />
),
},
{ label: '删除', key: 'delete', icon: <DeleteOutlined /> },
],
onClick: ({ key, domEvent }) => {
domEvent.stopPropagation();
action(key, record, index);
},
}}
>
<a onClick={(e) => e.stopPropagation()}>
<EllipsisOutlined />

View File

@ -296,7 +296,7 @@ export default {
documentTitleMap: {
'/login': '登录',
'/initialization': '初始化',
'/cron': '定时任务',
'/crontab': '定时任务',
'/env': '环境变量',
'/subscription': '订阅管理',
'/config': '配置文件',
@ -305,6 +305,7 @@ export default {
'/log': '日志管理',
'/setting': '系统设置',
'/error': '错误日志',
'/dependence': '依赖管理',
},
dependenceTypes: ['nodejs', 'python3', 'linux'],
};