Browse Source

chore: merge v6-full-edition to all-blocks

pull/11503/head
afc163 9 months ago
parent
commit
6f95fb66a3
  1. 1
      .commitlintrc.js
  2. 8
      .eslintignore
  3. 7
      .eslintrc.js
  4. 2
      .github/FUNDING.yml
  5. 11
      .github/dependabot.yml
  6. 16
      .github/workflows/ci.yml
  7. 41
      .github/workflows/codeql.yml
  8. 22
      .github/workflows/coverage.yml
  9. 33
      .github/workflows/pnpm.yml
  10. 7
      .github/workflows/preview-build.yml
  11. 6
      .github/workflows/preview-deploy.yml
  12. 1
      .gitignore
  13. 1
      .husky/commit-msg
  14. 1
      .husky/pre-commit
  15. 5
      .lintstagedrc
  16. 1
      .npmrc
  17. 22
      .prettierignore
  18. 26
      .prettierrc.js
  19. 11
      README.ar-DZ.md
  20. 11
      README.es-ES.md
  21. 9
      README.fr-FR.md
  22. 9
      README.ja-JP.md
  23. 11
      README.md
  24. 9
      README.pt-BR.md
  25. 9
      README.ru-RU.md
  26. 11
      README.tr-TR.md
  27. 11
      README.zh-CN.md
  28. 47
      biome.json
  29. 38
      config/config.ts
  30. 2
      config/defaultSettings.ts
  31. 1
      config/proxy.ts
  32. 5
      jest.config.ts
  33. 11
      jsconfig.json
  34. 2
      mock/analysis.mock.ts
  35. 49
      mock/listTableList.ts
  36. 10
      mock/notices.ts
  37. 63
      mock/requestRecord.mock.js
  38. 24
      mock/user.ts
  39. 2
      mock/workplace.mock.ts
  40. 91
      package.json
  41. 2
      public/scripts/loading.js
  42. 6
      src/access.ts
  43. 33
      src/app.tsx
  44. 22
      src/components/HeaderDropdown/index.tsx
  45. 49
      src/components/RightContent/AvatarDropdown.tsx
  46. 28
      src/components/RightContent/index.tsx
  47. 2
      src/components/index.ts
  48. 52
      src/global.less
  49. 2
      src/global.style.ts
  50. 6
      src/global.tsx
  51. 9
      src/locales/bn-BD/pages.ts
  52. 3
      src/locales/bn-BD/settingDrawer.ts
  53. 3
      src/locales/bn-BD/settings.ts
  54. 3
      src/locales/en-US.ts
  55. 3
      src/locales/en-US/globalHeader.ts
  56. 18
      src/locales/en-US/pages.ts
  57. 3
      src/locales/en-US/pwa.ts
  58. 3
      src/locales/en-US/settingDrawer.ts
  59. 3
      src/locales/en-US/settings.ts
  60. 3
      src/locales/fa-IR.ts
  61. 3
      src/locales/fa-IR/globalHeader.ts
  62. 18
      src/locales/fa-IR/pages.ts
  63. 12
      src/locales/fa-IR/settings.ts
  64. 3
      src/locales/id-ID/globalHeader.ts
  65. 3
      src/locales/id-ID/menu.ts
  66. 9
      src/locales/id-ID/pages.ts
  67. 3
      src/locales/id-ID/settingDrawer.ts
  68. 12
      src/locales/id-ID/settings.ts
  69. 3
      src/locales/ja-JP.ts
  70. 24
      src/locales/ja-JP/pages.ts
  71. 6
      src/locales/ja-JP/settingDrawer.ts
  72. 12
      src/locales/ja-JP/settings.ts
  73. 3
      src/locales/pt-BR/globalHeader.ts
  74. 6
      src/locales/pt-BR/menu.ts
  75. 15
      src/locales/pt-BR/pages.ts
  76. 3
      src/locales/pt-BR/settingDrawer.ts
  77. 18
      src/locales/pt-BR/settings.ts
  78. 12
      src/locales/zh-CN/pages.ts
  79. 3
      src/locales/zh-CN/settingDrawer.ts
  80. 12
      src/locales/zh-CN/settings.ts
  81. 2
      src/locales/zh-TW.ts
  82. 12
      src/locales/zh-TW/pages.ts
  83. 3
      src/locales/zh-TW/settingDrawer.ts
  84. 12
      src/locales/zh-TW/settings.ts
  85. 12
      src/pages/Admin.tsx
  86. 12
      src/pages/Welcome.tsx
  87. 23
      src/pages/account/center/_mock.ts
  88. 27
      src/pages/account/center/components/Applications/index.tsx
  89. 7
      src/pages/account/center/components/Articles/index.tsx
  90. 38
      src/pages/account/center/components/AvatarList/index.tsx
  91. 12
      src/pages/account/center/components/Projects/index.tsx
  92. 49
      src/pages/account/center/index.tsx
  93. 5
      src/pages/account/settings/_mock.ts
  94. 29
      src/pages/account/settings/components/base.tsx
  95. 6
      src/pages/account/settings/components/binding.tsx
  96. 4
      src/pages/account/settings/components/notification.tsx
  97. 20
      src/pages/account/settings/components/security.tsx
  98. 10
      src/pages/account/settings/index.tsx
  99. 4
      src/pages/account/settings/service.ts
  100. 4
      src/pages/dashboard/analysis/_mock.ts

1
.commitlintrc.js

@ -0,0 +1 @@
module.exports = { extends: ['@commitlint/config-conventional'] };

8
.eslintignore

@ -1,8 +0,0 @@
/lambda/
/scripts
/config
.history
public
dist
.umi
mock

7
.eslintrc.js

@ -1,7 +0,0 @@
module.exports = {
extends: [require.resolve('@umijs/lint/dist/config/eslint')],
globals: {
page: true,
REACT_APP_ENV: true,
},
};

2
.github/FUNDING.yml

@ -1,6 +1,6 @@
# These are supported funding model platforms # These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] github: ant-design # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username patreon: # Replace with a single Patreon username
open_collective: ant-design open_collective: ant-design
ko_fi: # Replace with a single Ko-fi username ko_fi: # Replace with a single Ko-fi username

11
.github/dependabot.yml

@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
- package-ecosystem: 'npm' # See documentation for possible values
directory: '/' # Location of package manifests
schedule:
interval: 'weekly'

16
.github/workflows/ci.yml

@ -1,4 +1,4 @@
name: Node CI name: CI
on: [push, pull_request] on: [push, pull_request]
@ -10,19 +10,19 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
node_version: [16.x, 14.x] node_version: [20]
os: [ubuntu-latest, windows-latest, macOS-latest] os: [ubuntu-latest, windows-latest, macOS-latest]
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node_version }} - name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v1 uses: actions/setup-node@v4
with: with:
node-version: ${{ matrix.node_version }} node-version: ${{ matrix.node_version }}
- run: echo ${{github.ref}} - run: echo ${{github.ref}}
- run: npm install --legacy-peer-deps - uses: oven-sh/setup-bun@v2
- run: yarn run lint - run: bun install
- run: yarn run tsc - run: bun run lint
- run: yarn run build - run: bun run build
env: env:
CI: true CI: true
PROGRESS: none PROGRESS: none

41
.github/workflows/codeql.yml

@ -1,41 +0,0 @@
name: "CodeQL"
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
schedule:
- cron: "48 12 * * 2"
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ javascript ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
queries: +security-and-quality
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{ matrix.language }}"

22
.github/workflows/coverage.yml

@ -9,19 +9,13 @@ jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v4
- name: Use Node.js 16.x - name: Use Node.js 20
uses: actions/setup-node@v1 uses: actions/setup-node@v4
with: with:
node-version: 16.x node-version: 20
- run: echo ${{github.ref}} - run: echo ${{github.ref}}
- run: curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7 - uses: oven-sh/setup-bun@v2
- run: pnpm config set store-dir ~/.pnpm-store - run: bun install
- run: pnpm install --strict-peer-dependencies=false - run: bun run test:coverage
- run: yarn run test:coverage - uses: codecov/codecov-action@v5
env:
CI: true
PROGRESS: none
NODE_ENV: test
NODE_OPTIONS: --max_old_space_size=4096
- run: bash <(curl -s https://codecov.io/bash)

33
.github/workflows/pnpm.yml

@ -1,33 +0,0 @@
name: Node pnpm CI
on: [push, pull_request]
permissions:
contents: read
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
node_version: [16.x]
os: [ubuntu-latest, windows-latest, macOS-latest]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node_version }}
- run: echo ${{github.ref}}
- run: curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7
- run: pnpm config set store-dir ~/.pnpm-store
- run: pnpm install --strict-peer-dependencies=false
- run: pnpm run lint
- run: pnpm run tsc
- run: pnpm run build
- run: pnpm run test
env:
CI: true
PROGRESS: none
NODE_ENV: test
NODE_OPTIONS: --max_old_space_size=4096

7
.github/workflows/preview-build.yml

@ -12,18 +12,17 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
- name: build - name: build
run: | run: |
yarn yarn
yarn add umi-plugin-pro --save
yarn build yarn build
- name: upload dist artifact - name: upload dist artifact
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: dist name: dist
path: dist/ path: dist/
@ -35,7 +34,7 @@ jobs:
- name: Upload PR number - name: Upload PR number
if: ${{ always() }} if: ${{ always() }}
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v4
with: with:
name: pr name: pr
path: ./pr-id.txt path: ./pr-id.txt

6
.github/workflows/preview-deploy.yml

@ -19,7 +19,7 @@ jobs:
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
steps: steps:
- name: download pr artifact - name: download pr artifact
uses: dawidd6/action-download-artifact@v2 uses: dawidd6/action-download-artifact@v4
with: with:
workflow: ${{ github.event.workflow_run.workflow_id }} workflow: ${{ github.event.workflow_run.workflow_id }}
name: pr name: pr
@ -29,7 +29,7 @@ jobs:
run: echo "::set-output name=id::$(<pr-id.txt)" run: echo "::set-output name=id::$(<pr-id.txt)"
- name: download dist artifact - name: download dist artifact
uses: dawidd6/action-download-artifact@v2 uses: dawidd6/action-download-artifact@v4
with: with:
workflow: ${{ github.event.workflow_run.workflow_id }} workflow: ${{ github.event.workflow_run.workflow_id }}
workflow_conclusion: success workflow_conclusion: success
@ -77,7 +77,7 @@ jobs:
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'failure' if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'failure'
steps: steps:
- name: download pr artifact - name: download pr artifact
uses: dawidd6/action-download-artifact@v2 uses: dawidd6/action-download-artifact@v4
with: with:
workflow: ${{ github.event.workflow_run.workflow_id }} workflow: ${{ github.event.workflow_run.workflow_id }}
name: pr name: pr

1
.gitignore

@ -36,6 +36,5 @@ functions/*
# screenshot # screenshot
screenshot screenshot
.firebase .firebase
.eslintcache
build build

1
.husky/commit-msg

@ -0,0 +1 @@
npx --no -- commitlint --edit $1

1
.husky/pre-commit

@ -0,0 +1 @@
lint-staged

5
.lintstagedrc

@ -0,0 +1,5 @@
{
"**/*.{js,jsx,tsx,ts,md,css,less,json,yml}": [
"npx @biomejs/biome check --write"
]
}

1
.npmrc

@ -0,0 +1 @@
legacy-peer-deps=true

22
.prettierignore

@ -1,22 +0,0 @@
**/*.svg
.umi
.umi-production
/dist
.dockerignore
.DS_Store
.eslintignore
*.png
*.toml
docker
.editorconfig
Dockerfile*
.gitignore
.prettierignore
LICENSE
.eslintcache
*.lock
yarn-error.log
.history
CNAME
/build
/public

26
.prettierrc.js

@ -1,26 +0,0 @@
module.exports = {
singleQuote: true,
trailingComma: 'all',
printWidth: 100,
proseWrap: 'never',
endOfLine: 'lf',
overrides: [
{
files: '.prettierrc',
options: {
parser: 'json',
},
},
{
files: 'document.ejs',
options: {
parser: 'html',
},
},
],
plugins: [
'prettier-plugin-organize-imports',
'prettier-plugin-packagejson',
'prettier-plugin-two-style-order',
],
};

11
README.ar-DZ.md

@ -7,11 +7,13 @@ Language : [🇺🇸](./README.md) | [🇨🇳](./README.zh-CN.md) | [🇷🇺](
حل UI جاهز لتطبيقات المؤسسات كنموذج معياري لـ React. حل UI جاهز لتطبيقات المؤسسات كنموذج معياري لـ React.
[![Build Status](https://dev.azure.com/ant-design/ant-design-pro/_apis/build/status/ant-design.ant-design-pro?branchName=master)](https://dev.azure.com/ant-design/ant-design-pro/_build/latest?definitionId=1?branchName=master) ![Github Action](https://github.com/ant-design/ant-design-pro/workflows/Node%20CI/badge.svg) ![Deploy](https://github.com/ant-design/ant-design-pro/workflows/Deploy%20CI/badge.svg) [![Dependencies](https://img.shields.io/david/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro) [![DevDependencies](https://img.shields.io/david/dev/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro?type=dev) [![CI](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml)
[![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml)
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/)
[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev)
![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label)
[![Gitter](https://img.shields.io/gitter/room/ant-design/pro-english.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyMzUiIGhlaWdodD0iNjUwIiB2aWV3Qm94PSIwIDAgNzQxMCAzOTAwIj4NCjxyZWN0IHdpZHRoPSI3NDEwIiBoZWlnaHQ9IjM5MDAiIGZpbGw9IiNiMjIyMzQiLz4NCjxwYXRoIGQ9Ik0wLDQ1MEg3NDEwbTAsNjAwSDBtMCw2MDBINzQxMG0wLDYwMEgwbTAsNjAwSDc0MTBtMCw2MDBIMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjMwMCIvPg0KPHJlY3Qgd2lkdGg9IjI5NjQiIGhlaWdodD0iMjEwMCIgZmlsbD0iIzNjM2I2ZSIvPg0KPGcgZmlsbD0iI2ZmZiI%2BDQo8ZyBpZD0iczE4Ij4NCjxnIGlkPSJzOSI%2BDQo8ZyBpZD0iczUiPg0KPGcgaWQ9InM0Ij4NCjxwYXRoIGlkPSJzIiBkPSJNMjQ3LDkwIDMxNy41MzQyMzAsMzA3LjA4MjAzOSAxMzIuODczMjE4LDE3Mi45MTc5NjFIMzYxLjEyNjc4MkwxNzYuNDY1NzcwLDMwNy4wODIwMzl6Ii8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB5PSI0MjAiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHk9Ijg0MCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTI2MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTY4MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjczQiIHg9IjI0NyIgeT0iMjEwIi8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzOSIgeD0iNDk0Ii8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzMTgiIHg9Ijk4OCIvPg0KPHVzZSB4bGluazpocmVmPSIjczkiIHg9IjE5NzYiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3M1IiB4PSIyNDcwIi8%2BDQo8L2c%2BDQo8L3N2Zz4%3D)](https://gitter.im/ant-design/pro-english?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Join the chat at https://gitter.im/ant-design/ant-design-pro](https://img.shields.io/gitter/room/ant-design/ant-design-pro.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjkwMCIgaGVpZ2h0PSI2MDAiIHZpZXdCb3g9IjAgMCAzMCAyMCI%2BDQo8ZGVmcz4NCjxwYXRoIGlkPSJzIiBkPSJNMCwtMSAwLjU4Nzc4NSwwLjgwOTAxNyAtMC45NTEwNTcsLTAuMzA5MDE3SDAuOTUxMDU3TC0wLjU4Nzc4NSwwLjgwOTAxN3oiIGZpbGw9IiNmZmRlMDAiLz4NCjwvZGVmcz4NCjxyZWN0IHdpZHRoPSIzMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2RlMjkxMCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw1KSBzY2FsZSgzKSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsMikgcm90YXRlKDIzLjAzNjI0MykiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLDQpIHJvdGF0ZSg0NS44Njk4OTgpIi8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiw3KSByb3RhdGUoNjkuOTQ1Mzk2KSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsOSkgcm90YXRlKDIwLjY1OTgwOCkiLz4NCjwvc3ZnPg%3D%3D)](https://gitter.im/ant-design/ant-design-pro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/) ![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label) ![](https://github.com/user-attachments/assets/fde29061-3d9a-4397-8ac2-397b0e033ef5)
![](https://user-images.githubusercontent.com/8186664/44953195-581e3d80-aec4-11e8-8dcb-54b9db38ec11.png)
</div> </div>
@ -20,7 +22,6 @@ Language : [🇺🇸](./README.md) | [🇨🇳](./README.zh-CN.md) | [🇷🇺](
- توثيق: http://pro.ant.design/docs/getting-started - توثيق: http://pro.ant.design/docs/getting-started
- سجل التغيير: http://pro.ant.design/docs/changelog - سجل التغيير: http://pro.ant.design/docs/changelog
- الأسئلة الشائعة: http://pro.ant.design/docs/faq - الأسئلة الشائعة: http://pro.ant.design/docs/faq
- مرآة الموقع بالصينية: http://ant-design-pro.gitee.io
## 4.0 صدر الآن! 🎉🎉🎉 ## 4.0 صدر الآن! 🎉🎉🎉

11
README.es-ES.md

@ -6,11 +6,13 @@ Idioma: 🇺🇸 | [🇨🇳](./README.zh-CN.md) | [🇷🇺](./README.ru-RU.md)
Una solución de IU listo para usar para aplicaciones empresariales como plantilla de React. Una solución de IU listo para usar para aplicaciones empresariales como plantilla de React.
[![Estado de construcción](https://dev.azure.com/ant-design/ant-design-pro/_apis/build/status/ant-design.ant-design-pro?branchName=master)](https://dev.azure.com/ant-design/ant-design-pro/_build/latest?definitionId=1?branchName=master) ![Acción de Github](https://github.com/ant-design/ant-design-pro/workflows/Node%20CI/badge.svg) ![Desplegar](https://github.com/ant-design/ant-design-pro/workflows/Deploy%20CI/badge.svg) [![CI](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml)
[![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml)
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/)
[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev)
![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label)
[![Gitter](https://img.shields.io/gitter/room/ant-design/pro-english.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0dHA6Ly93d3cudzMub3JnLzE5OTkveGxluayIgd2lkdGg9IjEyMzUiIGhlaWdodD0iNjUwIiB2aWV3Qm94PSIwIDAgNzQxMCAzOTAwIj4NCjxyZWN0IHdpZHRoPSI3NDEwIiBoZWlnaHQ9IjM5MDAiIGZpbGw9IiNiMjIyMzQiLz4NCjxwYXRoIGQ9Ik0wLDQ1MEg3NDEwbTAsNjAwSDBtMCw2MDBINzQxMG0wLDYwMEgwbTAsNjAwSDc0MTBtMCw2MDBIMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjMwMCIvPg0KPHJlY3Qgd2lkdGg9IjI5NjQiIGhlaWdodD0iMjEwMCIgZmlsbD0iIzNjM2I2ZSIvPg0KPGcgZmlsbD0iI2ZmZiI%2BDQo8ZyBpZD0iczE4Ij4NCjxnIGlkPSJzOSI%2BDQo8ZyBpZD0iczUiPg0KPGcgaWQ9InM0Ij4NCjxwYXRoIGlkPSJzIiBkPSJNMjQ3LDkwIDMxNy41MzQyMzAsMzA3LjA4MjAzOSAxMzIuODczMjE4LDE3Mi45MTc5NjFIMzYxLjEyNjc4MkwxNzYuNDY1NzcwLDMwNy4wODIwMzl6Ii8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB5PSI0MjAiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHk9Ijg0MCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTI2MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTY4MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjczQiIHg9IjI0NyIgeT0iMjEwIi8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzOSIgeD0iNDk0Ii8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzMTgiIHg9Ijk4OCIvPg0KPHVzZSB4bGluazpocmVmPSIjczkiIHg9IjE5NzYiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3M1IiB4PSIyNDcwIi8%2BDQo8L2c%2BDQo8L3N2Zz4%3D)](https://gitter.im/ant-design/pro-english?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Únete al chat en https://gitter.im/ant-design/ant-design-pro](https://img.shields.io/gitter/room/ant-design/ant-design-pro.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0dHA6Ly93d3cudzMub3JnLzE5OTkveGxluayIgd2lkdGg9IjkwMCIgaGVpZ2h0PSI2MDAiIHZpZXdCb3g9IjAgMCAzMCAyMCI%2BDQo8ZGVmcz4NCjxwYXRoIGlkPSJzIiBkPSJNMCwtMSAwLjU4Nzc4NSwwLjgwOTAxNyAtMC45NTEwNTcsLTAuMzA5MDE3SDAuOTUxMDU3TC0wLjU4Nzc4NSwwLjgwOTAxN3oiIGZpbGw9IiNmZmRlMDAiLz4NCjwvZGVmcz4NCjxyZWN0IHdpZHRoPSIzMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2RlMjkxMCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw1KSBzY2FsZSgzKSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsMikgcm90YXRlKDIzLjAzNjI0MykiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLDQpIHJvdGF0ZSg0NS44Njk4OTgpIi8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB5PSI0MjAiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwLDkpIHJvdGF0ZSgyMC42NTk4MDgpIi8%2BDQo8L3N2Zz4%3D)](https://gitter.im/ant-design/ant-design-pro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Construido con Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/) ![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label) ![](https://github.com/user-attachments/assets/fde29061-3d9a-4397-8ac2-397b0e033ef5)
![](https://user-images.githubusercontent.com/8186664/44953195-581e3d80-aec4-11e8-8dcb-54b9db38ec11.png)
</div> </div>
@ -19,7 +21,6 @@ Una solución de IU listo para usar para aplicaciones empresariales como plantil
- Documentación: http://pro.ant.design/docs/getting-started - Documentación: http://pro.ant.design/docs/getting-started
- Registro de cambios: http://pro.ant.design/docs/changelog - Registro de cambios: http://pro.ant.design/docs/changelog
- Preguntas frecuentes: http://pro.ant.design/docs/faq - Preguntas frecuentes: http://pro.ant.design/docs/faq
- Sitio espejo en China: http://ant-design-pro.gitee.io
## ¡La versión 5.0 ya está disponible! 🎉🎉🎉 ## ¡La versión 5.0 ya está disponible! 🎉🎉🎉

9
README.fr-FR.md

@ -6,9 +6,13 @@ Language : [🇺🇸](./README.md) | [🇨🇳](./README.zh-CN.md) | [🇷🇺](
Une solution UI prête à l'emploi pour des applications d'entreprise en tant que modèle React. Une solution UI prête à l'emploi pour des applications d'entreprise en tant que modèle React.
[![Construit avec Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/) [![Status de la construction](https://dev.azure.com/ant-design/ant-design-pro/_apis/build/status/ant-design.ant-design-pro?branchName=master)](https://dev.azure.com/ant-design/ant-design-pro/_build/latest?definitionId=1?branchName=master) [![Dépendences](https://img.shields.io/david/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro) [![Dépendences de développement](https://img.shields.io/david/dev/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro?type=dev) [![Gitter](https://img.shields.io/gitter/room/ant-design/pro-english.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyMzUiIGhlaWdodD0iNjUwIiB2aWV3Qm94PSIwIDAgNzQxMCAzOTAwIj4NCjxyZWN0IHdpZHRoPSI3NDEwIiBoZWlnaHQ9IjM5MDAiIGZpbGw9IiNiMjIyMzQiLz4NCjxwYXRoIGQ9Ik0wLDQ1MEg3NDEwbTAsNjAwSDBtMCw2MDBINzQxMG0wLDYwMEgwbTAsNjAwSDc0MTBtMCw2MDBIMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjMwMCIvPg0KPHJlY3Qgd2lkdGg9IjI5NjQiIGhlaWdodD0iMjEwMCIgZmlsbD0iIzNjM2I2ZSIvPg0KPGcgZmlsbD0iI2ZmZiI%2BDQo8ZyBpZD0iczE4Ij4NCjxnIGlkPSJzOSI%2BDQo8ZyBpZD0iczUiPg0KPGcgaWQ9InM0Ij4NCjxwYXRoIGlkPSJzIiBkPSJNMjQ3LDkwIDMxNy41MzQyMzAsMzA3LjA4MjAzOSAxMzIuODczMjE4LDE3Mi45MTc5NjFIMzYxLjEyNjc4MkwxNzYuNDY1NzcwLDMwNy4wODIwMzl6Ii8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB5PSI0MjAiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHk9Ijg0MCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTI2MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTY4MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjczQiIHg9IjI0NyIgeT0iMjEwIi8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzOSIgeD0iNDk0Ii8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzMTgiIHg9Ijk4OCIvPg0KPHVzZSB4bGluazpocmVmPSIjczkiIHg9IjE5NzYiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3M1IiB4PSIyNDcwIi8%2BDQo8L2c%2BDQo8L3N2Zz4%3D)](https://gitter.im/ant-design/pro-english?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Rejoignez la discussion dans https://gitter.im/ant-design/ant-design-pro](https://img.shields.io/gitter/room/ant-design/ant-design-pro.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjkwMCIgaGVpZ2h0PSI2MDAiIHZpZXdCb3g9IjAgMCAzMCAyMCI%2BDQo8ZGVmcz4NCjxwYXRoIGlkPSJzIiBkPSJNMCwtMSAwLjU4Nzc4NSwwLjgwOTAxNyAtMC45NTEwNTcsLTAuMzA5MDE3SDAuOTUxMDU3TC0wLjU4Nzc4NSwwLjgwOTAxN3oiIGZpbGw9IiNmZmRlMDAiLz4NCjwvZGVmcz4NCjxyZWN0IHdpZHRoPSIzMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2RlMjkxMCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw1KSBzY2FsZSgzKSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsMikgcm90YXRlKDIzLjAzNjI0MykiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLDQpIHJvdGF0ZSg0NS44Njk4OTgpIi8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiw3KSByb3RhdGUoNjkuOTQ1Mzk2KSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsOSkgcm90YXRlKDIwLjY1OTgwOCkiLz4NCjwvc3ZnPg%3D%3D)](https://gitter.im/ant-design/ant-design-pro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) ![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label) ![Github Action](https://github.com/ant-design/ant-design-pro/workflows/Node%20CI/badge.svg) [![CI](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml)
[![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml)
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/)
[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev)
![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label)
![](https://user-images.githubusercontent.com/8186664/44953195-581e3d80-aec4-11e8-8dcb-54b9db38ec11.png) ![](https://github.com/user-attachments/assets/fde29061-3d9a-4397-8ac2-397b0e033ef5)
</div> </div>
@ -17,7 +21,6 @@ Une solution UI prête à l'emploi pour des applications d'entreprise en tant qu
- Documentation: http://pro.ant.design/docs/getting-started - Documentation: http://pro.ant.design/docs/getting-started
- ChangeLog: http://pro.ant.design/docs/changelog - ChangeLog: http://pro.ant.design/docs/changelog
- FAQ: http://pro.ant.design/docs/faq - FAQ: http://pro.ant.design/docs/faq
- Site mirroir en Chine: http://ant-design-pro.gitee.io
## 2.0 Sorti maintenant! 🎉🎉🎉 ## 2.0 Sorti maintenant! 🎉🎉🎉

9
README.ja-JP.md

@ -6,9 +6,13 @@ Language : [🇺🇸](./README.md) | [🇨🇳](./README.zh-CN.md) | [🇷🇺](
独創的な業務システムの UI を解決するための React ボイラープレート。 独創的な業務システムの UI を解決するための React ボイラープレート。
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/) [![Build Status](https://dev.azure.com/ant-design/ant-design-pro/_apis/build/status/ant-design.ant-design-pro?branchName=master)](https://dev.azure.com/ant-design/ant-design-pro/_build/latest?definitionId=1?branchName=master) [![Dependencies](https://img.shields.io/david/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro) [![DevDependencies](https://img.shields.io/david/dev/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro?type=dev) [![Gitter](https://img.shields.io/gitter/room/ant-design/pro-english.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyMzUiIGhlaWdodD0iNjUwIiB2aWV3Qm94PSIwIDAgNzQxMCAzOTAwIj4NCjxyZWN0IHdpZHRoPSI3NDEwIiBoZWlnaHQ9IjM5MDAiIGZpbGw9IiNiMjIyMzQiLz4NCjxwYXRoIGQ9Ik0wLDQ1MEg3NDEwbTAsNjAwSDBtMCw2MDBINzQxMG0wLDYwMEgwbTAsNjAwSDc0MTBtMCw2MDBIMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjMwMCIvPg0KPHJlY3Qgd2lkdGg9IjI5NjQiIGhlaWdodD0iMjEwMCIgZmlsbD0iIzNjM2I2ZSIvPg0KPGcgZmlsbD0iI2ZmZiI%2BDQo8ZyBpZD0iczE4Ij4NCjxnIGlkPSJzOSI%2BDQo8ZyBpZD0iczUiPg0KPGcgaWQ9InM0Ij4NCjxwYXRoIGlkPSJzIiBkPSJNMjQ3LDkwIDMxNy41MzQyMzAsMzA3LjA4MjAzOSAxMzIuODczMjE4LDE3Mi45MTc5NjFIMzYxLjEyNjc4MkwxNzYuNDY1NzcwLDMwNy4wODIwMzl6Ii8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB5PSI0MjAiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHk9Ijg0MCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTI2MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTY4MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjczQiIHg9IjI0NyIgeT0iMjEwIi8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzOSIgeD0iNDk0Ii8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzMTgiIHg9Ijk4OCIvPg0KPHVzZSB4bGluazpocmVmPSIjczkiIHg9IjE5NzYiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3M1IiB4PSIyNDcwIi8%2BDQo8L2c%2BDQo8L3N2Zz4%3D)](https://gitter.im/ant-design/pro-english?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Join the chat at https://gitter.im/ant-design/ant-design-pro](https://img.shields.io/gitter/room/ant-design/ant-design-pro.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjkwMCIgaGVpZ2h0PSI2MDAiIHZpZXdCb3g9IjAgMCAzMCAyMCI%2BDQo8ZGVmcz4NCjxwYXRoIGlkPSJzIiBkPSJNMCwtMSAwLjU4Nzc4NSwwLjgwOTAxNyAtMC45NTEwNTcsLTAuMzA5MDE3SDAuOTUxMDU3TC0wLjU4Nzc4NSwwLjgwOTAxN3oiIGZpbGw9IiNmZmRlMDAiLz4NCjwvZGVmcz4NCjxyZWN0IHdpZHRoPSIzMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2RlMjkxMCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw1KSBzY2FsZSgzKSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsMikgcm90YXRlKDIzLjAzNjI0MykiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLDQpIHJvdGF0ZSg0NS44Njk4OTgpIi8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiw3KSByb3RhdGUoNjkuOTQ1Mzk2KSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsOSkgcm90YXRlKDIwLjY1OTgwOCkiLz4NCjwvc3ZnPg%3D%3D)](https://gitter.im/ant-design/ant-design-pro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) ![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label) ![Github Action](https://github.com/ant-design/ant-design-pro/workflows/Node%20CI/badge.svg) [![CI](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml)
[![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml)
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/)
[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev)
![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label)
![](https://user-images.githubusercontent.com/8186664/44953195-581e3d80-aec4-11e8-8dcb-54b9db38ec11.png) ![](https://github.com/user-attachments/assets/fde29061-3d9a-4397-8ac2-397b0e033ef5)
</div> </div>
@ -17,7 +21,6 @@ Language : [🇺🇸](./README.md) | [🇨🇳](./README.zh-CN.md) | [🇷🇺](
- ドキュメント: http://pro.ant.design/docs/getting-started - ドキュメント: http://pro.ant.design/docs/getting-started
- 変更ログ: http://pro.ant.design/docs/changelog - 変更ログ: http://pro.ant.design/docs/changelog
- FAQ: http://pro.ant.design/docs/faq - FAQ: http://pro.ant.design/docs/faq
- 中国のミラーサイト: http://ant-design-pro.gitee.io
## 2.0 がリリースされました 🎉🎉🎉 ## 2.0 がリリースされました 🎉🎉🎉

11
README.md

@ -6,11 +6,13 @@ Language : 🇺🇸 | [🇨🇳](./README.zh-CN.md) | [🇷🇺](./README.ru-RU.
An out-of-box UI solution for enterprise applications as a React boilerplate. An out-of-box UI solution for enterprise applications as a React boilerplate.
[![Build Status](https://dev.azure.com/ant-design/ant-design-pro/_apis/build/status/ant-design.ant-design-pro?branchName=master)](https://dev.azure.com/ant-design/ant-design-pro/_build/latest?definitionId=1?branchName=master) ![Github Action](https://github.com/ant-design/ant-design-pro/workflows/Node%20CI/badge.svg) [![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml) [![CI](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml)
[![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml)
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/)
[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev)
[![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label)](https://ant.design/)
[![Gitter](https://img.shields.io/gitter/room/ant-design/pro-english.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyMzUiIGhlaWdodD0iNjUwIiB2aWV3Qm94PSIwIDAgNzQxMCAzOTAwIj4NCjxyZWN0IHdpZHRoPSI3NDEwIiBoZWlnaHQ9IjM5MDAiIGZpbGw9IiNiMjIyMzQiLz4NCjxwYXRoIGQ9Ik0wLDQ1MEg3NDEwbTAsNjAwSDBtMCw2MDBINzQxMG0wLDYwMEgwbTAsNjAwSDc0MTBtMCw2MDBIMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjMwMCIvPg0KPHJlY3Qgd2lkdGg9IjI5NjQiIGhlaWdodD0iMjEwMCIgZmlsbD0iIzNjM2I2ZSIvPg0KPGcgZmlsbD0iI2ZmZiI%2BDQo8ZyBpZD0iczE4Ij4NCjxnIGlkPSJzOSI%2BDQo8ZyBpZD0iczUiPg0KPGcgaWQ9InM0Ij4NCjxwYXRoIGlkPSJzIiBkPSJNMjQ3LDkwIDMxNy41MzQyMzAsMzA3LjA4MjAzOSAxMzIuODczMjE4LDE3Mi45MTc5NjFIMzYxLjEyNjc4MkwxNzYuNDY1NzcwLDMwNy4wODIwMzl6Ii8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB5PSI0MjAiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHk9Ijg0MCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTI2MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTY4MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjczQiIHg9IjI0NyIgeT0iMjEwIi8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzOSIgeD0iNDk0Ii8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzMTgiIHg9Ijk4OCIvPg0KPHVzZSB4bGluazpocmVmPSIjczkiIHg9IjE5NzYiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3M1IiB4PSIyNDcwIi8%2BDQo8L2c%2BDQo8L3N2Zz4%3D)](https://gitter.im/ant-design/pro-english?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Join the chat at https://gitter.im/ant-design/ant-design-pro](https://img.shields.io/gitter/room/ant-design/ant-design-pro.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjkwMCIgaGVpZ2h0PSI2MDAiIHZpZXdCb3g9IjAgMCAzMCAyMCI%2BDQo8ZGVmcz4NCjxwYXRoIGlkPSJzIiBkPSJNMCwtMSAwLjU4Nzc4NSwwLjgwOTAxNyAtMC45NTEwNTcsLTAuMzA5MDE3SDAuOTUxMDU3TC0wLjU4Nzc4NSwwLjgwOTAxN3oiIGZpbGw9IiNmZmRlMDAiLz4NCjwvZGVmcz4NCjxyZWN0IHdpZHRoPSIzMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2RlMjkxMCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw1KSBzY2FsZSgzKSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsMikgcm90YXRlKDIzLjAzNjI0MykiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLDQpIHJvdGF0ZSg0NS44Njk4OTgpIi8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiw3KSByb3RhdGUoNjkuOTQ1Mzk2KSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsOSkgcm90YXRlKDIwLjY1OTgwOCkiLz4NCjwvc3ZnPg%3D%3D)](https://gitter.im/ant-design/ant-design-pro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/) ![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label) ![](https://github.com/user-attachments/assets/fde29061-3d9a-4397-8ac2-397b0e033ef5)
![](https://user-images.githubusercontent.com/8186664/44953195-581e3d80-aec4-11e8-8dcb-54b9db38ec11.png)
</div> </div>
@ -19,7 +21,6 @@ An out-of-box UI solution for enterprise applications as a React boilerplate.
- Documentation: http://pro.ant.design/docs/getting-started - Documentation: http://pro.ant.design/docs/getting-started
- ChangeLog: http://pro.ant.design/docs/changelog - ChangeLog: http://pro.ant.design/docs/changelog
- FAQ: http://pro.ant.design/docs/faq - FAQ: http://pro.ant.design/docs/faq
- Mirror Site in China: http://ant-design-pro.gitee.io
## 5.0 is out! 🎉🎉🎉 ## 5.0 is out! 🎉🎉🎉

9
README.pt-BR.md

@ -6,9 +6,13 @@ Language : [🇺🇸](./README.md) | [🇨🇳](./README.zh-CN.md) | [🇷🇺](
Uma solução de UI pronta para aplicações corporativos na forma de um boilerplate React. Uma solução de UI pronta para aplicações corporativos na forma de um boilerplate React.
[![Feito Com Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/) [![Status de Build](https://dev.azure.com/ant-design/ant-design-pro/_apis/build/status/ant-design.ant-design-pro?branchName=master)](https://dev.azure.com/ant-design/ant-design-pro/_build/latest?definitionId=1?branchName=master) [![Dependeências](https://img.shields.io/david/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro) [![Dependências de Desenvolvimento](https://img.shields.io/david/dev/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro?type=dev) [![Gitter](https://img.shields.io/gitter/room/ant-design/pro-english.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyMzUiIGhlaWdodD0iNjUwIiB2aWV3Qm94PSIwIDAgNzQxMCAzOTAwIj4NCjxyZWN0IHdpZHRoPSI3NDEwIiBoZWlnaHQ9IjM5MDAiIGZpbGw9IiNiMjIyMzQiLz4NCjxwYXRoIGQ9Ik0wLDQ1MEg3NDEwbTAsNjAwSDBtMCw2MDBINzQxMG0wLDYwMEgwbTAsNjAwSDc0MTBtMCw2MDBIMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjMwMCIvPg0KPHJlY3Qgd2lkdGg9IjI5NjQiIGhlaWdodD0iMjEwMCIgZmlsbD0iIzNjM2I2ZSIvPg0KPGcgZmlsbD0iI2ZmZiI%2BDQo8ZyBpZD0iczE4Ij4NCjxnIGlkPSJzOSI%2BDQo8ZyBpZD0iczUiPg0KPGcgaWQ9InM0Ij4NCjxwYXRoIGlkPSJzIiBkPSJNMjQ3LDkwIDMxNy41MzQyMzAsMzA3LjA4MjAzOSAxMzIuODczMjE4LDE3Mi45MTc5NjFIMzYxLjEyNjc4MkwxNzYuNDY1NzcwLDMwNy4wODIwMzl6Ii8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB5PSI0MjAiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHk9Ijg0MCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTI2MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTY4MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjczQiIHg9IjI0NyIgeT0iMjEwIi8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzOSIgeD0iNDk0Ii8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzMTgiIHg9Ijk4OCIvPg0KPHVzZSB4bGluazpocmVmPSIjczkiIHg9IjE5NzYiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3M1IiB4PSIyNDcwIi8%2BDQo8L2c%2BDQo8L3N2Zz4%3D)](https://gitter.im/ant-design/pro-english?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Junte-se ao chat em https://gitter.im/ant-design/ant-design-pro](https://img.shields.io/gitter/room/ant-design/ant-design-pro.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjkwMCIgaGVpZ2h0PSI2MDAiIHZpZXdCb3g9IjAgMCAzMCAyMCI%2BDQo8ZGVmcz4NCjxwYXRoIGlkPSJzIiBkPSJNMCwtMSAwLjU4Nzc4NSwwLjgwOTAxNyAtMC45NTEwNTcsLTAuMzA5MDE3SDAuOTUxMDU3TC0wLjU4Nzc4NSwwLjgwOTAxN3oiIGZpbGw9IiNmZmRlMDAiLz4NCjwvZGVmcz4NCjxyZWN0IHdpZHRoPSIzMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2RlMjkxMCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw1KSBzY2FsZSgzKSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsMikgcm90YXRlKDIzLjAzNjI0MykiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLDQpIHJvdGF0ZSg0NS44Njk4OTgpIi8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiw3KSByb3RhdGUoNjkuOTQ1Mzk2KSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsOSkgcm90YXRlKDIwLjY1OTgwOCkiLz4NCjwvc3ZnPg%3D%3D)](https://gitter.im/ant-design/ant-design-pro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) ![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label) ![Github Action](https://github.com/ant-design/ant-design-pro/workflows/Node%20CI/badge.svg) [![CI](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml)
[![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml)
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/)
[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev)
![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label)
![](https://user-images.githubusercontent.com/8186664/44953195-581e3d80-aec4-11e8-8dcb-54b9db38ec11.png) ![](https://github.com/user-attachments/assets/fde29061-3d9a-4397-8ac2-397b0e033ef5)
</div> </div>
@ -17,7 +21,6 @@ Uma solução de UI pronta para aplicações corporativos na forma de um boilerp
- Documentação: http://pro.ant.design/docs/getting-started - Documentação: http://pro.ant.design/docs/getting-started
- Mudanças: http://pro.ant.design/docs/changelog - Mudanças: http://pro.ant.design/docs/changelog
- FAQ: http://pro.ant.design/docs/faq - FAQ: http://pro.ant.design/docs/faq
- Site Alternativo na China: http://ant-design-pro.gitee.io
## 4.0 Lançado! 🎉🎉🎉 ## 4.0 Lançado! 🎉🎉🎉

9
README.ru-RU.md

@ -6,9 +6,13 @@ Language : [🇺🇸](./README.md) | [🇨🇳](./README.zh-CN.md) | 🇷🇺 |
UI-решение "из коробки" для корпоративных приложений как React boilerplate UI-решение "из коробки" для корпоративных приложений как React boilerplate
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/) [![Build Status](https://dev.azure.com/ant-design/ant-design-pro/_apis/build/status/ant-design.ant-design-pro?branchName=master)](https://dev.azure.com/ant-design/ant-design-pro/_build/latest?definitionId=1?branchName=master) [![Dependencies](https://img.shields.io/david/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro) [![DevDependencies](https://img.shields.io/david/dev/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro?type=dev) [![Gitter](https://img.shields.io/gitter/room/ant-design/pro-english.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyMzUiIGhlaWdodD0iNjUwIiB2aWV3Qm94PSIwIDAgNzQxMCAzOTAwIj4NCjxyZWN0IHdpZHRoPSI3NDEwIiBoZWlnaHQ9IjM5MDAiIGZpbGw9IiNiMjIyMzQiLz4NCjxwYXRoIGQ9Ik0wLDQ1MEg3NDEwbTAsNjAwSDBtMCw2MDBINzQxMG0wLDYwMEgwbTAsNjAwSDc0MTBtMCw2MDBIMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjMwMCIvPg0KPHJlY3Qgd2lkdGg9IjI5NjQiIGhlaWdodD0iMjEwMCIgZmlsbD0iIzNjM2I2ZSIvPg0KPGcgZmlsbD0iI2ZmZiI%2BDQo8ZyBpZD0iczE4Ij4NCjxnIGlkPSJzOSI%2BDQo8ZyBpZD0iczUiPg0KPGcgaWQ9InM0Ij4NCjxwYXRoIGlkPSJzIiBkPSJNMjQ3LDkwIDMxNy41MzQyMzAsMzA3LjA4MjAzOSAxMzIuODczMjE4LDE3Mi45MTc5NjFIMzYxLjEyNjc4MkwxNzYuNDY1NzcwLDMwNy4wODIwMzl6Ii8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB5PSI0MjAiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHk9Ijg0MCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTI2MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTY4MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjczQiIHg9IjI0NyIgeT0iMjEwIi8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzOSIgeD0iNDk0Ii8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzMTgiIHg9Ijk4OCIvPg0KPHVzZSB4bGluazpocmVmPSIjczkiIHg9IjE5NzYiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3M1IiB4PSIyNDcwIi8%2BDQo8L2c%2BDQo8L3N2Zz4%3D)](https://gitter.im/ant-design/pro-english?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Join the chat at https://gitter.im/ant-design/ant-design-pro](https://img.shields.io/gitter/room/ant-design/ant-design-pro.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjkwMCIgaGVpZ2h0PSI2MDAiIHZpZXdCb3g9IjAgMCAzMCAyMCI%2BDQo8ZGVmcz4NCjxwYXRoIGlkPSJzIiBkPSJNMCwtMSAwLjU4Nzc4NSwwLjgwOTAxNyAtMC45NTEwNTcsLTAuMzA5MDE3SDAuOTUxMDU3TC0wLjU4Nzc4NSwwLjgwOTAxN3oiIGZpbGw9IiNmZmRlMDAiLz4NCjwvZGVmcz4NCjxyZWN0IHdpZHRoPSIzMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2RlMjkxMCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw1KSBzY2FsZSgzKSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsMikgcm90YXRlKDIzLjAzNjI0MykiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLDQpIHJvdGF0ZSg0NS44Njk4OTgpIi8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiw3KSByb3RhdGUoNjkuOTQ1Mzk2KSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsOSkgcm90YXRlKDIwLjY1OTgwOCkiLz4NCjwvc3ZnPg%3D%3D)](https://gitter.im/ant-design/ant-design-pro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) ![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label) ![Github Action](https://github.com/ant-design/ant-design-pro/workflows/Node%20CI/badge.svg) [![CI](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml)
[![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml)
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/)
[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev)
![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label)
![](https://user-images.githubusercontent.com/8186664/44953195-581e3d80-aec4-11e8-8dcb-54b9db38ec11.png) ![](https://github.com/user-attachments/assets/fde29061-3d9a-4397-8ac2-397b0e033ef5)
</div> </div>
@ -17,7 +21,6 @@ UI-решение "из коробки" для корпоративных при
- Документация: http://pro.ant.design/docs/getting-started - Документация: http://pro.ant.design/docs/getting-started
- История изменений: http://pro.ant.design/docs/changelog - История изменений: http://pro.ant.design/docs/changelog
- FAQ: http://pro.ant.design/docs/faq - FAQ: http://pro.ant.design/docs/faq
- Китайское зеркало сайта: http://ant-design-pro.gitee.io
## Поиск переводчиков :loudspeaker: ## Поиск переводчиков :loudspeaker:

11
README.tr-TR.md

@ -6,11 +6,13 @@ Language : [🇺🇸](./README.md) | [🇨🇳](./README.zh-CN.md) | [🇷🇺](
React ile kurumsal uygulamalar için taslak olarak geliştirilmiş kullanıma hazır bir UI çözümü. React ile kurumsal uygulamalar için taslak olarak geliştirilmiş kullanıma hazır bir UI çözümü.
[![Build Status](https://dev.azure.com/ant-design/ant-design-pro/_apis/build/status/ant-design.ant-design-pro?branchName=master)](https://dev.azure.com/ant-design/ant-design-pro/_build/latest?definitionId=1?branchName=master) ![Github Action](https://github.com/ant-design/ant-design-pro/workflows/Node%20CI/badge.svg) ![Deploy](https://github.com/ant-design/ant-design-pro/workflows/Deploy%20CI/badge.svg) [![CI](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml)
[![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml)
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/)
[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev)
![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label)
[![Gitter](https://img.shields.io/gitter/room/ant-design/pro-english.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEyMzUiIGhlaWdodD0iNjUwIiB2aWV3Qm94PSIwIDAgNzQxMCAzOTAwIj4NCjxyZWN0IHdpZHRoPSI3NDEwIiBoZWlnaHQ9IjM5MDAiIGZpbGw9IiNiMjIyMzQiLz4NCjxwYXRoIGQ9Ik0wLDQ1MEg3NDEwbTAsNjAwSDBtMCw2MDBINzQxMG0wLDYwMEgwbTAsNjAwSDc0MTBtMCw2MDBIMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjMwMCIvPg0KPHJlY3Qgd2lkdGg9IjI5NjQiIGhlaWdodD0iMjEwMCIgZmlsbD0iIzNjM2I2ZSIvPg0KPGcgZmlsbD0iI2ZmZiI%2BDQo8ZyBpZD0iczE4Ij4NCjxnIGlkPSJzOSI%2BDQo8ZyBpZD0iczUiPg0KPGcgaWQ9InM0Ij4NCjxwYXRoIGlkPSJzIiBkPSJNMjQ3LDkwIDMxNy41MzQyMzAsMzA3LjA4MjAzOSAxMzIuODczMjE4LDE3Mi45MTc5NjFIMzYxLjEyNjc4MkwxNzYuNDY1NzcwLDMwNy4wODIwMzl6Ii8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB5PSI0MjAiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHk9Ijg0MCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTI2MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjcyIgeT0iMTY4MCIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjczQiIHg9IjI0NyIgeT0iMjEwIi8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzOSIgeD0iNDk0Ii8%2BDQo8L2c%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzMTgiIHg9Ijk4OCIvPg0KPHVzZSB4bGluazpocmVmPSIjczkiIHg9IjE5NzYiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3M1IiB4PSIyNDcwIi8%2BDQo8L2c%2BDQo8L3N2Zz4%3D)](https://gitter.im/ant-design/pro-english?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Join the chat at https://gitter.im/ant-design/ant-design-pro](https://img.shields.io/gitter/room/ant-design/ant-design-pro.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjkwMCIgaGVpZ2h0PSI2MDAiIHZpZXdCb3g9IjAgMCAzMCAyMCI%2BDQo8ZGVmcz4NCjxwYXRoIGlkPSJzIiBkPSJNMCwtMSAwLjU4Nzc4NSwwLjgwOTAxNyAtMC45NTEwNTcsLTAuMzA5MDE3SDAuOTUxMDU3TC0wLjU4Nzc4NSwwLjgwOTAxN3oiIGZpbGw9IiNmZmRlMDAiLz4NCjwvZGVmcz4NCjxyZWN0IHdpZHRoPSIzMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2RlMjkxMCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw1KSBzY2FsZSgzKSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsMikgcm90YXRlKDIzLjAzNjI0MykiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLDQpIHJvdGF0ZSg0NS44Njk4OTgpIi8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiw3KSByb3RhdGUoNjkuOTQ1Mzk2KSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsOSkgcm90YXRlKDIwLjY1OTgwOCkiLz4NCjwvc3ZnPg%3D%3D)](https://gitter.im/ant-design/ant-design-pro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/) ![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label) ![](https://github.com/user-attachments/assets/fde29061-3d9a-4397-8ac2-397b0e033ef5)
![](https://user-images.githubusercontent.com/8186664/44953195-581e3d80-aec4-11e8-8dcb-54b9db38ec11.png)
</div> </div>
@ -19,7 +21,6 @@ React ile kurumsal uygulamalar için taslak olarak geliştirilmiş kullanıma ha
- Dokümantasyon: http://pro.ant.design/docs/getting-started - Dokümantasyon: http://pro.ant.design/docs/getting-started
- ChangeLog: http://pro.ant.design/docs/changelog - ChangeLog: http://pro.ant.design/docs/changelog
- SSS: http://pro.ant.design/docs/faq - SSS: http://pro.ant.design/docs/faq
- Çinde barındırılan site: http://ant-design-pro.gitee.io
## 5.0 Versiyonu Şimdi Yayında! 🎉🎉🎉 ## 5.0 Versiyonu Şimdi Yayında! 🎉🎉🎉

11
README.zh-CN.md

@ -6,9 +6,13 @@ Language : [🇺🇸](./README.md) | 🇨🇳 | [🇷🇺](./README.ru-RU.md) |
开箱即用的中台前端/设计解决方案。 开箱即用的中台前端/设计解决方案。
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/) [![Build Status](https://dev.azure.com/ant-design/ant-design-pro/_apis/build/status/ant-design.ant-design-pro?branchName=master)](https://dev.azure.com/ant-design/ant-design-pro/_build/latest?definitionId=1?branchName=master) [![Dependencies](https://img.shields.io/david/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro) [![DevDependencies](https://img.shields.io/david/dev/ant-design/ant-design-pro.svg)](https://david-dm.org/ant-design/ant-design-pro?type=dev) [![Join the chat at https://gitter.im/ant-design/ant-design-pro](https://img.shields.io/gitter/room/ant-design/ant-design-pro.svg?style=flat-square&logoWidth=20&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjkwMCIgaGVpZ2h0PSI2MDAiIHZpZXdCb3g9IjAgMCAzMCAyMCI%2BDQo8ZGVmcz4NCjxwYXRoIGlkPSJzIiBkPSJNMCwtMSAwLjU4Nzc4NSwwLjgwOTAxNyAtMC45NTEwNTcsLTAuMzA5MDE3SDAuOTUxMDU3TC0wLjU4Nzc4NSwwLjgwOTAxN3oiIGZpbGw9IiNmZmRlMDAiLz4NCjwvZGVmcz4NCjxyZWN0IHdpZHRoPSIzMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2RlMjkxMCIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw1KSBzY2FsZSgzKSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsMikgcm90YXRlKDIzLjAzNjI0MykiLz4NCjx1c2UgeGxpbms6aHJlZj0iI3MiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLDQpIHJvdGF0ZSg0NS44Njk4OTgpIi8%2BDQo8dXNlIHhsaW5rOmhyZWY9IiNzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMiw3KSByb3RhdGUoNjkuOTQ1Mzk2KSIvPg0KPHVzZSB4bGluazpocmVmPSIjcyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAsOSkgcm90YXRlKDIwLjY1OTgwOCkiLz4NCjwvc3ZnPg%3D%3D)](https://gitter.im/ant-design/ant-design-pro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) ![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label) ![Github Action](https://github.com/ant-design/ant-design-pro/workflows/Node%20CI/badge.svg) [![CI](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/ci.yml)
[![Preview Deploy](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml/badge.svg)](https://github.com/ant-design/ant-design-pro/actions/workflows/preview-deploy.yml)
[![Build With Umi](https://img.shields.io/badge/build%20with-umi-028fe4.svg?style=flat-square)](http://umijs.org/)
[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev)
![](https://badgen.net/badge/icon/Ant%20Design?icon=https://gw.alipayobjects.com/zos/antfincdn/Pp4WPgVDB3/KDpgvguMpGfqaHPjicRK.svg&label)
![](https://user-images.githubusercontent.com/8186664/44953195-581e3d80-aec4-11e8-8dcb-54b9db38ec11.png) ![](https://github.com/user-attachments/assets/fde29061-3d9a-4397-8ac2-397b0e033ef5)
</div> </div>
@ -17,11 +21,10 @@ Language : [🇺🇸](./README.md) | 🇨🇳 | [🇷🇺](./README.ru-RU.md) |
- 使用文档:http://pro.ant.design/docs/getting-started-cn - 使用文档:http://pro.ant.design/docs/getting-started-cn
- 更新日志: http://pro.ant.design/docs/changelog-cn - 更新日志: http://pro.ant.design/docs/changelog-cn
- 常见问题:http://pro.ant.design/docs/faq-cn - 常见问题:http://pro.ant.design/docs/faq-cn
- 国内镜像:http://ant-design-pro.gitee.io
## 5.0 已经发布! 🎉🎉🎉 ## 5.0 已经发布! 🎉🎉🎉
[Ant Design Pro 5.0.0](https://github.com/ant-design/ant-design-pro/issues/8656) [Ant Design Pro 5.0](https://github.com/ant-design/ant-design-pro/issues/8656)
## 特性 ## 特性

47
biome.json

@ -0,0 +1,47 @@
{
"$schema": "https://biomejs.dev/schemas/2.0.6/schema.json",
"files": {
"ignoreUnknown": true,
"includes": [
"**/*",
"!**/.umi/**",
"**/*.md",
"!**/.umi-production/**",
"!**/.umi-test/**",
"!**/.umi-test-production/**",
"!**/src/services/**",
"!**/mock/**",
"!**/dist/**",
"!**/server/**",
"!**/public/**",
"!biome.json"
]
},
"formatter": {
"enabled": true,
"indentStyle": "space"
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"suspicious": {
"noExplicitAny": "off"
},
"correctness": {
"useExhaustiveDependencies": "off"
},
"a11y": {
"noStaticElementInteractions": "off",
"useValidAnchor": "off",
"useKeyWithClickEvents": "off"
}
}
},
"javascript": {
"jsxRuntime": "reactClassic",
"formatter": {
"quoteStyle": "single"
}
}
}

38
config/config.ts

@ -1,6 +1,7 @@
// https://umijs.org/config/ // https://umijs.org/config/
import { join } from 'node:path';
import { defineConfig } from '@umijs/max'; import { defineConfig } from '@umijs/max';
import { join } from 'path';
import defaultSettings from './defaultSettings'; import defaultSettings from './defaultSettings';
import proxy from './proxy'; import proxy from './proxy';
@ -8,6 +9,13 @@ import routes from './routes';
const { REACT_APP_ENV = 'dev' } = process.env; const { REACT_APP_ENV = 'dev' } = process.env;
/**
* @name 使
* @description
* @doc https://umijs.org/docs/api/config#publicpath
*/
const PUBLIC_PATH: string = '/';
export default defineConfig({ export default defineConfig({
/** /**
* @name hash * @name hash
@ -16,6 +24,8 @@ export default defineConfig({
*/ */
hash: true, hash: true,
publicPath: PUBLIC_PATH,
/** /**
* @name * @name
* @description ie11 使 * @description ie11 使
@ -107,7 +117,17 @@ export default defineConfig({
* @description babel import * @description babel import
* @doc https://umijs.org/docs/max/antd#antd * @doc https://umijs.org/docs/max/antd#antd
*/ */
antd: {}, antd: {
appConfig: {},
configProvider: {
theme: {
cssVar: true,
token: {
fontFamily: 'AlibabaSans, sans-serif',
},
},
},
},
/** /**
* @name * @name
* @description axios ahooks useRequest * @description axios ahooks useRequest
@ -126,7 +146,7 @@ export default defineConfig({
*/ */
headScripts: [ headScripts: [
// 解决首次加载时白屏的问题 // 解决首次加载时白屏的问题
{ src: '/scripts/loading.js', async: true }, { src: join(PUBLIC_PATH, 'scripts/loading.js'), async: true },
], ],
//================ pro 插件配置 ================= //================ pro 插件配置 =================
presets: ['umi-presets-pro'], presets: ['umi-presets-pro'],
@ -145,16 +165,20 @@ export default defineConfig({
}, },
{ {
requestLibPath: "import { request } from '@umijs/max'", requestLibPath: "import { request } from '@umijs/max'",
schemaPath: 'https://gw.alipayobjects.com/os/antfincdn/CA1dOm%2631B/openapi.json', schemaPath:
'https://gw.alipayobjects.com/os/antfincdn/CA1dOm%2631B/openapi.json',
projectName: 'swagger', projectName: 'swagger',
}, },
], ],
mock: { mock: {
include: ['mock/**/*', 'src/pages/**/_mock.ts'], include: ['mock/**/*', 'src/pages/**/_mock.ts'],
}, },
mfsu: { /**
strategy: 'normal', * @name mako
}, * @description 使 mako
* @doc https://umijs.org/docs/api/config#mako
*/
mako: {},
esbuildMinifyIIFE: true, esbuildMinifyIIFE: true,
requestRecord: {}, requestRecord: {},
}); });

2
config/defaultSettings.ts

@ -1,4 +1,4 @@
import { ProLayoutProps } from '@ant-design/pro-components'; import type { ProLayoutProps } from '@ant-design/pro-components';
/** /**
* @name * @name

1
config/proxy.ts

@ -21,7 +21,6 @@ export default {
// changeOrigin: true, // changeOrigin: true,
// }, // },
// }, // },
/** /**
* @name * @name
* @doc https://github.com/chimurai/http-proxy-middleware * @doc https://github.com/chimurai/http-proxy-middleware

5
jest.config.ts

@ -1,13 +1,12 @@
import type { Config } from '@jest/types';
import { configUmiAlias, createConfig } from '@umijs/max/test'; import { configUmiAlias, createConfig } from '@umijs/max/test';
export default async () => { export default async (): Promise<Config.InitialOptions> => {
const config = await configUmiAlias({ const config = await configUmiAlias({
...createConfig({ ...createConfig({
target: 'browser', target: 'browser',
}), }),
}); });
console.log(JSON.stringify(config));
return { return {
...config, ...config,
testEnvironmentOptions: { testEnvironmentOptions: {

11
jsconfig.json

@ -1,11 +0,0 @@
{
"compilerOptions": {
"jsx": "react-jsx",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}

2
mock/analysis.mock.ts

@ -1,6 +1,6 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import type { Request, Response } from 'express'; import type { Request, Response } from 'express';
import type { AnalysisData, DataItem, RadarData } from './data'; import type { AnalysisData, DataItem, RadarData } from '../src/pages/dashboard/analysis/data';
// mock data // mock data
const visitData: DataItem[] = []; const visitData: DataItem[] = [];

49
mock/listTableList.ts

@ -1,6 +1,6 @@
import { parse } from 'node:url';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { Request, Response } from 'express'; import type { Request, Response } from 'express';
import { parse } from 'url';
// mock tableListDataSource // mock tableListDataSource
const genList = (current: number, pageSize: number) => { const genList = (current: number, pageSize: number) => {
@ -34,7 +34,10 @@ let tableListDataSource = genList(1, 100);
function getRule(req: Request, res: Response, u: string) { function getRule(req: Request, res: Response, u: string) {
let realUrl = u; let realUrl = u;
if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') { if (
!realUrl ||
Object.prototype.toString.call(realUrl) !== '[object String]'
) {
realUrl = req.url; realUrl = req.url;
} }
const { current = 1, pageSize = 10 } = req.query; const { current = 1, pageSize = 10 } = req.query;
@ -53,8 +56,8 @@ function getRule(req: Request, res: Response, u: string) {
dataSource = dataSource.sort((prev, next) => { dataSource = dataSource.sort((prev, next) => {
let sortNumber = 0; let sortNumber = 0;
(Object.keys(sorter) as Array<keyof API.RuleListItem>).forEach((key) => { (Object.keys(sorter) as Array<keyof API.RuleListItem>).forEach((key) => {
let nextSort = next?.[key] as number; const nextSort = next?.[key] as number;
let preSort = prev?.[key] as number; const preSort = prev?.[key] as number;
if (sorter[key] === 'descend') { if (sorter[key] === 'descend') {
if (preSort - nextSort > 0) { if (preSort - nextSort > 0) {
sortNumber += -1; sortNumber += -1;
@ -78,21 +81,25 @@ function getRule(req: Request, res: Response, u: string) {
}; };
if (Object.keys(filter).length > 0) { if (Object.keys(filter).length > 0) {
dataSource = dataSource.filter((item) => { dataSource = dataSource.filter((item) => {
return (Object.keys(filter) as Array<keyof API.RuleListItem>).some((key) => { return (Object.keys(filter) as Array<keyof API.RuleListItem>).some(
if (!filter[key]) { (key) => {
return true; if (!filter[key]) {
} return true;
if (filter[key].includes(`${item[key]}`)) { }
return true; if (filter[key].includes(`${item[key]}`)) {
} return true;
return false; }
}); return false;
},
);
}); });
} }
} }
if (params.name) { if (params.name) {
dataSource = dataSource.filter((data) => data?.name?.includes(params.name || '')); dataSource = dataSource.filter((data) =>
data?.name?.includes(params.name || ''),
);
} }
const result = { const result = {
data: dataSource, data: dataSource,
@ -107,17 +114,21 @@ function getRule(req: Request, res: Response, u: string) {
function postRule(req: Request, res: Response, u: string, b: Request) { function postRule(req: Request, res: Response, u: string, b: Request) {
let realUrl = u; let realUrl = u;
if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') { if (
!realUrl ||
Object.prototype.toString.call(realUrl) !== '[object String]'
) {
realUrl = req.url; realUrl = req.url;
} }
const body = (b && b.body) || req.body; const body = b?.body || req.body;
const { method, name, desc, key } = body; const { method, name, desc, key } = body;
switch (method) { switch (method) {
/* eslint no-case-declarations:0 */
case 'delete': case 'delete':
tableListDataSource = tableListDataSource.filter((item) => key.indexOf(item.key) === -1); tableListDataSource = tableListDataSource.filter(
(item) => key.indexOf(item.key) === -1,
);
break; break;
case 'post': case 'post':
(() => { (() => {

10
mock/notices.ts

@ -1,6 +1,6 @@
import { Request, Response } from 'express'; import type { Request, Response } from 'express';
const getNotices = (req: Request, res: Response) => { const getNotices = (_req: Request, res: Response) => {
res.json({ res.json({
data: [ data: [
{ {
@ -85,7 +85,8 @@ const getNotices = (req: Request, res: Response) => {
{ {
id: '000000010', id: '000000010',
title: '第三方紧急代码变更', title: '第三方紧急代码变更',
description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', description:
'冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
extra: '马上到期', extra: '马上到期',
status: 'urgent', status: 'urgent',
type: 'event', type: 'event',
@ -101,7 +102,8 @@ const getNotices = (req: Request, res: Response) => {
{ {
id: '000000012', id: '000000012',
title: 'ABCD 版本发布', title: 'ABCD 版本发布',
description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', description:
'冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
extra: '进行中', extra: '进行中',
status: 'processing', status: 'processing',
type: 'event', type: 'event',

63
mock/requestRecord.mock.js

@ -2,7 +2,8 @@ module.exports = {
'GET /api/currentUser': { 'GET /api/currentUser': {
data: { data: {
name: 'Serati Ma', name: 'Serati Ma',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
userid: '00000001', userid: '00000001',
email: 'antdesign@alipay.com', email: 'antdesign@alipay.com',
signature: '海纳百川,有容乃大', signature: '海纳百川,有容乃大',
@ -33,7 +34,8 @@ module.exports = {
key: 99, key: 99,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 99', name: 'TradeCode 99',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -47,7 +49,8 @@ module.exports = {
key: 98, key: 98,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 98', name: 'TradeCode 98',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -61,7 +64,8 @@ module.exports = {
key: 97, key: 97,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 97', name: 'TradeCode 97',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -75,7 +79,8 @@ module.exports = {
key: 96, key: 96,
disabled: true, disabled: true,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 96', name: 'TradeCode 96',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -89,7 +94,8 @@ module.exports = {
key: 95, key: 95,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 95', name: 'TradeCode 95',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -103,7 +109,8 @@ module.exports = {
key: 94, key: 94,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 94', name: 'TradeCode 94',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -117,7 +124,8 @@ module.exports = {
key: 93, key: 93,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 93', name: 'TradeCode 93',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -131,7 +139,8 @@ module.exports = {
key: 92, key: 92,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 92', name: 'TradeCode 92',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -145,7 +154,8 @@ module.exports = {
key: 91, key: 91,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 91', name: 'TradeCode 91',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -159,7 +169,8 @@ module.exports = {
key: 90, key: 90,
disabled: true, disabled: true,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 90', name: 'TradeCode 90',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -173,7 +184,8 @@ module.exports = {
key: 89, key: 89,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 89', name: 'TradeCode 89',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -187,7 +199,8 @@ module.exports = {
key: 88, key: 88,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 88', name: 'TradeCode 88',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -201,7 +214,8 @@ module.exports = {
key: 87, key: 87,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 87', name: 'TradeCode 87',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -215,7 +229,8 @@ module.exports = {
key: 86, key: 86,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 86', name: 'TradeCode 86',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -229,7 +244,8 @@ module.exports = {
key: 85, key: 85,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 85', name: 'TradeCode 85',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -243,7 +259,8 @@ module.exports = {
key: 84, key: 84,
disabled: true, disabled: true,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 84', name: 'TradeCode 84',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -257,7 +274,8 @@ module.exports = {
key: 83, key: 83,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 83', name: 'TradeCode 83',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -271,7 +289,8 @@ module.exports = {
key: 82, key: 82,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 82', name: 'TradeCode 82',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -285,7 +304,8 @@ module.exports = {
key: 81, key: 81,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
name: 'TradeCode 81', name: 'TradeCode 81',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',
@ -299,7 +319,8 @@ module.exports = {
key: 80, key: 80,
disabled: false, disabled: false,
href: 'https://ant.design', href: 'https://ant.design',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
name: 'TradeCode 80', name: 'TradeCode 80',
owner: '曲丽丽', owner: '曲丽丽',
desc: '这是一段描述', desc: '这是一段描述',

24
mock/user.ts

@ -1,4 +1,4 @@
import { Request, Response } from 'express'; import type { Request, Response } from 'express';
const waitTime = (time: number = 100) => { const waitTime = (time: number = 100) => {
return new Promise((resolve) => { return new Promise((resolve) => {
@ -8,7 +8,7 @@ const waitTime = (time: number = 100) => {
}); });
}; };
async function getFakeCaptcha(req: Request, res: Response) { async function getFakeCaptcha(_req: Request, res: Response) {
await waitTime(2000); await waitTime(2000);
return res.json('captcha-xxx'); return res.json('captcha-xxx');
} }
@ -20,7 +20,8 @@ const { ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION } = process.env;
* current user access if is '', user need login * current user access if is '', user need login
* pro * pro
*/ */
let access = ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site' ? 'admin' : ''; let access =
ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site' ? 'admin' : '';
const getAccess = () => { const getAccess = () => {
return access; return access;
@ -29,7 +30,7 @@ const getAccess = () => {
// 代码中会兼容本地 service mock 以及部署站点的静态数据 // 代码中会兼容本地 service mock 以及部署站点的静态数据
export default { export default {
// 支持值为 Object 和 Array // 支持值为 Object 和 Array
'GET /api/currentUser': (req: Request, res: Response) => { 'GET /api/currentUser': (_req: Request, res: Response) => {
if (!getAccess()) { if (!getAccess()) {
res.status(401).send({ res.status(401).send({
data: { data: {
@ -45,7 +46,8 @@ export default {
success: true, success: true,
data: { data: {
name: 'Serati Ma', name: 'Serati Ma',
avatar: 'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png', avatar:
'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png',
userid: '00000001', userid: '00000001',
email: 'antdesign@alipay.com', email: 'antdesign@alipay.com',
signature: '海纳百川,有容乃大', signature: '海纳百川,有容乃大',
@ -155,14 +157,14 @@ export default {
}); });
access = 'guest'; access = 'guest';
}, },
'POST /api/login/outLogin': (req: Request, res: Response) => { 'POST /api/login/outLogin': (_req: Request, res: Response) => {
access = ''; access = '';
res.send({ data: {}, success: true }); res.send({ data: {}, success: true });
}, },
'POST /api/register': (req: Request, res: Response) => { 'POST /api/register': (_req: Request, res: Response) => {
res.send({ status: 'ok', currentAuthority: 'user', success: true }); res.send({ status: 'ok', currentAuthority: 'user', success: true });
}, },
'GET /api/500': (req: Request, res: Response) => { 'GET /api/500': (_req: Request, res: Response) => {
res.status(500).send({ res.status(500).send({
timestamp: 1513932555104, timestamp: 1513932555104,
status: 500, status: 500,
@ -171,7 +173,7 @@ export default {
path: '/base/category/list', path: '/base/category/list',
}); });
}, },
'GET /api/404': (req: Request, res: Response) => { 'GET /api/404': (_req: Request, res: Response) => {
res.status(404).send({ res.status(404).send({
timestamp: 1513932643431, timestamp: 1513932643431,
status: 404, status: 404,
@ -180,7 +182,7 @@ export default {
path: '/base/category/list/2121212', path: '/base/category/list/2121212',
}); });
}, },
'GET /api/403': (req: Request, res: Response) => { 'GET /api/403': (_req: Request, res: Response) => {
res.status(403).send({ res.status(403).send({
timestamp: 1513932555104, timestamp: 1513932555104,
status: 403, status: 403,
@ -189,7 +191,7 @@ export default {
path: '/base/category/list', path: '/base/category/list',
}); });
}, },
'GET /api/401': (req: Request, res: Response) => { 'GET /api/401': (_req: Request, res: Response) => {
res.status(401).send({ res.status(401).send({
timestamp: 1513932555104, timestamp: 1513932555104,
status: 401, status: 401,

2
mock/workplace.mock.ts

@ -1,6 +1,6 @@
import { DataItem } from '@antv/g2plot/esm/interface/config';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import type { Request, Response } from 'express'; import type { Request, Response } from 'express';
import type { DataItem, OfflineDataType } from '../src/pages/dashboard/workplace/data.d';
export type SearchDataType = { export type SearchDataType = {
index: number; index: number;

91
package.json

@ -3,6 +3,7 @@
"version": "6.0.0", "version": "6.0.0",
"private": true, "private": true,
"description": "An out-of-box UI solution for enterprise applications", "description": "An out-of-box UI solution for enterprise applications",
"repository": "git@github.com:ant-design/ant-design-pro.git",
"scripts": { "scripts": {
"analyze": "cross-env ANALYZE=1 max build", "analyze": "cross-env ANALYZE=1 max build",
"build": "max build", "build": "max build",
@ -12,13 +13,11 @@
"i18n-remove": "pro i18n-remove --locale=zh-CN --write", "i18n-remove": "pro i18n-remove --locale=zh-CN --write",
"postinstall": "max setup", "postinstall": "max setup",
"jest": "jest", "jest": "jest",
"lint": "npm run lint:js && npm run lint:prettier", "lint": "npm run biome:lint && npm run tsc",
"lint:fix": "eslint --fix --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src ", "lint-staged": "lint-staged",
"lint:js": "eslint --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src", "biome:lint": "npx @biomejs/biome lint",
"lint:prettier": "prettier -c --write \"**/**.{js,jsx,tsx,ts,less,md,json}\" --end-of-line auto",
"openapi": "max openapi", "openapi": "max openapi",
"prepare": "husky install", "prepare": "husky",
"prettier": "prettier -c --write \"**/**.{js,jsx,tsx,ts,less,md,json}\"",
"preview": "npm run build && max preview --port 8000", "preview": "npm run build && max preview --port 8000",
"record": "cross-env NODE_ENV=development REACT_APP_ENV=test max record --scene=login", "record": "cross-env NODE_ENV=development REACT_APP_ENV=test max record --scene=login",
"serve": "umi-serve", "serve": "umi-serve",
@ -33,66 +32,52 @@
"tsc": "tsc --noEmit" "tsc": "tsc --noEmit"
}, },
"browserslist": [ "browserslist": [
"> 1%", "defaults"
"last 2 versions",
"not ie <= 10"
], ],
"dependencies": { "dependencies": {
"@ant-design/icons": "^4.8.1", "@ant-design/icons": "^5.6.1",
"@ant-design/plots": "^2.1.5", "@ant-design/pro-components": "^2.7.19",
"@ant-design/pro-components": "^2.6.44", "antd": "^5.25.4",
"@antv/l7": "^2.20.13", "@ant-design/v5-patch-for-react-19": "^1.0.3",
"@antv/l7-maps": "^2.20.13", "antd-style": "^3.7.0",
"@antv/l7-react": "^2.4.3",
"@umijs/route-utils": "^2.2.2",
"antd": "^5.12.7",
"antd-style": "^3.6.1",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"dayjs": "^1.11.10", "dayjs": "^1.11.13",
"numeral": "^2.0.6", "react": "^19.1.0",
"omit.js": "^2.0.2", "react-dom": "^19.1.0",
"querystring": "^0.2.1", "@ant-design/plots": "^2.6.0",
"rc-util": "^5.38.1", "@antv/l7-react": "^2.4.3",
"react": "^18.2.0", "@antv/l7": "^2.22.7",
"react-dom": "^18.2.0", "numeral": "^2.0.6"
"react-fittext": "^1.0.0"
}, },
"devDependencies": { "devDependencies": {
"@ant-design/pro-cli": "^2.1.5", "@ant-design/pro-cli": "^3.3.0",
"@testing-library/react": "^13.4.0", "@commitlint/cli": "^19.5.0",
"@trivago/prettier-plugin-sort-imports": "^4.3.0", "@commitlint/config-conventional": "^19.5.0",
"@types/classnames": "^2.3.1", "@testing-library/dom": "^10.4.0",
"@types/express": "^4.17.21", "@testing-library/react": "^16.0.1",
"@types/history": "^4.7.11", "@types/express": "^5.0.3",
"@types/jest": "^29.5.11", "@types/jest": "^29.5.13",
"@types/lodash": "^4.14.202", "@types/lodash": "^4.17.10",
"@types/lodash.debounce": "^4.0.9", "@types/react": "^19.1.5",
"@types/react": "^18.2.46", "@types/react-dom": "^19.1.5",
"@types/react-dom": "^18.2.18",
"@types/react-helmet": "^6.1.11", "@types/react-helmet": "^6.1.11",
"@umijs/fabric": "^2.14.1", "@umijs/max": "^4.3.24",
"@umijs/lint": "^4.1.0",
"@umijs/max": "^4.1.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"eslint": "^8.56.0", "express": "^4.21.1",
"express": "^4.18.2", "gh-pages": "^6.1.1",
"gh-pages": "^3.2.3", "husky": "^9.1.7",
"husky": "^7.0.4",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "^29.7.0",
"lint-staged": "^16.1.2",
"mockjs": "^1.1.0", "mockjs": "^1.1.0",
"prettier": "^3.1.1",
"prettier-plugin-organize-imports": "^3.2.4",
"prettier-plugin-packagejson": "^2.4.8",
"prettier-plugin-two-style-order": "^1.0.1",
"react-dev-inspector": "^1.9.0",
"swagger-ui-dist": "^4.19.1",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "^4.9.5", "typescript": "^5.6.3",
"umi-presets-pro": "^2.0.3" "umi-presets-pro": "^2.0.3",
"umi-serve": "^1.9.11",
"@biomejs/biome": "^2.0.6"
}, },
"engines": { "engines": {
"node": ">=12.0.0" "node": ">=20.0.0"
}, },
"create-umi": { "create-umi": {
"ignoreScript": [ "ignoreScript": [

2
public/scripts/loading.js

@ -2,7 +2,7 @@
* loading 占位 * loading 占位
* 解决首次加载时白屏的问题 * 解决首次加载时白屏的问题
*/ */
(function () { (function () {
const _root = document.querySelector('#root'); const _root = document.querySelector('#root');
if (_root && _root.innerHTML === '') { if (_root && _root.innerHTML === '') {
_root.innerHTML = ` _root.innerHTML = `

6
src/access.ts

@ -1,7 +1,9 @@
/** /**
* @see https://umijs.org/zh-CN/plugins/plugin-access * @see https://umijs.org/docs/max/access#access
* */ * */
export default function access(initialState: { currentUser?: API.CurrentUser } | undefined) { export default function access(
initialState: { currentUser?: API.CurrentUser } | undefined,
) {
const { currentUser } = initialState ?? {}; const { currentUser } = initialState ?? {};
return { return {
canAdmin: currentUser && currentUser.access === 'admin', canAdmin: currentUser && currentUser.access === 'admin',

33
src/app.tsx

@ -1,17 +1,26 @@
import { AvatarDropdown, AvatarName, Footer, Question, SelectLang } from '@/components';
import { LinkOutlined } from '@ant-design/icons'; import { LinkOutlined } from '@ant-design/icons';
import type { Settings as LayoutSettings } from '@ant-design/pro-components'; import type { Settings as LayoutSettings } from '@ant-design/pro-components';
import { SettingDrawer } from '@ant-design/pro-components'; import { SettingDrawer } from '@ant-design/pro-components';
import type { RequestConfig, RunTimeLayoutConfig } from '@umijs/max'; import type { RequestConfig, RunTimeLayoutConfig } from '@umijs/max';
import { history, Link } from '@umijs/max'; import { history, Link } from '@umijs/max';
import React from 'react';
import {
AvatarDropdown,
AvatarName,
Footer,
Question,
SelectLang,
} from '@/components';
import { currentUser as queryCurrentUser } from '@/services/ant-design-pro/api';
import defaultSettings from '../config/defaultSettings'; import defaultSettings from '../config/defaultSettings';
import { errorConfig } from './requestErrorConfig'; import { errorConfig } from './requestErrorConfig';
import { currentUser as queryCurrentUser } from './services/ant-design-pro/api'; import '@ant-design/v5-patch-for-react-19';
const isDev = process.env.NODE_ENV === 'development'; const isDev = process.env.NODE_ENV === 'development';
const loginPath = '/user/login'; const loginPath = '/user/login';
/** /**
* @see https://umijs.org/zh-CN/plugins/plugin-initial-state * @see https://umijs.org/docs/api/runtime-config#getinitialstate
* */ * */
export async function getInitialState(): Promise<{ export async function getInitialState(): Promise<{
settings?: Partial<LayoutSettings>; settings?: Partial<LayoutSettings>;
@ -25,14 +34,18 @@ export async function getInitialState(): Promise<{
skipErrorHandler: true, skipErrorHandler: true,
}); });
return msg.data; return msg.data;
} catch (error) { } catch (_error) {
history.push(loginPath); history.push(loginPath);
} }
return undefined; return undefined;
}; };
// 如果不是登录页面,执行 // 如果不是登录页面,执行
const { location } = history; const { location } = history;
if (![loginPath, '/user/register', '/user/register-result'].includes(location.pathname)) { if (
![loginPath, '/user/register', '/user/register-result'].includes(
location.pathname,
)
) {
const currentUser = await fetchUserInfo(); const currentUser = await fetchUserInfo();
return { return {
fetchUserInfo, fetchUserInfo,
@ -47,9 +60,15 @@ export async function getInitialState(): Promise<{
} }
// ProLayout 支持的api https://procomponents.ant.design/components/layout // ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => { export const layout: RunTimeLayoutConfig = ({
initialState,
setInitialState,
}) => {
return { return {
actionsRender: () => [<Question key="doc" />, <SelectLang key="SelectLang" />], actionsRender: () => [
<Question key="doc" />,
<SelectLang key="SelectLang" />,
],
avatarProps: { avatarProps: {
src: initialState?.currentUser?.avatar, src: initialState?.currentUser?.avatar,
title: <AvatarName />, title: <AvatarName />,

22
src/components/HeaderDropdown/index.tsx

@ -1,6 +1,6 @@
import { Dropdown } from 'antd'; import { Dropdown } from 'antd';
import { createStyles } from 'antd-style';
import type { DropDownProps } from 'antd/es/dropdown'; import type { DropDownProps } from 'antd/es/dropdown';
import { createStyles } from 'antd-style';
import classNames from 'classnames'; import classNames from 'classnames';
import React from 'react'; import React from 'react';
@ -16,12 +16,26 @@ const useStyles = createStyles(({ token }) => {
export type HeaderDropdownProps = { export type HeaderDropdownProps = {
overlayClassName?: string; overlayClassName?: string;
placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topCenter' | 'topRight' | 'bottomCenter'; placement?:
| 'bottomLeft'
| 'bottomRight'
| 'topLeft'
| 'topCenter'
| 'topRight'
| 'bottomCenter';
} & Omit<DropDownProps, 'overlay'>; } & Omit<DropDownProps, 'overlay'>;
const HeaderDropdown: React.FC<HeaderDropdownProps> = ({ overlayClassName: cls, ...restProps }) => { const HeaderDropdown: React.FC<HeaderDropdownProps> = ({
overlayClassName: cls,
...restProps
}) => {
const { styles } = useStyles(); const { styles } = useStyles();
return <Dropdown overlayClassName={classNames(styles.dropdown, cls)} {...restProps} />; return (
<Dropdown
overlayClassName={classNames(styles.dropdown, cls)}
{...restProps}
/>
);
}; };
export default HeaderDropdown; export default HeaderDropdown;

49
src/components/RightContent/AvatarDropdown.tsx

@ -1,11 +1,15 @@
import { outLogin } from '@/services/ant-design-pro/api'; import {
import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons'; LogoutOutlined,
SettingOutlined,
UserOutlined,
} from '@ant-design/icons';
import { history, useModel } from '@umijs/max'; import { history, useModel } from '@umijs/max';
import type { MenuProps } from 'antd';
import { Spin } from 'antd'; import { Spin } from 'antd';
import { createStyles } from 'antd-style'; import { createStyles } from 'antd-style';
import { stringify } from 'querystring'; import React from 'react';
import React, { useCallback } from 'react';
import { flushSync } from 'react-dom'; import { flushSync } from 'react-dom';
import { outLogin } from '@/services/ant-design-pro/api';
import HeaderDropdown from '../HeaderDropdown'; import HeaderDropdown from '../HeaderDropdown';
export type GlobalHeaderRightProps = { export type GlobalHeaderRightProps = {
@ -37,7 +41,10 @@ const useStyles = createStyles(({ token }) => {
}; };
}); });
export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu, children }) => { export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({
menu,
children,
}) => {
/** /**
* 退 url * 退 url
*/ */
@ -45,15 +52,16 @@ export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu, childre
await outLogin(); await outLogin();
const { search, pathname } = window.location; const { search, pathname } = window.location;
const urlParams = new URL(window.location.href).searchParams; const urlParams = new URL(window.location.href).searchParams;
const searchParams = new URLSearchParams({
redirect: pathname + search,
});
/** 此方法会跳转到 redirect 参数所在的位置 */ /** 此方法会跳转到 redirect 参数所在的位置 */
const redirect = urlParams.get('redirect'); const redirect = urlParams.get('redirect');
// Note: There may be security issues, please note // Note: There may be security issues, please note
if (window.location.pathname !== '/user/login' && !redirect) { if (window.location.pathname !== '/user/login' && !redirect) {
history.replace({ history.replace({
pathname: '/user/login', pathname: '/user/login',
search: stringify({ search: searchParams.toString(),
redirect: pathname + search,
}),
}); });
} }
}; };
@ -61,20 +69,17 @@ export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu, childre
const { initialState, setInitialState } = useModel('@@initialState'); const { initialState, setInitialState } = useModel('@@initialState');
const onMenuClick = useCallback( const onMenuClick: MenuProps['onClick'] = (event) => {
(event: any) => { const { key } = event;
const { key } = event; if (key === 'logout') {
if (key === 'logout') { flushSync(() => {
flushSync(() => { setInitialState((s) => ({ ...s, currentUser: undefined }));
setInitialState((s) => ({ ...s, currentUser: undefined })); });
}); loginOut();
loginOut(); return;
return; }
} history.push(`/account/${key}`);
history.push(`/account/${key}`); };
},
[setInitialState],
);
const loading = ( const loading = (
<span className={styles.action}> <span className={styles.action}>

28
src/components/RightContent/index.tsx

@ -3,22 +3,30 @@ import { SelectLang as UmiSelectLang } from '@umijs/max';
export type SiderTheme = 'light' | 'dark'; export type SiderTheme = 'light' | 'dark';
export const SelectLang = () => { export const SelectLang: React.FC = () => {
return <UmiSelectLang />; return (
<UmiSelectLang
style={{
padding: 4,
}}
/>
);
}; };
export const Question = () => { export const Question: React.FC = () => {
return ( return (
<div <a
href="https://pro.ant.design/docs/getting-started"
target="_blank"
rel="noreferrer"
style={{ style={{
display: 'flex', display: 'inline-flex',
height: 26, padding: '4px',
}} fontSize: '18px',
onClick={() => { color: 'inherit',
window.open('https://pro.ant.design/docs/getting-started');
}} }}
> >
<QuestionCircleOutlined /> <QuestionCircleOutlined />
</div> </a>
); );
}; };

2
src/components/index.ts

@ -9,4 +9,4 @@ import Footer from './Footer';
import { Question, SelectLang } from './RightContent'; import { Question, SelectLang } from './RightContent';
import { AvatarDropdown, AvatarName } from './RightContent/AvatarDropdown'; import { AvatarDropdown, AvatarName } from './RightContent/AvatarDropdown';
export { Footer, Question, SelectLang, AvatarDropdown, AvatarName }; export { AvatarDropdown, AvatarName, Footer, Question, SelectLang };

52
src/global.less

@ -1,3 +1,55 @@
@font-face {
font-family: "AlibabaSans";
font-style: normal;
font-weight: 300;
font-display: swap;
src: url("//mdn.alipayobjects.com/huamei_iwk9zp/afts/file/A*1GSgSYDD_aIAAAAAQsAAAAgAegCCAQ/AlibabaSans-Light.woff2")
format("woff2");
}
@font-face {
font-family: "AlibabaSans";
font-style: normal;
font-weight: 400;
font-display: swap;
src: url("//mdn.alipayobjects.com/huamei_iwk9zp/afts/file/A*2zEUQqnPNesAAAAAQtAAAAgAegCCAQ/AlibabaSans-Regular.woff2")
format("woff2");
}
@font-face {
font-family: "AlibabaSans";
font-style: normal;
font-weight: 500;
font-display: swap;
src: url("//mdn.alipayobjects.com/huamei_iwk9zp/afts/file/A*E_cxRbMlZqUAAAAAQuAAAAgAegCCAQ/AlibabaSans-Medium.woff2")
format("woff2");
}
@font-face {
font-family: "AlibabaSans";
font-style: normal;
font-weight: 600;
font-display: swap;
src: url("//mdn.alipayobjects.com/huamei_iwk9zp/afts/file/A*E_cxRbMlZqUAAAAAQuAAAAgAegCCAQ/AlibabaSans-Bold.woff2")
format("woff2");
}
@font-face {
font-family: "AlibabaSans";
font-style: normal;
font-weight: 700;
font-display: swap;
src: url("//mdn.alipayobjects.com/huamei_iwk9zp/afts/file/A*E_cxRbMlZqUAAAAAQuAAAAgAegCCAQ/AlibabaSans-Heavy.woff2")
format("woff2");
}
html,
body,
#root {
height: 100%;
margin: 0;
padding: 0;
font-family:
AlibabaSans, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
}
.colorWeak { .colorWeak {
filter: invert(80%); filter: invert(80%);
} }

2
src/global.style.ts

@ -1,6 +1,6 @@
import { createStyles } from 'antd-style'; import { createStyles } from 'antd-style';
const useStyles = createStyles(({}) => { const useStyles = createStyles(() => {
return { return {
colorWeak: { colorWeak: {
filter: 'invert(80%)', filter: 'invert(80%)',

6
src/global.tsx

@ -32,7 +32,7 @@ if (pwa) {
const reloadSW = async () => { const reloadSW = async () => {
// Check if there is sw whose state is waiting in ServiceWorkerRegistration // Check if there is sw whose state is waiting in ServiceWorkerRegistration
// https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
const worker = e.detail && e.detail.waiting; const worker = e.detail?.waiting;
if (!worker) { if (!worker) {
return true; return true;
} }
@ -67,7 +67,9 @@ if (pwa) {
); );
notification.open({ notification.open({
message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }), message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }),
description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }), description: useIntl().formatMessage({
id: 'app.pwa.serviceworker.updated.hint',
}),
btn, btn,
key, key,
onClose: async () => null, onClose: async () => null,

9
src/locales/bn-BD/pages.ts

@ -2,7 +2,8 @@ export default {
'pages.layouts.userLayout.title': 'pages.layouts.userLayout.title':
'পিঁপড়া ডিজাইন হচ্ছে সিহু জেলার সবচেয়ে প্রভাবশালী ওয়েব ডিজাইনের স্পেসিফিকেশন', 'পিঁপড়া ডিজাইন হচ্ছে সিহু জেলার সবচেয়ে প্রভাবশালী ওয়েব ডিজাইনের স্পেসিফিকেশন',
'pages.login.accountLogin.tab': 'অ্যাকাউন্টে লগইন', 'pages.login.accountLogin.tab': 'অ্যাকাউন্টে লগইন',
'pages.login.accountLogin.errorMessage': 'ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড(admin/ant.design)', 'pages.login.accountLogin.errorMessage':
'ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড(admin/ant.design)',
'pages.login.failure': 'লগইন ব্যর্থ হয়েছে। আবার চেষ্টা করুন!', 'pages.login.failure': 'লগইন ব্যর্থ হয়েছে। আবার চেষ্টা করুন!',
'pages.login.success': 'সফল লগইন!', 'pages.login.success': 'সফল লগইন!',
'pages.login.username.placeholder': 'ব্যবহারকারীর নাম: admin or user', 'pages.login.username.placeholder': 'ব্যবহারকারীর নাম: admin or user',
@ -36,7 +37,8 @@ export default {
'pages.searchTable.updateForm.ruleName.nameLabel': 'বিধি নাম', 'pages.searchTable.updateForm.ruleName.nameLabel': 'বিধি নাম',
'pages.searchTable.updateForm.ruleName.nameRules': 'বিধির নাম লিখুন!', 'pages.searchTable.updateForm.ruleName.nameRules': 'বিধির নাম লিখুন!',
'pages.searchTable.updateForm.ruleDesc.descLabel': 'বিধির বিবরণ', 'pages.searchTable.updateForm.ruleDesc.descLabel': 'বিধির বিবরণ',
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'কমপক্ষে পাঁচটি অক্ষর লিখুন', 'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
'কমপক্ষে পাঁচটি অক্ষর লিখুন',
'pages.searchTable.updateForm.ruleDesc.descRules': 'pages.searchTable.updateForm.ruleDesc.descRules':
'কমপক্ষে পাঁচটি অক্ষরের একটি বিধান বিবরণ লিখুন!', 'কমপক্ষে পাঁচটি অক্ষরের একটি বিধান বিবরণ লিখুন!',
'pages.searchTable.updateForm.ruleProps.title': 'বৈশিষ্ট্য কনফিগার করুন', 'pages.searchTable.updateForm.ruleProps.title': 'বৈশিষ্ট্য কনফিগার করুন',
@ -45,7 +47,8 @@ export default {
'pages.searchTable.updateForm.ruleProps.typeLabel': 'বিধি প্রকার', 'pages.searchTable.updateForm.ruleProps.typeLabel': 'বিধি প্রকার',
'pages.searchTable.updateForm.schedulingPeriod.title': 'সময়সূচী নির্ধারণ করুন', 'pages.searchTable.updateForm.schedulingPeriod.title': 'সময়সূচী নির্ধারণ করুন',
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'শুরুর সময়', 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'শুরুর সময়',
'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'একটি শুরুর সময় চয়ন করুন!', 'pages.searchTable.updateForm.schedulingPeriod.timeRules':
'একটি শুরুর সময় চয়ন করুন!',
'pages.searchTable.titleDesc': 'বর্ণনা', 'pages.searchTable.titleDesc': 'বর্ণনা',
'pages.searchTable.ruleName': 'বিধি নাম প্রয়োজন', 'pages.searchTable.ruleName': 'বিধি নাম প্রয়োজন',
'pages.searchTable.titleCallNo': 'পরিষেবা কল সংখ্যা', 'pages.searchTable.titleCallNo': 'পরিষেবা কল সংখ্যা',

3
src/locales/bn-BD/settingDrawer.ts

@ -25,7 +25,8 @@ export default {
'app.setting.othersettings': 'অন্যান্য সেটিংস্', 'app.setting.othersettings': 'অন্যান্য সেটিংস্',
'app.setting.weakmode': 'দুর্বল মোড', 'app.setting.weakmode': 'দুর্বল মোড',
'app.setting.copy': 'সেটিং কপি করুন', 'app.setting.copy': 'সেটিং কপি করুন',
'app.setting.copyinfo': 'সাফল্যের অনুলিপি করুন - প্রতিস্থাপন করুন: src/models/setting.js', 'app.setting.copyinfo':
'সাফল্যের অনুলিপি করুন - প্রতিস্থাপন করুন: src/models/setting.js',
'app.setting.production.hint': 'app.setting.production.hint':
'কেবল বিকাশের পরিবেশে প্যানেল শো সেট করা হচ্ছে, দয়া করে ম্যানুয়ালি সংশোধন করুন', 'কেবল বিকাশের পরিবেশে প্যানেল শো সেট করা হচ্ছে, দয়া করে ম্যানুয়ালি সংশোধন করুন',
}; };

3
src/locales/bn-BD/settings.ts

@ -53,7 +53,8 @@ export default {
'app.settings.notification.messages-description': 'app.settings.notification.messages-description':
'সিস্টেম বার্তাগুলি স্টেশন চিঠির আকারে জানানো হবে', 'সিস্টেম বার্তাগুলি স্টেশন চিঠির আকারে জানানো হবে',
'app.settings.notification.todo': 'করণীয় বিজ্ঞপ্তি', 'app.settings.notification.todo': 'করণীয় বিজ্ঞপ্তি',
'app.settings.notification.todo-description': 'করণীয় তালিকাটি স্টেশন থেকে চিঠি আকারে জানানো হবে', 'app.settings.notification.todo-description':
'করণীয় তালিকাটি স্টেশন থেকে চিঠি আকারে জানানো হবে',
'app.settings.open': 'খোলা', 'app.settings.open': 'খোলা',
'app.settings.close': 'বন্ধ', 'app.settings.close': 'বন্ধ',
}; };

3
src/locales/en-US.ts

@ -13,7 +13,8 @@ export default {
'layout.user.link.terms': 'Terms', 'layout.user.link.terms': 'Terms',
'app.preview.down.block': 'Download this page to your local project', 'app.preview.down.block': 'Download this page to your local project',
'app.welcome.link.fetch-blocks': 'Get all block', 'app.welcome.link.fetch-blocks': 'Get all block',
'app.welcome.link.block-list': 'Quickly build standard, pages based on `block` development', 'app.welcome.link.block-list':
'Quickly build standard, pages based on `block` development',
...globalHeader, ...globalHeader,
...menu, ...menu,
...settingDrawer, ...settingDrawer,

3
src/locales/en-US/globalHeader.ts

@ -5,7 +5,8 @@ export default {
'component.globalHeader.search.example3': 'Search example 3', 'component.globalHeader.search.example3': 'Search example 3',
'component.globalHeader.help': 'Help', 'component.globalHeader.help': 'Help',
'component.globalHeader.notification': 'Notification', 'component.globalHeader.notification': 'Notification',
'component.globalHeader.notification.empty': 'You have viewed all notifications.', 'component.globalHeader.notification.empty':
'You have viewed all notifications.',
'component.globalHeader.message': 'Message', 'component.globalHeader.message': 'Message',
'component.globalHeader.message.empty': 'You have viewed all messsages.', 'component.globalHeader.message.empty': 'You have viewed all messsages.',
'component.globalHeader.event': 'Event', 'component.globalHeader.event': 'Event',

18
src/locales/en-US/pages.ts

@ -2,7 +2,8 @@ export default {
'pages.layouts.userLayout.title': 'pages.layouts.userLayout.title':
'Ant Design is the most influential web design specification in Xihu district', 'Ant Design is the most influential web design specification in Xihu district',
'pages.login.accountLogin.tab': 'Account Login', 'pages.login.accountLogin.tab': 'Account Login',
'pages.login.accountLogin.errorMessage': 'Incorrect username/password(admin/ant.design)', 'pages.login.accountLogin.errorMessage':
'Incorrect username/password(admin/ant.design)',
'pages.login.failure': 'Login failed, please try again!', 'pages.login.failure': 'Login failed, please try again!',
'pages.login.success': 'Login successful!', 'pages.login.success': 'Login successful!',
'pages.login.username.placeholder': 'Username: admin or user', 'pages.login.username.placeholder': 'Username: admin or user',
@ -24,7 +25,8 @@ export default {
'pages.login.loginWith': 'Login with :', 'pages.login.loginWith': 'Login with :',
'pages.login.registerAccount': 'Register Account', 'pages.login.registerAccount': 'Register Account',
'pages.welcome.link': 'Welcome', 'pages.welcome.link': 'Welcome',
'pages.welcome.alertMessage': 'Faster and stronger heavy-duty components have been released.', 'pages.welcome.alertMessage':
'Faster and stronger heavy-duty components have been released.',
'pages.404.subTitle': 'Sorry, the page you visited does not exist.', 'pages.404.subTitle': 'Sorry, the page you visited does not exist.',
'pages.404.buttonText': 'Back Home', 'pages.404.buttonText': 'Back Home',
'pages.admin.subPage.title': 'This page can only be viewed by Admin', 'pages.admin.subPage.title': 'This page can only be viewed by Admin',
@ -34,18 +36,22 @@ export default {
'pages.searchTable.updateForm.ruleConfig': 'Rule configuration', 'pages.searchTable.updateForm.ruleConfig': 'Rule configuration',
'pages.searchTable.updateForm.basicConfig': 'Basic Information', 'pages.searchTable.updateForm.basicConfig': 'Basic Information',
'pages.searchTable.updateForm.ruleName.nameLabel': 'Rule Name', 'pages.searchTable.updateForm.ruleName.nameLabel': 'Rule Name',
'pages.searchTable.updateForm.ruleName.nameRules': 'Please enter the rule name!', 'pages.searchTable.updateForm.ruleName.nameRules':
'Please enter the rule name!',
'pages.searchTable.updateForm.ruleDesc.descLabel': 'Rule Description', 'pages.searchTable.updateForm.ruleDesc.descLabel': 'Rule Description',
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'Please enter at least five characters', 'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
'Please enter at least five characters',
'pages.searchTable.updateForm.ruleDesc.descRules': 'pages.searchTable.updateForm.ruleDesc.descRules':
'Please enter a rule description of at least five characters!', 'Please enter a rule description of at least five characters!',
'pages.searchTable.updateForm.ruleProps.title': 'Configure Properties', 'pages.searchTable.updateForm.ruleProps.title': 'Configure Properties',
'pages.searchTable.updateForm.object': 'Monitoring Object', 'pages.searchTable.updateForm.object': 'Monitoring Object',
'pages.searchTable.updateForm.ruleProps.templateLabel': 'Rule Template', 'pages.searchTable.updateForm.ruleProps.templateLabel': 'Rule Template',
'pages.searchTable.updateForm.ruleProps.typeLabel': 'Rule Type', 'pages.searchTable.updateForm.ruleProps.typeLabel': 'Rule Type',
'pages.searchTable.updateForm.schedulingPeriod.title': 'Set Scheduling Period', 'pages.searchTable.updateForm.schedulingPeriod.title':
'Set Scheduling Period',
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Starting Time', 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Starting Time',
'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Please choose a start time!', 'pages.searchTable.updateForm.schedulingPeriod.timeRules':
'Please choose a start time!',
'pages.searchTable.titleDesc': 'Description', 'pages.searchTable.titleDesc': 'Description',
'pages.searchTable.ruleName': 'Rule name is required', 'pages.searchTable.ruleName': 'Rule name is required',
'pages.searchTable.titleCallNo': 'Number of Service Calls', 'pages.searchTable.titleCallNo': 'Number of Service Calls',

3
src/locales/en-US/pwa.ts

@ -1,6 +1,7 @@
export default { export default {
'app.pwa.offline': 'You are offline now', 'app.pwa.offline': 'You are offline now',
'app.pwa.serviceworker.updated': 'New content is available', 'app.pwa.serviceworker.updated': 'New content is available',
'app.pwa.serviceworker.updated.hint': 'Please press the "Refresh" button to reload current page', 'app.pwa.serviceworker.updated.hint':
'Please press the "Refresh" button to reload current page',
'app.pwa.serviceworker.updated.ok': 'Refresh', 'app.pwa.serviceworker.updated.ok': 'Refresh',
}; };

3
src/locales/en-US/settingDrawer.ts

@ -25,7 +25,8 @@ export default {
'app.setting.othersettings': 'Other Settings', 'app.setting.othersettings': 'Other Settings',
'app.setting.weakmode': 'Color Blind Friendly Mode', 'app.setting.weakmode': 'Color Blind Friendly Mode',
'app.setting.copy': 'Copy Setting', 'app.setting.copy': 'Copy Setting',
'app.setting.copyinfo': 'copy success, please replace defaultSettings in src/models/setting.js', 'app.setting.copyinfo':
'copy success, please replace defaultSettings in src/models/setting.js',
'app.setting.production.hint': 'app.setting.production.hint':
'Setting panel shows in development environment only, please manually modify', 'Setting panel shows in development environment only, please manually modify',
}; };

3
src/locales/en-US/settings.ts

@ -44,7 +44,8 @@ export default {
'app.settings.binding.alipay': 'Binding Alipay', 'app.settings.binding.alipay': 'Binding Alipay',
'app.settings.binding.alipay-description': 'Currently unbound Alipay account', 'app.settings.binding.alipay-description': 'Currently unbound Alipay account',
'app.settings.binding.dingding': 'Binding DingTalk', 'app.settings.binding.dingding': 'Binding DingTalk',
'app.settings.binding.dingding-description': 'Currently unbound DingTalk account', 'app.settings.binding.dingding-description':
'Currently unbound DingTalk account',
'app.settings.binding.bind': 'Bind', 'app.settings.binding.bind': 'Bind',
'app.settings.notification.password': 'Account Password', 'app.settings.notification.password': 'Account Password',
'app.settings.notification.password-description': 'app.settings.notification.password-description':

3
src/locales/fa-IR.ts

@ -13,7 +13,8 @@ export default {
'layout.user.link.terms': 'مقررات', 'layout.user.link.terms': 'مقررات',
'app.preview.down.block': 'این صفحه را در پروژه محلی خود بارگیری کنید', 'app.preview.down.block': 'این صفحه را در پروژه محلی خود بارگیری کنید',
'app.welcome.link.fetch-blocks': 'دریافت تمام بلوک', 'app.welcome.link.fetch-blocks': 'دریافت تمام بلوک',
'app.welcome.link.block-list': 'به سرعت صفحات استاندارد مبتنی بر توسعه "بلوک" را بسازید', 'app.welcome.link.block-list':
'به سرعت صفحات استاندارد مبتنی بر توسعه "بلوک" را بسازید',
...globalHeader, ...globalHeader,
...menu, ...menu,
...settingDrawer, ...settingDrawer,

3
src/locales/fa-IR/globalHeader.ts

@ -5,7 +5,8 @@ export default {
'component.globalHeader.search.example3': 'مثال 3 را جستجو کنید', 'component.globalHeader.search.example3': 'مثال 3 را جستجو کنید',
'component.globalHeader.help': 'کمک', 'component.globalHeader.help': 'کمک',
'component.globalHeader.notification': 'اعلان', 'component.globalHeader.notification': 'اعلان',
'component.globalHeader.notification.empty': 'شما همه اعلان ها را مشاهده کرده اید.', 'component.globalHeader.notification.empty':
'شما همه اعلان ها را مشاهده کرده اید.',
'component.globalHeader.message': 'پیام', 'component.globalHeader.message': 'پیام',
'component.globalHeader.message.empty': 'شما همه پیام ها را مشاهده کرده اید.', 'component.globalHeader.message.empty': 'شما همه پیام ها را مشاهده کرده اید.',
'component.globalHeader.event': 'رویداد', 'component.globalHeader.event': 'رویداد',

18
src/locales/fa-IR/pages.ts

@ -1,8 +1,11 @@
export default { export default {
'pages.layouts.userLayout.title': 'طراحی مورچه تأثیرگذارترین مشخصات طراحی وب در منطقه Xihu است', 'pages.layouts.userLayout.title':
'طراحی مورچه تأثیرگذارترین مشخصات طراحی وب در منطقه Xihu است',
'pages.login.accountLogin.tab': 'ورود به حساب کاربری', 'pages.login.accountLogin.tab': 'ورود به حساب کاربری',
'pages.login.accountLogin.errorMessage': 'نام کاربری / رمزعبور نادرست (مدیر / ant.design)', 'pages.login.accountLogin.errorMessage':
'pages.login.failure': 'ورود به سیستم با شکست مواجه شد، لطفا دوباره سعی کنید!', 'نام کاربری / رمزعبور نادرست (مدیر / ant.design)',
'pages.login.failure':
'ورود به سیستم با شکست مواجه شد، لطفا دوباره سعی کنید!',
'pages.login.success': 'ورود موفق!', 'pages.login.success': 'ورود موفق!',
'pages.login.username.placeholder': 'نام کاربری: مدیر یا کاربر', 'pages.login.username.placeholder': 'نام کاربری: مدیر یا کاربر',
'pages.login.username.required': 'لطفا نام کاربری خود را وارد کنید!', 'pages.login.username.required': 'لطفا نام کاربری خود را وارد کنید!',
@ -33,9 +36,11 @@ export default {
'pages.searchTable.updateForm.ruleConfig': 'پیکربندی قانون', 'pages.searchTable.updateForm.ruleConfig': 'پیکربندی قانون',
'pages.searchTable.updateForm.basicConfig': 'اطلاعات اولیه', 'pages.searchTable.updateForm.basicConfig': 'اطلاعات اولیه',
'pages.searchTable.updateForm.ruleName.nameLabel': ' نام قانون', 'pages.searchTable.updateForm.ruleName.nameLabel': ' نام قانون',
'pages.searchTable.updateForm.ruleName.nameRules': 'لطفاً نام قانون را وارد کنید!', 'pages.searchTable.updateForm.ruleName.nameRules':
'لطفاً نام قانون را وارد کنید!',
'pages.searchTable.updateForm.ruleDesc.descLabel': 'شرح قانون', 'pages.searchTable.updateForm.ruleDesc.descLabel': 'شرح قانون',
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'لطفاً حداقل پنج حرف وارد کنید', 'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
'لطفاً حداقل پنج حرف وارد کنید',
'pages.searchTable.updateForm.ruleDesc.descRules': 'pages.searchTable.updateForm.ruleDesc.descRules':
'لطفاً حداقل یک قانون حاوی پنج کاراکتر شرح دهید!', 'لطفاً حداقل یک قانون حاوی پنج کاراکتر شرح دهید!',
'pages.searchTable.updateForm.ruleProps.title': 'پیکربندی خصوصیات', 'pages.searchTable.updateForm.ruleProps.title': 'پیکربندی خصوصیات',
@ -44,7 +49,8 @@ export default {
'pages.searchTable.updateForm.ruleProps.typeLabel': 'نوع قانون', 'pages.searchTable.updateForm.ruleProps.typeLabel': 'نوع قانون',
'pages.searchTable.updateForm.schedulingPeriod.title': 'تنظیم دوره زمان بندی', 'pages.searchTable.updateForm.schedulingPeriod.title': 'تنظیم دوره زمان بندی',
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'زمان شروع', 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'زمان شروع',
'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'لطفاً زمان شروع را انتخاب کنید!', 'pages.searchTable.updateForm.schedulingPeriod.timeRules':
'لطفاً زمان شروع را انتخاب کنید!',
'pages.searchTable.titleDesc': 'شرح', 'pages.searchTable.titleDesc': 'شرح',
'pages.searchTable.ruleName': 'نام قانون لازم است', 'pages.searchTable.ruleName': 'نام قانون لازم است',
'pages.searchTable.titleCallNo': 'تعداد تماس های خدماتی', 'pages.searchTable.titleCallNo': 'تعداد تماس های خدماتی',

12
src/locales/fa-IR/settings.ts

@ -15,7 +15,8 @@ export default {
'app.settings.basic.country': 'کشور / منطقه', 'app.settings.basic.country': 'کشور / منطقه',
'app.settings.basic.country-message': 'لطفاً کشور خود را وارد کنید!', 'app.settings.basic.country-message': 'لطفاً کشور خود را وارد کنید!',
'app.settings.basic.geographic': 'استان یا شهر', 'app.settings.basic.geographic': 'استان یا شهر',
'app.settings.basic.geographic-message': 'لطفاً اطلاعات جغرافیایی خود را وارد کنید!', 'app.settings.basic.geographic-message':
'لطفاً اطلاعات جغرافیایی خود را وارد کنید!',
'app.settings.basic.address': 'آدرس خیابان', 'app.settings.basic.address': 'آدرس خیابان',
'app.settings.basic.address-message': 'لطفا آدرس خود را وارد کنید!', 'app.settings.basic.address-message': 'لطفا آدرس خود را وارد کنید!',
'app.settings.basic.phone': 'شماره تلفن', 'app.settings.basic.phone': 'شماره تلفن',
@ -40,11 +41,14 @@ export default {
'app.settings.security.set': 'تنظیم', 'app.settings.security.set': 'تنظیم',
'app.settings.security.bind': 'بستن', 'app.settings.security.bind': 'بستن',
'app.settings.binding.taobao': 'اتصال Taobao', 'app.settings.binding.taobao': 'اتصال Taobao',
'app.settings.binding.taobao-description': 'حساب Taobao در حال حاضر بسته نشده است', 'app.settings.binding.taobao-description':
'حساب Taobao در حال حاضر بسته نشده است',
'app.settings.binding.alipay': 'اتصال Alipay', 'app.settings.binding.alipay': 'اتصال Alipay',
'app.settings.binding.alipay-description': 'حساب Alipay در حال حاضر بسته نشده است', 'app.settings.binding.alipay-description':
'حساب Alipay در حال حاضر بسته نشده است',
'app.settings.binding.dingding': 'اتصال DingTalk', 'app.settings.binding.dingding': 'اتصال DingTalk',
'app.settings.binding.dingding-description': 'حساب DingTalk در حال حاضر محدود نشده است', 'app.settings.binding.dingding-description':
'حساب DingTalk در حال حاضر محدود نشده است',
'app.settings.binding.bind': 'بستن', 'app.settings.binding.bind': 'بستن',
'app.settings.notification.password': 'رمز عبور حساب کاربری', 'app.settings.notification.password': 'رمز عبور حساب کاربری',
'app.settings.notification.password-description': 'app.settings.notification.password-description':

3
src/locales/id-ID/globalHeader.ts

@ -5,7 +5,8 @@ export default {
'component.globalHeader.search.example3': 'Contoh 3 Pencarian', 'component.globalHeader.search.example3': 'Contoh 3 Pencarian',
'component.globalHeader.help': 'Bantuan', 'component.globalHeader.help': 'Bantuan',
'component.globalHeader.notification': 'Notifikasi', 'component.globalHeader.notification': 'Notifikasi',
'component.globalHeader.notification.empty': 'Anda telah membaca semua notifikasi', 'component.globalHeader.notification.empty':
'Anda telah membaca semua notifikasi',
'component.globalHeader.message': 'Pesan', 'component.globalHeader.message': 'Pesan',
'component.globalHeader.message.empty': 'Anda telah membaca semua pesan.', 'component.globalHeader.message.empty': 'Anda telah membaca semua pesan.',
'component.globalHeader.event': 'Acara', 'component.globalHeader.event': 'Acara',

3
src/locales/id-ID/menu.ts

@ -18,7 +18,8 @@ export default {
'menu.form.basic-form': 'Form Dasar', 'menu.form.basic-form': 'Form Dasar',
'menu.form.step-form': 'Form Bertahap', 'menu.form.step-form': 'Form Bertahap',
'menu.form.step-form.info': 'Form Bertahap(menulis informasi yang dibagikan)', 'menu.form.step-form.info': 'Form Bertahap(menulis informasi yang dibagikan)',
'menu.form.step-form.confirm': 'Form Bertahap(konfirmasi informasi yang dibagikan)', 'menu.form.step-form.confirm':
'Form Bertahap(konfirmasi informasi yang dibagikan)',
'menu.form.step-form.result': 'Form Bertahap(selesai)', 'menu.form.step-form.result': 'Form Bertahap(selesai)',
'menu.form.advanced-form': 'Form Lanjutan', 'menu.form.advanced-form': 'Form Lanjutan',
'menu.list': 'Daftar', 'menu.list': 'Daftar',

9
src/locales/id-ID/pages.ts

@ -2,7 +2,8 @@ export default {
'pages.layouts.userLayout.title': 'pages.layouts.userLayout.title':
'Ant Design adalah spesifikasi desain Web yang paling berpengaruh di Kabupaten Xihu', 'Ant Design adalah spesifikasi desain Web yang paling berpengaruh di Kabupaten Xihu',
'pages.login.accountLogin.tab': 'Login dengan akun', 'pages.login.accountLogin.tab': 'Login dengan akun',
'pages.login.accountLogin.errorMessage': 'Nama pengguna dan kata sandi salah(admin/ant.design)', 'pages.login.accountLogin.errorMessage':
'Nama pengguna dan kata sandi salah(admin/ant.design)',
'pages.login.failure': 'Log masuk gagal, silakan coba lagi!', 'pages.login.failure': 'Log masuk gagal, silakan coba lagi!',
'pages.login.success': 'Login berhasil!', 'pages.login.success': 'Login berhasil!',
'pages.login.username.placeholder': 'nama pengguna: admin atau user', 'pages.login.username.placeholder': 'nama pengguna: admin atau user',
@ -35,7 +36,8 @@ export default {
'pages.searchTable.updateForm.ruleConfig': 'Konfigurasi aturan', 'pages.searchTable.updateForm.ruleConfig': 'Konfigurasi aturan',
'pages.searchTable.updateForm.basicConfig': 'Informasi dasar', 'pages.searchTable.updateForm.basicConfig': 'Informasi dasar',
'pages.searchTable.updateForm.ruleName.nameLabel': 'Nama aturan', 'pages.searchTable.updateForm.ruleName.nameLabel': 'Nama aturan',
'pages.searchTable.updateForm.ruleName.nameRules': 'Harap masukkan nama aturan!', 'pages.searchTable.updateForm.ruleName.nameRules':
'Harap masukkan nama aturan!',
'pages.searchTable.updateForm.ruleDesc.descLabel': 'Deskripsi aturan', 'pages.searchTable.updateForm.ruleDesc.descLabel': 'Deskripsi aturan',
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
'Harap masukkan setidaknya lima karakter', 'Harap masukkan setidaknya lima karakter',
@ -47,7 +49,8 @@ export default {
'pages.searchTable.updateForm.ruleProps.typeLabel': 'Jenis aturan', 'pages.searchTable.updateForm.ruleProps.typeLabel': 'Jenis aturan',
'pages.searchTable.updateForm.schedulingPeriod.title': 'Periode penjadwalan', 'pages.searchTable.updateForm.schedulingPeriod.title': 'Periode penjadwalan',
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Waktu mulai', 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Waktu mulai',
'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Pilih waktu mulai!', 'pages.searchTable.updateForm.schedulingPeriod.timeRules':
'Pilih waktu mulai!',
'pages.searchTable.titleDesc': 'deskripsi', 'pages.searchTable.titleDesc': 'deskripsi',
'pages.searchTable.ruleName': 'Nama aturan wajib diisi', 'pages.searchTable.ruleName': 'Nama aturan wajib diisi',
'pages.searchTable.titleCallNo': 'Jumlah panggilan', 'pages.searchTable.titleCallNo': 'Jumlah panggilan',

3
src/locales/id-ID/settingDrawer.ts

@ -21,7 +21,8 @@ export default {
'app.setting.fixedsidebar': 'Sidebar Tetap', 'app.setting.fixedsidebar': 'Sidebar Tetap',
'app.setting.fixedsidebar.hint': 'Berjalan pada Susunan Menu Samping', 'app.setting.fixedsidebar.hint': 'Berjalan pada Susunan Menu Samping',
'app.setting.hideheader': 'Sembunyikan Header ketika gulir ke bawah', 'app.setting.hideheader': 'Sembunyikan Header ketika gulir ke bawah',
'app.setting.hideheader.hint': 'Bekerja ketika Header tersembunyi dimunculkan', 'app.setting.hideheader.hint':
'Bekerja ketika Header tersembunyi dimunculkan',
'app.setting.othersettings': 'Pengaturan Lainnya', 'app.setting.othersettings': 'Pengaturan Lainnya',
'app.setting.weakmode': 'Mode Lemah', 'app.setting.weakmode': 'Mode Lemah',
'app.setting.copy': 'Salin Pengaturan', 'app.setting.copy': 'Salin Pengaturan',

12
src/locales/id-ID/settings.ts

@ -11,11 +11,13 @@ export default {
'app.settings.basic.nickname-message': 'Tolong masukkan Nickname!', 'app.settings.basic.nickname-message': 'Tolong masukkan Nickname!',
'app.settings.basic.profile': 'Profil Personal', 'app.settings.basic.profile': 'Profil Personal',
'app.settings.basic.profile-message': 'Tolong masukkan profil personal!', 'app.settings.basic.profile-message': 'Tolong masukkan profil personal!',
'app.settings.basic.profile-placeholder': 'Perkenalan Singkat tentang Diri Anda', 'app.settings.basic.profile-placeholder':
'Perkenalan Singkat tentang Diri Anda',
'app.settings.basic.country': 'Negara/Wilayah', 'app.settings.basic.country': 'Negara/Wilayah',
'app.settings.basic.country-message': 'Tolong masukkan negara anda!', 'app.settings.basic.country-message': 'Tolong masukkan negara anda!',
'app.settings.basic.geographic': 'Provinsi atau kota', 'app.settings.basic.geographic': 'Provinsi atau kota',
'app.settings.basic.geographic-message': 'Tolong masukkan info geografis anda!', 'app.settings.basic.geographic-message':
'Tolong masukkan info geografis anda!',
'app.settings.basic.address': 'Alamat Jalan', 'app.settings.basic.address': 'Alamat Jalan',
'app.settings.basic.address-message': 'Tolong masukkan Alamat Jalan anda!', 'app.settings.basic.address-message': 'Tolong masukkan Alamat Jalan anda!',
'app.settings.basic.phone': 'Nomor Ponsel', 'app.settings.basic.phone': 'Nomor Ponsel',
@ -40,9 +42,11 @@ export default {
'app.settings.security.set': 'Setel', 'app.settings.security.set': 'Setel',
'app.settings.security.bind': 'Ikat', 'app.settings.security.bind': 'Ikat',
'app.settings.binding.taobao': 'Mengikat Taobao', 'app.settings.binding.taobao': 'Mengikat Taobao',
'app.settings.binding.taobao-description': 'Tidak mengikat akun Taobao saat ini', 'app.settings.binding.taobao-description':
'Tidak mengikat akun Taobao saat ini',
'app.settings.binding.alipay': 'Mengikat Alipay', 'app.settings.binding.alipay': 'Mengikat Alipay',
'app.settings.binding.alipay-description': 'Tidak mengikat akun Alipay saat ini', 'app.settings.binding.alipay-description':
'Tidak mengikat akun Alipay saat ini',
'app.settings.binding.dingding': 'Mengikat DingTalk', 'app.settings.binding.dingding': 'Mengikat DingTalk',
'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk', 'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk',
'app.settings.binding.bind': 'Ikat', 'app.settings.binding.bind': 'Ikat',

3
src/locales/ja-JP.ts

@ -11,7 +11,8 @@ export default {
'layout.user.link.help': 'ヘルプ', 'layout.user.link.help': 'ヘルプ',
'layout.user.link.privacy': 'プライバシー', 'layout.user.link.privacy': 'プライバシー',
'layout.user.link.terms': '利用規約', 'layout.user.link.terms': '利用規約',
'app.preview.down.block': 'このページをローカルプロジェクトにダウンロードしてください', 'app.preview.down.block':
'このページをローカルプロジェクトにダウンロードしてください',
'app.welcome.link.fetch-blocks': '', 'app.welcome.link.fetch-blocks': '',
'app.welcome.link.block-list': '', 'app.welcome.link.block-list': '',
...globalHeader, ...globalHeader,

24
src/locales/ja-JP/pages.ts

@ -1,5 +1,6 @@
export default { export default {
'pages.layouts.userLayout.title': 'Ant Designは、西湖区で最も影響力のあるWebデザイン仕様です。', 'pages.layouts.userLayout.title':
'Ant Designは、西湖区で最も影響力のあるWebデザイン仕様です。',
'pages.login.accountLogin.tab': 'アカウントログイン', 'pages.login.accountLogin.tab': 'アカウントログイン',
'pages.login.accountLogin.errorMessage': 'pages.login.accountLogin.errorMessage':
'ユーザー名/パスワードが正しくありません(admin/ant.design)', 'ユーザー名/パスワードが正しくありません(admin/ant.design)',
@ -24,8 +25,10 @@ export default {
'pages.login.loginWith': 'その他のログイン方法:', 'pages.login.loginWith': 'その他のログイン方法:',
'pages.login.registerAccount': 'アカウント登録', 'pages.login.registerAccount': 'アカウント登録',
'pages.welcome.link': 'ようこそ', 'pages.welcome.link': 'ようこそ',
'pages.welcome.alertMessage': 'より高速で強力な頑丈なコンポーネントがリリースされました。', 'pages.welcome.alertMessage':
'pages.404.subTitle': '申し訳ありませんが、アクセスしたページは存在しません。', 'より高速で強力な頑丈なコンポーネントがリリースされました。',
'pages.404.subTitle':
'申し訳ありませんが、アクセスしたページは存在しません。',
'pages.404.buttonText': 'ホームに戻る', 'pages.404.buttonText': 'ホームに戻る',
'pages.admin.subPage.title': 'このページは管理者のみが表示できます', 'pages.admin.subPage.title': 'このページは管理者のみが表示できます',
'pages.admin.subPage.alertMessage': 'pages.admin.subPage.alertMessage':
@ -34,17 +37,22 @@ export default {
'pages.searchTable.updateForm.ruleConfig': 'ルール構成', 'pages.searchTable.updateForm.ruleConfig': 'ルール構成',
'pages.searchTable.updateForm.basicConfig': '基本情報', 'pages.searchTable.updateForm.basicConfig': '基本情報',
'pages.searchTable.updateForm.ruleName.nameLabel': 'ルール名', 'pages.searchTable.updateForm.ruleName.nameLabel': 'ルール名',
'pages.searchTable.updateForm.ruleName.nameRules': 'ルール名を入力してください!', 'pages.searchTable.updateForm.ruleName.nameRules':
'ルール名を入力してください!',
'pages.searchTable.updateForm.ruleDesc.descLabel': 'ルールの説明', 'pages.searchTable.updateForm.ruleDesc.descLabel': 'ルールの説明',
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '5文字以上入力してください', 'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
'pages.searchTable.updateForm.ruleDesc.descRules': '5文字以上のルールの説明を入力してください!', '5文字以上入力してください',
'pages.searchTable.updateForm.ruleDesc.descRules':
'5文字以上のルールの説明を入力してください!',
'pages.searchTable.updateForm.ruleProps.title': 'プロパティの構成', 'pages.searchTable.updateForm.ruleProps.title': 'プロパティの構成',
'pages.searchTable.updateForm.object': '監視対象', 'pages.searchTable.updateForm.object': '監視対象',
'pages.searchTable.updateForm.ruleProps.templateLabel': 'ルールテンプレート', 'pages.searchTable.updateForm.ruleProps.templateLabel': 'ルールテンプレート',
'pages.searchTable.updateForm.ruleProps.typeLabel': 'ルールタイプ', 'pages.searchTable.updateForm.ruleProps.typeLabel': 'ルールタイプ',
'pages.searchTable.updateForm.schedulingPeriod.title': 'スケジュール期間の設定', 'pages.searchTable.updateForm.schedulingPeriod.title':
'スケジュール期間の設定',
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間', 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間',
'pages.searchTable.updateForm.schedulingPeriod.timeRules': '開始時間を選択してください!', 'pages.searchTable.updateForm.schedulingPeriod.timeRules':
'開始時間を選択してください!',
'pages.searchTable.titleDesc': '説明', 'pages.searchTable.titleDesc': '説明',
'pages.searchTable.ruleName': 'ルール名が必要です', 'pages.searchTable.ruleName': 'ルール名が必要です',
'pages.searchTable.titleCallNo': 'サービスコール数', 'pages.searchTable.titleCallNo': 'サービスコール数',

6
src/locales/ja-JP/settingDrawer.ts

@ -21,11 +21,13 @@ export default {
'app.setting.fixedsidebar': '固定サイドバー', 'app.setting.fixedsidebar': '固定サイドバー',
'app.setting.fixedsidebar.hint': 'サイドメニューのレイアウトで動作します', 'app.setting.fixedsidebar.hint': 'サイドメニューのレイアウトで動作します',
'app.setting.hideheader': 'スクロール時の非表示ヘッダー', 'app.setting.hideheader': 'スクロール時の非表示ヘッダー',
'app.setting.hideheader.hint': '非表示ヘッダーが有効になっている場合に機能します', 'app.setting.hideheader.hint':
'非表示ヘッダーが有効になっている場合に機能します',
'app.setting.othersettings': 'その他の設定', 'app.setting.othersettings': 'その他の設定',
'app.setting.weakmode': 'ウィークモード', 'app.setting.weakmode': 'ウィークモード',
'app.setting.copy': 'コピー設定', 'app.setting.copy': 'コピー設定',
'app.setting.copyinfo': 'app.setting.copyinfo':
'コピーが成功しました。src/models/setting.jsのdefaultSettingsを置き換えてください', 'コピーが成功しました。src/models/setting.jsのdefaultSettingsを置き換えてください',
'app.setting.production.hint': '設定パネルは開発環境でのみ表示されます。手動で変更してください', 'app.setting.production.hint':
'設定パネルは開発環境でのみ表示されます。手動で変更してください',
}; };

12
src/locales/ja-JP/settings.ts

@ -40,11 +40,14 @@ export default {
'app.settings.security.set': 'セットする', 'app.settings.security.set': 'セットする',
'app.settings.security.bind': 'バインド', 'app.settings.security.bind': 'バインド',
'app.settings.binding.taobao': 'タオバオをバインドする', 'app.settings.binding.taobao': 'タオバオをバインドする',
'app.settings.binding.taobao-description': '現在バインドされていないタオバオアカウント', 'app.settings.binding.taobao-description':
'現在バインドされていないタオバオアカウント',
'app.settings.binding.alipay': 'アリペイをバインドする', 'app.settings.binding.alipay': 'アリペイをバインドする',
'app.settings.binding.alipay-description': '現在バインドされていないアリペイアカウント', 'app.settings.binding.alipay-description':
'現在バインドされていないアリペイアカウント',
'app.settings.binding.dingding': 'ディントークをバインドする', 'app.settings.binding.dingding': 'ディントークをバインドする',
'app.settings.binding.dingding-description': '現在バインドされていないディントークアカウント', 'app.settings.binding.dingding-description':
'現在バインドされていないディントークアカウント',
'app.settings.binding.bind': 'バインド', 'app.settings.binding.bind': 'バインド',
'app.settings.notification.password': 'アカウントパスワード', 'app.settings.notification.password': 'アカウントパスワード',
'app.settings.notification.password-description': 'app.settings.notification.password-description':
@ -53,7 +56,8 @@ export default {
'app.settings.notification.messages-description': 'app.settings.notification.messages-description':
'システムメッセージは、ステーションレターの形式で通知されます', 'システムメッセージは、ステーションレターの形式で通知されます',
'app.settings.notification.todo': 'To Do(用事) 通知', 'app.settings.notification.todo': 'To Do(用事) 通知',
'app.settings.notification.todo-description': 'To Doタスクは、内部レターの形式で通知されます', 'app.settings.notification.todo-description':
'To Doタスクは、内部レターの形式で通知されます',
'app.settings.open': '開く', 'app.settings.open': '開く',
'app.settings.close': '閉じる', 'app.settings.close': '閉じる',
}; };

3
src/locales/pt-BR/globalHeader.ts

@ -5,7 +5,8 @@ export default {
'component.globalHeader.search.example3': 'Exemplo de busca 3', 'component.globalHeader.search.example3': 'Exemplo de busca 3',
'component.globalHeader.help': 'Ajuda', 'component.globalHeader.help': 'Ajuda',
'component.globalHeader.notification': 'Notificação', 'component.globalHeader.notification': 'Notificação',
'component.globalHeader.notification.empty': 'Você visualizou todas as notificações.', 'component.globalHeader.notification.empty':
'Você visualizou todas as notificações.',
'component.globalHeader.message': 'Mensagem', 'component.globalHeader.message': 'Mensagem',
'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.', 'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.',
'component.globalHeader.event': 'Evento', 'component.globalHeader.event': 'Evento',

6
src/locales/pt-BR/menu.ts

@ -17,8 +17,10 @@ export default {
'menu.form': 'Formulário', 'menu.form': 'Formulário',
'menu.form.basic-form': 'Formulário Básico', 'menu.form.basic-form': 'Formulário Básico',
'menu.form.step-form': 'Formulário Assistido', 'menu.form.step-form': 'Formulário Assistido',
'menu.form.step-form.info': 'Formulário Assistido(gravar informações de transferência)', 'menu.form.step-form.info':
'menu.form.step-form.confirm': 'Formulário Assistido(confirmar informações de transferência)', 'Formulário Assistido(gravar informações de transferência)',
'menu.form.step-form.confirm':
'Formulário Assistido(confirmar informações de transferência)',
'menu.form.step-form.result': 'Formulário Assistido(finalizado)', 'menu.form.step-form.result': 'Formulário Assistido(finalizado)',
'menu.form.advanced-form': 'Formulário Avançado', 'menu.form.advanced-form': 'Formulário Avançado',
'menu.list': 'Lista', 'menu.list': 'Lista',

15
src/locales/pt-BR/pages.ts

@ -2,7 +2,8 @@ export default {
'pages.layouts.userLayout.title': 'pages.layouts.userLayout.title':
'Ant Design é a especificação de web design mais influente no distrito de Xihu', 'Ant Design é a especificação de web design mais influente no distrito de Xihu',
'pages.login.accountLogin.tab': 'Login da conta', 'pages.login.accountLogin.tab': 'Login da conta',
'pages.login.accountLogin.errorMessage': 'usuário/senha incorreto(admin/ant.design)', 'pages.login.accountLogin.errorMessage':
'usuário/senha incorreto(admin/ant.design)',
'pages.login.failure': 'Login falhou, por favor tente novamente!', 'pages.login.failure': 'Login falhou, por favor tente novamente!',
'pages.login.success': 'Login efetuado com sucesso!', 'pages.login.success': 'Login efetuado com sucesso!',
'pages.login.username.placeholder': 'Usuário: admin or user', 'pages.login.username.placeholder': 'Usuário: admin or user',
@ -15,7 +16,8 @@ export default {
'pages.login.phoneNumber.required': 'Por favor entre com seu telefone!', 'pages.login.phoneNumber.required': 'Por favor entre com seu telefone!',
'pages.login.phoneNumber.invalid': 'Telefone é inválido!', 'pages.login.phoneNumber.invalid': 'Telefone é inválido!',
'pages.login.captcha.placeholder': 'Código de Verificação', 'pages.login.captcha.placeholder': 'Código de Verificação',
'pages.login.captcha.required': 'Por favor entre com o código de verificação!', 'pages.login.captcha.required':
'Por favor entre com o código de verificação!',
'pages.login.phoneLogin.getVerificationCode': 'Obter Código', 'pages.login.phoneLogin.getVerificationCode': 'Obter Código',
'pages.getCaptchaSecondText': 'seg(s)', 'pages.getCaptchaSecondText': 'seg(s)',
'pages.login.rememberMe': 'Lembre-me', 'pages.login.rememberMe': 'Lembre-me',
@ -24,7 +26,8 @@ export default {
'pages.login.loginWith': 'Login com :', 'pages.login.loginWith': 'Login com :',
'pages.login.registerAccount': 'Registra Conta', 'pages.login.registerAccount': 'Registra Conta',
'pages.welcome.link': 'Bem-vindo', 'pages.welcome.link': 'Bem-vindo',
'pages.welcome.alertMessage': 'Componentes pesados mais rápidos e mais fortes foram lançados.', 'pages.welcome.alertMessage':
'Componentes pesados mais rápidos e mais fortes foram lançados.',
'pages.404.subTitle': 'Desculpe, a página que você visitou não existe. ', 'pages.404.subTitle': 'Desculpe, a página que você visitou não existe. ',
'pages.404.buttonText': 'Voltar à página inicial', 'pages.404.buttonText': 'Voltar à página inicial',
'pages.admin.subPage.title': 'Esta página só pode ser vista pelo Admin', 'pages.admin.subPage.title': 'Esta página só pode ser vista pelo Admin',
@ -34,7 +37,8 @@ export default {
'pages.searchTable.updateForm.ruleConfig': 'Configuração de Regra', 'pages.searchTable.updateForm.ruleConfig': 'Configuração de Regra',
'pages.searchTable.updateForm.basicConfig': 'Informação básica', 'pages.searchTable.updateForm.basicConfig': 'Informação básica',
'pages.searchTable.updateForm.ruleName.nameLabel': 'Nome da Regra', 'pages.searchTable.updateForm.ruleName.nameLabel': 'Nome da Regra',
'pages.searchTable.updateForm.ruleName.nameRules': 'Por favor entre com o nome da regra!', 'pages.searchTable.updateForm.ruleName.nameRules':
'Por favor entre com o nome da regra!',
'pages.searchTable.updateForm.ruleDesc.descLabel': 'Descrição da Regra', 'pages.searchTable.updateForm.ruleDesc.descLabel': 'Descrição da Regra',
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
'Por favor insira ao menos cinco caracteres', 'Por favor insira ao menos cinco caracteres',
@ -44,7 +48,8 @@ export default {
'pages.searchTable.updateForm.object': 'Objeto de Monitoramento', 'pages.searchTable.updateForm.object': 'Objeto de Monitoramento',
'pages.searchTable.updateForm.ruleProps.templateLabel': 'Modelo de Regra', 'pages.searchTable.updateForm.ruleProps.templateLabel': 'Modelo de Regra',
'pages.searchTable.updateForm.ruleProps.typeLabel': 'Tipo de Regra', 'pages.searchTable.updateForm.ruleProps.typeLabel': 'Tipo de Regra',
'pages.searchTable.updateForm.schedulingPeriod.title': 'Definir Período de Agendamento', 'pages.searchTable.updateForm.schedulingPeriod.title':
'Definir Período de Agendamento',
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Hora de Início', 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Hora de Início',
'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'pages.searchTable.updateForm.schedulingPeriod.timeRules':
'Por favor selecione um horáriod e início!', 'Por favor selecione um horáriod e início!',

3
src/locales/pt-BR/settingDrawer.ts

@ -21,7 +21,8 @@ export default {
'app.setting.fixedsidebar': 'Barra lateral fixa', 'app.setting.fixedsidebar': 'Barra lateral fixa',
'app.setting.fixedsidebar.hint': 'Funciona no layout do menu lateral', 'app.setting.fixedsidebar.hint': 'Funciona no layout do menu lateral',
'app.setting.hideheader': 'Esconder o cabeçalho quando rolar', 'app.setting.hideheader': 'Esconder o cabeçalho quando rolar',
'app.setting.hideheader.hint': 'Funciona quando o esconder cabeçalho está abilitado', 'app.setting.hideheader.hint':
'Funciona quando o esconder cabeçalho está abilitado',
'app.setting.othersettings': 'Outras configurações', 'app.setting.othersettings': 'Outras configurações',
'app.setting.weakmode': 'Weak Mode', 'app.setting.weakmode': 'Weak Mode',
'app.setting.copy': 'Copiar Configuração', 'app.setting.copy': 'Copiar Configuração',

18
src/locales/pt-BR/settings.ts

@ -8,18 +8,21 @@ export default {
'app.settings.basic.email': 'Email', 'app.settings.basic.email': 'Email',
'app.settings.basic.email-message': 'Por favor insira seu email!', 'app.settings.basic.email-message': 'Por favor insira seu email!',
'app.settings.basic.nickname': 'Nome de usuário', 'app.settings.basic.nickname': 'Nome de usuário',
'app.settings.basic.nickname-message': 'Por favor insira seu nome de usuário!', 'app.settings.basic.nickname-message':
'Por favor insira seu nome de usuário!',
'app.settings.basic.profile': 'Perfil pessoal', 'app.settings.basic.profile': 'Perfil pessoal',
'app.settings.basic.profile-message': 'Por favor insira seu perfil pessoal!', 'app.settings.basic.profile-message': 'Por favor insira seu perfil pessoal!',
'app.settings.basic.profile-placeholder': 'Breve introdução sua', 'app.settings.basic.profile-placeholder': 'Breve introdução sua',
'app.settings.basic.country': 'País/Região', 'app.settings.basic.country': 'País/Região',
'app.settings.basic.country-message': 'Por favor insira país!', 'app.settings.basic.country-message': 'Por favor insira país!',
'app.settings.basic.geographic': 'Província, estado ou cidade', 'app.settings.basic.geographic': 'Província, estado ou cidade',
'app.settings.basic.geographic-message': 'Por favor insira suas informações geográficas!', 'app.settings.basic.geographic-message':
'Por favor insira suas informações geográficas!',
'app.settings.basic.address': 'Endereço', 'app.settings.basic.address': 'Endereço',
'app.settings.basic.address-message': 'Por favor insira seu endereço!', 'app.settings.basic.address-message': 'Por favor insira seu endereço!',
'app.settings.basic.phone': 'Número de telefone', 'app.settings.basic.phone': 'Número de telefone',
'app.settings.basic.phone-message': 'Por favor insira seu número de telefone!', 'app.settings.basic.phone-message':
'Por favor insira seu número de telefone!',
'app.settings.basic.update': 'Atualizar Informações', 'app.settings.basic.update': 'Atualizar Informações',
'app.settings.security.strong': 'Forte', 'app.settings.security.strong': 'Forte',
'app.settings.security.medium': 'Média', 'app.settings.security.medium': 'Média',
@ -40,11 +43,14 @@ export default {
'app.settings.security.set': 'Atribuir', 'app.settings.security.set': 'Atribuir',
'app.settings.security.bind': 'Vincular', 'app.settings.security.bind': 'Vincular',
'app.settings.binding.taobao': 'Vincular Taobao', 'app.settings.binding.taobao': 'Vincular Taobao',
'app.settings.binding.taobao-description': 'Atualmente não vinculado à conta Taobao', 'app.settings.binding.taobao-description':
'Atualmente não vinculado à conta Taobao',
'app.settings.binding.alipay': 'Vincular Alipay', 'app.settings.binding.alipay': 'Vincular Alipay',
'app.settings.binding.alipay-description': 'Atualmente não vinculado à conta Alipay', 'app.settings.binding.alipay-description':
'Atualmente não vinculado à conta Alipay',
'app.settings.binding.dingding': 'Vincular DingTalk', 'app.settings.binding.dingding': 'Vincular DingTalk',
'app.settings.binding.dingding-description': 'Atualmente não vinculado à conta DingTalk', 'app.settings.binding.dingding-description':
'Atualmente não vinculado à conta DingTalk',
'app.settings.binding.bind': 'Vincular', 'app.settings.binding.bind': 'Vincular',
'app.settings.notification.password': 'Senha da Conta', 'app.settings.notification.password': 'Senha da Conta',
'app.settings.notification.password-description': 'app.settings.notification.password-description':

12
src/locales/zh-CN/pages.ts

@ -1,7 +1,9 @@
export default { export default {
'pages.layouts.userLayout.title': 'Ant Design 是西湖区最具影响力的 Web 设计规范', 'pages.layouts.userLayout.title':
'Ant Design 是西湖区最具影响力的 Web 设计规范',
'pages.login.accountLogin.tab': '账户密码登录', 'pages.login.accountLogin.tab': '账户密码登录',
'pages.login.accountLogin.errorMessage': '错误的用户名和密码(admin/ant.design)', 'pages.login.accountLogin.errorMessage':
'错误的用户名和密码(admin/ant.design)',
'pages.login.failure': '登录失败,请重试!', 'pages.login.failure': '登录失败,请重试!',
'pages.login.success': '登录成功!', 'pages.login.success': '登录成功!',
'pages.login.username.placeholder': '用户名: admin or user', 'pages.login.username.placeholder': '用户名: admin or user',
@ -27,7 +29,8 @@ export default {
'pages.404.subTitle': '抱歉,您访问的页面不存在。', 'pages.404.subTitle': '抱歉,您访问的页面不存在。',
'pages.404.buttonText': '返回首页', 'pages.404.buttonText': '返回首页',
'pages.admin.subPage.title': ' 这个页面只有 admin 权限才能查看', 'pages.admin.subPage.title': ' 这个页面只有 admin 权限才能查看',
'pages.admin.subPage.alertMessage': 'umi ui 现已发布,欢迎使用 npm run ui 启动体验。', 'pages.admin.subPage.alertMessage':
'umi ui 现已发布,欢迎使用 npm run ui 启动体验。',
'pages.searchTable.createForm.newRule': '新建规则', 'pages.searchTable.createForm.newRule': '新建规则',
'pages.searchTable.updateForm.ruleConfig': '规则配置', 'pages.searchTable.updateForm.ruleConfig': '规则配置',
'pages.searchTable.updateForm.basicConfig': '基本信息', 'pages.searchTable.updateForm.basicConfig': '基本信息',
@ -35,7 +38,8 @@ export default {
'pages.searchTable.updateForm.ruleName.nameRules': '请输入规则名称!', 'pages.searchTable.updateForm.ruleName.nameRules': '请输入规则名称!',
'pages.searchTable.updateForm.ruleDesc.descLabel': '规则描述', 'pages.searchTable.updateForm.ruleDesc.descLabel': '规则描述',
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '请输入至少五个字符', 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '请输入至少五个字符',
'pages.searchTable.updateForm.ruleDesc.descRules': '请输入至少五个字符的规则描述!', 'pages.searchTable.updateForm.ruleDesc.descRules':
'请输入至少五个字符的规则描述!',
'pages.searchTable.updateForm.ruleProps.title': '配置规则属性', 'pages.searchTable.updateForm.ruleProps.title': '配置规则属性',
'pages.searchTable.updateForm.object': '监控对象', 'pages.searchTable.updateForm.object': '监控对象',
'pages.searchTable.updateForm.ruleProps.templateLabel': '规则模板', 'pages.searchTable.updateForm.ruleProps.templateLabel': '规则模板',

3
src/locales/zh-CN/settingDrawer.ts

@ -25,7 +25,8 @@ export default {
'app.setting.othersettings': '其他设置', 'app.setting.othersettings': '其他设置',
'app.setting.weakmode': '色弱模式', 'app.setting.weakmode': '色弱模式',
'app.setting.copy': '拷贝设置', 'app.setting.copy': '拷贝设置',
'app.setting.copyinfo': '拷贝成功,请到 config/defaultSettings.js 中替换默认配置', 'app.setting.copyinfo':
'拷贝成功,请到 config/defaultSettings.js 中替换默认配置',
'app.setting.production.hint': 'app.setting.production.hint':
'配置栏只在开发环境用于预览,生产环境不会展现,请拷贝后手动修改配置文件', '配置栏只在开发环境用于预览,生产环境不会展现,请拷贝后手动修改配置文件',
}; };

12
src/locales/zh-CN/settings.ts

@ -29,11 +29,13 @@ export default {
'app.settings.security.phone': '密保手机', 'app.settings.security.phone': '密保手机',
'app.settings.security.phone-description': '已绑定手机', 'app.settings.security.phone-description': '已绑定手机',
'app.settings.security.question': '密保问题', 'app.settings.security.question': '密保问题',
'app.settings.security.question-description': '未设置密保问题,密保问题可有效保护账户安全', 'app.settings.security.question-description':
'未设置密保问题,密保问题可有效保护账户安全',
'app.settings.security.email': '备用邮箱', 'app.settings.security.email': '备用邮箱',
'app.settings.security.email-description': '已绑定邮箱', 'app.settings.security.email-description': '已绑定邮箱',
'app.settings.security.mfa': 'MFA 设备', 'app.settings.security.mfa': 'MFA 设备',
'app.settings.security.mfa-description': '未绑定 MFA 设备,绑定后,可以进行二次确认', 'app.settings.security.mfa-description':
'未绑定 MFA 设备,绑定后,可以进行二次确认',
'app.settings.security.modify': '修改', 'app.settings.security.modify': '修改',
'app.settings.security.set': '设置', 'app.settings.security.set': '设置',
'app.settings.security.bind': '绑定', 'app.settings.security.bind': '绑定',
@ -45,9 +47,11 @@ export default {
'app.settings.binding.dingding-description': '当前未绑定钉钉账号', 'app.settings.binding.dingding-description': '当前未绑定钉钉账号',
'app.settings.binding.bind': '绑定', 'app.settings.binding.bind': '绑定',
'app.settings.notification.password': '账户密码', 'app.settings.notification.password': '账户密码',
'app.settings.notification.password-description': '其他用户的消息将以站内信的形式通知', 'app.settings.notification.password-description':
'其他用户的消息将以站内信的形式通知',
'app.settings.notification.messages': '系统消息', 'app.settings.notification.messages': '系统消息',
'app.settings.notification.messages-description': '系统消息将以站内信的形式通知', 'app.settings.notification.messages-description':
'系统消息将以站内信的形式通知',
'app.settings.notification.todo': '待办任务', 'app.settings.notification.todo': '待办任务',
'app.settings.notification.todo-description': '待办任务将以站内信的形式通知', 'app.settings.notification.todo-description': '待办任务将以站内信的形式通知',
'app.settings.open': '开', 'app.settings.open': '开',

2
src/locales/zh-TW.ts

@ -1,6 +1,7 @@
import component from './zh-TW/component'; import component from './zh-TW/component';
import globalHeader from './zh-TW/globalHeader'; import globalHeader from './zh-TW/globalHeader';
import menu from './zh-TW/menu'; import menu from './zh-TW/menu';
import pages from './zh-TW/pages';
import pwa from './zh-TW/pwa'; import pwa from './zh-TW/pwa';
import settingDrawer from './zh-TW/settingDrawer'; import settingDrawer from './zh-TW/settingDrawer';
import settings from './zh-TW/settings'; import settings from './zh-TW/settings';
@ -11,6 +12,7 @@ export default {
'layout.user.link.privacy': '隱私', 'layout.user.link.privacy': '隱私',
'layout.user.link.terms': '條款', 'layout.user.link.terms': '條款',
'app.preview.down.block': '下載此頁面到本地項目', 'app.preview.down.block': '下載此頁面到本地項目',
...pages,
...globalHeader, ...globalHeader,
...menu, ...menu,
...settingDrawer, ...settingDrawer,

12
src/locales/zh-TW/pages.ts

@ -1,7 +1,9 @@
export default { export default {
'pages.layouts.userLayout.title': 'Ant Design 是西湖區最具影響力的 Web 設計規範', 'pages.layouts.userLayout.title':
'Ant Design 是西湖區最具影響力的 Web 設計規範',
'pages.login.accountLogin.tab': '賬戶密碼登錄', 'pages.login.accountLogin.tab': '賬戶密碼登錄',
'pages.login.accountLogin.errorMessage': '錯誤的用戶名和密碼(admin/ant.design)', 'pages.login.accountLogin.errorMessage':
'錯誤的用戶名和密碼(admin/ant.design)',
'pages.login.failure': '登錄失敗,請重試!', 'pages.login.failure': '登錄失敗,請重試!',
'pages.login.success': '登錄成功!', 'pages.login.success': '登錄成功!',
'pages.login.username.placeholder': '用戶名: admin or user', 'pages.login.username.placeholder': '用戶名: admin or user',
@ -27,7 +29,8 @@ export default {
'pages.404.subTitle': '抱歉,您訪問的頁面不存在。', 'pages.404.subTitle': '抱歉,您訪問的頁面不存在。',
'pages.404.buttonText': '返回首頁', 'pages.404.buttonText': '返回首頁',
'pages.admin.subPage.title': '這個頁面只有 admin 權限才能查看', 'pages.admin.subPage.title': '這個頁面只有 admin 權限才能查看',
'pages.admin.subPage.alertMessage': 'umi ui 現已發佈,歡迎使用 npm run ui 啓動體驗。', 'pages.admin.subPage.alertMessage':
'umi ui 現已發佈,歡迎使用 npm run ui 啓動體驗。',
'pages.searchTable.createForm.newRule': '新建規則', 'pages.searchTable.createForm.newRule': '新建規則',
'pages.searchTable.updateForm.ruleConfig': '規則配置', 'pages.searchTable.updateForm.ruleConfig': '規則配置',
'pages.searchTable.updateForm.basicConfig': '基本信息', 'pages.searchTable.updateForm.basicConfig': '基本信息',
@ -35,7 +38,8 @@ export default {
'pages.searchTable.updateForm.ruleName.nameRules': '請輸入規則名稱!', 'pages.searchTable.updateForm.ruleName.nameRules': '請輸入規則名稱!',
'pages.searchTable.updateForm.ruleDesc.descLabel': '規則描述', 'pages.searchTable.updateForm.ruleDesc.descLabel': '規則描述',
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '請輸入至少五個字符', 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '請輸入至少五個字符',
'pages.searchTable.updateForm.ruleDesc.descRules': '請輸入至少五個字符的規則描述!', 'pages.searchTable.updateForm.ruleDesc.descRules':
'請輸入至少五個字符的規則描述!',
'pages.searchTable.updateForm.ruleProps.title': '配置規則屬性', 'pages.searchTable.updateForm.ruleProps.title': '配置規則屬性',
'pages.searchTable.updateForm.object': '監控對象', 'pages.searchTable.updateForm.object': '監控對象',
'pages.searchTable.updateForm.ruleProps.templateLabel': '規則模板', 'pages.searchTable.updateForm.ruleProps.templateLabel': '規則模板',

3
src/locales/zh-TW/settingDrawer.ts

@ -25,7 +25,8 @@ export default {
'app.setting.othersettings': '其他設置', 'app.setting.othersettings': '其他設置',
'app.setting.weakmode': '色弱模式', 'app.setting.weakmode': '色弱模式',
'app.setting.copy': '拷貝設置', 'app.setting.copy': '拷貝設置',
'app.setting.copyinfo': '拷貝成功,請到 config/defaultSettings.js 中替換默認配置', 'app.setting.copyinfo':
'拷貝成功,請到 config/defaultSettings.js 中替換默認配置',
'app.setting.production.hint': 'app.setting.production.hint':
'配置欄只在開發環境用於預覽,生產環境不會展現,請拷貝後手動修改配置文件', '配置欄只在開發環境用於預覽,生產環境不會展現,請拷貝後手動修改配置文件',
}; };

12
src/locales/zh-TW/settings.ts

@ -29,11 +29,13 @@ export default {
'app.settings.security.phone': '密保手機', 'app.settings.security.phone': '密保手機',
'app.settings.security.phone-description': '已綁定手機', 'app.settings.security.phone-description': '已綁定手機',
'app.settings.security.question': '密保問題', 'app.settings.security.question': '密保問題',
'app.settings.security.question-description': '未設置密保問題,密保問題可有效保護賬戶安全', 'app.settings.security.question-description':
'未設置密保問題,密保問題可有效保護賬戶安全',
'app.settings.security.email': '備用郵箱', 'app.settings.security.email': '備用郵箱',
'app.settings.security.email-description': '已綁定郵箱', 'app.settings.security.email-description': '已綁定郵箱',
'app.settings.security.mfa': 'MFA 設備', 'app.settings.security.mfa': 'MFA 設備',
'app.settings.security.mfa-description': '未綁定 MFA 設備,綁定後,可以進行二次確認', 'app.settings.security.mfa-description':
'未綁定 MFA 設備,綁定後,可以進行二次確認',
'app.settings.security.modify': '修改', 'app.settings.security.modify': '修改',
'app.settings.security.set': '設置', 'app.settings.security.set': '設置',
'app.settings.security.bind': '綁定', 'app.settings.security.bind': '綁定',
@ -45,9 +47,11 @@ export default {
'app.settings.binding.dingding-description': '當前未綁定釘釘賬號', 'app.settings.binding.dingding-description': '當前未綁定釘釘賬號',
'app.settings.binding.bind': '綁定', 'app.settings.binding.bind': '綁定',
'app.settings.notification.password': '賬戶密碼', 'app.settings.notification.password': '賬戶密碼',
'app.settings.notification.password-description': '其他用戶的消息將以站內信的形式通知', 'app.settings.notification.password-description':
'其他用戶的消息將以站內信的形式通知',
'app.settings.notification.messages': '系統消息', 'app.settings.notification.messages': '系統消息',
'app.settings.notification.messages-description': '系統消息將以站內信的形式通知', 'app.settings.notification.messages-description':
'系統消息將以站內信的形式通知',
'app.settings.notification.todo': '待辦任務', 'app.settings.notification.todo': '待辦任務',
'app.settings.notification.todo-description': '待辦任務將以站內信的形式通知', 'app.settings.notification.todo-description': '待辦任務將以站內信的形式通知',
'app.settings.open': '開', 'app.settings.open': '開',

12
src/pages/Admin.tsx

@ -17,7 +17,8 @@ const Admin: React.FC = () => {
<Alert <Alert
message={intl.formatMessage({ message={intl.formatMessage({
id: 'pages.welcome.alertMessage', id: 'pages.welcome.alertMessage',
defaultMessage: 'Faster and stronger heavy-duty components have been released.', defaultMessage:
'Faster and stronger heavy-duty components have been released.',
})} })}
type="success" type="success"
showIcon showIcon
@ -28,12 +29,17 @@ const Admin: React.FC = () => {
}} }}
/> />
<Typography.Title level={2} style={{ textAlign: 'center' }}> <Typography.Title level={2} style={{ textAlign: 'center' }}>
<SmileTwoTone /> Ant Design Pro <HeartTwoTone twoToneColor="#eb2f96" /> You <SmileTwoTone /> Ant Design Pro{' '}
<HeartTwoTone twoToneColor="#eb2f96" /> You
</Typography.Title> </Typography.Title>
</Card> </Card>
<p style={{ textAlign: 'center', marginTop: 24 }}> <p style={{ textAlign: 'center', marginTop: 24 }}>
Want to add more pages? Please refer to{' '} Want to add more pages? Please refer to{' '}
<a href="https://pro.ant.design/docs/block-cn" target="_blank" rel="noopener noreferrer"> <a
href="https://pro.ant.design/docs/block-cn"
target="_blank"
rel="noopener noreferrer"
>
use block use block
</a> </a>

12
src/pages/Welcome.tsx

@ -92,11 +92,13 @@ const Welcome: React.FC = () => {
style={{ style={{
borderRadius: 8, borderRadius: 8,
}} }}
bodyStyle={{ styles={{
backgroundImage: body: {
initialState?.settings?.navTheme === 'realDark' backgroundImage:
? 'background-image: linear-gradient(75deg, #1A1B1F 0%, #191C1F 100%)' initialState?.settings?.navTheme === 'realDark'
: 'background-image: linear-gradient(75deg, #FBFDFF 0%, #F5F7FF 100%)', ? 'background-image: linear-gradient(75deg, #1A1B1F 0%, #191C1F 100%)'
: 'background-image: linear-gradient(75deg, #FBFDFF 0%, #F5F7FF 100%)',
},
}} }}
> >
<div <div

23
src/pages/account/center/_mock.ts

@ -52,7 +52,8 @@ const user = [
// 当前用户信息 // 当前用户信息
const currentUseDetail = { const currentUseDetail = {
name: 'Serati Ma', name: 'Serati Ma',
avatar: 'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png', avatar:
'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png',
userid: '00000001', userid: '00000001',
email: 'antdesign@alipay.com', email: 'antdesign@alipay.com',
signature: '海纳百川,有容乃大', signature: '海纳百川,有容乃大',
@ -171,7 +172,10 @@ function fakeList(count: number): ListItemDataType[] {
owner: user[i % 10], owner: user[i % 10],
title: titles[i % 8], title: titles[i % 8],
avatar: avatars[i % 8], avatar: avatars[i % 8],
cover: parseInt(`${i / 4}`, 10) % 2 === 0 ? covers[i % 4] : covers[3 - (i % 4)], cover:
parseInt(`${i / 4}`, 10) % 2 === 0
? covers[i % 4]
: covers[3 - (i % 4)],
status: ['active', 'exception', 'normal'][i % 3] as status: ['active', 'exception', 'normal'][i % 3] as
| 'normal' | 'normal'
| 'exception' | 'exception'
@ -180,8 +184,8 @@ function fakeList(count: number): ListItemDataType[] {
percent: Math.ceil(Math.random() * 50) + 50, percent: Math.ceil(Math.random() * 50) + 50,
logo: avatars[i % 8], logo: avatars[i % 8],
href: 'https://ant.design', href: 'https://ant.design',
updatedAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i).getTime(), updatedAt: new Date(Date.now() - 1000 * 60 * 60 * 2 * i).getTime(),
createdAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i).getTime(), createdAt: new Date(Date.now() - 1000 * 60 * 60 * 2 * i).getTime(),
subDescription: desc[i % 5], subDescription: desc[i % 5],
description: description:
'在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。', '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。',
@ -194,17 +198,20 @@ function fakeList(count: number): ListItemDataType[] {
'段落示意:蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。', '段落示意:蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。',
members: [ members: [
{ {
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png',
name: '曲丽丽', name: '曲丽丽',
id: 'member1', id: 'member1',
}, },
{ {
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png',
name: '王昭君', name: '王昭君',
id: 'member2', id: 'member2',
}, },
{ {
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png',
name: '董娜娜', name: '董娜娜',
id: 'member3', id: 'member3',
}, },
@ -229,7 +236,7 @@ function getFakeList(req: Request, res: Response) {
} }
// 获取用户信息 // 获取用户信息
function getCurrentUser(req: Request, res: Response) { function getCurrentUser(_req: Request, res: Response) {
return res.json({ return res.json({
data: currentUseDetail, data: currentUseDetail,
}); });

27
src/pages/account/center/components/Applications/index.tsx

@ -91,23 +91,28 @@ const Applications: React.FC = () => {
<ShareAltOutlined /> <ShareAltOutlined />
</Tooltip>, </Tooltip>,
<Dropdown <Dropdown
items={[ menu={{
{ items: [
key: '1', {
title: '1st menu item', key: '1',
}, title: '1st menu item',
{ },
key: '2', {
title: '2nd menu item', key: '2',
}, title: '2nd menu item',
]} },
],
}}
key="ellipsis" key="ellipsis"
> >
<EllipsisOutlined /> <EllipsisOutlined />
</Dropdown>, </Dropdown>,
]} ]}
> >
<Card.Meta avatar={<Avatar size="small" src={item.avatar} />} title={item.title} /> <Card.Meta
avatar={<Avatar size="small" src={item.avatar} />}
title={item.title}
/>
<div> <div>
<CardInfo <CardInfo
activeUser={formatWan(item.activeUser)} activeUser={formatWan(item.activeUser)}

7
src/pages/account/center/components/Articles/index.tsx

@ -6,6 +6,7 @@ import type { ListItemDataType } from '../../data.d';
import { queryFakeList } from '../../service'; import { queryFakeList } from '../../service';
import ArticleListContent from '../ArticleListContent'; import ArticleListContent from '../ArticleListContent';
import useStyles from './index.style'; import useStyles from './index.style';
const Articles: React.FC = () => { const Articles: React.FC = () => {
const { styles } = useStyles(); const { styles } = useStyles();
const IconText: React.FC<{ const IconText: React.FC<{
@ -36,7 +37,11 @@ const Articles: React.FC = () => {
actions={[ actions={[
<IconText key="star" icon={<StarTwoTone />} text={item.star} />, <IconText key="star" icon={<StarTwoTone />} text={item.star} />,
<IconText key="like" icon={<LikeOutlined />} text={item.like} />, <IconText key="like" icon={<LikeOutlined />} text={item.like} />,
<IconText key="message" icon={<MessageFilled />} text={item.message} />, <IconText
key="message"
icon={<MessageFilled />}
text={item.message}
/>,
]} ]}
> >
<List.Item.Meta <List.Item.Meta

38
src/pages/account/center/components/AvatarList/index.tsx

@ -16,17 +16,26 @@ export type AvatarListProps = {
maxLength?: number; maxLength?: number;
excessItemsStyle?: React.CSSProperties; excessItemsStyle?: React.CSSProperties;
style?: React.CSSProperties; style?: React.CSSProperties;
children: React.ReactElement<AvatarItemProps> | React.ReactElement<AvatarItemProps>[]; children:
| React.ReactElement<AvatarItemProps>
| React.ReactElement<AvatarItemProps>[];
}; };
const Item: React.FC<AvatarItemProps> = ({ src, size, tips, onClick = () => {} }) => {
const avatarSizeToClassName = (styles: any, size?: SizeType | 'mini') =>
classNames(styles.avatarItem, {
[styles.avatarItemLarge]: size === 'large',
[styles.avatarItemSmall]: size === 'small',
[styles.avatarItemMini]: size === 'mini',
});
const Item: React.FC<AvatarItemProps> = ({
src,
size,
tips,
onClick = () => {},
}) => {
const { styles } = useStyles(); const { styles } = useStyles();
const avatarSizeToClassName = (size?: SizeType | 'mini') => const cls = avatarSizeToClassName(styles, size);
classNames(styles.avatarItem, {
[styles.avatarItemLarge]: size === 'large',
[styles.avatarItemSmall]: size === 'small',
[styles.avatarItemMini]: size === 'mini',
});
const cls = avatarSizeToClassName(size);
return ( return (
<li className={cls} onClick={onClick}> <li className={cls} onClick={onClick}>
{tips ? ( {tips ? (
@ -51,17 +60,22 @@ const AvatarList: React.FC<AvatarListProps> & {
const { styles } = useStyles(); const { styles } = useStyles();
const numOfChildren = React.Children.count(children); const numOfChildren = React.Children.count(children);
const numToShow = maxLength >= numOfChildren ? numOfChildren : maxLength; const numToShow = maxLength >= numOfChildren ? numOfChildren : maxLength;
const childrenArray = React.Children.toArray(children) as React.ReactElement<AvatarItemProps>[]; const childrenArray = React.Children.toArray(
children,
) as React.ReactElement<AvatarItemProps>[];
const childrenWithProps = childrenArray.slice(0, numToShow).map((child) => const childrenWithProps = childrenArray.slice(0, numToShow).map((child) =>
React.cloneElement(child, { React.cloneElement(child, {
size, size,
}), }),
); );
if (numToShow < numOfChildren) { if (numToShow < numOfChildren) {
const cls = avatarSizeToClassName(size); const cls = avatarSizeToClassName(styles, size);
childrenWithProps.push( childrenWithProps.push(
<li key="exceed" className={cls}> <li key="exceed" className={cls}>
<Avatar size={size} style={excessItemsStyle}>{`+${numOfChildren - maxLength}`}</Avatar> <Avatar
size={size}
style={excessItemsStyle}
>{`+${numOfChildren - maxLength}`}</Avatar>
</li>, </li>,
); );
} }

12
src/pages/account/center/components/Projects/index.tsx

@ -7,6 +7,7 @@ import type { ListItemDataType } from '../../data.d';
import { queryFakeList } from '../../service'; import { queryFakeList } from '../../service';
import AvatarList from '../AvatarList'; import AvatarList from '../AvatarList';
import useStyles from './index.style'; import useStyles from './index.style';
dayjs.extend(relativeTime); dayjs.extend(relativeTime);
const Projects: React.FC = () => { const Projects: React.FC = () => {
const { styles } = useStyles(); const { styles } = useStyles();
@ -32,8 +33,15 @@ const Projects: React.FC = () => {
dataSource={listData?.list || []} dataSource={listData?.list || []}
renderItem={(item) => ( renderItem={(item) => (
<List.Item> <List.Item>
<Card className={styles.card} hoverable cover={<img alt={item.title} src={item.cover} />}> <Card
<Card.Meta title={<a>{item.title}</a>} description={item.subDescription} /> className={styles.card}
hoverable
cover={<img alt={item.title} src={item.cover} />}
>
<Card.Meta
title={<a>{item.title}</a>}
description={item.subDescription}
/>
<div className={styles.cardItemContent}> <div className={styles.cardItemContent}>
<span>{dayjs(item.updatedAt).fromNow()}</span> <span>{dayjs(item.updatedAt).fromNow()}</span>
<div className={styles.avatarList}> <div className={styles.avatarList}>

49
src/pages/account/center/index.tsx

@ -1,14 +1,29 @@
import { ClusterOutlined, ContactsOutlined, HomeOutlined, PlusOutlined } from '@ant-design/icons'; import {
ClusterOutlined,
ContactsOutlined,
HomeOutlined,
PlusOutlined,
} from '@ant-design/icons';
import { GridContent } from '@ant-design/pro-components'; import { GridContent } from '@ant-design/pro-components';
import { useRequest } from '@umijs/max'; import { useRequest } from '@umijs/max';
import { Avatar, Card, Col, Divider, Input, InputRef, Row, Tag } from 'antd'; import {
Avatar,
Card,
Col,
Divider,
Input,
type InputRef,
Row,
Tag,
} from 'antd';
import React, { useRef, useState } from 'react'; import React, { useRef, useState } from 'react';
import useStyles from './Center.style'; import useStyles from './Center.style';
import Applications from './components/Applications'; import Applications from './components/Applications';
import Articles from './components/Articles'; import Articles from './components/Articles';
import Projects from './components/Projects'; import Projects from './components/Projects';
import type { CurrentUser, tabKeyType, TagType } from './data.d'; import type { CurrentUser, TagType, tabKeyType } from './data.d';
import { queryCurrent } from './service'; import { queryCurrent } from './service';
const operationTabList = [ const operationTabList = [
{ {
key: 'articles', key: 'articles',
@ -76,7 +91,10 @@ const TagList: React.FC<{
}; };
const handleInputConfirm = () => { const handleInputConfirm = () => {
let tempsTags = [...newTags]; let tempsTags = [...newTags];
if (inputValue && tempsTags.filter((tag) => tag.label === inputValue).length === 0) { if (
inputValue &&
tempsTags.filter((tag) => tag.label === inputValue).length === 0
) {
tempsTags = [ tempsTags = [
...tempsTags, ...tempsTags,
{ {
@ -132,7 +150,11 @@ const Center: React.FC = () => {
}); });
// 渲染用户信息 // 渲染用户信息
const renderUserInfo = ({ title, group, geographic }: Partial<CurrentUser>) => { const renderUserInfo = ({
title,
group,
geographic,
}: Partial<CurrentUser>) => {
return ( return (
<div className={styles.detail}> <div className={styles.detail}>
<p> <p>
@ -223,15 +245,14 @@ const Center: React.FC = () => {
<div className={styles.team}> <div className={styles.team}>
<div className={styles.teamTitle}></div> <div className={styles.teamTitle}></div>
<Row gutter={36}> <Row gutter={36}>
{currentUser.notice && {currentUser.notice?.map((item) => (
currentUser.notice.map((item) => ( <Col key={item.id} lg={24} xl={12}>
<Col key={item.id} lg={24} xl={12}> <a href={item.href}>
<a href={item.href}> <Avatar size="small" src={item.logo} />
<Avatar size="small" src={item.logo} /> {item.member}
{item.member} </a>
</a> </Col>
</Col> ))}
))}
</Row> </Row>
</div> </div>
</div> </div>

5
src/pages/account/settings/_mock.ts

@ -15,11 +15,12 @@ function getCity(req: Request, res: Response) {
}); });
} }
function getCurrentUse(req: Request, res: Response) { function getCurrentUse(_req: Request, res: Response) {
return res.json({ return res.json({
data: { data: {
name: 'Serati Ma', name: 'Serati Ma',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png', avatar:
'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
userid: '00000001', userid: '00000001',
email: 'antdesign@alipay.com', email: 'antdesign@alipay.com',
signature: '海纳百川,有容乃大', signature: '海纳百川,有容乃大',

29
src/pages/account/settings/components/base.tsx

@ -13,7 +13,11 @@ import React from 'react';
import { queryCity, queryCurrent, queryProvince } from '../service'; import { queryCity, queryCurrent, queryProvince } from '../service';
import useStyles from './index.style'; import useStyles from './index.style';
const validatorPhone = (rule: any, value: string[], callback: (message?: string) => void) => { const validatorPhone = (
_rule: any,
value: string[],
callback: (message?: string) => void,
) => {
if (!value[0]) { if (!value[0]) {
callback('Please input your area code!'); callback('Please input your area code!');
} }
@ -50,7 +54,8 @@ const BaseView: React.FC = () => {
if (currentUser.avatar) { if (currentUser.avatar) {
return currentUser.avatar; return currentUser.avatar;
} }
const url = 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png'; const url =
'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png';
return url; return url;
} }
return ''; return '';
@ -142,7 +147,6 @@ const BaseView: React.FC = () => {
labelInValue: true, labelInValue: true,
}} }}
name="province" name="province"
className={styles.item}
request={async () => { request={async () => {
return queryProvince().then(({ data }) => { return queryProvince().then(({ data }) => {
return data.map((item) => { return data.map((item) => {
@ -170,19 +174,20 @@ const BaseView: React.FC = () => {
}, },
]} ]}
disabled={!province} disabled={!province}
className={styles.item}
request={async () => { request={async () => {
if (!province?.key) { if (!province?.key) {
return []; return [];
} }
return queryCity(province.key || '').then(({ data }) => { return queryCity(province.key || '').then(
return data.map((item) => { ({ data }) => {
return { return data.map((item) => {
label: item.name, return {
value: item.id, label: item.name,
}; value: item.id,
}); };
}); });
},
);
}} }}
/> />
); );

6
src/pages/account/settings/components/binding.tsx

@ -1,4 +1,8 @@
import { AlipayOutlined, DingdingOutlined, TaobaoOutlined } from '@ant-design/icons'; import {
AlipayOutlined,
DingdingOutlined,
TaobaoOutlined,
} from '@ant-design/icons';
import { List } from 'antd'; import { List } from 'antd';
import React, { Fragment } from 'react'; import React, { Fragment } from 'react';

4
src/pages/account/settings/components/notification.tsx

@ -5,7 +5,9 @@ type Unpacked<T> = T extends (infer U)[] ? U : T;
const NotificationView: React.FC = () => { const NotificationView: React.FC = () => {
const getData = () => { const getData = () => {
const Action = <Switch checkedChildren="开" unCheckedChildren="关" defaultChecked />; const Action = (
<Switch checkedChildren="开" unCheckedChildren="关" defaultChecked />
);
return [ return [
{ {
title: '用户消息', title: '用户消息',

20
src/pages/account/settings/components/security.tsx

@ -45,17 +45,15 @@ const SecurityView: React.FC = () => {
const data = getData(); const data = getData();
return ( return (
<> <List<Unpacked<typeof data>>
<List<Unpacked<typeof data>> itemLayout="horizontal"
itemLayout="horizontal" dataSource={data}
dataSource={data} renderItem={(item) => (
renderItem={(item) => ( <List.Item actions={item.actions}>
<List.Item actions={item.actions}> <List.Item.Meta title={item.title} description={item.description} />
<List.Item.Meta title={item.title} description={item.description} /> </List.Item>
</List.Item> )}
)} />
/>
</>
); );
}; };

10
src/pages/account/settings/index.tsx

@ -6,6 +6,7 @@ import BindingView from './components/binding';
import NotificationView from './components/notification'; import NotificationView from './components/notification';
import SecurityView from './components/security'; import SecurityView from './components/security';
import useStyles from './style.style'; import useStyles from './style.style';
type SettingsStateKeys = 'base' | 'security' | 'binding' | 'notification'; type SettingsStateKeys = 'base' | 'security' | 'binding' | 'notification';
type SettingsState = { type SettingsState = {
mode: 'inline' | 'horizontal'; mode: 'inline' | 'horizontal';
@ -23,7 +24,7 @@ const Settings: React.FC = () => {
mode: 'inline', mode: 'inline',
selectKey: 'base', selectKey: 'base',
}); });
const dom = useRef<HTMLDivElement>(); const dom = useRef<HTMLDivElement>(null);
const resize = () => { const resize = () => {
requestAnimationFrame(() => { requestAnimationFrame(() => {
if (!dom.current) { if (!dom.current) {
@ -51,9 +52,12 @@ const Settings: React.FC = () => {
return () => { return () => {
window.removeEventListener('resize', resize); window.removeEventListener('resize', resize);
}; };
}, [dom.current]); }, []);
const getMenu = () => { const getMenu = () => {
return Object.keys(menuMap).map((item) => ({ key: item, label: menuMap[item] })); return Object.keys(menuMap).map((item) => ({
key: item,
label: menuMap[item],
}));
}; };
const renderChildren = () => { const renderChildren = () => {
const { selectKey } = initConfig; const { selectKey } = initConfig;

4
src/pages/account/settings/service.ts

@ -9,7 +9,9 @@ export async function queryProvince(): Promise<{ data: GeographicItemType[] }> {
return request('/api/geographic/province'); return request('/api/geographic/province');
} }
export async function queryCity(province: string): Promise<{ data: GeographicItemType[] }> { export async function queryCity(
province: string,
): Promise<{ data: GeographicItemType[] }> {
return request(`/api/geographic/city/${province}`); return request(`/api/geographic/city/${province}`);
} }

4
src/pages/dashboard/analysis/_mock.ts

@ -4,7 +4,7 @@ import type { AnalysisData, DataItem, RadarData } from './data.d';
// mock data // mock data
const visitData: DataItem[] = []; const visitData: DataItem[] = [];
const beginDay = new Date().getTime(); const beginDay = Date.now();
const fakeY = [7, 5, 4, 2, 4, 7, 5, 6, 5, 9, 6, 3, 1, 5, 3, 6, 5]; const fakeY = [7, 5, 4, 2, 4, 7, 5, 6, 5, 9, 6, 3, 1, 5, 3, 6, 5];
for (let i = 0; i < fakeY.length; i += 1) { for (let i = 0; i < fakeY.length; i += 1) {
@ -126,7 +126,7 @@ for (let i = 0; i < 10; i += 1) {
} }
const offlineChartData = []; const offlineChartData = [];
for (let i = 0; i < 20; i += 1) { for (let i = 0; i < 20; i += 1) {
const date = dayjs(new Date().getTime() + 1000 * 60 * 30 * i).format('HH:mm'); const date = dayjs(Date.now() + 1000 * 60 * 30 * i).format('HH:mm');
offlineChartData.push({ offlineChartData.push({
date, date,
type: '客流量', type: '客流量',

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save