diff --git a/config/config.ts b/config/config.ts index c6e3a197..a745026b 100644 --- a/config/config.ts +++ b/config/config.ts @@ -1,4 +1,5 @@ import { defineConfig } from '@umijs/max'; +import theme from './theme'; const CompressionWebpackPlugin = require('compression-webpack-plugin'); import proxy from './proxy'; @@ -44,6 +45,24 @@ export default defineConfig({ minRatio: 0.8 } ]); + config.module + .rule('images') + .test(/\.(png|jpe?g|gif|svg|ico)(\?.*)?$/) + .use('url-loader') + .loader(require.resolve('url-loader')) + .tap((options: any) => { + console.log('iamges==options========', options); + return { + ...options, + limit: 8192, // 小于8KB的图片会被转为base64 + fallback: { + loader: require.resolve('file-loader'), + options: { + name: 'static/[name].[hash:8].[ext]' // 将所有图片输出到 static 目录 + } + } + }; + }); } } : {}), @@ -58,25 +77,7 @@ export default defineConfig({ style: 'less', configProvider: { componentSize: 'large', - theme: { - 'root-entry-name': 'variable', - cssVar: true, - hashed: false, - components: { - Input: { - inputFontSize: 12 - }, - Table: { - cellFontSize: 12 - } - }, - token: { - colorPrimary: '#2fbf85', - borderRadius: 8, - fontSize: 12, - motion: true - } - } + theme } }, hash: true, diff --git a/config/theme.ts b/config/theme.ts new file mode 100644 index 00000000..c56d26c2 --- /dev/null +++ b/config/theme.ts @@ -0,0 +1,25 @@ +export default { + 'root-entry-name': 'variable', + cssVar: true, + hashed: false, + components: { + Input: { + inputFontSize: 12 + }, + Table: { + cellFontSize: 12, + rowSelectedHoverBg: '#e6f6ff' + }, + Menu: { + iconSize: 16, + iconMarginInlineEnd: 12, + itemHeight: 44 + } + }, + token: { + colorPrimary: '#007BFF', + borderRadius: 8, + fontSize: 12, + motion: true + } +}; diff --git a/package.json b/package.json index be527a00..24f87db9 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "dayjs": "^1.11.11", "has-ansi": "^5.0.1", "jotai": "^2.8.4", + "localforage": "^1.10.0", "lodash": "^4.17.21", "numeral": "^2.0.6", "query-string": "^9.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2148053f..8b87d360 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ dependencies: jotai: specifier: ^2.8.4 version: 2.8.4(@types/react@18.3.1)(react@18.3.1) + localforage: + specifier: ^1.10.0 + version: 1.10.0 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -4285,7 +4288,7 @@ packages: dependencies: '@babel/core': 7.24.5 postcss: 7.0.39 - postcss-syntax: 0.36.2(postcss@7.0.39) + postcss-syntax: 0.36.2(postcss@8.4.38) transitivePeerDependencies: - supports-color dev: false @@ -4312,7 +4315,7 @@ packages: postcss-syntax: '>=0.36.2' dependencies: postcss: 7.0.39 - postcss-syntax: 0.36.2(postcss@7.0.39) + postcss-syntax: 0.36.2(postcss@8.4.38) remark: 13.0.0 unist-util-find-all-after: 3.0.2 transitivePeerDependencies: @@ -10176,6 +10179,10 @@ packages: requiresBuild: true optional: true + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, tarball: https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz} + dev: false + /immer@8.0.4: resolution: {integrity: sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ==} dev: false @@ -10999,6 +11006,12 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==, tarball: https://registry.npmjs.org/lie/-/lie-3.1.1.tgz} + dependencies: + immediate: 3.0.6 + dev: false + /lightningcss-darwin-arm64@1.22.1: resolution: {integrity: sha512-ldvElu+R0QimNTjsKpaZkUv3zf+uefzLy/R1R19jtgOfSRM+zjUCUgDhfEDRmVqJtMwYsdhMI2aJtJChPC6Osg==, tarball: https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.22.1.tgz} engines: {node: '>= 12.0.0'} @@ -11158,6 +11171,12 @@ packages: engines: {node: '>=14'} dev: false + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==, tarball: https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz} + dependencies: + lie: 3.1.1 + dev: false + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -12460,7 +12479,7 @@ packages: dependencies: htmlparser2: 3.10.1 postcss: 7.0.39 - postcss-syntax: 0.36.2(postcss@7.0.39) + postcss-syntax: 0.36.2(postcss@8.4.38) dev: false /postcss-image-set-function@4.0.7(postcss@8.4.38): @@ -12750,30 +12769,6 @@ packages: lodash: 4.17.21 postcss: 8.4.38 - /postcss-syntax@0.36.2(postcss@7.0.39): - resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==} - peerDependencies: - postcss: '>=5.0.0' - postcss-html: '*' - postcss-jsx: '*' - postcss-less: '*' - postcss-markdown: '*' - postcss-scss: '*' - peerDependenciesMeta: - postcss-html: - optional: true - postcss-jsx: - optional: true - postcss-less: - optional: true - postcss-markdown: - optional: true - postcss-scss: - optional: true - dependencies: - postcss: 7.0.39 - dev: false - /postcss-syntax@0.36.2(postcss@8.4.38): resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==} peerDependencies: @@ -15900,7 +15895,7 @@ packages: postcss-sass: 0.4.4 postcss-scss: 2.1.1 postcss-selector-parser: 6.0.16 - postcss-syntax: 0.36.2(postcss@7.0.39) + postcss-syntax: 0.36.2(postcss@8.4.38) postcss-value-parser: 4.2.0 resolve-from: 5.0.0 slash: 3.0.0 diff --git a/src/assets/images/bg-12.png b/src/assets/images/bg-12.png new file mode 100644 index 00000000..a550b46a Binary files /dev/null and b/src/assets/images/bg-12.png differ diff --git a/src/assets/images/bg-2.png b/src/assets/images/bg-2.png new file mode 100644 index 00000000..91e22ef0 Binary files /dev/null and b/src/assets/images/bg-2.png differ diff --git a/src/assets/styles/menu.less b/src/assets/styles/menu.less index cc7ed8e6..2aa4ae8b 100644 --- a/src/assets/styles/menu.less +++ b/src/assets/styles/menu.less @@ -7,7 +7,7 @@ background-color: var(--color-fill-1); border-inline: none; border-radius: 0; - padding-inline: 16px; + // padding-inline: 16px; padding-block-end: 12px; } diff --git a/src/components/card-wrapper/index.less b/src/components/card-wrapper/index.less index 3bebaead..edd203f9 100644 --- a/src/components/card-wrapper/index.less +++ b/src/components/card-wrapper/index.less @@ -1,6 +1,8 @@ .cardWrapper { border-radius: var(--border-radius-small); background-color: var(--color-white-1); - box-shadow: var(--box-shadow-base); + // box-shadow: var(--box-shadow-base); + box-shadow: none; padding: 10px; + border: 1px solid var(--ant-color-border); } diff --git a/src/components/charts/area.tsx b/src/components/charts/area.tsx index 672e0066..b0503e5b 100644 --- a/src/components/charts/area.tsx +++ b/src/components/charts/area.tsx @@ -35,15 +35,15 @@ const LineChart: React.FC = (props) => { x: { textStyle: { autoRoate: true - } + }, + labelFormatter }, y: { tick: false, // size: 14, // title: '%', titlePosition: 'top', - titleFontSize: 12, - labelFormatter + titleFontSize: 12 } }, style: { diff --git a/src/components/charts/column-bar.tsx b/src/components/charts/column-bar.tsx index 064ea55c..672e0211 100644 --- a/src/components/charts/column-bar.tsx +++ b/src/components/charts/column-bar.tsx @@ -13,6 +13,7 @@ interface BarChartProps { seriesField?: string; stack?: boolean; legend?: any; + labelFormatter?: (v: any) => string; } const BarChart: React.FC = (props) => { const { @@ -25,7 +26,8 @@ const BarChart: React.FC = (props) => { colorField, seriesField, stack, - legend = undefined + legend = undefined, + labelFormatter } = props; const config = { data, @@ -57,7 +59,8 @@ const BarChart: React.FC = (props) => { axis: { x: { xAxis: true, - tick: false + tick: false, + labelFormatter }, y: { tick: false, @@ -86,10 +89,7 @@ const BarChart: React.FC = (props) => { style: { fill: (params: any) => { - return ( - params.color || - 'linear-gradient(90deg,rgba(84, 204, 152,0.8) 0%,rgb(0, 168, 143,.7) 100%)' - ); + return params.color || 'rgba(84, 204, 152,0.8)'; }, // radiusTopLeft: 12, // radiusTopRight: 12, diff --git a/src/components/editor-wrap/index.less b/src/components/editor-wrap/index.less index df052fa5..7ff7aea3 100644 --- a/src/components/editor-wrap/index.less +++ b/src/components/editor-wrap/index.less @@ -1,21 +1,25 @@ .editor-wrap { - border-radius: 16px; + border-radius: 8px; overflow: hidden; + .editor-header { display: flex; padding: 6px 10px; justify-content: space-between; align-items: center; background-color: rgb(56, 56, 56); + .ant-select-selector { - background-color: rgba(255, 255, 255, 0.09) !important; - color: rgba(255, 255, 255, 0.7); + background-color: rgba(255, 255, 255, 9%) !important; + color: rgba(255, 255, 255, 70%); + .ant-select-selection-item { - color: rgba(255, 255, 255, 0.7); + color: rgba(255, 255, 255, 70%); } } + .ant-select-arrow { - color: rgba(255, 255, 255, 0.7); + color: rgba(255, 255, 255, 70%); } } // set scrollbar style diff --git a/src/components/modal-footer/index.tsx b/src/components/modal-footer/index.tsx index 4f494e05..7e88f29a 100644 --- a/src/components/modal-footer/index.tsx +++ b/src/components/modal-footer/index.tsx @@ -1,3 +1,4 @@ +import { useIntl } from '@umijs/max'; import { Button, Space } from 'antd'; type ModalFooterProps = { @@ -18,10 +19,11 @@ const ModalFooter: React.FC = ({ htmlType = 'button', form }) => { + const intl = useIntl(); return ( ); diff --git a/src/components/page-tools/index.tsx b/src/components/page-tools/index.tsx index 6ab8283a..2aacf26c 100644 --- a/src/components/page-tools/index.tsx +++ b/src/components/page-tools/index.tsx @@ -14,7 +14,7 @@ const PageTools: React.FC = (props) => { left, right, marginBottom = 0, - marginTop = 70, + marginTop = 60, style: pageStyle } = props; diff --git a/src/components/progress-bar/index.tsx b/src/components/progress-bar/index.tsx index 4b309b27..8f177af3 100644 --- a/src/components/progress-bar/index.tsx +++ b/src/components/progress-bar/index.tsx @@ -29,12 +29,12 @@ const RenderProgress = memo( { return ( {percent}% @@ -49,12 +49,12 @@ const RenderProgress = memo( { return ( {percent}% diff --git a/src/components/seal-form/components/wrapper.less b/src/components/seal-form/components/wrapper.less index 25791a4d..954ea44f 100644 --- a/src/components/seal-form/components/wrapper.less +++ b/src/components/seal-form/components/wrapper.less @@ -3,11 +3,12 @@ @inputheight: 32px; @borderRadius: 8px; @input-inner-padding: 12px; + @bgColor: transparent; position: relative; display: flex; flex-direction: column; - align-items: center; + align-items: flex-start; height: 54px; border-width: var(--ant-line-width); border-style: var(--ant-line-type); @@ -15,6 +16,7 @@ border-radius: @borderRadius; padding-inline: 12px; padding-block: 20px 0; + background-color: var(--color-white-1); &.filled { border: none; @@ -105,6 +107,7 @@ } // ==================== select ================== + :global(.ant-select) { display: flex; align-items: center; @@ -118,6 +121,7 @@ padding-block: 5px; padding-inline: @input-inner-padding !important; box-shadow: none !important; + background-color: @bgColor !important; } :global(.ant-select-selection-item) { @@ -127,6 +131,10 @@ padding-inline-end: 0 !important; } + :global(.ant-select-auto-complete) :global(.ant-select-selector) { + padding-inline: 0 !important; + } + :global(.ant-select-arrow) { top: 10px; } @@ -144,6 +152,7 @@ // ==================== input ==================== :global(.ant-input), :global(.ant-input-password) { + width: 100%; display: flex; align-items: center; border: none; @@ -151,6 +160,11 @@ padding-block: 5px; padding-inline: 12px; height: @inputheight !important; + background-color: @bgColor; + } + + :global(.ant-input.seal-textarea) { + width: 100%; } :global(.ant-input-number) { @@ -160,6 +174,7 @@ box-shadow: none; padding: 0; height: @inputheight !important; + background-color: @bgColor; } :global(.ant-input-outlined) { @@ -170,6 +185,7 @@ padding-block: 5px; padding-inline: @input-inner-padding; height: @inputheight !important; + background-color: transparent; &.seal-textarea { min-height: 100px !important; @@ -213,7 +229,7 @@ :global(.ant-input-search-button) { position: absolute; top: -20px; - right: -11px; + right: 0; border-radius: 0 @borderRadius @borderRadius 0 !important; overflow: hidden; border: none; diff --git a/src/components/seal-form/password.tsx b/src/components/seal-form/password.tsx index f101e598..fa76efaf 100644 --- a/src/components/seal-form/password.tsx +++ b/src/components/seal-form/password.tsx @@ -68,6 +68,7 @@ const SealPassword: React.FC = (props) => { {...rest} ref={inputRef} autoComplete="off" + className="seal-input-password" onFocus={handleOnFocus} onBlur={handleOnBlur} onChange={handleChange} diff --git a/src/components/seal-table/styles/cell.less b/src/components/seal-table/styles/cell.less index 152868d8..5103e915 100644 --- a/src/components/seal-table/styles/cell.less +++ b/src/components/seal-table/styles/cell.less @@ -4,13 +4,16 @@ display: flex; align-items: center; justify-content: flex-start; - height: 70px; + height: 68px; + &-left { justify-content: flex-start; } + &-right { justify-content: flex-end; } + &-center { justify-content: center; } diff --git a/src/components/seal-table/styles/index.less b/src/components/seal-table/styles/index.less index f4d69c19..014cdd69 100644 --- a/src/components/seal-table/styles/index.less +++ b/src/components/seal-table/styles/index.less @@ -23,7 +23,7 @@ margin-bottom: 20px; border-radius: var(--ant-table-header-border-radius); overflow: hidden; - box-shadow: var(--box-shadow-base); + // box-shadow: var(--box-shadow-base); } .expanded-row { @@ -39,7 +39,7 @@ display: flex; justify-content: flex-start; align-items: center; - background-color: var(--color-white-1); + background-color: var(--color-fill-sider); transition: all 0.2s ease; &:hover { diff --git a/src/components/transition/index.less b/src/components/transition/index.less index 28ac1d6d..ccc12fc4 100644 --- a/src/components/transition/index.less +++ b/src/components/transition/index.less @@ -1,5 +1,5 @@ .transition-wrapper { - border-radius: 16px; + border-radius: 8px; display: flex; flex-direction: column; overflow: hidden; diff --git a/src/components/util-bar/index.tsx b/src/components/util-bar/index.tsx index 93868f23..fc37680a 100644 --- a/src/components/util-bar/index.tsx +++ b/src/components/util-bar/index.tsx @@ -25,12 +25,12 @@ const UitilBar: React.FC = (props) => { const strokeColorFunc = (percent: number) => { if (percent <= 50) { - return 'var(--ant-color-primary)'; + return 'var(--color-chart-green)'; } if (percent <= 80) { - return 'var(--ant-color-warning)'; + return 'var(--color-chart-glod)'; } - return 'var(--ant-color-error)'; + return 'var(--color-chart-red)'; }; return (
diff --git a/src/config/hotkeys.ts b/src/config/hotkeys.ts index 82620bb9..6856393e 100644 --- a/src/config/hotkeys.ts +++ b/src/config/hotkeys.ts @@ -1,5 +1,5 @@ export default { - CREATE: ['ctrl+n', 'meta+n'], + CREATE: ['ctrl+shift+n', 'meta+shift+n'], SAVE: ['ctrl+s', 'meta+s'], SUBMIT: ['ctrl+enter', 'meta+enter'], SAVEAS: ['ctrl+shift+s', 'meta+shift+s'], diff --git a/src/global.less b/src/global.less index 8278a090..305a74a2 100644 --- a/src/global.less +++ b/src/global.less @@ -5,6 +5,7 @@ html { --ant-color-fill-tertiary: rgba(0, 0, 0, 4%); --color-fill-1: var(--ant-color-fill-tertiary); // --color-fill-1: #fff; + --ant-color-text: #000; --color-fill-2: #fff; --color-fill-3: #f3f6fa; --color-logs-bg: #1e1e1e; @@ -16,11 +17,12 @@ html { --border-radius-middle: 20px; --border-radius-small: 8px; --color-white-1: rgba(255, 255, 255, 100%); + --color-fill-sider: #f4f5f4; --font-weight-normal: 500; --font-weight-medium: 600; --font-weight-bold: 700; --color-text-1: var(--ant-color-text); - --color-bg-light-1: #f0fff6; + --color-bg-light-1: #e6f6ff; --font-size-base: 12px; --font-size-large: 16px; --font-size-middle: 14px; @@ -31,18 +33,19 @@ html { --ant-table-cell-padding-block: 8px; --ant-table-header-border-radius: 8px; --ant-table-header-split-color: #f0f0f0; - --ant-table-row-selected-bg: #f0fff6; - --ant-table-row-selected-hover-bg: #d8f2e4; - --ant-table-row-hover-bg: rgba(230, 230, 230, 70%); - --color-chart-red: #ff7875; - --color-chart-green: #54cc98; - --color-chart-glod: #ffd666; + --ant-table-row-selected-bg: #e6f6ff; + --ant-table-row-selected-hover-bg: #e6f6ff; + --ant-table-row-hover-bg: rgba(230, 230, 230, 88%); + --color-chart-red: rgba(255, 77, 79, 80%); + --color-chart-green: rgb(84, 204, 152, 80%); + --color-chart-glod: rgba(250, 173, 20, 80%); --seal-transition-func: cubic-bezier(0, 0, 1, 1); // ======== input ============ --ant-input-active-shadow: 0 0 0 2px rgba(5, 255, 105, 6%); - --ant-input-active-border-color: #2fbf85; - --ant-input-hover-border-color: #54cc98; - --box-shadow-base: 0 4px 12px rgba(227, 232, 240, 70%); + --ant-input-active-border-color: #007bff; + --ant-input-hover-border-color: #2997ff; + --box-shadow-base: 0 4px 6px rgba(227, 232, 240, 70%); + // --box-shadow-base: none; .css-var-rf { --ant-font-size: var(--font-size-base); @@ -54,7 +57,6 @@ html { --ant-font-size: var(--font-size-base); &.ant-menu-css-var { - --ant-menu-item-height: 46px; --ant-menu-item-selected-bg: var(--color-white-1); --ant-menu-item-border-radius: 8px; --ant-menu-item-selected-color: var(--ant-color-primary); @@ -72,6 +74,7 @@ html { --ant-font-size: var(--font-size-base); --ant-padding-sm: 14px; --ant-border-radius-lg: 8px; + --ant-color-text: #000; --ant-color-error: #ff4d4f; --ant-color-bg-mask: rgba(0, 0, 0, 35%); --ant-color-border: rgb(217 217 217 / 50%); @@ -171,7 +174,7 @@ body { tr > td { // background-color: var(--color-fill-1); border-bottom: none; - height: 70px; + height: 68px; &:first-child { border-top-left-radius: var(--table-td-radius); @@ -237,8 +240,9 @@ body { height: 100%; .ant-pro-sider .ant-layout-sider-children { - background-color: var(--color-white-1); - box-shadow: var(--box-shadow-base); + background-color: var(--color-fill-sider); + // box-shadow: var(--box-shadow-base); + border-right: 1px solid var(--ant-color-border); } } @@ -254,8 +258,9 @@ body { .ant-table-tbody { .ant-table-row { border-radius: var(--table-td-radius); - background-color: var(--color-white-1); - box-shadow: var(--box-shadow-base); + // background-color: var(--color-white-1); + background-color: var(--color-fill-sider); + // box-shadow: var(--box-shadow-base); > td { background-color: unset; @@ -297,10 +302,15 @@ body { } .ant-pro-layout-container { + min-height: 100vh; // background-color: var(--color-fill-2); } .ant-pro-sider { + .ant-pro-base-menu-inline-item-title { + gap: 12px; + } + .ant-menu { .ant-menu-item { border-radius: var(--border-radius-small); @@ -325,7 +335,7 @@ body { .ant-menu-item.ant-menu-item-selected { color: var(--ant-color-primary); - background-color: unset; + background-color: var(--ant-menu-item-selected-bg); } } } @@ -343,8 +353,9 @@ body { left: 0; bottom: 0; right: 0; - background: url('./assets/images/bg-11.png') center center no-repeat; - background-size: cover; + // background: url('@/assets/images/bg-11.png') center center no-repeat; + // background-size: cover; + background-color: #fff; &::after { content: ''; @@ -357,6 +368,15 @@ body { height: 100%; } } +// .login-wrapper { +// position: fixed; +// top: 0; +// left: 0; +// bottom: 0; +// right: 0; +// background: url('@/assets/images/bg-2.png') center center no-repeat; +// background-size: cover; +// } .ant-pro-page-container { background: transparent; diff --git a/src/pages/dashboard/components/active-table.tsx b/src/pages/dashboard/components/active-table.tsx index fa418e99..d6d1cbab 100644 --- a/src/pages/dashboard/components/active-table.tsx +++ b/src/pages/dashboard/components/active-table.tsx @@ -105,7 +105,7 @@ const ActiveTable = () => { diff --git a/src/pages/dashboard/components/system-load.tsx b/src/pages/dashboard/components/system-load.tsx index 0ea4f3a2..64f9ce9a 100644 --- a/src/pages/dashboard/components/system-load.tsx +++ b/src/pages/dashboard/components/system-load.tsx @@ -11,11 +11,6 @@ import { DashboardContext } from '../config/dashboard-context'; import ResourceUtilization from './resource-utilization'; const SystemLoad = () => { - const colors = [ - 'linear-gradient(90deg, rgba(84, 204, 152,.8) 0%, rgba(84, 204, 152,0.5) 50%, rgba(84, 204, 152,.8) 100%)', - 'linear-gradient(90deg, rgba(255, 214, 102,.8) 0%, rgba(255, 214, 102,0.5) 50%, rgba(255, 214, 102,.8) 100%)', - 'linear-gradient(90deg, rgba(255, 120, 117,.8) 0%, rgba(255, 120, 117,0.5) 50%, rgba(255, 120, 117,.8) 100%)' - ]; const intl = useIntl(); const data = useContext(DashboardContext)?.system_load?.current || {}; const { size } = useWindowResize(); @@ -39,7 +34,7 @@ const SystemLoad = () => {
{intl.formatMessage({ id: 'dashboard.systemload' })} diff --git a/src/pages/dashboard/components/usage.tsx b/src/pages/dashboard/components/usage.tsx index 4db15b9c..a320d094 100644 --- a/src/pages/dashboard/components/usage.tsx +++ b/src/pages/dashboard/components/usage.tsx @@ -225,6 +225,10 @@ const Usage = () => { setUserData(userList); }; + const labelFormatter = (v: any) => { + return dayjs(v).format('MM-DD'); + }; + useEffect(() => { if (size.width < breakpoints.xl) { setPaddingRight('0'); @@ -240,7 +244,7 @@ const Usage = () => { return ( <> {intl.formatMessage({ id: 'dashboard.usage' })} @@ -272,6 +276,7 @@ const Usage = () => { xField="time" yField="value" height={360} + labelFormatter={labelFormatter} > @@ -285,6 +290,7 @@ const Usage = () => { legend={false} yField="value" height={360} + labelFormatter={labelFormatter} > diff --git a/src/pages/login/components/login-form.tsx b/src/pages/login/components/login-form.tsx index d2abf2a3..4363aa14 100644 --- a/src/pages/login/components/login-form.tsx +++ b/src/pages/login/components/login-form.tsx @@ -1,13 +1,23 @@ import LogoIcon from '@/assets/images/logo.png'; import { initialPasswordAtom, userAtom } from '@/atoms/user'; import SealInput from '@/components/seal-form/seal-input'; +import { + getRememberMe, + rememberMe, + removeRememberMe +} from '@/utils/localstore/index'; import { GlobalOutlined, LockOutlined, UserOutlined } from '@ant-design/icons'; import { SelectLang, history, useIntl, useModel } from '@umijs/max'; import { Button, Checkbox, Form } from 'antd'; +import CryptoJS from 'crypto-js'; import { useAtom } from 'jotai'; +import { useEffect } from 'react'; import { flushSync } from 'react-dom'; import { login } from '../apis'; +const REMEMBER_ME_KEY = 'r_m'; +const CRYPT_TEXT = 'seal'; + const renderLogo = () => { return (
{ const [userInfo, setUserInfo] = useAtom(userAtom); const [initialPassword, setInitialPassword] = useAtom(initialPasswordAtom); const { initialState, setInitialState } = useModel('@@initialState'); - const { globalState, setGlobalState } = useModel('global'); const intl = useIntl(); const [form] = Form.useForm(); @@ -51,28 +60,65 @@ const LoginForm = () => { return userInfo; }; + const encryptPassword = (password: string) => { + const psw = CryptoJS.AES?.encrypt?.(password, CRYPT_TEXT).toString(); + return psw; + }; + const decryptPassword = (password: string) => { + const bytes = CryptoJS.AES?.decrypt?.(password, CRYPT_TEXT); + const res = bytes.toString(CryptoJS.enc.Utf8); + return res; + }; + + const callRememberMe = async (values: any) => { + const { autoLogin } = values; + if (autoLogin) { + await rememberMe(REMEMBER_ME_KEY, { + um: encryptPassword(values.username), + pw: encryptPassword(values.password), + f: true + }); + } else { + await removeRememberMe(REMEMBER_ME_KEY); + } + }; + + const callGetRememberMe = async () => { + const rememberMe = await getRememberMe(REMEMBER_ME_KEY); + + if (rememberMe?.f) { + const username = decryptPassword(rememberMe?.um); + const password = decryptPassword(rememberMe?.pw); + form.setFieldsValue({ username, password, autoLogin: true }); + } + }; + const handleLogin = async (values: any) => { - console.log('values', values, form); try { await login({ username: values.username, password: values.password }); const userInfo = await fetchUserInfo(); - setGlobalState({ - userInfo - }); setUserInfo(userInfo); setInitialPassword(values.password); + if (values.autoLogin) { + await callRememberMe(values); + } else { + await removeRememberMe(REMEMBER_ME_KEY); + } if (!userInfo?.require_password_change) { gotoDefaultPage(userInfo); } - // gotoDefaultPage(userInfo); } catch (error) { - console.log('error====', error); + // to do something } }; + useEffect(() => { + callGetRememberMe(); + }, []); + return (
@@ -119,12 +165,10 @@ const LoginForm = () => { label={intl.formatMessage({ id: 'common.form.password' })} /> - -
- - {intl.formatMessage({ id: 'common.login.rember' })} - -
+ + + {intl.formatMessage({ id: 'common.login.rember' })} +