wjx 13 stundas atpakaļ
vecāks
revīzija
a9ac46e8aa
100 mainītis faili ar 3937 papildinājumiem un 0 dzēšanām
  1. 1 0
      .commitlintrc.js
  2. 16 0
      .editorconfig
  3. 40 0
      .gitignore
  4. 1 0
      .husky/commit-msg
  5. 1 0
      .husky/pre-commit
  6. 5 0
      .lintstagedrc
  7. 1 0
      .npmrc
  8. 48 0
      biome.json
  9. 178 0
      config/config.ts
  10. 28 0
      config/defaultSettings.ts
  11. 593 0
      config/oneapi.json
  12. 46 0
      config/proxy.ts
  13. 66 0
      config/routes.ts
  14. 21 0
      jest.config.ts
  15. 187 0
      mock/listTableList.ts
  16. 14 0
      mock/monitor.mock.ts
  17. 117 0
      mock/notices.ts
  18. 345 0
      mock/requestRecord.mock.js
  19. 5 0
      mock/route.ts
  20. 205 0
      mock/user.ts
  21. 79 0
      package.json
  22. 1 0
      public/CNAME
  23. BIN
      public/favicon.ico
  24. BIN
      public/icons/icon-128x128.png
  25. BIN
      public/icons/icon-192x192.png
  26. BIN
      public/icons/icon-512x512.png
  27. 0 0
      public/logo.svg
  28. 5 0
      public/pro_icon.svg
  29. 202 0
      public/scripts/loading.js
  30. 11 0
      src/access.ts
  31. 371 0
      src/app.tsx
  32. 0 0
      src/assets/icons/adLaunch.svg
  33. 1 0
      src/assets/icons/adLaunchs.svg
  34. 1 0
      src/assets/icons/barChart.svg
  35. 1 0
      src/assets/icons/bi.svg
  36. 1 0
      src/assets/icons/bookData.svg
  37. 0 0
      src/assets/icons/corpChat.svg
  38. 1 0
      src/assets/icons/drawStem.svg
  39. 1 0
      src/assets/icons/edit.svg
  40. 1 0
      src/assets/icons/externalMaterial.svg
  41. 1 0
      src/assets/icons/floatbuttonSvg.svg
  42. 1 0
      src/assets/icons/followAcc.svg
  43. 1 0
      src/assets/icons/game.svg
  44. 1 0
      src/assets/icons/gameServer.svg
  45. 1 0
      src/assets/icons/ghIcon.svg
  46. 1 0
      src/assets/icons/iaaData.svg
  47. 1 0
      src/assets/icons/imageData.svg
  48. 1 0
      src/assets/icons/img.svg
  49. 1 0
      src/assets/icons/imgText.svg
  50. 1 0
      src/assets/icons/jumpLink.svg
  51. 1 0
      src/assets/icons/launch.svg
  52. 0 0
      src/assets/icons/logo.svg
  53. 1 0
      src/assets/icons/ltv.svg
  54. 1 0
      src/assets/icons/material.svg
  55. 1 0
      src/assets/icons/media.svg
  56. 2 0
      src/assets/icons/monitor.svg
  57. 1 0
      src/assets/icons/novelDataSystem.svg
  58. 0 0
      src/assets/icons/number.svg
  59. 1 0
      src/assets/icons/pitcherData.svg
  60. 1 0
      src/assets/icons/player.svg
  61. 0 0
      src/assets/icons/rechargeData.svg
  62. 1 0
      src/assets/icons/rocket.svg
  63. 0 0
      src/assets/icons/roleManage.svg
  64. 1 0
      src/assets/icons/sliderImgSvg.svg
  65. 1 0
      src/assets/icons/text.svg
  66. 0 0
      src/assets/icons/topNullBack.svg
  67. 1 0
      src/assets/icons/topimg.svg
  68. 1 0
      src/assets/icons/topslider.svg
  69. 1 0
      src/assets/icons/topvideo.svg
  70. 1 0
      src/assets/icons/weChat.svg
  71. 1 0
      src/assets/icons/weChatData.svg
  72. 1 0
      src/assets/icons/wxAutoSvg.svg
  73. 15 0
      src/components/Footer/index.tsx
  74. 41 0
      src/components/HeaderDropdown/index.tsx
  75. 158 0
      src/components/RightContent/AvatarDropdown.tsx
  76. 21 0
      src/components/RightContent/index.tsx
  77. 12 0
      src/components/index.ts
  78. 331 0
      src/global.less
  79. 42 0
      src/global.style.ts
  80. 93 0
      src/global.tsx
  81. 7 0
      src/loading.tsx
  82. 25 0
      src/locales/bn-BD.ts
  83. 5 0
      src/locales/bn-BD/component.ts
  84. 17 0
      src/locales/bn-BD/globalHeader.ts
  85. 52 0
      src/locales/bn-BD/menu.ts
  86. 73 0
      src/locales/bn-BD/pages.ts
  87. 7 0
      src/locales/bn-BD/pwa.ts
  88. 32 0
      src/locales/bn-BD/settingDrawer.ts
  89. 60 0
      src/locales/bn-BD/settings.ts
  90. 25 0
      src/locales/en-US.ts
  91. 5 0
      src/locales/en-US/component.ts
  92. 18 0
      src/locales/en-US/globalHeader.ts
  93. 52 0
      src/locales/en-US/menu.ts
  94. 76 0
      src/locales/en-US/pages.ts
  95. 7 0
      src/locales/en-US/pwa.ts
  96. 32 0
      src/locales/en-US/settingDrawer.ts
  97. 61 0
      src/locales/en-US/settings.ts
  98. 25 0
      src/locales/fa-IR.ts
  99. 5 0
      src/locales/fa-IR/component.ts
  100. 18 0
      src/locales/fa-IR/globalHeader.ts

+ 1 - 0
.commitlintrc.js

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

+ 16 - 0
.editorconfig

@@ -0,0 +1,16 @@
+# http://editorconfig.org
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[Makefile]
+indent_style = tab

+ 40 - 0
.gitignore

@@ -0,0 +1,40 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+**/node_modules
+# roadhog-api-doc ignore
+/src/utils/request-temp.js
+_roadhog-api-doc
+
+# production
+/dist
+
+# misc
+.DS_Store
+npm-debug.log*
+yarn-error.log
+
+/coverage
+.idea
+yarn.lock
+package-lock.json
+*bak
+.vscode
+
+
+# visual studio code
+.history
+*.log
+functions/*
+.temp/**
+
+# umi
+.umi
+.umi-production
+.umi-test
+
+# screenshot
+screenshot
+.firebase
+
+build

+ 1 - 0
.husky/commit-msg

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

+ 1 - 0
.husky/pre-commit

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

+ 5 - 0
.lintstagedrc

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

+ 1 - 0
.npmrc

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

+ 48 - 0
biome.json

@@ -0,0 +1,48 @@
+{
+  "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
+  "files": {
+    "ignoreUnknown": true,
+    "includes": [
+      "**/*",
+      "!**/.umi/**",
+      "!**/.umi-production/**",
+      "!**/.umi-test/**",
+      "!**/.umi-test-production/**",
+      "!**/src/services/**",
+      "!**/mock/**",
+      "!**/dist/**",
+      "!**/server/**",
+      "!**/public/**",
+      "!**/coverage/**",
+      "!**/node_modules/**",
+      "!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"
+    }
+  }
+}

+ 178 - 0
config/config.ts

@@ -0,0 +1,178 @@
+// https://umijs.org/config/
+
+import { join } from 'node:path';
+import { defineConfig } from '@umijs/max';
+import defaultSettings from './defaultSettings';
+import proxy from './proxy';
+
+import routes from './routes';
+
+const { REACT_APP_ENV = 'dev' } = process.env;
+
+/**
+ * @name 使用公共路径
+ * @description 部署时的路径,如果部署在非根目录下,需要配置这个变量
+ * @doc https://umijs.org/docs/api/config#publicpath
+ */
+const PUBLIC_PATH: string = '/';
+
+export default defineConfig({
+  history: {
+    type: 'hash',
+  },
+  /**
+   * @name 开启 hash 模式
+   * @description 让 build 之后的产物包含 hash 后缀。通常用于增量发布和避免浏览器加载缓存。
+   * @doc https://umijs.org/docs/api/config#hash
+   */
+  hash: true,
+
+  publicPath: PUBLIC_PATH,
+
+  /**
+   * @name 兼容性设置
+   * @description 设置 ie11 不一定完美兼容,需要检查自己使用的所有依赖
+   * @doc https://umijs.org/docs/api/config#targets
+   */
+  // targets: {
+  //   ie: 11,
+  // },
+  /**
+   * @name 路由的配置,不在路由中引入的文件不会编译
+   * @description 只支持 path,component,routes,redirect,wrappers,title 的配置
+   * @doc https://umijs.org/docs/guides/routes
+   */
+  // umi routes: https://umijs.org/docs/routing
+  routes,
+  /**
+   * @name 主题的配置
+   * @description 虽然叫主题,但是其实只是 less 的变量设置
+   * @doc antd的主题设置 https://ant.design/docs/react/customize-theme-cn
+   * @doc umi 的 theme 配置 https://umijs.org/docs/api/config#theme
+   */
+  // theme: { '@primary-color': '#1DA57A' }
+  /**
+   * @name moment 的国际化配置
+   * @description 如果对国际化没有要求,打开之后能减少js的包大小
+   * @doc https://umijs.org/docs/api/config#ignoremomentlocale
+   */
+  ignoreMomentLocale: true,
+  /**
+   * @name 代理配置
+   * @description 可以让你的本地服务器代理到你的服务器上,这样你就可以访问服务器的数据了
+   * @see 要注意以下 代理只能在本地开发时使用,build 之后就无法使用了。
+   * @doc 代理介绍 https://umijs.org/docs/guides/proxy
+   * @doc 代理配置 https://umijs.org/docs/api/config#proxy
+   */
+  proxy: proxy[REACT_APP_ENV as keyof typeof proxy],
+  /**
+   * @name 快速热更新配置
+   * @description 一个不错的热更新组件,更新时可以保留 state
+   */
+  fastRefresh: true,
+  //============== 以下都是max的插件配置 ===============
+  /**
+   * @name 数据流插件
+   * @@doc https://umijs.org/docs/max/data-flow
+   */
+  model: {},
+  /**
+   * 一个全局的初始数据流,可以用它在插件之间共享数据
+   * @description 可以用来存放一些全局的数据,比如用户信息,或者一些全局的状态,全局初始状态在整个 Umi 项目的最开始创建。
+   * @doc https://umijs.org/docs/max/data-flow#%E5%85%A8%E5%B1%80%E5%88%9D%E5%A7%8B%E7%8A%B6%E6%80%81
+   */
+  initialState: {},
+  /**
+   * @name layout 插件
+   * @doc https://umijs.org/docs/max/layout-menu
+   */
+  title: '趣程游戏数据系统',
+  layout: {
+    locale: true,
+    ...defaultSettings,
+  },
+  /**
+   * @name moment2dayjs 插件
+   * @description 将项目中的 moment 替换为 dayjs
+   * @doc https://umijs.org/docs/max/moment2dayjs
+   */
+  moment2dayjs: {
+    preset: 'antd',
+    plugins: ['duration'],
+  },
+  /**
+   * @name 国际化插件
+   * @doc https://umijs.org/docs/max/i18n
+   */
+  locale: false,
+  /**
+   * @name antd 插件
+   * @description 内置了 babel import 插件
+   * @doc https://umijs.org/docs/max/antd#antd
+   */
+  antd: {
+    appConfig: {},
+    configProvider: {
+      theme: {
+        cssVar: true,
+        token: {
+          fontFamily: 'AlibabaSans, sans-serif',
+        },
+      },
+    },
+  },
+  /**
+   * @name 网络请求配置
+   * @description 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
+   * @doc https://umijs.org/docs/max/request
+   */
+  request: {},
+  /**
+   * @name 权限插件
+   * @description 基于 initialState 的权限插件,必须先打开 initialState
+   * @doc https://umijs.org/docs/max/access
+   */
+  access: {},
+  /**
+   * @name <head> 中额外的 script
+   * @description 配置 <head> 中额外的 script
+   */
+  headScripts: [
+    // 解决首次加载时白屏的问题
+    { src: join(PUBLIC_PATH, 'scripts/loading.js'), async: true },
+  ],
+  //================ pro 插件配置 =================
+  presets: ['umi-presets-pro'],
+  /**
+   * @name openAPI 插件的配置
+   * @description 基于 openapi 的规范生成serve 和mock,能减少很多样板代码
+   * @doc https://pro.ant.design/zh-cn/docs/openapi/
+   */
+  openAPI: [
+    {
+      requestLibPath: "import { request } from '@umijs/max'",
+      // 或者使用在线的版本
+      // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json"
+      schemaPath: join(__dirname, 'oneapi.json'),
+      mock: false,
+    },
+    {
+      requestLibPath: "import { request } from '@umijs/max'",
+      schemaPath:
+        'https://gw.alipayobjects.com/os/antfincdn/CA1dOm%2631B/openapi.json',
+      projectName: 'swagger',
+    },
+  ],
+  mock: {
+    include: ['mock/**/*', 'src/pages/**/_mock.ts'],
+  },
+  /**
+   * @name 是否开启 mako
+   * @description 使用 mako 极速研发
+   * @doc https://umijs.org/docs/api/config#mako
+   */
+  mako: {},
+  esbuildMinifyIIFE: true,
+  requestRecord: {},
+  exportStatic: {},
+});

+ 28 - 0
config/defaultSettings.ts

@@ -0,0 +1,28 @@
+import type { ProLayoutProps } from '@ant-design/pro-components';
+
+/**
+ * @name
+ */
+const Settings: ProLayoutProps & {
+  pwa?: boolean;
+  logo?: string;
+} = {
+  navTheme: 'light',
+  // 拂晓蓝
+  colorPrimary: '#1890ff',
+  layout: 'mix',
+  contentWidth: 'Fluid',
+  fixedHeader: true,
+  fixSiderbar: true,
+  colorWeak: false,
+  title: '趣程游戏数据系统',
+  pwa: true,
+  logo: 'https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg',
+  iconfontUrl: '',
+  token: {
+    // 参见ts声明,demo 见文档,通过token 修改样式
+    //https://procomponents.ant.design/components/layout#%E9%80%9A%E8%BF%87-token-%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F
+  },
+};
+
+export default Settings;

+ 593 - 0
config/oneapi.json

@@ -0,0 +1,593 @@
+{
+  "openapi": "3.0.1",
+  "info": {
+    "title": "Ant Design Pro",
+    "version": "1.0.0"
+  },
+  "servers": [
+    {
+      "url": "http://localhost:8000/"
+    },
+    {
+      "url": "https://localhost:8000/"
+    }
+  ],
+  "paths": {
+    "/api/currentUser": {
+      "get": {
+        "tags": ["api"],
+        "description": "获取当前的用户",
+        "operationId": "currentUser",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/CurrentUser"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "x-swagger-router-controller": "api"
+    },
+    "/api/login/captcha": {
+      "post": {
+        "description": "发送验证码",
+        "operationId": "getFakeCaptcha",
+        "tags": ["login"],
+        "parameters": [
+          {
+            "name": "phone",
+            "in": "query",
+            "description": "手机号",
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/FakeCaptcha"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/login/outLogin": {
+      "post": {
+        "description": "登录接口",
+        "operationId": "outLogin",
+        "tags": ["login"],
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "x-swagger-router-controller": "api"
+    },
+    "/api/login/account": {
+      "post": {
+        "tags": ["login"],
+        "description": "登录接口",
+        "operationId": "login",
+        "requestBody": {
+          "description": "登录系统",
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/LoginParams"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/LoginResult"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        },
+        "x-codegen-request-body-name": "body"
+      },
+      "x-swagger-router-controller": "api"
+    },
+    "/api/notices": {
+      "summary": "getNotices",
+      "description": "NoticeIconItem",
+      "get": {
+        "tags": ["api"],
+        "operationId": "getNotices",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/NoticeIconList"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/rule": {
+      "get": {
+        "tags": ["rule"],
+        "description": "获取规则列表",
+        "operationId": "rule",
+        "parameters": [
+          {
+            "name": "current",
+            "in": "query",
+            "description": "当前的页码",
+            "schema": {
+              "type": "number"
+            }
+          },
+          {
+            "name": "pageSize",
+            "in": "query",
+            "description": "页面的容量",
+            "schema": {
+              "type": "number"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RuleList"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["rule"],
+        "description": "新建规则",
+        "operationId": "addRule",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RuleListItem"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "put": {
+        "tags": ["rule"],
+        "description": "新建规则",
+        "operationId": "updateRule",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RuleListItem"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["rule"],
+        "description": "删除规则",
+        "operationId": "removeRule",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "x-swagger-router-controller": "api"
+    },
+    "/swagger": {
+      "x-swagger-pipe": "swagger_raw"
+    }
+  },
+  "components": {
+    "schemas": {
+      "CurrentUser": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string"
+          },
+          "avatar": {
+            "type": "string"
+          },
+          "userid": {
+            "type": "string"
+          },
+          "email": {
+            "type": "string"
+          },
+          "signature": {
+            "type": "string"
+          },
+          "title": {
+            "type": "string"
+          },
+          "group": {
+            "type": "string"
+          },
+          "tags": {
+            "type": "array",
+            "items": {
+              "type": "object",
+              "properties": {
+                "key": {
+                  "type": "string"
+                },
+                "label": {
+                  "type": "string"
+                }
+              }
+            }
+          },
+          "notifyCount": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "unreadCount": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "country": {
+            "type": "string"
+          },
+          "access": {
+            "type": "string"
+          },
+          "geographic": {
+            "type": "object",
+            "properties": {
+              "province": {
+                "type": "object",
+                "properties": {
+                  "label": {
+                    "type": "string"
+                  },
+                  "key": {
+                    "type": "string"
+                  }
+                }
+              },
+              "city": {
+                "type": "object",
+                "properties": {
+                  "label": {
+                    "type": "string"
+                  },
+                  "key": {
+                    "type": "string"
+                  }
+                }
+              }
+            }
+          },
+          "address": {
+            "type": "string"
+          },
+          "phone": {
+            "type": "string"
+          }
+        }
+      },
+      "LoginResult": {
+        "type": "object",
+        "properties": {
+          "status": {
+            "type": "string"
+          },
+          "type": {
+            "type": "string"
+          },
+          "currentAuthority": {
+            "type": "string"
+          }
+        }
+      },
+      "PageParams": {
+        "type": "object",
+        "properties": {
+          "current": {
+            "type": "number"
+          },
+          "pageSize": {
+            "type": "number"
+          }
+        }
+      },
+      "RuleListItem": {
+        "type": "object",
+        "properties": {
+          "key": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "disabled": {
+            "type": "boolean"
+          },
+          "href": {
+            "type": "string"
+          },
+          "avatar": {
+            "type": "string"
+          },
+          "name": {
+            "type": "string"
+          },
+          "owner": {
+            "type": "string"
+          },
+          "desc": {
+            "type": "string"
+          },
+          "callNo": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "status": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "updatedAt": {
+            "type": "string",
+            "format": "datetime"
+          },
+          "createdAt": {
+            "type": "string",
+            "format": "datetime"
+          },
+          "progress": {
+            "type": "integer",
+            "format": "int32"
+          }
+        }
+      },
+      "RuleList": {
+        "type": "object",
+        "properties": {
+          "data": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/RuleListItem"
+            }
+          },
+          "total": {
+            "type": "integer",
+            "description": "列表的内容总数",
+            "format": "int32"
+          },
+          "success": {
+            "type": "boolean"
+          }
+        }
+      },
+      "FakeCaptcha": {
+        "type": "object",
+        "properties": {
+          "code": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "status": {
+            "type": "string"
+          }
+        }
+      },
+      "LoginParams": {
+        "type": "object",
+        "properties": {
+          "username": {
+            "type": "string"
+          },
+          "password": {
+            "type": "string"
+          },
+          "autoLogin": {
+            "type": "boolean"
+          },
+          "type": {
+            "type": "string"
+          }
+        }
+      },
+      "ErrorResponse": {
+        "required": ["errorCode"],
+        "type": "object",
+        "properties": {
+          "errorCode": {
+            "type": "string",
+            "description": "业务约定的错误码"
+          },
+          "errorMessage": {
+            "type": "string",
+            "description": "业务上的错误信息"
+          },
+          "success": {
+            "type": "boolean",
+            "description": "业务上的请求是否成功"
+          }
+        }
+      },
+      "NoticeIconList": {
+        "type": "object",
+        "properties": {
+          "data": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/NoticeIconItem"
+            }
+          },
+          "total": {
+            "type": "integer",
+            "description": "列表的内容总数",
+            "format": "int32"
+          },
+          "success": {
+            "type": "boolean"
+          }
+        }
+      },
+      "NoticeIconItemType": {
+        "title": "NoticeIconItemType",
+        "description": "已读未读列表的枚举",
+        "type": "string",
+        "properties": {},
+        "enum": ["notification", "message", "event"]
+      },
+      "NoticeIconItem": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string"
+          },
+          "extra": {
+            "type": "string",
+            "format": "any"
+          },
+          "key": { "type": "string" },
+          "read": {
+            "type": "boolean"
+          },
+          "avatar": {
+            "type": "string"
+          },
+          "title": {
+            "type": "string"
+          },
+          "status": {
+            "type": "string"
+          },
+          "datetime": {
+            "type": "string",
+            "format": "date"
+          },
+          "description": {
+            "type": "string"
+          },
+          "type": {
+            "extensions": {
+              "x-is-enum": true
+            },
+            "$ref": "#/components/schemas/NoticeIconItemType"
+          }
+        }
+      }
+    }
+  }
+}

+ 46 - 0
config/proxy.ts

@@ -0,0 +1,46 @@
+/**
+ * @name 代理的配置
+ * @see 在生产环境 代理是无法生效的,所以这里没有生产环境的配置
+ * -------------------------------
+ * The agent cannot take effect in the production environment
+ * so there is no configuration of the production environment
+ * For details, please see
+ * https://pro.ant.design/docs/deploy
+ *
+ * @doc https://umijs.org/docs/guides/proxy
+ */
+export default {
+  // 如果需要自定义本地开发服务器  请取消注释按需调整
+  dev: {
+    '/api/': {
+      target: 'https://api.zanxiangwl.com',
+      changeOrigin: true,
+      pathRewrite: { '/api': '' },
+    },
+    '/gameApi/': {
+      target: 'https://game.84game.cn',//服务器
+      changeOrigin: true,
+      pathRewrite: { '^/gameApi/': '' },
+    },
+  },
+
+  /**
+   * @name 详细的代理配置
+   * @doc https://github.com/chimurai/http-proxy-middleware
+   */
+  test: {
+    // localhost:8000/api/** -> https://preview.pro.ant.design/api/**
+    '/api/': {
+      target: 'https://game.84game.cn',
+      changeOrigin: true,
+      pathRewrite: { '^': '' },
+    },
+  },
+  pre: {
+    '/api/': {
+      target: 'your pre url',
+      changeOrigin: true,
+      pathRewrite: { '^': '' },
+    },
+  },
+};

+ 66 - 0
config/routes.ts

@@ -0,0 +1,66 @@
+/**
+ * @name umi 的路由配置
+ * @description 只支持 path,component,routes,redirect,wrappers,name,icon 的配置
+ * @param path  path 只支持两种占位符配置,第一种是动态参数 :id 的形式,第二种是 * 通配符,通配符只能出现路由字符串的最后。
+ * @param component 配置 location 和 path 匹配后用于渲染的 React 组件路径。可以是绝对路径,也可以是相对路径,如果是相对路径,会从 src/pages 开始找起。
+ * @param routes 配置子路由,通常在需要为多个路径增加 layout 组件时使用。
+ * @param redirect 配置路由跳转
+ * @param wrappers 配置路由组件的包装组件,通过包装组件可以为当前的路由组件组合进更多的功能。 比如,可以用于路由级别的权限校验
+ * @param name 配置路由的标题,默认读取国际化文件 menu.ts 中 menu.xxxx 的值,如配置 name 为 login,则读取 menu.ts 中 menu.login 的取值作为标题
+ * @param icon 配置路由的图标,取值参考 https://ant.design/components/icon-cn, 注意去除风格后缀和大小写,如想要配置图标为 <StepBackwardOutlined /> 则取值应为 stepBackward 或 StepBackward,如想要配置图标为 <UserOutlined /> 则取值应为 user 或者 User
+ * @doc https://umijs.org/docs/guides/routes
+ */
+
+
+const dataStatisticsGame = {
+  name: '游戏数据系统',
+  path: '/gameDataStatistics',
+  routes: [
+    {
+      path: '/gameDataStatistics/allSurvey',
+      name: '整体概况',
+      component: './gameDataStatistics/allSurvey',
+    }
+  ]
+}
+
+
+export default [
+  {
+    path: '/user',
+    layout: false,
+    routes: [
+      {
+        name: 'login',
+        path: '/user/login',
+        component: './user/login',
+      },
+    ],
+  },
+  dataStatisticsGame,
+  {
+    path: '/mp',
+    name: '运营系统'
+  },
+  {
+    path: '/corpChat',
+    name: '企微系统'
+  },
+  {
+    path: '/adLaunch',
+    name: '投放系统'
+  },
+  {
+    path: '/iaaData',
+    name: 'IAA数据系统'
+  },
+  {
+    path: '/exteriorMedia',
+    name: '外部素材'
+  },
+  {
+    path: '*',
+    layout: false,
+    component: './404',
+  },
+];

+ 21 - 0
jest.config.ts

@@ -0,0 +1,21 @@
+import { configUmiAlias, createConfig } from '@umijs/max/test';
+
+export default async (): Promise<any> => {
+  const config = await configUmiAlias({
+    ...createConfig({
+      target: 'browser',
+    }),
+  });
+  return {
+    ...config,
+    testEnvironmentOptions: {
+      ...(config?.testEnvironmentOptions || {}),
+      url: 'http://localhost:8000',
+    },
+    setupFiles: [...(config.setupFiles || []), './tests/setupTests.jsx'],
+    globals: {
+      ...config.globals,
+      localStorage: null,
+    },
+  };
+};

+ 187 - 0
mock/listTableList.ts

@@ -0,0 +1,187 @@
+import { parse } from 'node:url';
+import dayjs from 'dayjs';
+import type { Request, Response } from 'express';
+
+// mock tableListDataSource
+const genList = (current: number, pageSize: number) => {
+  const tableListDataSource: API.RuleListItem[] = [];
+
+  for (let i = 0; i < pageSize; i += 1) {
+    const index = (current - 1) * 10 + i;
+    tableListDataSource.push({
+      key: index,
+      disabled: i % 6 === 0,
+      href: 'https://ant.design',
+      avatar: [
+        'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+      ][i % 2],
+      name: `TradeCode ${index}`,
+      owner: '曲丽丽',
+      desc: '这是一段描述',
+      callNo: Math.floor(Math.random() * 1000),
+      status: Math.floor(Math.random() * 10) % 4,
+      updatedAt: dayjs().format('YYYY-MM-DD'),
+      createdAt: dayjs().format('YYYY-MM-DD'),
+      progress: Math.ceil(Math.random() * 100),
+    });
+  }
+  tableListDataSource.reverse();
+  return tableListDataSource;
+};
+
+let tableListDataSource = genList(1, 100);
+
+function getRule(req: Request, res: Response, u: string) {
+  let realUrl = u;
+  if (
+    !realUrl ||
+    Object.prototype.toString.call(realUrl) !== '[object String]'
+  ) {
+    realUrl = req.url;
+  }
+  const { current = 1, pageSize = 10 } = req.query;
+  const params = parse(realUrl, true).query as unknown as API.PageParams &
+    API.RuleListItem & {
+      sorter: any;
+      filter: any;
+    };
+
+  let dataSource = [...tableListDataSource].slice(
+    ((current as number) - 1) * (pageSize as number),
+    (current as number) * (pageSize as number),
+  );
+  if (params.sorter) {
+    const sorter = JSON.parse(params.sorter);
+    dataSource = dataSource.sort((prev, next) => {
+      let sortNumber = 0;
+      (Object.keys(sorter) as Array<keyof API.RuleListItem>).forEach((key) => {
+        const nextSort = next?.[key] as number;
+        const preSort = prev?.[key] as number;
+        if (sorter[key] === 'descend') {
+          if (preSort - nextSort > 0) {
+            sortNumber += -1;
+          } else {
+            sortNumber += 1;
+          }
+          return;
+        }
+        if (preSort - nextSort > 0) {
+          sortNumber += 1;
+        } else {
+          sortNumber += -1;
+        }
+      });
+      return sortNumber;
+    });
+  }
+  if (params.filter) {
+    const filter = JSON.parse(params.filter as any) as {
+      [key: string]: string[];
+    };
+    if (Object.keys(filter).length > 0) {
+      dataSource = dataSource.filter((item) => {
+        return (Object.keys(filter) as Array<keyof API.RuleListItem>).some(
+          (key) => {
+            if (!filter[key]) {
+              return true;
+            }
+            if (filter[key].includes(`${item[key]}`)) {
+              return true;
+            }
+            return false;
+          },
+        );
+      });
+    }
+  }
+
+  if (params.name) {
+    dataSource = dataSource.filter((data) =>
+      data?.name?.includes(params.name || ''),
+    );
+  }
+  const result = {
+    data: dataSource,
+    total: tableListDataSource.length,
+    success: true,
+    pageSize,
+    current: parseInt(`${params.current}`, 10) || 1,
+  };
+
+  return res.json(result);
+}
+
+function postRule(req: Request, res: Response, u: string, b: Request) {
+  let realUrl = u;
+  if (
+    !realUrl ||
+    Object.prototype.toString.call(realUrl) !== '[object String]'
+  ) {
+    realUrl = req.url;
+  }
+
+  const body = b?.body || req.body;
+  const { method, name, desc, key } = body;
+
+  switch (method) {
+    case 'delete':
+      tableListDataSource = tableListDataSource.filter(
+        (item) => key.indexOf(item.key) === -1,
+      );
+      break;
+    case 'post':
+      (() => {
+        const i = Math.ceil(Math.random() * 10000);
+        const newRule: API.RuleListItem = {
+          key: tableListDataSource.length,
+          href: 'https://ant.design',
+          avatar: [
+            'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+            'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+          ][i % 2],
+          name,
+          owner: '曲丽丽',
+          desc,
+          callNo: Math.floor(Math.random() * 1000),
+          status: Math.floor(Math.random() * 10) % 2,
+          updatedAt: dayjs().format('YYYY-MM-DD'),
+          createdAt: dayjs().format('YYYY-MM-DD'),
+          progress: Math.ceil(Math.random() * 100),
+        };
+        tableListDataSource.unshift(newRule);
+        return res.json(newRule);
+      })();
+      return;
+
+    case 'update':
+      (() => {
+        let newRule = {};
+        tableListDataSource = tableListDataSource.map((item) => {
+          if (item.key === key) {
+            newRule = { ...item, desc, name };
+            return { ...item, desc, name };
+          }
+          return item;
+        });
+        return res.json(newRule);
+      })();
+      return;
+    default:
+      break;
+  }
+
+  const result = {
+    list: tableListDataSource,
+    pagination: {
+      total: tableListDataSource.length,
+    },
+  };
+
+  res.json(result);
+}
+
+export default {
+  'GET /api/rule': getRule,
+  'POST /api/rule': postRule,
+};

+ 14 - 0
mock/monitor.mock.ts

@@ -0,0 +1,14 @@
+import type { Request, Response } from 'express';
+import mockjs from 'mockjs';
+
+const getTags = (_: Request, res: Response) => {
+  return res.json({
+    data: mockjs.mock({
+      'list|100': [{ name: '@city', 'value|1-100': 150, 'type|0-2': 1 }],
+    }),
+  });
+};
+
+export default {
+  'GET  /api/tags': getTags,
+};

+ 117 - 0
mock/notices.ts

@@ -0,0 +1,117 @@
+import type { Request, Response } from 'express';
+
+const getNotices = (_req: Request, res: Response) => {
+  res.json({
+    data: [
+      {
+        id: '000000001',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/MSbDR4FR2MUAAAAAAAAAAAAAFl94AQBr',
+        title: '你收到了 14 份新周报',
+        datetime: '2017-08-09',
+        type: 'notification',
+      },
+      {
+        id: '000000002',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/hX-PTavYIq4AAAAAAAAAAAAAFl94AQBr',
+        title: '你推荐的 曲妮妮 已通过第三轮面试',
+        datetime: '2017-08-08',
+        type: 'notification',
+      },
+      {
+        id: '000000003',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/jHX5R5l3QjQAAAAAAAAAAAAAFl94AQBr',
+        title: '这种模板可以区分多种通知类型',
+        datetime: '2017-08-07',
+        read: true,
+        type: 'notification',
+      },
+      {
+        id: '000000004',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/Wr4mQqx6jfwAAAAAAAAAAAAAFl94AQBr',
+        title: '左侧图标用于区分不同的类型',
+        datetime: '2017-08-07',
+        type: 'notification',
+      },
+      {
+        id: '000000005',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/Mzj_TbcWUj4AAAAAAAAAAAAAFl94AQBr',
+        title: '内容不要超过两行字,超出时自动截断',
+        datetime: '2017-08-07',
+        type: 'notification',
+      },
+      {
+        id: '000000006',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/eXLzRbPqQE4AAAAAAAAAAAAAFl94AQBr',
+        title: '曲丽丽 评论了你',
+        description: '描述信息描述信息描述信息',
+        datetime: '2017-08-07',
+        type: 'message',
+        clickClose: true,
+      },
+      {
+        id: '000000007',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/w5mRQY2AmEEAAAAAAAAAAAAAFl94AQBr',
+        title: '朱偏右 回复了你',
+        description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
+        datetime: '2017-08-07',
+        type: 'message',
+        clickClose: true,
+      },
+      {
+        id: '000000008',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/wPadR5M9918AAAAAAAAAAAAAFl94AQBr',
+        title: '标题',
+        description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
+        datetime: '2017-08-07',
+        type: 'message',
+        clickClose: true,
+      },
+      {
+        id: '000000009',
+        title: '任务名称',
+        description: '任务需要在 2017-01-12 20:00 前启动',
+        extra: '未开始',
+        status: 'todo',
+        type: 'event',
+      },
+      {
+        id: '000000010',
+        title: '第三方紧急代码变更',
+        description:
+          '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
+        extra: '马上到期',
+        status: 'urgent',
+        type: 'event',
+      },
+      {
+        id: '000000011',
+        title: '信息安全考试',
+        description: '指派竹尔于 2017-01-09 前完成更新并发布',
+        extra: '已耗时 8 天',
+        status: 'doing',
+        type: 'event',
+      },
+      {
+        id: '000000012',
+        title: 'ABCD 版本发布',
+        description:
+          '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
+        extra: '进行中',
+        status: 'processing',
+        type: 'event',
+      },
+    ],
+  });
+};
+
+export default {
+  'GET /api/notices': getNotices,
+};

+ 345 - 0
mock/requestRecord.mock.js

@@ -0,0 +1,345 @@
+module.exports = {
+  'GET /api/currentUser': {
+    data: {
+      name: 'Serati Ma',
+      avatar:
+        'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
+      userid: '00000001',
+      email: 'antdesign@alipay.com',
+      signature: '海纳百川,有容乃大',
+      title: '交互专家',
+      group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED',
+      tags: [
+        { key: '0', label: '很有想法的' },
+        { key: '1', label: '专注设计' },
+        { key: '2', label: '辣~' },
+        { key: '3', label: '大长腿' },
+        { key: '4', label: '川妹子' },
+        { key: '5', label: '海纳百川' },
+      ],
+      notifyCount: 12,
+      unreadCount: 11,
+      country: 'China',
+      geographic: {
+        province: { label: '浙江省', key: '330000' },
+        city: { label: '杭州市', key: '330100' },
+      },
+      address: '西湖区工专路 77 号',
+      phone: '0752-268888888',
+    },
+  },
+  'GET /api/rule': {
+    data: [
+      {
+        key: 99,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 99',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 503,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 81,
+      },
+      {
+        key: 98,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 98',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 164,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 12,
+      },
+      {
+        key: 97,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 97',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 174,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 81,
+      },
+      {
+        key: 96,
+        disabled: true,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 96',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 914,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 7,
+      },
+      {
+        key: 95,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 95',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 698,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 82,
+      },
+      {
+        key: 94,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 94',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 488,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 14,
+      },
+      {
+        key: 93,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 93',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 580,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 77,
+      },
+      {
+        key: 92,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 92',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 244,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 58,
+      },
+      {
+        key: 91,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 91',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 959,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 66,
+      },
+      {
+        key: 90,
+        disabled: true,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 90',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 958,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 72,
+      },
+      {
+        key: 89,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 89',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 301,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 2,
+      },
+      {
+        key: 88,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 88',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 277,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 12,
+      },
+      {
+        key: 87,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 87',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 810,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 82,
+      },
+      {
+        key: 86,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 86',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 780,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 22,
+      },
+      {
+        key: 85,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 85',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 705,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 12,
+      },
+      {
+        key: 84,
+        disabled: true,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 84',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 203,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 79,
+      },
+      {
+        key: 83,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 83',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 491,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 59,
+      },
+      {
+        key: 82,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 82',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 73,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 100,
+      },
+      {
+        key: 81,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 81',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 406,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 61,
+      },
+      {
+        key: 80,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar:
+          'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 80',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 112,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 20,
+      },
+    ],
+    total: 100,
+    success: true,
+    pageSize: 20,
+    current: 1,
+  },
+  'POST /api/login/outLogin': { data: {}, success: true },
+  'POST /api/login/account': {
+    status: 'ok',
+    type: 'account',
+    currentAuthority: 'admin',
+  },
+};

+ 5 - 0
mock/route.ts

@@ -0,0 +1,5 @@
+export default {
+  '/api/auth_routes': {
+    '/form/advanced-form': { authority: ['admin', 'user'] },
+  },
+};

+ 205 - 0
mock/user.ts

@@ -0,0 +1,205 @@
+import type { Request, Response } from 'express';
+
+const waitTime = (time: number = 100) => {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      resolve(true);
+    }, time);
+  });
+};
+
+async function getFakeCaptcha(_req: Request, res: Response) {
+  await waitTime(2000);
+  return res.json('captcha-xxx');
+}
+
+const { ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION } = process.env;
+
+/**
+ * 当前用户的权限,如果为空代表没登录
+ * current user access, if is '', user need login
+ * 如果是 pro 的预览,默认是有权限的
+ */
+let access =
+  ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site' ? 'admin' : '';
+
+const getAccess = () => {
+  return access;
+};
+
+// 代码中会兼容本地 service mock 以及部署站点的静态数据
+export default {
+  // 支持值为 Object 和 Array
+  'GET /api/currentUser': (_req: Request, res: Response) => {
+    if (!getAccess()) {
+      res.status(401).send({
+        data: {
+          isLogin: false,
+        },
+        errorCode: '401',
+        errorMessage: '请先登录!',
+        success: true,
+      });
+      return;
+    }
+    res.send({
+      success: true,
+      data: {
+        name: 'Serati Ma',
+        avatar:
+          'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png',
+        userid: '00000001',
+        email: 'antdesign@alipay.com',
+        signature: '海纳百川,有容乃大',
+        title: '交互专家',
+        group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED',
+        tags: [
+          {
+            key: '0',
+            label: '很有想法的',
+          },
+          {
+            key: '1',
+            label: '专注设计',
+          },
+          {
+            key: '2',
+            label: '辣~',
+          },
+          {
+            key: '3',
+            label: '大长腿',
+          },
+          {
+            key: '4',
+            label: '川妹子',
+          },
+          {
+            key: '5',
+            label: '海纳百川',
+          },
+        ],
+        notifyCount: 12,
+        unreadCount: 11,
+        country: 'China',
+        access: getAccess(),
+        geographic: {
+          province: {
+            label: '浙江省',
+            key: '330000',
+          },
+          city: {
+            label: '杭州市',
+            key: '330100',
+          },
+        },
+        address: '西湖区工专路 77 号',
+        phone: '0752-268888888',
+      },
+    });
+  },
+  // GET POST 可省略
+  'GET /api/users': [
+    {
+      key: '1',
+      name: 'John Brown',
+      age: 32,
+      address: 'New York No. 1 Lake Park',
+    },
+    {
+      key: '2',
+      name: 'Jim Green',
+      age: 42,
+      address: 'London No. 1 Lake Park',
+    },
+    {
+      key: '3',
+      name: 'Joe Black',
+      age: 32,
+      address: 'Sidney No. 1 Lake Park',
+    },
+  ],
+  'POST /api/login/account': async (req: Request, res: Response) => {
+    const { password, username, type } = req.body;
+    await waitTime(2000);
+    if (password === 'ant.design' && username === 'admin') {
+      res.send({
+        status: 'ok',
+        type,
+        currentAuthority: 'admin',
+      });
+      access = 'admin';
+      return;
+    }
+    if (password === 'ant.design' && username === 'user') {
+      res.send({
+        status: 'ok',
+        type,
+        currentAuthority: 'user',
+      });
+      access = 'user';
+      return;
+    }
+    if (type === 'mobile') {
+      res.send({
+        status: 'ok',
+        type,
+        currentAuthority: 'admin',
+      });
+      access = 'admin';
+      return;
+    }
+
+    res.send({
+      status: 'error',
+      type,
+      currentAuthority: 'guest',
+    });
+    access = 'guest';
+  },
+  'POST /api/login/outLogin': (_req: Request, res: Response) => {
+    access = '';
+    res.send({ data: {}, success: true });
+  },
+  'POST /api/register': (_req: Request, res: Response) => {
+    res.send({ status: 'ok', currentAuthority: 'user', success: true });
+  },
+  'GET /api/500': (_req: Request, res: Response) => {
+    res.status(500).send({
+      timestamp: 1513932555104,
+      status: 500,
+      error: 'error',
+      message: 'error',
+      path: '/base/category/list',
+    });
+  },
+  'GET /api/404': (_req: Request, res: Response) => {
+    res.status(404).send({
+      timestamp: 1513932643431,
+      status: 404,
+      error: 'Not Found',
+      message: 'No message available',
+      path: '/base/category/list/2121212',
+    });
+  },
+  'GET /api/403': (_req: Request, res: Response) => {
+    res.status(403).send({
+      timestamp: 1513932555104,
+      status: 403,
+      error: 'Forbidden',
+      message: 'Forbidden',
+      path: '/base/category/list',
+    });
+  },
+  'GET /api/401': (_req: Request, res: Response) => {
+    res.status(401).send({
+      timestamp: 1513932555104,
+      status: 401,
+      error: 'Unauthorized',
+      message: 'Unauthorized',
+      path: '/base/category/list',
+    });
+  },
+
+  'GET  /api/login/captcha': getFakeCaptcha,
+};

+ 79 - 0
package.json

@@ -0,0 +1,79 @@
+{
+  "name": "ant-design-pro",
+  "version": "6.0.0",
+  "private": true,
+  "description": "An out-of-box UI solution for enterprise applications",
+  "repository": "git@github.com:ant-design/ant-design-pro.git",
+  "scripts": {
+    "analyze": "cross-env ANALYZE=1 max build",
+    "biome:lint": "npx @biomejs/biome lint",
+    "build": "max build",
+    "deploy": "npm run build && npm run gh-pages",
+    "dev": "npm run start:dev",
+    "gh-pages": "gh-pages -d dist",
+    "i18n-remove": "pro i18n-remove --locale=zh-CN --write",
+    "postinstall": "max setup",
+    "jest": "jest",
+    "lint": "npm run biome:lint && npm run tsc",
+    "lint-staged": "lint-staged",
+    "openapi": "max openapi",
+    "prepare": "husky",
+    "preview": "npm run build && max preview --port 8000",
+    "record": "cross-env NODE_ENV=development REACT_APP_ENV=test max record --scene=login",
+    "serve": "umi-serve",
+    "start": "cross-env UMI_ENV=dev max dev",
+    "start:dev": "cross-env REACT_APP_ENV=dev MOCK=none UMI_ENV=dev max dev",
+    "start:no-mock": "cross-env MOCK=none UMI_ENV=dev max dev",
+    "start:pre": "cross-env REACT_APP_ENV=pre UMI_ENV=dev max dev",
+    "start:test": "cross-env REACT_APP_ENV=test MOCK=none UMI_ENV=dev max dev",
+    "test": "jest",
+    "test:coverage": "npm run jest -- --coverage",
+    "test:update": "npm run jest -- -u",
+    "tsc": "tsc --noEmit"
+  },
+  "browserslist": [
+    "defaults"
+  ],
+  "dependencies": {
+    "@ant-design/icons": "^5.6.1",
+    "@ant-design/pro-components": "^2.7.19",
+    "@ant-design/v5-patch-for-react-19": "^1.0.3",
+    "antd": "^5.25.4",
+    "antd-style": "^3.7.0",
+    "classnames": "^2.5.1",
+    "dayjs": "^1.11.13",
+    "react": "^19.1.0",
+    "react-dom": "^19.1.0"
+  },
+  "devDependencies": {
+    "@ant-design/pro-cli": "^3.3.0",
+    "@biomejs/biome": "^2.0.6",
+    "@commitlint/cli": "^19.5.0",
+    "@commitlint/config-conventional": "^19.5.0",
+    "@testing-library/dom": "^10.4.0",
+    "@testing-library/react": "^16.0.1",
+    "@types/express": "^5.0.3",
+    "@types/jest": "^30.0.0",
+    "@types/lodash": "^4.17.10",
+    "@types/node": "^24.0.10",
+    "@types/react": "^19.1.5",
+    "@types/react-dom": "^19.1.5",
+    "@types/react-helmet": "^6.1.11",
+    "@umijs/max": "^4.3.24",
+    "cross-env": "^7.0.3",
+    "express": "^4.21.1",
+    "gh-pages": "^6.1.1",
+    "husky": "^9.1.7",
+    "jest": "^30.0.4",
+    "jest-environment-jsdom": "^29.7.0",
+    "lint-staged": "^16.1.2",
+    "mockjs": "^1.1.0",
+    "ts-node": "^10.9.2",
+    "typescript": "^5.6.3",
+    "umi-presets-pro": "^2.0.3",
+    "umi-serve": "^1.9.11"
+  },
+  "engines": {
+    "node": ">=20.0.0"
+  }
+}

+ 1 - 0
public/CNAME

@@ -0,0 +1 @@
+preview.pro.ant.design

BIN
public/favicon.ico


BIN
public/icons/icon-128x128.png


BIN
public/icons/icon-192x192.png


BIN
public/icons/icon-512x512.png


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
public/logo.svg


+ 5 - 0
public/pro_icon.svg

@@ -0,0 +1,5 @@
+<svg width="42" height="42" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <path fill="#070707" d="m6.717392,13.773912l5.6,0c2.8,0 4.7,1.9 4.7,4.7c0,2.8 -2,4.7 -4.9,4.7l-2.5,0l0,4.3l-2.9,0l0,-13.7zm2.9,2.2l0,4.9l1.9,0c1.6,0 2.6,-0.9 2.6,-2.4c0,-1.6 -0.9,-2.4 -2.6,-2.4l-1.9,0l0,-0.1zm8.9,11.5l2.7,0l0,-5.7c0,-1.4 0.8,-2.3 2.2,-2.3c0.4,0 0.8,0.1 1,0.2l0,-2.4c-0.2,-0.1 -0.5,-0.1 -0.8,-0.1c-1.2,0 -2.1,0.7 -2.4,2l-0.1,0l0,-1.9l-2.7,0l0,10.2l0.1,0zm11.7,0.1c-3.1,0 -5,-2 -5,-5.3c0,-3.3 2,-5.3 5,-5.3s5,2 5,5.3c0,3.4 -1.9,5.3 -5,5.3zm0,-2.1c1.4,0 2.2,-1.1 2.2,-3.2c0,-2 -0.8,-3.2 -2.2,-3.2c-1.4,0 -2.2,1.2 -2.2,3.2c0,2.1 0.8,3.2 2.2,3.2z" class="st0" id="Ant-Design-Pro"/>
+ </g>
+</svg>

+ 202 - 0
public/scripts/loading.js

@@ -0,0 +1,202 @@
+/**
+ * loading 占位
+ * 解决首次加载时白屏的问题
+ */
+(function () {
+  const _root = document.querySelector('#root');
+  if (_root && _root.innerHTML === '') {
+    _root.innerHTML = `
+      <style>
+        html,
+        body,
+        #root {
+          height: 100%;
+          margin: 0;
+          padding: 0;
+        }
+        #root {
+          background-repeat: no-repeat;
+          background-size: 100% auto;
+        }
+
+        .loading-title {
+          font-size: 1.1rem;
+        }
+
+        .loading-sub-title {
+          margin-top: 20px;
+          font-size: 1rem;
+          color: #888;
+        }
+
+        .page-loading-warp {
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          padding: 26px;
+        }
+        .ant-spin {
+          position: absolute;
+          display: none;
+          -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+          margin: 0;
+          padding: 0;
+          color: rgba(0, 0, 0, 0.65);
+          color: #1890ff;
+          font-size: 14px;
+          font-variant: tabular-nums;
+          line-height: 1.5;
+          text-align: center;
+          list-style: none;
+          opacity: 0;
+          -webkit-transition: -webkit-transform 0.3s
+            cubic-bezier(0.78, 0.14, 0.15, 0.86);
+          transition: -webkit-transform 0.3s
+            cubic-bezier(0.78, 0.14, 0.15, 0.86);
+          transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+          transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86),
+            -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+          -webkit-font-feature-settings: "tnum";
+          font-feature-settings: "tnum";
+        }
+
+        .ant-spin-spinning {
+          position: static;
+          display: inline-block;
+          opacity: 1;
+        }
+
+        .ant-spin-dot {
+          position: relative;
+          display: inline-block;
+          width: 20px;
+          height: 20px;
+          font-size: 20px;
+        }
+
+        .ant-spin-dot-item {
+          position: absolute;
+          display: block;
+          width: 9px;
+          height: 9px;
+          background-color: #1890ff;
+          border-radius: 100%;
+          -webkit-transform: scale(0.75);
+          -ms-transform: scale(0.75);
+          transform: scale(0.75);
+          -webkit-transform-origin: 50% 50%;
+          -ms-transform-origin: 50% 50%;
+          transform-origin: 50% 50%;
+          opacity: 0.3;
+          -webkit-animation: antspinmove 1s infinite linear alternate;
+          animation: antSpinMove 1s infinite linear alternate;
+        }
+
+        .ant-spin-dot-item:nth-child(1) {
+          top: 0;
+          left: 0;
+        }
+
+        .ant-spin-dot-item:nth-child(2) {
+          top: 0;
+          right: 0;
+          -webkit-animation-delay: 0.4s;
+          animation-delay: 0.4s;
+        }
+
+        .ant-spin-dot-item:nth-child(3) {
+          right: 0;
+          bottom: 0;
+          -webkit-animation-delay: 0.8s;
+          animation-delay: 0.8s;
+        }
+
+        .ant-spin-dot-item:nth-child(4) {
+          bottom: 0;
+          left: 0;
+          -webkit-animation-delay: 1.2s;
+          animation-delay: 1.2s;
+        }
+
+        .ant-spin-dot-spin {
+          -webkit-transform: rotate(45deg);
+          -ms-transform: rotate(45deg);
+          transform: rotate(45deg);
+          -webkit-animation: antrotate 1.2s infinite linear;
+          animation: antRotate 1.2s infinite linear;
+        }
+
+        .ant-spin-lg .ant-spin-dot {
+          width: 32px;
+          height: 32px;
+          font-size: 32px;
+        }
+
+        .ant-spin-lg .ant-spin-dot i {
+          width: 14px;
+          height: 14px;
+        }
+
+        @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+          .ant-spin-blur {
+            background: #fff;
+            opacity: 0.5;
+          }
+        }
+
+        @-webkit-keyframes antSpinMove {
+          to {
+            opacity: 1;
+          }
+        }
+
+        @keyframes antSpinMove {
+          to {
+            opacity: 1;
+          }
+        }
+
+        @-webkit-keyframes antRotate {
+          to {
+            -webkit-transform: rotate(405deg);
+            transform: rotate(405deg);
+          }
+        }
+
+        @keyframes antRotate {
+          to {
+            -webkit-transform: rotate(405deg);
+            transform: rotate(405deg);
+          }
+        }
+      </style>
+
+      <div style="
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        height: 100%;
+        min-height: 362px;
+      ">
+        <div class="page-loading-warp">
+          <div class="ant-spin ant-spin-lg ant-spin-spinning">
+            <span class="ant-spin-dot ant-spin-dot-spin">
+              <i class="ant-spin-dot-item"></i>
+              <i class="ant-spin-dot-item"></i>
+              <i class="ant-spin-dot-item"></i>
+              <i class="ant-spin-dot-item"></i>
+            </span>
+          </div>
+        </div>
+        <div class="loading-title">
+          正在加载资源
+        </div>
+        <div class="loading-sub-title">
+          初次加载资源可能需要较多时间 请耐心等待
+        </div>
+      </div>
+    `;
+  }
+})();

+ 11 - 0
src/access.ts

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

+ 371 - 0
src/app.tsx

@@ -0,0 +1,371 @@
+import { Footer, AvatarDropdown, AvatarName } from '@/components';
+import type { Settings as LayoutSettings } from '@ant-design/pro-components';
+import { PageLoading } from '@ant-design/pro-components';
+import type { RequestConfig, RunTimeLayoutConfig } from '@umijs/max';
+import { history } from '@umijs/max';
+import defaultSettings from '../config/defaultSettings';
+import { errorConfig } from './requestErrorConfig';
+import { getMenu, currentUser as queryCurrentUser } from '@/services/user/api';
+import { DesktopOutlined, MessageOutlined, SendOutlined, TeamOutlined, QrcodeOutlined, DatabaseOutlined, ReadOutlined, MobileOutlined, FundViewOutlined, RadarChartOutlined, BarChartOutlined, WechatOutlined, BookOutlined, FileImageOutlined, EyeOutlined, UserOutlined } from '@ant-design/icons';
+import { ReactComponent as LaunchSvg } from '@/assets/icons/launch.svg'
+import { ReactComponent as AdLaunchSvg } from '@/assets/icons/adLaunch.svg'
+import { ReactComponent as MaterialSvg } from '@/assets/icons/material.svg'
+import { ReactComponent as NumberSvg } from '@/assets/icons/number.svg'
+import { ReactComponent as GameSvg } from '@/assets/icons/game.svg'
+import { ReactComponent as GameServerSvg } from '@/assets/icons/gameServer.svg'
+import { ReactComponent as MediaSvg } from '@/assets/icons/media.svg'
+import { ReactComponent as PlayerSvg } from '@/assets/icons/player.svg'
+import { ReactComponent as RoleManageSvg } from '@/assets/icons/roleManage.svg'
+import { ReactComponent as MonitorSvg } from '@/assets/icons/monitor.svg'
+import { ReactComponent as BarChartSvg } from '@/assets/icons/barChart.svg'
+import { ReactComponent as PitcherDataSvg } from '@/assets/icons/pitcherData.svg'
+import { ReactComponent as WeChatDataSvg } from '@/assets/icons/weChatData.svg'
+import { ReactComponent as BookDataSvg } from '@/assets/icons/bookData.svg'
+import { ReactComponent as ImageDataSvg } from '@/assets/icons/imageData.svg'
+import { ReactComponent as RechargeDataSvg } from '@/assets/icons/rechargeData.svg'
+import { ReactComponent as NovelDataSystemSvg } from '@/assets/icons/novelDataSystem.svg'
+import { ReactComponent as CorpChatSvg } from '@/assets/icons/corpChat.svg'
+import { ReactComponent as WeChatSvg } from '@/assets/icons/weChat.svg'
+import { ReactComponent as AdLaunchsSvg } from '@/assets/icons/adLaunchs.svg'
+import { ReactComponent as IaaDataSvg } from '@/assets/icons/iaaData.svg'
+import { ReactComponent as ExternalMaterialSvg } from '@/assets/icons/externalMaterial.svg'
+import { ConfigProvider, Watermark } from 'antd';
+const isDev = process.env.NODE_ENV === 'development';
+const loginPath = '/user/login';
+
+/**
+ * @see  https://umijs.org/zh-CN/plugins/plugin-initial-state
+ * */
+export async function getInitialState(): Promise<{
+  settings?: Partial<LayoutSettings>;
+  currentUser?: API.CurrentUser;
+  loading?: boolean;
+  menu?: any,
+  collapsed?: string,
+  onCollapse?: (onCollapse: boolean) => void
+  fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
+}> {
+  const fetchUserInfo = async () => {
+    try {
+      const msg = await queryCurrentUser();
+      return msg.data;
+    } catch (error) {
+      history.push(loginPath);
+    }
+    return undefined;
+  };
+  if (localStorage.getItem('Admin-Token')) {
+    try {
+      sessionStorage.removeItem('IS_MES')
+      const currentUser = await fetchUserInfo();
+      console.log('currentUser', currentUser)
+      if (currentUser) {
+        const { companyRelationInfo, userInfo: { powerLevel, nickname, userId, phone, sex }, onlineCompanyId } = currentUser
+        const companyInfo = companyRelationInfo?.filter((item: { companyId: number }) => item.companyId !== 4 && item.companyId !== 3)
+        localStorage.setItem('sex', sex)
+        localStorage.setItem('userId', userId)
+        localStorage.setItem('name', nickname)
+        const navTheme: any = localStorage.getItem('NAVTHEME')
+        const isNoDark = localStorage.getItem('ISNODARK')
+        return {
+          fetchUserInfo,
+          currentUser: { access: 'admin', powerLevel, name: nickname || '', userId, phone, companyList: companyInfo, onlineCompanyId: onlineCompanyId },
+          settings: { ...defaultSettings as Partial<LayoutSettings>, navTheme: navTheme || defaultSettings.navTheme, isNoDark: JSON.parse(isNoDark || 'false') } as any,
+          loading: false,
+          collapsed: '0',
+          onCollapse: (collapsed: boolean) => {
+            const v = collapsed ? '1' : '0'
+            localStorage.setItem('collapsed', v)
+          }
+        };
+      }
+    } catch (error) {
+      history.push(loginPath);
+    }
+  }
+  return {
+    fetchUserInfo,
+    settings: defaultSettings as Partial<LayoutSettings>,
+  };
+}
+
+const IconMap = {
+  desktop: <DesktopOutlined />,
+  message: <MessageOutlined />,
+  send: <SendOutlined />,
+  team: <TeamOutlined />,
+  database: <DatabaseOutlined />,
+  qrcode: <QrcodeOutlined />,
+  read: <ReadOutlined />,
+  mobile: <MobileOutlined />,
+  fundView: <FundViewOutlined />,
+  radarChart: <RadarChartOutlined />,
+  wechat: <WechatOutlined />,
+  book: <BookOutlined />,
+  peoples: <UserOutlined />,
+  barChart: <BarChartOutlined />,
+  'file-image': <FileImageOutlined />,
+  launch: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><LaunchSvg /></span>,
+  adLaunch: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><AdLaunchSvg /></span>,
+  material: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><MaterialSvg /></span>,
+  number: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><NumberSvg /></span>,
+  game: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><GameSvg /></span>,
+  gameServer: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><GameServerSvg /></span>,
+  media: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><MediaSvg /></span>,
+  player: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><PlayerSvg /></span>,
+  roleManage: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><RoleManageSvg /></span>,
+  monitor: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><MonitorSvg /></span>,
+  pitcherData: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><PitcherDataSvg /></span>,
+  barChartNoval: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><BarChartSvg /></span>,
+  weChatData: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><WeChatDataSvg /></span>,
+  bookData: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><BookDataSvg /></span>,
+  imageData: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><ImageDataSvg /></span>,
+  rechargeData: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><RechargeDataSvg /></span>,
+  novelDataSystem: <span role="img" aria-label="fund-view" className="anticon anticon-fund-view"><NovelDataSystemSvg /></span>,
+  eye: <EyeOutlined />
+};
+
+/** 处理远程路由 */
+const handleMenuData = (menuData: any[]) => {
+  return menuData.map(item => {
+    const data: { [x: string]: any } = {
+      name: item.title,
+      path: item.path,
+      icon: item.icon && IconMap[item.icon as keyof typeof IconMap]
+    }
+    if (item?.component) {
+      data.component = item.component
+    }
+    if (item?.children?.length) {
+      data.routes = handleMenuData(item.children)
+    }
+    return data
+  })
+}
+
+// ProLayout 支持的api https://procomponents.ant.design/components/layout
+export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
+  let isLoading = false;
+  return {
+    splitMenus: true,//切割菜单
+    className: initialState?.settings?.navTheme === 'realDark' ? 'css-realDark' : (initialState?.settings as any)?.isNoDark ? 'css-light' : 'css-dark',
+    menu: {
+      params: {
+        token: initialState?.currentUser?.userId
+      },
+      request: async (_, defaultMenuData) => {
+        if (initialState?.currentUser?.userId) {
+          isLoading = true;
+          const menuData = await getMenu();
+          isLoading = false;
+          if (menuData?.data) {
+            const protoMenu = Object.values(menuData.data).map((item: unknown) => {
+              if (Array.isArray(item)) {
+                return item[0];
+              }
+              return null; // 或者根据业务逻辑返回默认值
+            }).filter(Boolean) as any[]
+            const { location } = history;
+            if (location.pathname === '/') {
+              // 如果当前路径是根路径,则重定向到第一个菜单的第一个子菜单
+              const firstPath = protoMenu?.[0]?.children?.[0]?.path || protoMenu?.[0]?.children?.[0]?.children?.[0]?.path;
+              if (firstPath) {
+                history.push(firstPath);
+              }
+            }
+            const menuSync = handleMenuData(protoMenu)
+            const menu = [
+              {
+                path: '/user',
+                layout: false,
+                routes: [
+                  {
+                    name: 'login',
+                    path: '/user/login',
+                    component: './User/Login',
+                  },
+                ],
+              },
+              {
+                path: '/',
+                redirect: '/dataStatisticsNovel' //firStPath,
+              },
+              ...menuSync.map(({ routes, ...item }) => {
+                return { ...item, routes: [{ path: item.path, redirect: routes[0].path }, ...routes] }
+              }),
+              {
+                path: '/mp',
+                name: '运营系统',
+                icon: <WeChatSvg />
+              },
+              {
+                path: '/corpChat',
+                name: '企微系统',
+                icon: <CorpChatSvg />
+              },
+              {
+                path: '/adLaunch',
+                name: '投放系统',
+                icon: <AdLaunchsSvg />
+              },
+              {
+                path: '/iaaData',
+                name: 'IAA数据系统',
+                icon: <IaaDataSvg />
+              },
+              {
+                path: '/exteriorMedia',
+                name: '外部素材',
+                icon: <ExternalMaterialSvg />
+              },
+            ]
+            setInitialState(s => ({ ...s, menu: menuData?.data }))
+            return menu;
+          }
+        }
+        return defaultMenuData
+      },
+      loading: isLoading
+    },
+    avatarProps: {
+      src: initialState?.currentUser?.avatar || 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
+      title: <AvatarName />,
+      render: (_, avatarChildren) => {
+        return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
+      },
+    },
+    footerRender: () => <Footer />,
+    onPageChange: (location) => {
+      if (location?.pathname === '/mp') {
+        window.open(`https://mp.zanxiangnet.com/#/user/login?token=${localStorage.getItem('Admin-Token')}`, '_blank')
+        history.back() // 返回上一页
+        return
+      } else if (location?.pathname === '/corpChat') {
+        window.open(`https://corp.zanxiangnet.com/#/login?token=${localStorage.getItem('Admin-Token')}`, '_blank')
+        history.back() // 返回上一页
+        return
+      } else if (location?.pathname === '/adLaunch') {
+        window.open(`https://adq.zanxiangnet.com/#/user/login?token=${localStorage.getItem('Admin-Token')}`, '_blank')
+        history.back() // 返回上一页
+        return
+      } else if (location?.pathname === '/iaaData') {
+        window.open(`https://iaadata.84game.cn/#/user/login?token=${localStorage.getItem('Admin-Token')}`, '_blank')
+        history.back() // 返回上一页
+        return
+      } else if (location?.pathname === '/exteriorMedia') { // 外部素材
+        window.open(`https://mp.zanxiangnet.com/#/user/login?token=${localStorage.getItem('Admin-Token')}&redirect=${encodeURIComponent('/#/exteriorMedia/reyun')}`, '_blank')
+        history.back() // 返回上一页
+        return
+      }
+      // 如果没有登录,重定向到 login
+      if (location?.pathname !== loginPath && !localStorage.getItem('Admin-Token')) {
+        history.push(loginPath);
+      }
+      if (initialState?.currentUser && location?.pathname !== loginPath) {
+        let menu = []
+        if (initialState?.menu) {
+          menu = Object.values(initialState?.menu).map((item: unknown) => {
+            if (Array.isArray(item)) {
+              return item[0];
+            }
+            return null; // 或者根据业务逻辑返回默认值
+          }).filter(Boolean) as any[]
+        }
+        if (menu?.length) {
+          switch (location?.pathname) {
+            case '/':
+              history.push(menu?.[0]?.children?.[0]?.path)
+              break;
+            case '/dataStatisticsNovel':
+              history.push(menu?.find(item => item.path === '/dataStatisticsNovel')?.children?.[0]?.path)
+              break
+          }
+        }
+      }
+    },
+    bgLayoutImgList: [
+      {
+        src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
+        left: 85,
+        bottom: 100,
+        height: '303px',
+      },
+      {
+        src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
+        bottom: -68,
+        right: -45,
+        height: '303px',
+      },
+      {
+        src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
+        bottom: 0,
+        left: 0,
+        width: '331px',
+      }
+    ],
+    menuHeaderRender: undefined,
+    // 自定义 403 页面
+    // unAccessible: <div>unAccessible</div>,
+    // 增加一个 loading 的状态
+    childrenRender: (children) => {
+      if (initialState?.loading) return <PageLoading />;
+      return (<ConfigProvider
+        componentSize='middle'
+        theme={initialState?.settings?.navTheme === 'realDark' ? undefined : {
+          components: {
+            Table: {
+              colorBorderSecondary: '#e0e0e0',
+              headerBg: '#F5F5F5'
+            },
+            Menu: {
+              fontSizeSM: 20,
+              fontSizeXL: 20,
+              fontSize: 20,
+              fontSizeLG: 20
+            }
+          }
+        }}
+      >
+        <Watermark
+          content={initialState?.currentUser?.name}
+          font={{
+            color: 'rgba(255, 0, 0, 0.06)',
+            fontSize: 20,
+            fontWeight: 600,
+          }}
+          gap={[50, 100]}
+        >
+          {children}
+          {/* {isDev && (
+            <SettingDrawer
+              disableUrlParams
+              enableDarkTheme
+              settings={initialState?.settings}
+              onSettingChange={(settings) => {
+                setInitialState((preInitialState) => ({
+                  ...preInitialState,
+                  settings,
+                }));
+              }}
+            />
+          )} */}
+        </Watermark>
+      </ConfigProvider>);
+    },
+    ...initialState?.settings
+  };
+};
+
+/**
+ * @name request 配置,可以配置错误处理
+ * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
+ * @doc https://umijs.org/docs/max/request#配置
+ */
+export const request: RequestConfig = {
+  ...errorConfig,
+  timeout: 300000,
+  headers: {
+    ['Authorization']: 'Bearer ' + localStorage.getItem('Admin-Token'),
+    ['debug']: sessionStorage.getItem('debug') || ''
+  }
+};

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/assets/icons/adLaunch.svg


+ 1 - 0
src/assets/icons/adLaunchs.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M733 64.2H287.1C164 64.2 64.2 164 64.2 287.1V733c0 123.1 99.8 222.9 222.9 222.9H733c123.1 0 222.9-99.8 222.9-222.9V287.1C955.9 164 856.1 64.2 733 64.2z" fill="#73C0DE" p-id="25741"></path><path d="M734.8 733m-222.9 0a222.9 222.9 0 1 0 445.8 0 222.9 222.9 0 1 0-445.8 0Z" fill="#FFFFFF" opacity=".16" p-id="25742"></path><path d="M697.4 242.6H322.7c-45.4 0-82.2 36.9-82.2 82.2v274c0 45.4 36.9 82.2 82.2 82.2h374.7c45.4 0 82.2-36.9 82.2-82.2v-274c0-45.4-36.9-82.2-82.2-82.2z m44.3 356.2c0 24.4-19.9 44.3-44.3 44.3H322.7c-24.4 0-44.3-19.9-44.3-44.3v-274c0-24.4 19.9-44.3 44.3-44.3h374.7c24.4 0 44.3 19.9 44.3 44.3v274zM630 735.8H390.1c-10.5 0-19 8.5-19 19s8.5 19 19 19H630c10.5 0 19-8.5 19-19s-8.5-19-19-19z m0 0" fill="#FFFFFF" p-id="25743"></path><path d="M340.4 579.1c-2.4 0-4.9-0.5-7.2-1.4-4.8-1.9-8.6-5.6-10.6-10.4-2-4.7-2.1-10.1-0.1-14.9l71.9-179.1c2.9-7.3 10-12.1 17.9-12.2h0.1c7.8 0 14.9 4.7 17.9 12l74.4 179.1c2.7 6.4 1.7 13.7-2.5 19.2s-11 8.3-17.9 7.4c-6.9-0.9-12.7-5.4-15.4-11.8l-56.3-135-54.2 135c-2.9 7.3-10 12.1-18 12.1z m0 0" fill="#FFFFFF" p-id="25744"></path><path d="M455.7 524.6h-85.5c-10.7 0-19.4-8.7-19.4-19.4s8.7-19.4 19.4-19.4h85.5c10.7 0 19.4 8.7 19.4 19.4s-8.7 19.4-19.4 19.4z m103.1 57.8h-5.6c-10.7 0-19.4-8.7-19.4-19.4V375.2c0-10 7.6-18.4 17.5-19.3 3-0.3 73.1-6.7 115.9 32.1 21.1 19.2 31.8 45.3 31.8 77.7 0 33.5-10.3 60.6-30.5 80.7-24.1 23.8-61.1 36-109.7 36z m13.9-188.1v148.9c31-1.8 54-10 68.6-24.5 12.8-12.6 19-30 19-53 0-21.2-6.2-37.2-19-48.8-19.4-17.8-49.6-21.9-68.6-22.6z m0 0" fill="#FFFFFF" p-id="25745"></path></svg>

+ 1 - 0
src/assets/icons/barChart.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M289.386667 907.136c-20.608 0-37.098667-16.490667-37.098667-37.12 0-20.608 16.490667-37.098667 37.12-37.098667H721.706667c20.608 0 37.12 16.490667 37.12 37.12 0 20.608-16.512 37.098667-37.12 37.098667H289.386667zM889.429333 128A49.493333 49.493333 0 0 1 938.666667 177.237333v535.701334a49.493333 49.493333 0 0 1-49.237334 49.237333H134.570667A49.493333 49.493333 0 0 1 85.333333 712.938667V177.237333A49.493333 49.493333 0 0 1 134.570667 128h754.858666z m-127.253333 135.552L536.32 489.301333l-125.098667-125.888a7.893333 7.893333 0 0 0-11.093333 0l-180.48 179.413334a7.893333 7.893333 0 0 0 0 11.093333l38.784 38.976a7.893333 7.893333 0 0 0 11.093333 0L405.333333 457.770667l125.290667 126.08a7.893333 7.893333 0 0 0 11.093333 0l270.421334-270.314667a7.893333 7.893333 0 0 0 0-11.093333l-38.869334-38.890667a7.893333 7.893333 0 0 0-11.093333 0z" fill="currentColor" p-id="3273"></path></svg>

+ 1 - 0
src/assets/icons/bi.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M711.088314 599.018889c0 47.465035-17.593703 83.517135-52.738132 108.114346-28.14092 17.551748-61.555961 26.369577-100.20419 26.369577L312.911686 733.502813 312.911686 290.497187l255.781524 0c35.146475 0 65.017806 8.816806 89.656973 26.369577 26.368554 21.095457 39.552831 51.008744 39.552831 89.655949 0 36.916794-12.319583 66.830081-36.916794 89.655949C694.359304 520.816806 711.088314 555.097564 711.088314 599.018889zM630.519324 406.731468c0-34.031071-21.305235-51.066049-63.833841-51.066049L380.296399 355.665419l0 114.897843 163.40972 0C601.554642 470.564285 630.519324 449.299983 630.519324 406.731468zM647.465275 599.076194c0-20.638039-7.739265-36.962843-23.218818-49.015344-12.050454-10.317996-26.683732-15.47853-43.855834-15.47853l-201.219861 0 0 134.147256 178.002067 0C617.35449 668.729577 647.465275 645.51076 647.465275 599.076194z" p-id="2505"></path></svg>

+ 1 - 0
src/assets/icons/bookData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M856.60820578 158.89959912c-16.98622753 0-28.30884809 11.32353924-28.30884808 28.3088481v656.7698691c0 28.30884809-28.30884809 56.61769619-56.61769619 56.61769619H273.44042304c-33.97061772 0-73.60392371-28.30884809-73.60392371-56.61769619v-62.28038447c0-28.30884809 33.97245506-45.29415695 67.9421541-45.29415694h475.59232264c16.98622753 0 28.30884809-11.32353924 28.30884809-28.3088481V153.23691084c0-62.2794658-45.29415695-101.91185314-113.23539237-101.91185314H273.44042304c-62.2794658 0-124.55893161 33.97061772-124.5589316 101.91185314V866.6253948c5.66176961 50.95592657 56.61769619 90.58923256 107.57362275 96.25100219H771.68074283c62.28038448 0 113.23631104-50.95684524 113.23631104-107.57454143v-668.09432702c0-11.32262057-11.32353924-28.30884809-28.30884809-28.30884809zM749.03366436 793.02147109h-464.2687834c-16.98530885 0-28.30884809 11.32353924-28.3088481 28.30976676s11.32353924 28.30884809 28.30976677 28.3088481h464.2687834c16.98439019 0 28.30792942-11.32353924 28.30792942-28.3088481S766.01897321 793.02147109 749.03366436 793.02147109z" p-id="45034"></path></svg>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/assets/icons/corpChat.svg


+ 1 - 0
src/assets/icons/drawStem.svg

@@ -0,0 +1 @@
+<svg width="18" height="18" class="IconMove-ifc-xgIpHo"><path d="M8 14a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zM8 4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm5 5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-10a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z" fill="#c7c7c7" fill-rule="evenodd"></path></svg>

+ 1 - 0
src/assets/icons/edit.svg

@@ -0,0 +1 @@
+<svg class="adui-button-leftIcon adui-icon-base" width="18" height="18" viewBox="0 0 18 18" fill="var(--gray-700)" data-interactive="false" data-icon="replace"><path d="M3.5 3.5V6.5H6.5V3.5H3.5ZM16 10V16H10V10H16ZM3.5 9V10.5C3.5 11.7426 4.50736 12.75 5.75 12.75H7V11L9.75 13.5L7 16V14.25H5.75C3.67893 14.25 2 12.5711 2 10.5V9H3.5ZM14.5 11.5H11.5V14.5H14.5V11.5ZM11 2V3.75H12.25C14.3211 3.75 16 5.42893 16 7.5V9H14.5V7.5C14.5 6.25736 13.4926 5.25 12.25 5.25H11V7L8.25 4.5L11 2ZM8 2V8H2V2H8Z" fill-rule="evenodd"></path></svg>

+ 1 - 0
src/assets/icons/externalMaterial.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M213.48 64.22h597.04c99.5 0 149.26 49.75 149.26 149.26v597.04c0 99.5-49.75 149.26-149.26 149.26H213.48c-99.51 0-149.26-49.75-149.26-149.26V213.48c0-99.5 49.76-149.26 149.26-149.26z m0 0" fill="#4E6EF2" p-id="28675"></path><path d="M716.95 365.59H545.2L490.63 311H327.65c-10.66 0-19.46 8.77-19.46 19.46v342.73c0.04 10.73 8.73 19.42 19.46 19.46h389.3c10.66 0 19.46-8.77 19.46-19.46V385.05c0-10.68-8.77-19.46-19.46-19.46z" fill="#FFFFFF" p-id="28676"></path><path d="M599.34 523.54c0-10.57 6.5-20.06 16.37-23.87a96.02 96.02 0 0 0-10.48-25.31 25.563 25.563 0 0 1-28.51-5.25 25.54 25.54 0 0 1-5.23-28.51 96.352 96.352 0 0 0-25.3-10.45 25.593 25.593 0 0 1-23.88 16.45c-10.6-0.01-20.1-6.55-23.88-16.45a95.748 95.748 0 0 0-25.28 10.45 25.55 25.55 0 0 1-5.27 28.5c-7.49 7.49-18.83 9.59-28.5 5.26-4.65 7.81-8.17 16.3-10.48 25.31a25.613 25.613 0 0 1 16.48 23.86c0 10.94-6.86 20.18-16.48 23.88 2.3 9 5.85 17.49 10.48 25.28a25.557 25.557 0 0 1 28.53 5.25c7.49 7.51 9.57 18.87 5.21 28.54 7.81 4.63 16.3 8.18 25.3 10.45a25.617 25.617 0 0 1 23.88-16.46c10.92 0 20.18 6.86 23.88 16.46a95.049 95.049 0 0 0 25.28-10.45 25.559 25.559 0 0 1 5.24-28.5c7.48-7.5 18.82-9.6 28.49-5.29 4.66-7.79 8.2-16.28 10.51-25.28a25.591 25.591 0 0 1-16.36-23.87z m-75.51 41.65c-22.15 0-40.1-17.95-40.1-40.11 0-22.15 17.95-40.1 40.1-40.1s40.11 17.96 40.11 40.1c-0.01 22.15-17.96 40.11-40.11 40.11z" fill="#B9C8F9" p-id="28677"></path></svg>

+ 1 - 0
src/assets/icons/floatbuttonSvg.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5.5 8.5C3.84315 8.5 2.5 9.84315 2.5 11.5V16.5C2.5 18.1569 3.84315 19.5 5.5 19.5H22.5C24.1569 19.5 25.5 18.1569 25.5 16.5V11.5C25.5 9.84315 24.1569 8.5 22.5 8.5H5.5ZM5.5 12.5H8.5V15.5H5.5V12.5ZM17.5 14.5V13.5H22.5V14.5H17.5Z" fill="url(#paint0_linear)" stroke="white"></path><defs><linearGradient id="paint0_linear" x1="24.3537" y1="18.9707" x2="24.3537" y2="9.55829" gradientUnits="userSpaceOnUse"><stop stop-color="#999999"></stop><stop offset="1" stop-color="#737373"></stop></linearGradient></defs></svg>

+ 1 - 0
src/assets/icons/followAcc.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="a"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><path d="M21 7a3 3 0 013 3v8a3 3 0 01-3 3H7a3 3 0 01-3-3v-8a3 3 0 013-3h14zm-9.603 8.08h-1.256C7.981 15.08 7 16.84 7 18.3v.194c0 .28.216.506.492.506h6.516a.49.49 0 00.492-.5v-.2c0-1.46-1.5-3.3-3.103-3.22zM18.242 10h-.484a.496.496 0 00-.508.491v1.758l-1.759.001c-.234 0-.44.18-.483.417l-.008.09v.485c0 .287.22.508.491.508l1.759-.001v1.76c0 .234.18.44.417.483l.09.008h.485c.287 0 .508-.22.508-.491v-1.76l1.759.001c.234 0 .44-.18.483-.417l.008-.09v-.485a.496.496 0 00-.491-.508l-1.759-.001v-1.758c0-.234-.18-.44-.417-.483l-.09-.008zm-7.414 0a2 2 0 00-2.005 1.996 2 2 0 002.005 1.996 2 2 0 002.005-1.996A2 2 0 0010.828 10z" fill="url(#a)" fill-rule="nonzero"></path></svg>

+ 1 - 0
src/assets/icons/game.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M725.333333 149.333333c141.376 0 256 114.624 256 256v298.666667a170.666667 170.666667 0 1 1-341.333333 0v-42.666667H383.978667L384 704a170.666667 170.666667 0 1 1-341.333333 0V405.333333C42.666667 263.957333 157.290667 149.333333 298.666667 149.333333h426.666666z m-21.333333 64H320c-115.84 0-210.090667 92.309333-213.248 207.36L106.666667 426.666667v277.333333a106.666667 106.666667 0 0 0 213.226666 4.629333L320 704v-85.333333a21.333333 21.333333 0 0 1 21.333333-21.333334h341.333334a21.333333 21.333333 0 0 1 21.333333 21.333334v85.333333a106.666667 106.666667 0 0 0 213.226667 4.629333L917.333333 704V426.666667c0-117.824-95.509333-213.333333-213.333333-213.333334z m10.666667 256a32 32 0 1 1 0 64 32 32 0 0 1 0-64z m-405.333334-128a32 32 0 0 1 32 32V405.333333h32a32 32 0 0 1 0 64H341.333333v32a32 32 0 0 1-64 0V469.333333h-32a32 32 0 0 1 0-64H277.333333v-32a32 32 0 0 1 32-32z m469.333334 64a32 32 0 1 1 0 64 32 32 0 0 1 0-64z m-128 0a32 32 0 1 1 0 64 32 32 0 0 1 0-64z m64-64a32 32 0 1 1 0 64 32 32 0 0 1 0-64z" p-id="3049"></path></svg>

+ 1 - 0
src/assets/icons/gameServer.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M85.333333 0h853.333334v42.666667H85.333333zM85.333333 213.333333h853.333334v42.666667H85.333333zM85.333333 42.666667h42.666667v170.666666H85.333333zM896 42.666667h42.666667v170.666666h-42.666667z" p-id="7038"></path><path d="M213.333333 106.666667h42.666667v42.666666H213.333333z"  p-id="7039"></path><path d="M85.333333 426.666667h853.333334v42.666666H85.333333zM85.333333 256h42.666667v170.666667H85.333333zM896 256h42.666667v170.666667h-42.666667z" p-id="7040"></path><path d="M213.333333 320h42.666667v42.666667H213.333333z" p-id="7041"></path><path d="M85.333333 640h853.333334v42.666667H85.333333zM85.333333 469.333333h42.666667v170.666667H85.333333zM896 469.333333h42.666667v170.666667h-42.666667z" p-id="7042"></path><path d="M213.333333 533.333333h42.666667v42.666667H213.333333z" p-id="7043"></path><path d="M384 810.666667h42.666667v213.333333H384zM597.333333 810.666667v42.666666h-170.666666v-42.666666zM597.333333 981.333333v42.666667h-170.666666v-42.666667zM597.333333 810.666667h42.666667v213.333333h-42.666667z" p-id="7044"></path><path d="M0 896h426.666667v42.666667H0zM597.333333 896h426.666667v42.666667H597.333333z" p-id="7045"></path><path d="M490.666667 682.666667h42.666666v128h-42.666666z" p-id="7046"></path></svg>

+ 1 - 0
src/assets/icons/ghIcon.svg

@@ -0,0 +1 @@
+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M6.52659 10.2918C5.91359 9.56524 5.41666 8.20791 5.41666 7.25774V5.83298C5.41666 3.99223 6.91279 2.5 8.74999 2.5C10.5909 2.5 12.0833 3.99415 12.0833 5.83351V7.25849C12.0833 8.20775 11.5841 9.56905 10.9734 10.293L10.6721 10.6501C10.1809 11.2325 10.3343 11.9737 11.0213 12.3088L15.7382 14.6096C16.251 14.8597 16.6667 15.521 16.6667 16.0962V16.668C16.6667 17.1275 16.2909 17.5 15.8321 17.5H1.66785C1.20696 17.5 0.833328 17.1298 0.833328 16.668V16.0962C0.833328 15.5253 1.24845 14.8599 1.76174 14.6094L6.4787 12.3076C7.16281 11.9738 7.32188 11.2344 6.82787 10.6489L6.52659 10.2918ZM16.875 8.95833H19.1667V10.2083H16.875V12.5H15.625V10.2083H13.3333V9.58333V8.95833H15.625V6.66667H16.875V8.95833Z"></path></svg>

+ 1 - 0
src/assets/icons/iaaData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M735.8976 930.7136H284.672c-113.1008 0-204.8-91.6992-204.8-204.8V278.3744c0-113.1008 91.6992-204.8 204.8-204.8h451.2256c113.1008 0 204.8 91.6992 204.8 204.8v447.5392c0 113.1008-91.6992 204.8-204.8 204.8z" fill="#aaaaf8" p-id="38868"></path><path d="M260.4544 654.592c-10.0864 0-20.224-3.9424-27.7504-11.8272-14.6944-15.3088-14.1312-39.6288 1.1776-54.272l180.48-172.8c19.2512-18.432 50.2272-18.0736 69.0688 0.8704l105.7792 106.4448 144.128-141.8752c15.104-14.8992 39.424-14.6944 54.3232 0.4096s14.6944 39.424-0.4096 54.3232l-163.584 161.0752c-19.2512 18.9952-50.432 18.8416-69.5296-0.3584L448 489.7792l-160.9728 154.1632a38.35392 38.35392 0 0 1-26.5728 10.6496z m309.2992-112.4352c-0.0512 0-0.0512 0 0 0z" fill="#FFCD43" p-id="38869"></path></svg>

+ 1 - 0
src/assets/icons/imageData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M922 82H102C46.77 82 2 126.77 2 182v660c0 55.23 44.77 100 100 100h820c55.23 0 100-44.77 100-100V182c0-55.23-44.77-100-100-100z m-601.94 84.04c55.23 0 100 44.77 100 100s-44.77 100-100 100-100-44.77-100-100 44.77-100 100-100zM860.43 822H163.59c-29.21 0-49.31-29.71-38.74-57.29l97.72-255.15c14.83-38.71 61.9-52.63 94.97-28.08l76.92 57.1c32.37 24.03 77.08 21.2 106.24-6.72L701.84 339.3c34.79-33.31 92.14-16.11 103.41 31.01l95.56 399.72c6.33 26.47-13.48 51.97-40.38 51.97z" fill="currentColor" p-id="14804"></path></svg>

+ 1 - 0
src/assets/icons/img.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="a"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><path d="M19.5 6A2.5 2.5 0 0122 8.5v11a2.5 2.5 0 01-2.5 2.5h-11A2.5 2.5 0 016 19.5v-11A2.5 2.5 0 018.5 6h11zm-2.657 8.156a1 1 0 00-1.347.006l-4.22 3.881a.5.5 0 01-.643.03l-2.731-2.087a.25.25 0 00-.402.199V19.5a1 1 0 001 1h11a1 1 0 001-1v-1.82a.5.5 0 00-.165-.371zM11 9.5a1.5 1.5 0 100 3 1.5 1.5 0 000-3z" fill="url(#a)" fill-rule="nonzero"></path></svg>

+ 1 - 0
src/assets/icons/imgText.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="a"><stop stop-color="#8F8F8F" offset="0%"></stop><stop stop-color="#666" offset="100%"></stop></linearGradient><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="b"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><g fill="none" fill-rule="nonzero"><rect fill="url(#a)" opacity=".4" x="16" y="7" width="3" height="3" rx="1"></rect><rect fill="url(#a)" opacity=".6" x="11" y="6" width="4" height="4" rx=".75"></rect><path d="M18.375 19.75a1.875 1.875 0 110 3.75 1.875 1.875 0 010-3.75zm-7.25 0a1.875 1.875 0 110 3.75 1.875 1.875 0 010-3.75zM8.576 6.5a.5.5 0 01.494.418L9.75 11h10.597a1 1 0 01.99 1.141l-.653 4.571A1.5 1.5 0 0119.199 18h-8.907a1.5 1.5 0 01-1.484-1.277L7.5 8h-2a.5.5 0 01-.5-.5V7a.5.5 0 01.5-.5h3.076z" fill="url(#b)"></path></g></svg>

+ 1 - 0
src/assets/icons/jumpLink.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="a"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><path d="M21 7a3 3 0 013 3v8a3 3 0 01-3 3H7a3 3 0 01-3-3v-8a3 3 0 013-3h14zm-4.857 2a2.857 2.857 0 00-2.857 2.857v4.286a1.429 1.429 0 11-1.429-1.429v-1.428a2.857 2.857 0 102.857 2.857v-4.286a1.429 1.429 0 111.429 1.429v1.428a2.857 2.857 0 100-5.714z" fill="url(#a)" fill-rule="nonzero"></path></svg>

+ 1 - 0
src/assets/icons/launch.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><defs><style type="text/css"></style></defs><path d="M938.666667 725.333333a42.666667 42.666667 0 0 1 0 85.333334h-384v128a42.666667 42.666667 0 0 1-85.333334 0v-128H85.333333a42.666667 42.666667 0 0 1 0-85.333334h853.333334zM854.954667 42.666667C924.501333 42.666667 981.333333 91.648 981.333333 151.509333v464.213334c0 13.354667-12.672 24.277333-28.16 24.277333H70.826667c-15.488 0-28.16-10.922667-28.16-24.32V151.552C42.666667 91.648 99.498667 42.666667 169.045333 42.666667h685.909334zM377.344 213.333333c-20.053333 0.938667-34.048 11.733333-41.088 31.914667l-78.848 212.608c0 0.938667-0.469333 1.877333-1.408 3.285333v10.794667c0.938667 16.426667 10.24 24.405333 27.52 24.405333 14.037333 0 23.808-6.101333 28.970667-18.304l12.117333-36.608h107.349333l10.752 36.608c4.181333 12.202667 13.525333 18.304 28.928 18.304 17.28 0 26.581333-7.509333 27.52-22.997333a66.133333 66.133333 0 0 1-3.242666-15.488L419.84 245.248c-8.874667-20.181333-23.338667-30.976-42.496-31.914667z m253.866667 4.224h-65.28c-18.218667 1.877333-28.032 11.733333-28.970667 29.098667v220.586667c0 18.304 10.24 27.690667 30.336 28.629333h66.773333c84.48-4.224 128.810667-49.28 133.930667-136.106667-3.754667-90.581333-49.493333-137.984-136.746667-142.208z m-1.365334 53.504c50.389333 0.938667 76.544 30.037333 77.482667 87.296-2.816 54.912-27.093333 83.072-72.832 84.010667h-39.68V271.061333z m-252.032 3.285334l36.394667 113.109333H341.418667l36.394666-113.109333z" p-id="1276"></path></svg>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/assets/icons/logo.svg


+ 1 - 0
src/assets/icons/ltv.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#000000" fill-opacity=".17" p-id="3525"></path><path d="M732.65152 326.4512a30.72 30.72 0 0 1 46.40768 39.97696l-2.94912 3.44064-227.00032 227.00032a30.72 30.72 0 0 1-40.01792 2.99008l-3.44064-2.99008-97.73056-97.73056-157.4912 157.45024a30.72 30.72 0 0 1-39.97696 2.99008l-3.44064-2.99008a30.72 30.72 0 0 1-2.99008-39.97696l2.99008-3.44064 179.2-179.2a30.72 30.72 0 0 1 39.97696-2.99008l3.44064 2.99008 97.73056 97.6896 205.29152-205.2096z" fill="#000000" p-id="3526"></path><path d="M754.31936 317.44a30.72 30.72 0 0 1 30.43328 26.54208l0.28672 4.17792V491.52a30.72 30.72 0 0 1-61.15328 4.17792L723.59936 491.52V378.88h-112.64a30.72 30.72 0 0 1-30.43328-26.54208l-0.28672-4.17792a30.72 30.72 0 0 1 26.54208-30.43328l4.17792-0.28672h143.36z" fill="#000000" p-id="3527"></path></svg>

+ 1 - 0
src/assets/icons/material.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><defs><style type="text/css"></style></defs><path d="M154.545231 366.355692c-48.64-21.031385-48.482462-55.138462 0-76.20923l269.745231-116.81477a253.715692 253.715692 0 0 1 176.206769 0l269.745231 116.775385c48.64 21.031385 48.482462 55.138462 0 76.248615l-269.745231 116.775385a254.306462 254.306462 0 0 1-176.206769 0z m18.235077 99.997539l251.510154 108.859077a254.148923 254.148923 0 0 0 176.206769 0l251.510154-108.859077 18.235077 7.876923c48.64 21.031385 48.482462 55.138462 0 76.248615l-269.745231 116.775385a253.991385 253.991385 0 0 1-176.206769 0l-269.745231-116.775385c-48.64-21.031385-48.482462-55.138462 0-76.209231z m0 184.162461l251.510154 108.819693a253.833846 253.833846 0 0 0 176.206769 0l251.510154-108.819693 18.235077 7.876923c48.64 21.031385 48.482462 55.138462 0 76.209231l-269.705847 116.932923a254.148923 254.148923 0 0 1-176.206769 0l-269.745231-116.775384c-48.64-21.031385-48.482462-55.138462 0-76.209231z" p-id="13650"></path></svg>

+ 1 - 0
src/assets/icons/media.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M946.594909 788.200727a20.898909 20.898909 0 0 1-41.704727 0v-56.878545a20.898909 20.898909 0 0 1 41.704727 0v56.925091z m-69.12 0a20.852364 20.852364 0 0 1-41.704727 0v-149.969454a20.805818 20.805818 0 0 1 41.704727 0v150.016z m-69.166545 0a20.805818 20.805818 0 1 1-41.658182 0v-86.248727a20.852364 20.852364 0 1 1 41.658182 0v86.295273z m-69.12 0a20.805818 20.805818 0 1 1-41.658182 0v-47.104a20.852364 20.852364 0 0 1 41.658182 0v47.104z m82.850909-278.295272a203.310545 203.310545 0 1 0 0.093091 406.62109 203.310545 203.310545 0 0 0-0.093091-406.62109z" fill="" p-id="4456"></path><path d="M346.763636 667.554909a37.376 37.376 0 0 1-58.228363-30.952727v-296.494546a37.329455 37.329455 0 0 1 58.274909-30.952727l219.601454 148.200727a37.422545 37.422545 0 0 1 0 61.905455L346.763636 667.601455z m224.302546 51.2a261.399273 261.399273 0 0 1 261.399273-261.399273c7.726545 0 15.313455 0.465455 22.807272 1.163637V224.581818c0-37.888-30.72-68.561455-68.561454-68.561454H84.712727c-37.888 0-68.561455 30.673455-68.561454 68.561454v527.499637c0 37.934545 30.673455 68.608 68.561454 68.608h507.019637a260.794182 260.794182 0 0 1-20.666182-101.934546z" fill="" p-id="4457"></path></svg>

+ 2 - 0
src/assets/icons/monitor.svg

@@ -0,0 +1,2 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><defs><style type="text/css">@font-face { font-family: rbicon; src: url("chrome-extension://dipiagiiohfljcicegpgffpbnjmgjcnf/fonts/rbicon.woff2") format("woff2"); font-weight: normal; font-style: normal; }
+</style></defs><path d="M64 64V640H896V64H64zM0 0h960v704H0V0z" p-id="4696"></path><path d="M192 896H768v64H192zM448 640H512v256h-64z" p-id="4697"></path><path d="M479.232 561.604267l309.9904-348.330667-47.803733-42.5472-259.566934 291.669333L303.957333 240.008533 163.208533 438.6048l52.224 37.009067 91.6224-129.28z" p-id="4698"></path></svg>

+ 1 - 0
src/assets/icons/novelDataSystem.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M0 0m384 0l256 0q384 0 384 384l0 256q0 384-384 384l-256 0q-384 0-384-384l0-256q0-384 384-384Z" fill="#3E63F1" p-id="42767"></path><path d="M320 256m128 0l128 0q128 0 128 128l0 0q0 128-128 128l-128 0q-128 0-128-128l0 0q0-128 128-128Z" fill="#3E63F1" p-id="42768"></path><path d="M348.16 673.696h323.36a54.08 54.08 0 0 0 53.888-53.888V309.888A54.048 54.048 0 0 0 671.52 256H348.16a54.08 54.08 0 0 0-53.888 53.888v404.224A54.048 54.048 0 0 0 348.16 768h357.088a20.704 20.704 0 0 0 20.192-20.192 20.736 20.736 0 0 0-20.16-20.224H361.6a27.008 27.008 0 0 1-26.944-26.944v-28.288c4.032 0 9.44 1.344 13.44 1.344h0.032z m53.888-390.752h80.832v132.064l-28.288-29.664c-6.72-5.376-16.16-5.376-21.568 0l-30.976 29.664V282.944z" fill="#FFFFFF" p-id="42769"></path></svg>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/assets/icons/number.svg


+ 1 - 0
src/assets/icons/pitcherData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M853.56 391.14c34.83 0 63.09 28.26 63.09 63.09V874.6c0 34.83-28.26 63.09-63.09 63.09h-84.04c-34.83 0-63.1-28.26-63.1-63.09V454.15c0-34.83 28.26-63.1 63.1-63.1h84.04v0.09z m-588.55 84.04c34.83 0 63.09 28.26 63.09 63.09v336.25c0 34.83-28.26 63.1-63.09 63.1h-84.04c-34.83 0-63.09-28.26-63.09-63.1V538.19c0-34.83 28.26-63.1 63.09-63.1h84.04v0.09z m294.27 84.04c34.83 0 63.09 28.26 63.09 63.09v252.21c0 34.83-28.26 63.1-63.09 63.1h-84.04c-34.83 0-63.1-28.26-63.1-63.1V622.31c0-34.83 28.26-63.09 63.1-63.09h84.04z m0 0M776.91 149.9l-49.63 0.33c-17.38 0.09-31.59-13.88-31.75-31.34-0.17-17.29 13.88-31.5 31.26-31.67l126.51-0.92c8.15-0.08 16.3 3 22.53 9.23 3.08 3.08 5.4 6.65 6.9 10.39 1.41 3.32 2.33 7.48 2.33 11.89V244.5c0 17.38-14.13 31.51-31.5 31.51-17.37 0-31.51-14.13-31.51-31.51v-50.54L539.58 476.42c-9.23 9.23-23.19 11.81-35.08 6.48L126.11 314.82c-15.88-7.07-23.11-25.69-16.04-41.65 7.06-15.88 25.69-23.11 41.65-16.04l358.53 159.35L776.91 149.9z m0 0" fill="currentColor" p-id="6297"></path></svg>

+ 1 - 0
src/assets/icons/player.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M736 896H288c-160 0-288-128-288-288s128-288 288-288h480c134.4 0 256 137.6 256 288 0 160-128 288-288 288zM288 384c-121.6 0-224 99.2-224 224s99.2 224 224 224h448c121.6 0 224-99.2 224-224s-102.4-224-192-224H288z" fill="" p-id="4693"></path><path d="M256 480h64v256H256v-256z" fill="" p-id="4694"></path><path d="M160 576h256v64H160v-64zM544 256h-64V192c0-54.4 41.6-96 96-96v64c-19.2 0-32 12.8-32 32v64zM652.8 601.6c-12.8-12.8-32-12.8-44.8 0l-44.8-44.8c38.4-38.4 99.2-38.4 134.4 0l-44.8 44.8z" fill="" p-id="4695"></path><path d="M563.2 691.2c-19.2-19.2-28.8-41.6-28.8-67.2s9.6-51.2 28.8-67.2l44.8 44.8c-6.4 6.4-9.6 12.8-9.6 22.4 0 9.6 3.2 16 9.6 22.4l-44.8 44.8zM844.8 601.6c-12.8-12.8-32-12.8-44.8 0l-44.8-44.8c38.4-38.4 99.2-38.4 134.4 0l-44.8 44.8z" fill="" p-id="4696"></path><path d="M755.2 691.2c-19.2-19.2-28.8-41.6-28.8-67.2s9.6-51.2 28.8-67.2l44.8 44.8c-6.4 6.4-9.6 12.8-9.6 22.4 0 9.6 3.2 16 9.6 22.4l-44.8 44.8z" fill="" p-id="4697"></path></svg>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/assets/icons/rechargeData.svg


+ 1 - 0
src/assets/icons/rocket.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1640337291163" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="24697" xmlns:xlink="http://www.w3.org/1999/xlink" width="26" height="26"><defs><style type="text/css"></style></defs><path d="M175.9 686z" p-id="24698"></path><path d="M694.9 412.6L483 535.7l66.4 72.7 148.5-192.9c0.6-1.1 0.2-2.4-0.8-3-0.7-0.3-1.6-0.3-2.2 0.1z" fill="#4887C7" p-id="24699"></path><path d="M463.9 574.6c0 27.3 22.1 49.4 49.4 49.4s49.4-22.1 49.4-49.4-22.1-49.4-49.4-49.4c-27.3-0.1-49.4 22.1-49.4 49.4z" fill="#4887C7" p-id="24700"></path><path d="M264.8 327.4l-69.9-69.9C369 83.1 651.3 82.3 826.3 255.7L756.8 326c-136.5-134.9-356.3-134.3-492 1.4z" fill="#EDB019" p-id="24701"></path><path d="M194.9 890.7C20 716.1 19.8 432.8 194.4 257.9l0.5-0.5 69.9 69.9c-136.2 136.2-136.2 357.1 0 493.3l-69.9 70.1z" fill="#81BE00" p-id="24702"></path><path d="M828.1 890.7l-69.9-69.9c136.2-136.2 136.2-357.1 0-493.3l-1.4-1.4 69.5-70.3c175.8 173.6 177.6 456.9 4 632.7-0.8 0.7-1.5 1.4-2.2 2.2z" fill="#D22422" p-id="24703"></path><path d="M500.5 258.7h22v37.2h-22v-37.2z m-156.2 47.8l19-11 18.6 32.2-19 11-18.6-32.2zM232.9 425.9l11-19 32.2 18.6-11 19-32.2-18.6z m-36.7 137.2h37.2v22h-37.2v-22z m36.7 159.1l32.2-18.6 11 19-32.2 18.6-11-19zM641 327.7l18.6-32.2 19 11-18.6 32.2-19-11z m105.9 97.8l32.2-18.6 11 19-32.2 18.6-11-19z m42.7 137.6h37.2v22h-37.2v-22z m-42.7 159.5l11-19 32.2 18.6-11 19-32.2-18.6z" fill="#4887C7" p-id="24704"></path></svg>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/assets/icons/roleManage.svg


+ 1 - 0
src/assets/icons/sliderImgSvg.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="a"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><path d="M19.5 6A2.5 2.5 0 0122 8.5v11a2.5 2.5 0 01-2.5 2.5h-11A2.5 2.5 0 016 19.5v-11A2.5 2.5 0 018.5 6h11zm-3.905 8.082l-.099.08-4.22 3.881a.5.5 0 01-.567.077l-.076-.048-2.731-2.086a.25.25 0 00-.395.142l-.007.057V19.5a1 1 0 00.883.993l.117.007h11a1 1 0 00.993-.883l.007-.117v-1.82a.5.5 0 00-.107-.31l-.058-.061-3.492-3.153a1 1 0 00-1.248-.074zM24 9a2 2 0 012 2v6a2 2 0 01-2 2h-1v-1.5h1a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5h-1V9h1zM5 9v1.5H4a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h1V19H4a2 2 0 01-2-2v-6a2 2 0 012-2h1zm6 .5a1.5 1.5 0 100 3 1.5 1.5 0 000-3z" fill="url(#a)" fill-rule="nonzero"></path></svg>

+ 1 - 0
src/assets/icons/text.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="canvas_gradient_common"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><path d="M8.5 6h11A2.5 2.5 0 0122 8.5v11a2.5 2.5 0 01-2.5 2.5h-11A2.5 2.5 0 016 19.5v-11A2.5 2.5 0 018.5 6zm1 3.5V11h9V9.5h-9zM12 17v1.5h4V17h-4zm-2.5-6v1.5h.75l.375-1.5H9.5zm9 0h-1.125l.375 1.5h.75V11zm-5.25 0v6h1.5v-6h-1.5z" fill="url(#a)" fill-rule="nonzero"></path></svg>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/assets/icons/topNullBack.svg


+ 1 - 0
src/assets/icons/topimg.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="a"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><g fill="none" fill-rule="evenodd"><path d="M19.5 6A2.5 2.5 0 0122 8.5v11a2.5 2.5 0 01-2.5 2.5h-11A2.5 2.5 0 016 19.5v-11A2.5 2.5 0 018.5 6h11zm-2.657 8.156a1 1 0 00-1.347.006l-4.22 3.881a.5.5 0 01-.643.03l-2.731-2.087a.25.25 0 00-.402.199V19.5a1 1 0 001 1h11a1 1 0 001-1v-1.82a.5.5 0 00-.165-.371zM11 9.5a1.5 1.5 0 100 3 1.5 1.5 0 000-3z" fill="url(#a)" fill-rule="nonzero"></path><path d="M5.25 1a.75.75 0 010 1.5h-2.5a.75.75 0 010-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 010-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 110-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 110-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 110-1.5h2.5z" fill="#C7C7C7"></path></g></svg>

+ 1 - 0
src/assets/icons/topslider.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="a"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><g fill="none" fill-rule="evenodd"><path d="M19.5 6A2.5 2.5 0 0122 8.5v11a2.5 2.5 0 01-2.5 2.5h-11A2.5 2.5 0 016 19.5v-11A2.5 2.5 0 018.5 6h11zm-3.905 8.082l-.099.08-4.22 3.881a.5.5 0 01-.567.077l-.076-.048-2.731-2.086a.25.25 0 00-.395.142l-.007.057V19.5a1 1 0 00.883.993l.117.007h11a1 1 0 00.993-.883l.007-.117v-1.82a.5.5 0 00-.107-.31l-.058-.061-3.492-3.153a1 1 0 00-1.248-.074zM24 9a2 2 0 012 2v6a2 2 0 01-2 2h-1v-1.5h1a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5h-1V9h1zM5 9v1.5H4a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h1V19H4a2 2 0 01-2-2v-6a2 2 0 012-2h1zm6 .5a1.5 1.5 0 100 3 1.5 1.5 0 000-3z" fill="url(#a)" fill-rule="nonzero"></path><path d="M5.25 1a.75.75 0 010 1.5h-2.5a.75.75 0 010-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 010-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 110-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 110-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 110-1.5h2.5z" fill="#C7C7C7"></path></g></svg>

+ 1 - 0
src/assets/icons/topvideo.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="a"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><g fill="none" fill-rule="evenodd"><path d="M16.5 8A1.5 1.5 0 0118 9.5v2.25l4.2-3.15a.5.5 0 01.8.4v10a.5.5 0 01-.8.4L18 16.25v2.25a1.5 1.5 0 01-1.5 1.5h-10A1.5 1.5 0 015 18.5v-9A1.5 1.5 0 016.5 8h10z" fill="url(#a)" fill-rule="nonzero"></path><path d="M5.25 1a.75.75 0 010 1.5h-2.5a.75.75 0 010-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 010-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 110-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 110-1.5h2.5zm5 0a.75.75 0 110 1.5h-2.5a.75.75 0 110-1.5h2.5z" fill="#C7C7C7"></path></g></svg>

+ 1 - 0
src/assets/icons/weChat.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M0 0m512 0l0 0q512 0 512 512l0 0q0 512-512 512l0 0q-512 0-512-512l0 0q0-512 512-512Z" fill="#149F5A" p-id="10543"></path><path d="M815.889626 471.889416l-60.039974-59.734452V327.713574c0-31.310898-25.512708-56.696026-56.98476-56.696026h-84.881207L553.943711 211.279738c-22.18219-22.068039-58.317639-22.068039-80.630767 0l-60.039974 59.734452H328.391764c-15.114911 0-29.608708 5.976131-40.295239 16.605587a56.548302 56.548302 0 0 0-16.689522 40.087082v84.448105l-60.043331 59.734452c-22.18219 22.071397-22.18219 58.015475 0 80.221168l60.043331 59.734452v84.444748c0 15.037692 6.00299 29.457626 16.689522 40.087082a57.135843 57.135843 0 0 0 40.295239 16.608944h84.881206l60.039974 59.734452c22.18219 22.068039 58.314282 22.068039 80.630767 0l60.039974-59.734452h84.881207c15.114911 0 29.608708-5.976131 40.295239-16.605587a56.548302 56.548302 0 0 0 16.689521-40.087082v-84.448105l60.039974-59.734452A56.484511 56.484511 0 0 0 832.629508 512c0-15.051121-6.023134-29.484485-16.739882-40.110584z m-155.547278-16.253062l-185.035122 155.809154a28.604852 28.604852 0 0 1-18.465574 6.741613c-0.795698 0-1.594754 0-2.524747-0.134295-7.570885-0.658046-14.611305-4.226938-19.39221-10.041915l-71.199895-84.975213a28.208682 28.208682 0 0 1 3.585679-39.912498c12.086557-10.041915 30.021666-8.326295 40.117298 3.568892l52.868616 63.038111 163.252459-137.440944c12.086557-10.045272 30.018308-8.591528 40.113941 3.303659 10.229928 12.026125 8.769469 29.998164-3.320445 40.043436z" fill="#FFFFFF" p-id="10544"></path></svg>

+ 1 - 0
src/assets/icons/weChatData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M995.837 449.01L900 353.173V217.686c0-50.237-40.725-90.958-90.962-90.958H673.552l-95.838-95.836c-35.407-35.413-93.08-35.413-128.704 0l-95.837 95.836H217.687a90.958 90.958 0 0 0-90.958 90.957v135.488L30.893 449.01c-35.414 35.409-35.414 93.08 0 128.703l95.836 95.838v135.487a90.952 90.952 0 0 0 26.64 64.316 90.954 90.954 0 0 0 64.318 26.644h135.486l95.837 95.838c35.409 35.409 93.08 35.409 128.704 0l95.838-95.838h135.486a90.95 90.95 0 0 0 64.317-26.644A90.948 90.948 0 0 0 900 809.038V673.551l95.837-95.838a90.852 90.852 0 0 0 0-128.703z m-248.286-26.078L452.192 672.916c-8.271 6.993-18.661 10.81-29.469 10.81-1.274 0-2.549 0-4.031-0.21-12.088-1.059-23.321-6.785-30.958-16.113L274.088 531.065c-16.112-19.294-13.57-47.915 5.724-64.034 19.296-16.115 47.917-13.356 64.029 5.73l84.39 101.137 260.584-220.512c19.296-16.113 47.921-13.785 64.035 5.301 16.324 19.294 13.991 48.132-5.299 64.245z m0 0" fill="currentColor" p-id="9123"></path></svg>

+ 1 - 0
src/assets/icons/wxAutoSvg.svg

@@ -0,0 +1 @@
+<svg width="28" height="28" viewBox="0 0 28 28"><defs><linearGradient x1="50%" y1="99.707%" x2="50%" y2="5.583%" id="a"><stop stop-color="#999" offset="0%"></stop><stop stop-color="#737373" offset="100%"></stop></linearGradient></defs><g fill="none" fill-rule="evenodd"><path d="M6.5 7h15c1.38 0 2.5 1.343 2.5 3v8c0 1.657-1.12 3-2.5 3h-15C5.12 21 4 19.657 4 18v-8c0-1.657 1.12-3 2.5-3z" fill="url(#a)" fill-rule="nonzero"></path><path d="M14 9.5c2.485 0 4.5 1.833 4.5 4.093s-2.015 4.093-4.5 4.093c-.496 0-.974-.073-1.42-.208-.002.01-.434.24-1.296.69a.367.367 0 01-.533-.378l.025-.178c.1-.685.151-1.026.155-1.026-.88-.747-1.431-1.811-1.431-2.993 0-2.26 2.015-4.093 4.5-4.093zM11.75 13a.75.75 0 100 1.5.75.75 0 000-1.5zM14 13a.75.75 0 100 1.5.75.75 0 000-1.5zm2.25 0a.75.75 0 100 1.5.75.75 0 000-1.5z" fill="#FFF"></path></g></svg>

+ 15 - 0
src/components/Footer/index.tsx

@@ -0,0 +1,15 @@
+import { DefaultFooter } from '@ant-design/pro-components';
+import React from 'react';
+
+const Footer: React.FC = () => {
+  return (
+    <DefaultFooter
+      copyright="2025 Copyright 趣程"
+      style={{
+        background: 'none',
+      }}
+    />
+  );
+};
+
+export default Footer;

+ 41 - 0
src/components/HeaderDropdown/index.tsx

@@ -0,0 +1,41 @@
+import { Dropdown } from 'antd';
+import type { DropDownProps } from 'antd/es/dropdown';
+import { createStyles } from 'antd-style';
+import classNames from 'classnames';
+import React from 'react';
+
+const useStyles = createStyles(({ token }) => {
+  return {
+    dropdown: {
+      [`@media screen and (max-width: ${token.screenXS}px)`]: {
+        width: '100%',
+      },
+    },
+  };
+});
+
+export type HeaderDropdownProps = {
+  overlayClassName?: string;
+  placement?:
+    | 'bottomLeft'
+    | 'bottomRight'
+    | 'topLeft'
+    | 'topCenter'
+    | 'topRight'
+    | 'bottomCenter';
+} & Omit<DropDownProps, 'overlay'>;
+
+const HeaderDropdown: React.FC<HeaderDropdownProps> = ({
+  overlayClassName: cls,
+  ...restProps
+}) => {
+  const { styles } = useStyles();
+  return (
+    <Dropdown
+      overlayClassName={classNames(styles.dropdown, cls)}
+      {...restProps}
+    />
+  );
+};
+
+export default HeaderDropdown;

+ 158 - 0
src/components/RightContent/AvatarDropdown.tsx

@@ -0,0 +1,158 @@
+import { outLogin, selectCompanyApi } from '@/services/user/api';
+import { LogoutOutlined, SwapOutlined } from '@ant-design/icons';
+import { history, useModel, useRequest } from '@umijs/max';
+import { Spin } from 'antd';
+import { createStyles } from 'antd-style';
+import { stringify } from 'querystring';
+import type { MenuInfo } from 'rc-menu/lib/interface';
+import React, { useCallback, useState } from 'react';
+import { flushSync } from 'react-dom';
+import HeaderDropdown from '../HeaderDropdown';
+import SwitchCompany from '@/pages/user/login/switchCompany';
+
+export type GlobalHeaderRightProps = {
+  children?: React.ReactNode;
+};
+
+export const AvatarName = () => {
+  const { initialState } = useModel('@@initialState');
+  const { currentUser } = initialState || {};
+  return <span className="anticon">{currentUser?.name}</span>;
+};
+
+const useStyles = createStyles(({ token }) => {
+  return {
+    action: {
+      display: 'flex',
+      height: '48px',
+      marginLeft: 'auto',
+      overflow: 'hidden',
+      alignItems: 'center',
+      padding: '0 8px',
+      cursor: 'pointer',
+      borderRadius: token.borderRadius,
+      '&:hover': {
+        backgroundColor: token.colorBgTextHover,
+      },
+    },
+  };
+});
+
+export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ children }) => {
+
+  const [switchOpen, setSwitchOpen] = useState<boolean>(false)
+  const selectCompany = useRequest((params) => selectCompanyApi(params), { manual: true }) // 切换公司
+  /**
+   * 退出登录,并且将当前的 url 保存
+   */
+  const loginOut = async () => {
+    await outLogin();
+    localStorage.removeItem('Admin-Token')
+    const { search, pathname } = window.location;
+    const urlParams = new URL(window.location.href).searchParams;
+    /** 此方法会跳转到 redirect 参数所在的位置 */
+    const redirect = urlParams.get('redirect');
+    // Note: There may be security issues, please note
+    if (window.location.pathname !== '/user/login' && !redirect) {
+      history.replace({
+        pathname: '/user/login',
+        search: stringify({
+          redirect: pathname + search,
+        }),
+      });
+    }
+  };
+  const { styles } = useStyles();
+
+  const { initialState, setInitialState } = useModel('@@initialState');
+
+  const onMenuClick = useCallback(
+    (event: MenuInfo) => {
+      const { key } = event;
+      if (key === 'logout') {
+        flushSync(() => {
+          setInitialState((s) => ({ ...s, currentUser: undefined }));
+        });
+        loginOut();
+        return;
+      } else if (key === 'switch') {
+        setSwitchOpen(true)
+        return
+      } else if (key === 'dark' || key === 'solid') {
+        localStorage.setItem('ISNODARK', JSON.stringify(key === 'solid'))
+        setInitialState((s) => ({ ...s, settings: { ...s?.settings, isNoDark: key === 'solid' } }))
+        return
+      }
+      history.push(`/account/${key}`);
+    },
+    [setInitialState],
+  );
+
+  const loading = (
+    <span className={styles.action}>
+      <Spin
+        size="small"
+        style={{
+          marginLeft: 8,
+          marginRight: 8,
+        }}
+      />
+    </span>
+  );
+
+  if (!initialState) {
+    return loading;
+  }
+
+  const { currentUser } = initialState;
+
+  if (!currentUser || !currentUser.name) {
+    return loading;
+  }
+
+  const menuItems = [
+    {
+      key: 'switch',
+      icon: <SwapOutlined />,
+      label: '切换公司',
+    },
+    {
+      key: 'logout',
+      icon: <LogoutOutlined />,
+      label: '退出登录',
+    },
+  ];
+
+  // 切换公司
+  const setCompanyHandle = (companyId: number) => {
+    selectCompany.run(companyId).then((res: any) => {
+      setSwitchOpen(false)
+      if (res?.token) {
+        localStorage.setItem('Admin-Token', res?.token)
+        window.location.reload()
+      }
+    })
+  }
+  return (
+    <>
+      <HeaderDropdown
+        menu={{
+          selectedKeys: [],
+          onClick: onMenuClick,
+          items: menuItems,
+        }}
+      >
+        {children}
+      </HeaderDropdown>
+      {/* 切换公司弹窗 */}
+      {switchOpen && <SwitchCompany
+        onlineCompanyId={initialState.currentUser?.onlineCompanyId as number}
+        companyList={initialState.currentUser?.companyList as any[]}
+        setCompanyHandle={setCompanyHandle}
+        visible={switchOpen}
+        onClose={() => { setSwitchOpen(false) }}
+        loading={selectCompany.loading}
+      />}
+    </>
+  );
+};

+ 21 - 0
src/components/RightContent/index.tsx

@@ -0,0 +1,21 @@
+import { QuestionCircleOutlined } from '@ant-design/icons';
+
+export type SiderTheme = 'light' | 'dark';
+
+export const Question: React.FC = () => {
+  return (
+    <a
+      href="https://pro.ant.design/docs/getting-started"
+      target="_blank"
+      rel="noreferrer"
+      style={{
+        display: 'inline-flex',
+        padding: '4px',
+        fontSize: '18px',
+        color: 'inherit',
+      }}
+    >
+      <QuestionCircleOutlined />
+    </a>
+  );
+};

+ 12 - 0
src/components/index.ts

@@ -0,0 +1,12 @@
+/**
+ * 这个文件作为组件的目录
+ * 目的是统一管理对外输出的组件,方便分类
+ */
+/**
+ * 布局组件
+ */
+import Footer from './Footer';
+import { Question, SelectLang } from './RightContent';
+import { AvatarDropdown, AvatarName } from './RightContent/AvatarDropdown';
+
+export { AvatarDropdown, AvatarName, Footer, Question, SelectLang };

+ 331 - 0
src/global.less

@@ -0,0 +1,331 @@
+@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: -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 {
+  filter: invert(80%);
+}
+
+.ant-layout {
+  min-height: 100vh;
+}
+
+.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed {
+  left: unset;
+}
+
+canvas {
+  display: block;
+}
+
+body {
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+ul,
+ol {
+  list-style: none;
+}
+
+@media (max-width: 768px) {
+  .ant-table {
+    width: 100%;
+    overflow-x: auto;
+
+    &-thead>tr,
+    &-tbody>tr {
+
+      >th,
+      >td {
+        white-space: pre;
+
+        >span {
+          display: block;
+        }
+      }
+    }
+  }
+}
+
+// 框架格式化
+.ant-pro-top-nav-header-logo>*:first-child>img {
+  display: inline-block;
+  height: 26px;
+  vertical-align: middle;
+}
+
+.ant-layout-sider {
+
+  .ant-pro-base-menu-inline-item-title {
+    // font-size: 13px;
+  }
+
+  .ant-menu-title-content .anticon {
+    // font-size: 13px !important;
+    min-width: 13px !important;
+  }
+
+  .ant-menu-item-selected {
+    color: #000 !important;
+  }
+
+  .ant-menu-dark .ant-menu-item-selected {
+    color: #FFF !important;
+  }
+}
+
+.ant-pro-layout .ant-pro-layout-content {
+  padding-block: 0;
+  padding-inline: 0;
+}
+
+.ant-pro-page-container .ant-pro-page-container-warp-page-header {
+  padding-block-start: 0;
+  padding-block-end: 10px;
+  padding-inline-start: 20px;
+  padding-inline-end: 20px;
+}
+
+/** 初始化 表格里样式 */
+.all_table {
+  .ant-table-cell {
+    padding: 2px 5px !important;
+  }
+
+  .progress {
+    padding: 0 !important;
+
+    .ant-progress {
+      height: 100%;
+
+      .ant-progress-outer {
+        height: 100%;
+
+        .ant-progress-inner {
+          height: 100%;
+          border-radius: 0;
+          background-color: transparent;
+
+          .ant-progress-bg {
+            height: 100% !important;
+            border-radius: 0;
+          }
+        }
+      }
+    }
+  }
+
+  .ant-statistic {
+    line-height: 22px;
+
+    .ant-statistic-content {
+      font-size: 13px;
+      word-break: break-word;
+    }
+  }
+
+  .ant-typography {
+    font-size: 13px;
+  }
+
+  .ant-table-summary td {
+    font-weight: bold;
+  }
+}
+
+.ringRatio.ant-table-cell {
+  padding: 0 !important;
+}
+
+// 黑夜表格
+.all_table_dark {}
+
+.header_table_body td {
+  font-weight: 600;
+}
+
+.css-dark {
+  &>.ant-pro-layout-bg-list {
+    background: linear-gradient(#ebecef, #e7eaed 20%);
+  }
+}
+
+.css-dark,
+.css-light {
+  .ant-table-tbody-virtual-scrollbar-thumb {
+    background-color: #a3a3a3 !important;
+  }
+}
+
+// 自定义拂晓蓝xiao 样式
+.css-dark {
+  .ant-pro-sider-logo {
+    color: rgba(255, 255, 255, 0.65);
+    border-block-end: 1px solid rgba(255, 255, 255, 0.06);
+
+    &>a>h1 {
+      color: rgba(255, 255, 255, 0.88);
+    }
+  }
+
+  .ant-pro-sider-actions {
+    color: rgba(255, 255, 255, 0.65);
+  }
+
+  aside {
+    &.ant-layout-sider.ant-pro-sider {
+      background-color: #001529;
+    }
+
+    .ant-menu {
+
+      .ant-menu-item,
+      .ant-menu-submenu-title {
+        color: rgba(255, 255, 255, 0.65);
+      }
+
+      .ant-menu-item:not(.ant-menu-item-selected):hover {
+        color: rgba(255, 255, 255, 0.88) !important;
+      }
+    }
+
+    &.ant-layout-sider .ant-menu-item-selected {
+      color: #ffffff !important;
+    }
+
+    .ant-menu-light {
+
+      .ant-menu-submenu-selected>.ant-menu-submenu-title {
+        color: #1890ff;
+      }
+
+      .ant-menu-item-selected {
+        // background-color: rgba(255, 255, 255, 0.04);
+        background-color: #1890ff;
+      }
+
+      &:not(.ant-menu-horizontal) {
+
+        .ant-menu-item:not(.ant-menu-item-selected):hover,
+        .ant-menu-submenu-title:hover {
+          background-color: rgba(255, 255, 255, 0.03);
+        }
+      }
+    }
+
+    .ant-pro-base-menu-inline-group .ant-menu-item-group-title {
+      color: rgba(255, 255, 255, 0.65);
+    }
+  }
+
+  header {
+    &.ant-layout-header {
+      background-color: #001529 !important;
+    }
+
+    .ant-pro-top-nav-header-logo>*:first-child>h1 {
+      color: rgba(255, 255, 255, 0.88)
+    }
+
+    .ant-pro-global-header-header-actions-avatar>div {
+      color: rgba(255, 255, 255, 0.45);
+    }
+
+    .ant-menu-light {
+      .ant-menu-item {
+        color: rgba(255, 255, 255, 0.65);
+
+        &:not(.ant-menu-item-selected):not(.ant-menu-submenu-selected):hover {
+          color: rgba(255, 255, 255, 0.88);
+          background: rgba(255, 255, 255, 0.08);
+        }
+      }
+
+      &.ant-menu-horizontal>.ant-menu-item-selected {
+        color: rgba(255, 255, 255, 0.95)
+      }
+    }
+  }
+}
+
+// 背景不同颜色不同
+.window_page {
+
+  .ant-pro-form-login-header,
+  .ant-pro-form-login-desc,
+  .ant-radio-label,
+  .ant-pro-global-footer-copyright {
+    // filter: invert(1) hue-rotate(180deg);
+    color: #FFF;
+    // mix-blend-mode: difference;
+  }
+}
+
+
+
+::-webkit-scrollbar {
+  width: 6px;
+  height: 8px;
+}
+
+::-webkit-scrollbar-thumb {
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0);
+  background-color: #a3a3a3;
+  // background: rgba(0, 0, 0, 0);
+}
+
+:hover::-webkit-scrollbar-thumb {
+  background: rgba(82, 82, 82, 0.3);
+  -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.2);
+}

+ 42 - 0
src/global.style.ts

@@ -0,0 +1,42 @@
+import { createStyles } from 'antd-style';
+
+const useStyles = createStyles(() => {
+  return {
+    colorWeak: {
+      filter: 'invert(80%)',
+    },
+    'ant-layout': {
+      minHeight: '100vh',
+    },
+    'ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed': {
+      left: 'unset',
+    },
+    canvas: {
+      display: 'block',
+    },
+    body: {
+      textRendering: 'optimizeLegibility',
+      WebkitFontSmoothing: 'antialiased',
+      MozOsxFontSmoothing: 'grayscale',
+    },
+    'ul,ol': {
+      listStyle: 'none',
+    },
+    '@media(max-width: 768px)': {
+      'ant-table': {
+        width: '100%',
+        overflowX: 'auto',
+        '&-thead > tr,    &-tbody > tr': {
+          '> th,      > td': {
+            whiteSpace: 'pre',
+            '> span': {
+              display: 'block',
+            },
+          },
+        },
+      },
+    },
+  };
+});
+
+export default useStyles;

+ 93 - 0
src/global.tsx

@@ -0,0 +1,93 @@
+import { useIntl } from '@umijs/max';
+import { Button, message, notification } from 'antd';
+import defaultSettings from '../config/defaultSettings';
+
+const { pwa } = defaultSettings;
+const isHttps = document.location.protocol === 'https:';
+
+const clearCache = () => {
+  // remove all caches
+  if (window.caches) {
+    caches
+      .keys()
+      .then((keys) => {
+        keys.forEach((key) => {
+          caches.delete(key);
+        });
+      })
+      .catch((e) => console.log(e));
+  }
+};
+
+// if pwa is true
+if (pwa) {
+  // Notify user if offline now
+  window.addEventListener('sw.offline', () => {
+    message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' }));
+  });
+
+  // Pop up a prompt on the page asking the user if they want to use the latest version
+  window.addEventListener('sw.updated', (event: Event) => {
+    const e = event as CustomEvent;
+    const reloadSW = async () => {
+      // Check if there is sw whose state is waiting in ServiceWorkerRegistration
+      // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
+      const worker = e.detail?.waiting;
+      if (!worker) {
+        return true;
+      }
+      // Send skip-waiting event to waiting SW with MessageChannel
+      await new Promise((resolve, reject) => {
+        const channel = new MessageChannel();
+        channel.port1.onmessage = (msgEvent) => {
+          if (msgEvent.data.error) {
+            reject(msgEvent.data.error);
+          } else {
+            resolve(msgEvent.data);
+          }
+        };
+        worker.postMessage({ type: 'skip-waiting' }, [channel.port2]);
+      });
+
+      clearCache();
+      window.location.reload();
+      return true;
+    };
+    const key = `open${Date.now()}`;
+    const btn = (
+      <Button
+        type="primary"
+        onClick={() => {
+          notification.destroy(key);
+          reloadSW();
+        }}
+      >
+        {useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })}
+      </Button>
+    );
+    notification.open({
+      message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }),
+      description: useIntl().formatMessage({
+        id: 'app.pwa.serviceworker.updated.hint',
+      }),
+      btn,
+      key,
+      onClose: async () => null,
+    });
+  });
+} else if ('serviceWorker' in navigator && isHttps) {
+  // unregister service worker
+  const { serviceWorker } = navigator;
+  if (serviceWorker.getRegistrations) {
+    serviceWorker.getRegistrations().then((sws) => {
+      sws.forEach((sw) => {
+        sw.unregister();
+      });
+    });
+  }
+  serviceWorker.getRegistration().then((sw) => {
+    if (sw) sw.unregister();
+  });
+
+  clearCache();
+}

+ 7 - 0
src/loading.tsx

@@ -0,0 +1,7 @@
+import { Skeleton } from 'antd';
+
+const Loading: React.FC = () => (
+  <Skeleton style={{ margin: '24px 40px', height: '60vh' }} active />
+);
+
+export default Loading;

+ 25 - 0
src/locales/bn-BD.ts

@@ -0,0 +1,25 @@
+import component from './bn-BD/component';
+import globalHeader from './bn-BD/globalHeader';
+import menu from './bn-BD/menu';
+import pages from './bn-BD/pages';
+import pwa from './bn-BD/pwa';
+import settingDrawer from './bn-BD/settingDrawer';
+import settings from './bn-BD/settings';
+
+export default {
+  'navBar.lang': 'ভাষা',
+  'layout.user.link.help': 'সহায়তা',
+  'layout.user.link.privacy': 'গোপনীয়তা',
+  'layout.user.link.terms': 'শর্তাদি',
+  'app.preview.down.block': 'আপনার স্থানীয় প্রকল্পে এই পৃষ্ঠাটি ডাউনলোড করুন',
+  'app.welcome.link.fetch-blocks': 'সমস্ত ব্লক পান',
+  'app.welcome.link.block-list':
+    '`block` ডেভেলপমেন্ট এর উপর ভিত্তি করে দ্রুত স্ট্যান্ডার্ড, পৃষ্ঠাসমূহ তৈরি করুন।',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+  ...pages,
+};

+ 5 - 0
src/locales/bn-BD/component.ts

@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': 'বিস্তৃত',
+  'component.tagSelect.collapse': 'সঙ্কুচিত',
+  'component.tagSelect.all': 'সব',
+};

+ 17 - 0
src/locales/bn-BD/globalHeader.ts

@@ -0,0 +1,17 @@
+export default {
+  'component.globalHeader.search': 'অনুসন্ধান করুন',
+  'component.globalHeader.search.example1': 'অনুসন্ধান উদাহরণ ১',
+  'component.globalHeader.search.example2': 'অনুসন্ধান উদাহরণ ২',
+  'component.globalHeader.search.example3': 'অনুসন্ধান উদাহরণ ৩',
+  'component.globalHeader.help': 'সহায়তা',
+  'component.globalHeader.notification': 'বিজ্ঞপ্তি',
+  'component.globalHeader.notification.empty': 'আপনি সমস্ত বিজ্ঞপ্তি দেখেছেন।',
+  'component.globalHeader.message': 'বার্তা',
+  'component.globalHeader.message.empty': 'আপনি সমস্ত বার্তা দেখেছেন।',
+  'component.globalHeader.event': 'ঘটনা',
+  'component.globalHeader.event.empty': 'আপনি সমস্ত ইভেন্ট দেখেছেন।',
+  'component.noticeIcon.clear': 'সাফ',
+  'component.noticeIcon.cleared': 'সাফ করা হয়েছে',
+  'component.noticeIcon.empty': 'বিজ্ঞপ্তি নেই',
+  'component.noticeIcon.view-more': 'আরো দেখুন',
+};

+ 52 - 0
src/locales/bn-BD/menu.ts

@@ -0,0 +1,52 @@
+export default {
+  'menu.welcome': 'স্বাগতম',
+  'menu.more-blocks': 'আরও ব্লক',
+  'menu.home': 'নীড়',
+  'menu.admin': 'অ্যাডমিন',
+  'menu.admin.sub-page': 'উপ-পৃষ্ঠা',
+  'menu.login': 'প্রবেশ',
+  'menu.register': 'নিবন্ধন',
+  'menu.register-result': 'নিবন্ধনে ফলাফল',
+  'menu.dashboard': 'ড্যাশবোর্ড',
+  'menu.dashboard.analysis': 'বিশ্লেষণ',
+  'menu.dashboard.monitor': 'নিরীক্ষণ',
+  'menu.dashboard.workplace': 'কর্মক্ষেত্র',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': 'ফর্ম',
+  'menu.form.basic-form': 'বেসিক ফর্ম',
+  'menu.form.step-form': 'পদক্ষেপ ফর্ম',
+  'menu.form.step-form.info': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য লিখুন)',
+  'menu.form.step-form.confirm': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য নিশ্চিত করুন)',
+  'menu.form.step-form.result': 'পদক্ষেপ ফর্ম (সমাপ্ত)',
+  'menu.form.advanced-form': 'উন্নত ফর্ম',
+  'menu.list': 'তালিকা',
+  'menu.list.table-list': 'অনুসন্ধানের টেবিল',
+  'menu.list.basic-list': 'বেসিক তালিকা',
+  'menu.list.card-list': 'কার্ডের তালিকা',
+  'menu.list.search-list': 'অনুসন্ধানের তালিকা',
+  'menu.list.search-list.articles': 'অনুসন্ধানের তালিকা (নিবন্ধসমূহ)',
+  'menu.list.search-list.projects': 'অনুসন্ধানের তালিকা (প্রকল্পগুলি)',
+  'menu.list.search-list.applications': 'অনুসন্ধানের তালিকা (অ্যাপ্লিকেশন)',
+  'menu.profile': 'প্রোফাইল',
+  'menu.profile.basic': 'বেসিক প্রোফাইল',
+  'menu.profile.advanced': 'উন্নত প্রোফাইল',
+  'menu.result': 'ফলাফল',
+  'menu.result.success': 'সাফল্য',
+  'menu.result.fail': 'ব্যর্থ',
+  'menu.exception': 'ব্যতিক্রম',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': 'ট্রিগার',
+  'menu.account': 'হিসাব',
+  'menu.account.center': 'অ্যাকাউন্ট কেন্দ্র',
+  'menu.account.settings': 'অ্যাকাউন্ট সেটিংস',
+  'menu.account.trigger': 'ট্রিগার ত্রুটি',
+  'menu.account.logout': 'প্রস্থান',
+  'menu.editor': 'গ্রাফিক সম্পাদক',
+  'menu.editor.flow': 'ফ্লো এডিটর',
+  'menu.editor.mind': 'মাইন্ড এডিটর',
+  'menu.editor.koni': 'কোনি সম্পাদক',
+};

+ 73 - 0
src/locales/bn-BD/pages.ts

@@ -0,0 +1,73 @@
+export default {
+  'pages.layouts.userLayout.title':
+    'পিঁপড়া ডিজাইন হচ্ছে সিহু জেলার সবচেয়ে প্রভাবশালী ওয়েব ডিজাইনের স্পেসিফিকেশন',
+  'pages.login.accountLogin.tab': 'অ্যাকাউন্টে লগইন',
+  'pages.login.accountLogin.errorMessage':
+    'ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড(admin/ant.design)',
+  'pages.login.failure': 'লগইন ব্যর্থ হয়েছে। আবার চেষ্টা করুন!',
+  'pages.login.success': 'সফল লগইন!',
+  'pages.login.username.placeholder': 'ব্যবহারকারীর নাম: admin or user',
+  'pages.login.username.required': 'আপনার ব্যবহারকারীর নাম ইনপুট করুন!',
+  'pages.login.password.placeholder': 'পাসওয়ার্ড: ant.design',
+  'pages.login.password.required': 'আপনার পাসওয়ার্ড ইনপুট করুন!',
+  'pages.login.phoneLogin.tab': 'ফোন লগইন',
+  'pages.login.phoneLogin.errorMessage': 'যাচাইকরণ কোড ত্রুটি',
+  'pages.login.phoneNumber.placeholder': 'ফোন নম্বর',
+  'pages.login.phoneNumber.required': 'আপনার ফোন নম্বর ইনপুট করুন!',
+  'pages.login.phoneNumber.invalid': 'ফোন নম্বরটি সঠিক নয়!',
+  'pages.login.captcha.placeholder': 'যাচাইকরণের কোড',
+  'pages.login.captcha.required': 'দয়া করে ভেরিফিকেশন কোডটি ইনপুট করুন!',
+  'pages.login.phoneLogin.getVerificationCode': 'কোড পান',
+  'pages.getCaptchaSecondText': 'সেকেন্ড',
+  'pages.login.rememberMe': 'আমাকে মনে রাখুন',
+  'pages.login.forgotPassword': 'পাসওয়ার্ড ভুলে গেছেন?',
+  'pages.login.submit': 'প্রবেশ করুন',
+  'pages.login.loginWith': 'লগইন করতে পারেন:',
+  'pages.login.registerAccount': 'অ্যাকাউন্ট নিবন্ধন করুন',
+  'pages.welcome.link': 'স্বাগতম',
+  'pages.welcome.alertMessage': 'দ্রুত এবং শক্তিশালী ভারী শুল্ক উপাদান প্রকাশ করা হয়েছে।',
+  'pages.404.subTitle': 'দুঃখিত, আপনি যে পৃষ্ঠাটি দেখতে চান তা বিদ্যমান নেই।',
+  'pages.404.buttonText': 'প্রধান পাতায় ফিরে যান',
+  'pages.admin.subPage.title': 'এই পৃষ্ঠাটি কেবল অ্যাডমিন দ্বারা দেখা যাবে',
+  'pages.admin.subPage.alertMessage':
+    'UMI UI এখন প্রকাশিত হয়েছে, অভিজ্ঞতা শুরু করতে npm run ui ব্যবহার করতে স্বাগতম।',
+  'pages.searchTable.createForm.newRule': 'নতুন বিধি',
+  'pages.searchTable.updateForm.ruleConfig': 'বিধি কনফিগারেশন',
+  'pages.searchTable.updateForm.basicConfig': 'মৌলিক তথ্য',
+  'pages.searchTable.updateForm.ruleName.nameLabel': 'বিধি নাম',
+  'pages.searchTable.updateForm.ruleName.nameRules': 'বিধির নাম লিখুন!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': 'বিধির বিবরণ',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
+    'কমপক্ষে পাঁচটি অক্ষর লিখুন',
+  'pages.searchTable.updateForm.ruleDesc.descRules':
+    'কমপক্ষে পাঁচটি অক্ষরের একটি বিধান বিবরণ লিখুন!',
+  'pages.searchTable.updateForm.ruleProps.title': 'বৈশিষ্ট্য কনফিগার করুন',
+  'pages.searchTable.updateForm.object': 'নিরীক্ষণ অবজেক্ট',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': 'বিধি টেম্পলেট',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': 'বিধি প্রকার',
+  'pages.searchTable.updateForm.schedulingPeriod.title': 'সময়সূচী নির্ধারণ করুন',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'শুরুর সময়',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules':
+    'একটি শুরুর সময় চয়ন করুন!',
+  'pages.searchTable.titleDesc': 'বর্ণনা',
+  'pages.searchTable.ruleName': 'বিধি নাম প্রয়োজন',
+  'pages.searchTable.titleCallNo': 'পরিষেবা কল সংখ্যা',
+  'pages.searchTable.titleStatus': 'অবস্থা',
+  'pages.searchTable.nameStatus.default': 'ডিফল্ট',
+  'pages.searchTable.nameStatus.running': 'চলমান',
+  'pages.searchTable.nameStatus.online': 'অনলাইন',
+  'pages.searchTable.nameStatus.abnormal': 'অস্বাভাবিক',
+  'pages.searchTable.titleUpdatedAt': 'সর্বশেষ নির্ধারিত',
+  'pages.searchTable.exception': 'ব্যতিক্রম জন্য কারণ লিখুন!',
+  'pages.searchTable.titleOption': 'অপশন',
+  'pages.searchTable.config': 'কনফিগারেশন',
+  'pages.searchTable.subscribeAlert': 'সতর্কতা সাবস্ক্রাইব করুন',
+  'pages.searchTable.title': 'ইনকয়েরি ফরম',
+  'pages.searchTable.new': 'নতুন',
+  'pages.searchTable.chosen': 'নির্বাচিত',
+  'pages.searchTable.item': 'আইটেম',
+  'pages.searchTable.totalServiceCalls': 'পরিষেবা কলগুলির মোট সংখ্যা',
+  'pages.searchTable.tenThousand': '000',
+  'pages.searchTable.batchDeletion': 'একসাখে ডিলিট',
+  'pages.searchTable.batchApproval': 'একসাখে অনুমোদন',
+};

+ 7 - 0
src/locales/bn-BD/pwa.ts

@@ -0,0 +1,7 @@
+export default {
+  'app.pwa.offline': 'আপনি এখন অফলাইন',
+  'app.pwa.serviceworker.updated': 'নতুন সামগ্রী উপলব্ধ',
+  'app.pwa.serviceworker.updated.hint':
+    'বর্তমান পৃষ্ঠাটি পুনরায় লোড করতে দয়া করে "রিফ্রেশ" বোতাম টিপুন',
+  'app.pwa.serviceworker.updated.ok': 'রিফ্রেশ',
+};

+ 32 - 0
src/locales/bn-BD/settingDrawer.ts

@@ -0,0 +1,32 @@
+export default {
+  'app.setting.pagestyle': 'পৃষ্ঠা স্টাইল সেটিং',
+  'app.setting.pagestyle.dark': 'ডার্ক স্টাইল',
+  'app.setting.pagestyle.light': 'লাইট স্টাইল',
+  'app.setting.content-width': 'সামগ্রীর প্রস্থ',
+  'app.setting.content-width.fixed': 'স্থির',
+  'app.setting.content-width.fluid': 'প্রবাহী',
+  'app.setting.themecolor': 'থিম রঙ',
+  'app.setting.themecolor.dust': 'ডাস্ট রেড',
+  'app.setting.themecolor.volcano': 'আগ্নেয়গিরি',
+  'app.setting.themecolor.sunset': 'সানসেট কমলা',
+  'app.setting.themecolor.cyan': 'সবুজাভ নীল',
+  'app.setting.themecolor.green': 'পোলার সবুজ',
+  'app.setting.themecolor.daybreak': 'দিবস ব্রেক ব্লু (ডিফল্ট)',
+  'app.setting.themecolor.geekblue': 'গিক আঠালো',
+  'app.setting.themecolor.purple': 'গোল্ডেন বেগুনি',
+  'app.setting.navigationmode': 'নেভিগেশন মোড',
+  'app.setting.sidemenu': 'সাইড মেনু লেআউট',
+  'app.setting.topmenu': 'টপ মেনু লেআউট',
+  'app.setting.fixedheader': 'স্থির হেডার',
+  'app.setting.fixedsidebar': 'স্থির সাইডবার',
+  'app.setting.fixedsidebar.hint': 'সাইড মেনু বিন্যাসে কাজ করে',
+  'app.setting.hideheader': 'স্ক্রোল করার সময় হেডার লুকানো',
+  'app.setting.hideheader.hint': 'লুকানো হেডার সক্ষম থাকলে কাজ করে',
+  'app.setting.othersettings': 'অন্যান্য সেটিংস্',
+  'app.setting.weakmode': 'দুর্বল মোড',
+  'app.setting.copy': 'সেটিং কপি করুন',
+  'app.setting.copyinfo':
+    'সাফল্যের অনুলিপি করুন - প্রতিস্থাপন করুন: src/models/setting.js',
+  'app.setting.production.hint':
+    'কেবল বিকাশের পরিবেশে প্যানেল শো সেট করা হচ্ছে, দয়া করে ম্যানুয়ালি সংশোধন করুন',
+};

+ 60 - 0
src/locales/bn-BD/settings.ts

@@ -0,0 +1,60 @@
+export default {
+  'app.settings.menuMap.basic': 'মৌলিক বৈশিষ্ট্যসহ',
+  'app.settings.menuMap.security': 'নিরাপত্তা বিন্যাস',
+  'app.settings.menuMap.binding': 'অ্যাকাউন্ট বাঁধাই',
+  'app.settings.menuMap.notification': 'নতুন বার্তা বিজ্ঞপ্তি',
+  'app.settings.basic.avatar': 'অবতার',
+  'app.settings.basic.change-avatar': 'অবতার পরিবর্তন করুন',
+  'app.settings.basic.email': 'ইমেইল',
+  'app.settings.basic.email-message': 'আপনার ইমেইল ইনপুট করুন!',
+  'app.settings.basic.nickname': 'ডাক নাম',
+  'app.settings.basic.nickname-message': 'আপনার ডাকনামটি ইনপুট করুন!',
+  'app.settings.basic.profile': 'ব্যক্তিগত প্রোফাইল',
+  'app.settings.basic.profile-message': 'আপনার ব্যক্তিগত প্রোফাইল ইনপুট করুন!',
+  'app.settings.basic.profile-placeholder': 'নিজের সাথে সংক্ষিপ্ত পরিচয়',
+  'app.settings.basic.country': 'দেশ/অঞ্চল',
+  'app.settings.basic.country-message': 'আপনার দেশ ইনপুট করুন!',
+  'app.settings.basic.geographic': 'প্রদেশ বা শহর',
+  'app.settings.basic.geographic-message': 'আপনার ভৌগলিক তথ্য ইনপুট করুন!',
+  'app.settings.basic.address': 'রাস্তার ঠিকানা',
+  'app.settings.basic.address-message': 'দয়া করে আপনার ঠিকানা ইনপুট করুন!',
+  'app.settings.basic.phone': 'ফোন নম্বর',
+  'app.settings.basic.phone-message': 'আপনার ফোন ইনপুট করুন!',
+  'app.settings.basic.update': 'তথ্য হালনাগাদ',
+  'app.settings.security.strong': 'শক্তিশালী',
+  'app.settings.security.medium': 'মধ্যম',
+  'app.settings.security.weak': 'দুর্বল',
+  'app.settings.security.password': 'অ্যাকাউন্টের পাসওয়ার্ড',
+  'app.settings.security.password-description': 'বর্তমান পাসওয়ার্ড শক্তি',
+  'app.settings.security.phone': 'সুরক্ষা ফোন',
+  'app.settings.security.phone-description': 'আবদ্ধ ফোন',
+  'app.settings.security.question': 'নিরাপত্তা প্রশ্ন',
+  'app.settings.security.question-description':
+    'সুরক্ষা প্রশ্ন সেট করা নেই, এবং সুরক্ষা নীতি কার্যকরভাবে অ্যাকাউন্ট সুরক্ষা রক্ষা করতে পারে',
+  'app.settings.security.email': 'ব্যাকআপ ইমেইল',
+  'app.settings.security.email-description': 'বাউন্ড ইমেইল',
+  'app.settings.security.mfa': 'MFA ডিভাইস',
+  'app.settings.security.mfa-description':
+    "আনবাউন্ড এমএফএ ডিভাইস, বাঁধাইয়ের পরে, দু'বার নিশ্চিত করা যায়",
+  'app.settings.security.modify': 'পরিবর্তন করুন',
+  'app.settings.security.set': 'সেট',
+  'app.settings.security.bind': 'বাঁধাই',
+  'app.settings.binding.taobao': 'বাঁধাই তাওবাও',
+  'app.settings.binding.taobao-description': 'বর্তমানে আনবাউন্ড তাওবাও অ্যাকাউন্ট',
+  'app.settings.binding.alipay': 'বাইন্ডিং আলিপে',
+  'app.settings.binding.alipay-description': 'বর্তমানে আনবাউন্ড আলিপে অ্যাকাউন্ট',
+  'app.settings.binding.dingding': 'বাঁধাই ডিঙ্গটালক',
+  'app.settings.binding.dingding-description': 'বর্তমানে আনবাউন্ড ডিঙ্গটাল অ্যাকাউন্ট',
+  'app.settings.binding.bind': 'বাঁধাই',
+  'app.settings.notification.password': 'অ্যাকাউন্টের পাসওয়ার্ড',
+  'app.settings.notification.password-description':
+    'অন্যান্য ব্যবহারকারীর বার্তাগুলি স্টেশন চিঠি আকারে জানানো হবে',
+  'app.settings.notification.messages': 'সিস্টেম বার্তা',
+  'app.settings.notification.messages-description':
+    'সিস্টেম বার্তাগুলি স্টেশন চিঠির আকারে জানানো হবে',
+  'app.settings.notification.todo': 'করণীয় বিজ্ঞপ্তি',
+  'app.settings.notification.todo-description':
+    'করণীয় তালিকাটি স্টেশন থেকে চিঠি আকারে জানানো হবে',
+  'app.settings.open': 'খোলা',
+  'app.settings.close': 'বন্ধ',
+};

+ 25 - 0
src/locales/en-US.ts

@@ -0,0 +1,25 @@
+import component from './en-US/component';
+import globalHeader from './en-US/globalHeader';
+import menu from './en-US/menu';
+import pages from './en-US/pages';
+import pwa from './en-US/pwa';
+import settingDrawer from './en-US/settingDrawer';
+import settings from './en-US/settings';
+
+export default {
+  'navBar.lang': 'Languages',
+  'layout.user.link.help': 'Help',
+  'layout.user.link.privacy': 'Privacy',
+  'layout.user.link.terms': 'Terms',
+  'app.preview.down.block': 'Download this page to your local project',
+  'app.welcome.link.fetch-blocks': 'Get all block',
+  'app.welcome.link.block-list':
+    'Quickly build standard, pages based on `block` development',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+  ...pages,
+};

+ 5 - 0
src/locales/en-US/component.ts

@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': 'Expand',
+  'component.tagSelect.collapse': 'Collapse',
+  'component.tagSelect.all': 'All',
+};

+ 18 - 0
src/locales/en-US/globalHeader.ts

@@ -0,0 +1,18 @@
+export default {
+  'component.globalHeader.search': 'Search',
+  'component.globalHeader.search.example1': 'Search example 1',
+  'component.globalHeader.search.example2': 'Search example 2',
+  'component.globalHeader.search.example3': 'Search example 3',
+  'component.globalHeader.help': 'Help',
+  'component.globalHeader.notification': 'Notification',
+  'component.globalHeader.notification.empty':
+    'You have viewed all notifications.',
+  'component.globalHeader.message': 'Message',
+  'component.globalHeader.message.empty': 'You have viewed all messsages.',
+  'component.globalHeader.event': 'Event',
+  'component.globalHeader.event.empty': 'You have viewed all events.',
+  'component.noticeIcon.clear': 'Clear',
+  'component.noticeIcon.cleared': 'Cleared',
+  'component.noticeIcon.empty': 'No notifications',
+  'component.noticeIcon.view-more': 'View more',
+};

+ 52 - 0
src/locales/en-US/menu.ts

@@ -0,0 +1,52 @@
+export default {
+  'menu.welcome': 'Welcome',
+  'menu.more-blocks': 'More Blocks',
+  'menu.home': 'Home',
+  'menu.admin': 'Admin',
+  'menu.admin.sub-page': 'Sub-Page',
+  'menu.login': 'Login',
+  'menu.register': 'Register',
+  'menu.register-result': 'Register Result',
+  'menu.dashboard': 'Dashboard',
+  'menu.dashboard.analysis': 'Analysis',
+  'menu.dashboard.monitor': 'Monitor',
+  'menu.dashboard.workplace': 'Workplace',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': 'Form',
+  'menu.form.basic-form': 'Basic Form',
+  'menu.form.step-form': 'Step Form',
+  'menu.form.step-form.info': 'Step Form(write transfer information)',
+  'menu.form.step-form.confirm': 'Step Form(confirm transfer information)',
+  'menu.form.step-form.result': 'Step Form(finished)',
+  'menu.form.advanced-form': 'Advanced Form',
+  'menu.list': 'List',
+  'menu.list.table-list': 'Search Table',
+  'menu.list.basic-list': 'Basic List',
+  'menu.list.card-list': 'Card List',
+  'menu.list.search-list': 'Search List',
+  'menu.list.search-list.articles': 'Search List(articles)',
+  'menu.list.search-list.projects': 'Search List(projects)',
+  'menu.list.search-list.applications': 'Search List(applications)',
+  'menu.profile': 'Profile',
+  'menu.profile.basic': 'Basic Profile',
+  'menu.profile.advanced': 'Advanced Profile',
+  'menu.result': 'Result',
+  'menu.result.success': 'Success',
+  'menu.result.fail': 'Fail',
+  'menu.exception': 'Exception',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': 'Trigger',
+  'menu.account': 'Account',
+  'menu.account.center': 'Account Center',
+  'menu.account.settings': 'Account Settings',
+  'menu.account.trigger': 'Trigger Error',
+  'menu.account.logout': 'Logout',
+  'menu.editor': 'Graphic Editor',
+  'menu.editor.flow': 'Flow Editor',
+  'menu.editor.mind': 'Mind Editor',
+  'menu.editor.koni': 'Koni Editor',
+};

+ 76 - 0
src/locales/en-US/pages.ts

@@ -0,0 +1,76 @@
+export default {
+  'pages.layouts.userLayout.title':
+    'Ant Design is the most influential web design specification in Xihu district',
+  'pages.login.accountLogin.tab': 'Account Login',
+  'pages.login.accountLogin.errorMessage':
+    'Incorrect username/password(admin/ant.design)',
+  'pages.login.failure': 'Login failed, please try again!',
+  'pages.login.success': 'Login successful!',
+  'pages.login.username.placeholder': 'Username: admin or user',
+  'pages.login.username.required': 'Please input your username!',
+  'pages.login.password.placeholder': 'Password: ant.design',
+  'pages.login.password.required': 'Please input your password!',
+  'pages.login.phoneLogin.tab': 'Phone Login',
+  'pages.login.phoneLogin.errorMessage': 'Verification Code Error',
+  'pages.login.phoneNumber.placeholder': 'Phone Number',
+  'pages.login.phoneNumber.required': 'Please input your phone number!',
+  'pages.login.phoneNumber.invalid': 'Phone number is invalid!',
+  'pages.login.captcha.placeholder': 'Verification Code',
+  'pages.login.captcha.required': 'Please input verification code!',
+  'pages.login.phoneLogin.getVerificationCode': 'Get Code',
+  'pages.getCaptchaSecondText': 'sec(s)',
+  'pages.login.rememberMe': 'Remember me',
+  'pages.login.forgotPassword': 'Forgot Password ?',
+  'pages.login.submit': 'Login',
+  'pages.login.loginWith': 'Login with :',
+  'pages.login.registerAccount': 'Register Account',
+  'pages.welcome.link': 'Welcome',
+  '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.buttonText': 'Back Home',
+  'pages.admin.subPage.title': 'This page can only be viewed by Admin',
+  'pages.admin.subPage.alertMessage':
+    'Umi ui is now released, welcome to use npm run ui to start the experience.',
+  'pages.searchTable.createForm.newRule': 'New Rule',
+  'pages.searchTable.updateForm.ruleConfig': 'Rule configuration',
+  'pages.searchTable.updateForm.basicConfig': 'Basic Information',
+  'pages.searchTable.updateForm.ruleName.nameLabel': 'Rule Name',
+  'pages.searchTable.updateForm.ruleName.nameRules':
+    'Please enter the rule name!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': 'Rule Description',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
+    'Please enter at least five characters',
+  'pages.searchTable.updateForm.ruleDesc.descRules':
+    'Please enter a rule description of at least five characters!',
+  'pages.searchTable.updateForm.ruleProps.title': 'Configure Properties',
+  'pages.searchTable.updateForm.object': 'Monitoring Object',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': 'Rule Template',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': 'Rule Type',
+  'pages.searchTable.updateForm.schedulingPeriod.title':
+    'Set Scheduling Period',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Starting Time',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules':
+    'Please choose a start time!',
+  'pages.searchTable.titleDesc': 'Description',
+  'pages.searchTable.ruleName': 'Rule name is required',
+  'pages.searchTable.titleCallNo': 'Number of Service Calls',
+  'pages.searchTable.titleStatus': 'Status',
+  'pages.searchTable.nameStatus.default': 'default',
+  'pages.searchTable.nameStatus.running': 'running',
+  'pages.searchTable.nameStatus.online': 'online',
+  'pages.searchTable.nameStatus.abnormal': 'abnormal',
+  'pages.searchTable.titleUpdatedAt': 'Last Scheduled at',
+  'pages.searchTable.exception': 'Please enter the reason for the exception!',
+  'pages.searchTable.titleOption': 'Option',
+  'pages.searchTable.config': 'Configuration',
+  'pages.searchTable.subscribeAlert': 'Subscribe to alerts',
+  'pages.searchTable.title': 'Enquiry Form',
+  'pages.searchTable.new': 'New',
+  'pages.searchTable.chosen': 'chosen',
+  'pages.searchTable.item': 'item',
+  'pages.searchTable.totalServiceCalls': 'Total Number of Service Calls',
+  'pages.searchTable.tenThousand': '0000',
+  'pages.searchTable.batchDeletion': 'batch deletion',
+  'pages.searchTable.batchApproval': 'batch approval',
+};

+ 7 - 0
src/locales/en-US/pwa.ts

@@ -0,0 +1,7 @@
+export default {
+  'app.pwa.offline': 'You are offline now',
+  '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.ok': 'Refresh',
+};

+ 32 - 0
src/locales/en-US/settingDrawer.ts

@@ -0,0 +1,32 @@
+export default {
+  'app.setting.pagestyle': 'Page style setting',
+  'app.setting.pagestyle.dark': 'Dark style',
+  'app.setting.pagestyle.light': 'Light style',
+  'app.setting.content-width': 'Content Width',
+  'app.setting.content-width.fixed': 'Fixed',
+  'app.setting.content-width.fluid': 'Fluid',
+  'app.setting.themecolor': 'Theme Color',
+  'app.setting.themecolor.dust': 'Dust Red',
+  'app.setting.themecolor.volcano': 'Volcano',
+  'app.setting.themecolor.sunset': 'Sunset Orange',
+  'app.setting.themecolor.cyan': 'Cyan',
+  'app.setting.themecolor.green': 'Polar Green',
+  'app.setting.themecolor.daybreak': 'Daybreak Blue (default)',
+  'app.setting.themecolor.geekblue': 'Geek Glue',
+  'app.setting.themecolor.purple': 'Golden Purple',
+  'app.setting.navigationmode': 'Navigation Mode',
+  'app.setting.sidemenu': 'Side Menu Layout',
+  'app.setting.topmenu': 'Top Menu Layout',
+  'app.setting.fixedheader': 'Fixed Header',
+  'app.setting.fixedsidebar': 'Fixed Sidebar',
+  'app.setting.fixedsidebar.hint': 'Works on Side Menu Layout',
+  'app.setting.hideheader': 'Hidden Header when scrolling',
+  'app.setting.hideheader.hint': 'Works when Hidden Header is enabled',
+  'app.setting.othersettings': 'Other Settings',
+  'app.setting.weakmode': 'Color Blind Friendly Mode',
+  'app.setting.copy': 'Copy Setting',
+  'app.setting.copyinfo':
+    'copy success, please replace defaultSettings in src/models/setting.js',
+  'app.setting.production.hint':
+    'Setting panel shows in development environment only, please manually modify',
+};

+ 61 - 0
src/locales/en-US/settings.ts

@@ -0,0 +1,61 @@
+export default {
+  'app.settings.menuMap.basic': 'Basic Settings',
+  'app.settings.menuMap.security': 'Security Settings',
+  'app.settings.menuMap.binding': 'Account Binding',
+  'app.settings.menuMap.notification': 'New Message Notification',
+  'app.settings.basic.avatar': 'Avatar',
+  'app.settings.basic.change-avatar': 'Change avatar',
+  'app.settings.basic.email': 'Email',
+  'app.settings.basic.email-message': 'Please input your email!',
+  'app.settings.basic.nickname': 'Nickname',
+  'app.settings.basic.nickname-message': 'Please input your Nickname!',
+  'app.settings.basic.profile': 'Personal profile',
+  'app.settings.basic.profile-message': 'Please input your personal profile!',
+  'app.settings.basic.profile-placeholder': 'Brief introduction to yourself',
+  'app.settings.basic.country': 'Country/Region',
+  'app.settings.basic.country-message': 'Please input your country!',
+  'app.settings.basic.geographic': 'Province or city',
+  'app.settings.basic.geographic-message': 'Please input your geographic info!',
+  'app.settings.basic.address': 'Street Address',
+  'app.settings.basic.address-message': 'Please input your address!',
+  'app.settings.basic.phone': 'Phone Number',
+  'app.settings.basic.phone-message': 'Please input your phone!',
+  'app.settings.basic.update': 'Update Information',
+  'app.settings.security.strong': 'Strong',
+  'app.settings.security.medium': 'Medium',
+  'app.settings.security.weak': 'Weak',
+  'app.settings.security.password': 'Account Password',
+  'app.settings.security.password-description': 'Current password strength',
+  'app.settings.security.phone': 'Security Phone',
+  'app.settings.security.phone-description': 'Bound phone',
+  'app.settings.security.question': 'Security Question',
+  'app.settings.security.question-description':
+    'The security question is not set, and the security policy can effectively protect the account security',
+  'app.settings.security.email': 'Backup Email',
+  'app.settings.security.email-description': 'Bound Email',
+  'app.settings.security.mfa': 'MFA Device',
+  'app.settings.security.mfa-description':
+    'Unbound MFA device, after binding, can be confirmed twice',
+  'app.settings.security.modify': 'Modify',
+  'app.settings.security.set': 'Set',
+  'app.settings.security.bind': 'Bind',
+  'app.settings.binding.taobao': 'Binding Taobao',
+  'app.settings.binding.taobao-description': 'Currently unbound Taobao account',
+  'app.settings.binding.alipay': 'Binding Alipay',
+  'app.settings.binding.alipay-description': 'Currently unbound Alipay account',
+  'app.settings.binding.dingding': 'Binding DingTalk',
+  'app.settings.binding.dingding-description':
+    'Currently unbound DingTalk account',
+  'app.settings.binding.bind': 'Bind',
+  'app.settings.notification.password': 'Account Password',
+  'app.settings.notification.password-description':
+    'Messages from other users will be notified in the form of a station letter',
+  'app.settings.notification.messages': 'System Messages',
+  'app.settings.notification.messages-description':
+    'System messages will be notified in the form of a station letter',
+  'app.settings.notification.todo': 'To-do Notification',
+  'app.settings.notification.todo-description':
+    'The to-do list will be notified in the form of a letter from the station',
+  'app.settings.open': 'Open',
+  'app.settings.close': 'Close',
+};

+ 25 - 0
src/locales/fa-IR.ts

@@ -0,0 +1,25 @@
+import component from './fa-IR/component';
+import globalHeader from './fa-IR/globalHeader';
+import menu from './fa-IR/menu';
+import pages from './fa-IR/pages';
+import pwa from './fa-IR/pwa';
+import settingDrawer from './fa-IR/settingDrawer';
+import settings from './fa-IR/settings';
+
+export default {
+  'navBar.lang': 'زبان ها  ',
+  'layout.user.link.help': 'کمک',
+  'layout.user.link.privacy': 'حریم خصوصی',
+  'layout.user.link.terms': 'مقررات',
+  'app.preview.down.block': 'این صفحه را در پروژه محلی خود بارگیری کنید',
+  'app.welcome.link.fetch-blocks': 'دریافت تمام بلوک',
+  'app.welcome.link.block-list':
+    'به سرعت صفحات استاندارد مبتنی بر توسعه "بلوک" را بسازید',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+  ...pages,
+};

+ 5 - 0
src/locales/fa-IR/component.ts

@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': 'باز',
+  'component.tagSelect.collapse': 'بسته ',
+  'component.tagSelect.all': 'همه',
+};

+ 18 - 0
src/locales/fa-IR/globalHeader.ts

@@ -0,0 +1,18 @@
+export default {
+  'component.globalHeader.search': 'جستجو ',
+  'component.globalHeader.search.example1': 'مثال 1 را جستجو کنید',
+  'component.globalHeader.search.example2': 'مثال 2 را جستجو کنید',
+  'component.globalHeader.search.example3': 'مثال 3 را جستجو کنید',
+  'component.globalHeader.help': 'کمک',
+  'component.globalHeader.notification': 'اعلان',
+  'component.globalHeader.notification.empty':
+    'شما همه اعلان ها را مشاهده کرده اید.',
+  'component.globalHeader.message': 'پیام',
+  'component.globalHeader.message.empty': 'شما همه پیام ها را مشاهده کرده اید.',
+  'component.globalHeader.event': 'رویداد',
+  'component.globalHeader.event.empty': 'شما همه رویدادها را مشاهده کرده اید.',
+  'component.noticeIcon.clear': 'پاک کردن',
+  'component.noticeIcon.cleared': 'پاک شد',
+  'component.noticeIcon.empty': 'بدون اعلان',
+  'component.noticeIcon.view-more': 'نمایش بیشتر',
+};

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels