├── .drone.yml ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .prettierrc.js ├── README.md ├── config ├── config.ts ├── defaultSettings.ts ├── proxy.ts └── routes.ts ├── jsconfig.json ├── package.json ├── pnpm-lock.yaml ├── public ├── alsap_logo.svg ├── banner.2fbaee3a.png ├── dark.json ├── favicon.ico ├── graphicon │ ├── amplifg.svg │ ├── boost.svg │ ├── expand.svg │ ├── file.svg │ ├── process.svg │ ├── socket.svg │ └── zoom.svg ├── hot.gif ├── hot.svg ├── logo.svg ├── pro_icon.svg └── scripts │ ├── inf_debugger.js │ └── loading.js ├── src ├── access.ts ├── app.tsx ├── components │ ├── AnnotationComponent │ │ ├── EntityItem │ │ │ └── index.tsx │ │ ├── EntityItemBox │ │ │ └── index.tsx │ │ ├── css │ │ │ └── entityStyle.css │ │ └── types │ │ │ └── AnnotationChunkType.d.ts │ ├── FloatButtonComponent │ │ ├── index.tsx │ │ └── style │ │ │ └── floatStyle.css │ ├── Footer │ │ └── index.tsx │ ├── GraphComponent │ │ ├── CtiGraph │ │ │ └── index.tsx │ │ ├── JsxGraph │ │ │ └── index.tsx │ │ ├── TtpGraph │ │ │ └── index.tsx │ │ └── style │ │ │ └── graphDrawerStyle.css │ ├── HeaderDropdown │ │ └── index.tsx │ ├── Image │ │ └── index.tsx │ ├── MarkdownComponent │ │ └── index.tsx │ └── RightContent │ │ ├── AvatarDropdown.tsx │ │ └── style │ │ └── headerStyle.ts ├── constants │ ├── access │ │ └── accessEnum.ts │ ├── car │ │ └── carConstants.ts │ ├── dackChatTheme │ │ └── index.ts │ ├── index.ts │ └── ruleType │ │ └── RuleEnum.ts ├── global.less ├── global.style.ts ├── global.tsx ├── locales │ ├── bn-BD.ts │ ├── bn-BD │ │ ├── component.ts │ │ ├── globalHeader.ts │ │ ├── menu.ts │ │ ├── pages.ts │ │ ├── pwa.ts │ │ ├── settingDrawer.ts │ │ └── settings.ts │ ├── en-US.ts │ ├── en-US │ │ ├── component.ts │ │ ├── globalHeader.ts │ │ ├── menu.ts │ │ ├── pages.ts │ │ ├── pwa.ts │ │ ├── settingDrawer.ts │ │ └── settings.ts │ ├── fa-IR.ts │ ├── fa-IR │ │ ├── component.ts │ │ ├── globalHeader.ts │ │ ├── menu.ts │ │ ├── pages.ts │ │ ├── pwa.ts │ │ ├── settingDrawer.ts │ │ └── settings.ts │ ├── id-ID.ts │ ├── id-ID │ │ ├── component.ts │ │ ├── globalHeader.ts │ │ ├── menu.ts │ │ ├── pages.ts │ │ ├── pwa.ts │ │ ├── settingDrawer.ts │ │ └── settings.ts │ ├── ja-JP.ts │ ├── ja-JP │ │ ├── component.ts │ │ ├── globalHeader.ts │ │ ├── menu.ts │ │ ├── pages.ts │ │ ├── pwa.ts │ │ ├── settingDrawer.ts │ │ └── settings.ts │ ├── pt-BR.ts │ ├── pt-BR │ │ ├── component.ts │ │ ├── globalHeader.ts │ │ ├── menu.ts │ │ ├── pages.ts │ │ ├── pwa.ts │ │ ├── settingDrawer.ts │ │ └── settings.ts │ ├── zh-CN.ts │ ├── zh-CN │ │ ├── component.ts │ │ ├── globalHeader.ts │ │ ├── menu.ts │ │ ├── pages.ts │ │ ├── pwa.ts │ │ ├── settingDrawer.ts │ │ └── settings.ts │ ├── zh-TW.ts │ └── zh-TW │ │ ├── component.ts │ │ ├── globalHeader.ts │ │ ├── menu.ts │ │ ├── pages.ts │ │ ├── pwa.ts │ │ ├── settingDrawer.ts │ │ └── settings.ts ├── pages │ ├── 404.tsx │ ├── Admin.tsx │ ├── Admin │ │ └── User │ │ │ ├── components │ │ │ ├── CreateModal.tsx │ │ │ └── UpdateModal.tsx │ │ │ └── index.tsx │ ├── Chat │ │ ├── LlmChat │ │ │ ├── index.tsx │ │ │ └── style │ │ │ │ └── llmChat.css │ │ ├── components │ │ │ ├── BotChat │ │ │ │ └── index.tsx │ │ │ └── UserChat │ │ │ │ └── index.tsx │ │ └── index.tsx │ ├── Cti │ │ ├── Annotation │ │ │ ├── index.tsx │ │ │ └── style │ │ │ │ └── annotationStyle.css │ │ ├── CtiCardShow │ │ │ ├── index.tsx │ │ │ └── style │ │ │ │ └── ctiCardPageStyle.css │ │ ├── CtiShow │ │ │ ├── components │ │ │ │ └── CreateModal.tsx │ │ │ └── index.tsx │ │ ├── Detail │ │ │ ├── components │ │ │ │ ├── AttckBehavior │ │ │ │ │ └── index.tsx │ │ │ │ ├── Content │ │ │ │ │ └── index.tsx │ │ │ │ ├── Defense │ │ │ │ │ └── index.tsx │ │ │ │ ├── Entity │ │ │ │ │ └── index.tsx │ │ │ │ ├── Information │ │ │ │ │ └── index.tsx │ │ │ │ ├── Ttps │ │ │ │ │ └── index.tsx │ │ │ │ └── knowledge │ │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── style │ │ │ │ ├── contentPageStyle.css │ │ │ │ └── detailPageStyle.css │ │ ├── Graph │ │ │ └── index.tsx │ │ ├── ItemShow │ │ │ ├── components │ │ │ │ └── UpdateModal.tsx │ │ │ └── index.tsx │ │ └── RelationShow │ │ │ ├── components │ │ │ └── UpdateModal.tsx │ │ │ └── index.tsx │ ├── Home │ │ ├── components │ │ │ ├── history │ │ │ │ └── index.tsx │ │ │ └── hot │ │ │ │ └── index.tsx │ │ ├── index.tsx │ │ └── style │ │ │ ├── historyStyle.css │ │ │ ├── homeStyle.ts │ │ │ └── hotStyle.css │ ├── Pressure.tsx │ ├── Search │ │ ├── components │ │ │ └── SearchDetail │ │ │ │ └── index.tsx │ │ ├── index.tsx │ │ └── style │ │ │ └── searchStyle.css │ ├── User │ │ ├── Login │ │ │ ├── index.tsx │ │ │ └── style │ │ │ │ └── loginPage.css │ │ └── Register │ │ │ └── index.tsx │ └── Welcome.tsx ├── requestConfig.ts ├── service-worker.js ├── services.rar ├── services │ └── backend │ │ ├── ctiController.ts │ │ ├── ctiInnerController.ts │ │ ├── entityInnerController.ts │ │ ├── fileController.ts │ │ ├── graphController.ts │ │ ├── homeController.ts │ │ ├── index.ts │ │ ├── itemController.ts │ │ ├── itemInnerController.ts │ │ ├── llmController.ts │ │ ├── postController.ts │ │ ├── relationInnerController.ts │ │ ├── relationTypeController.ts │ │ ├── relationTypeInnerController.ts │ │ ├── ruleController.ts │ │ ├── ttpController.ts │ │ ├── ttpInnerController.ts │ │ ├── typings.d.ts │ │ ├── userController.ts │ │ └── wechatController.ts ├── style │ ├── homePageStyle.css │ └── welcomePageStyle.css ├── typings.d.ts └── utils │ ├── checkTheme.ts │ ├── data │ └── db.json │ ├── fonts │ ├── Montserrat-Light.ttf │ ├── Montserrat-Medium.ttf │ ├── Montserrat-Regular.ttf │ └── fonts.css │ ├── graphUtil.ts │ ├── graphicon │ ├── amplifg.svg │ ├── boost.svg │ ├── expand.svg │ ├── file.svg │ ├── process.svg │ ├── socket.svg │ └── zoom.svg │ ├── images │ └── background.svg │ └── sound │ ├── car1.wav │ ├── car2.wav │ └── car3.wav └── tsconfig.json /.drone.yml: -------------------------------------------------------------------------------- 1 | kind: pipeline 2 | type: docker 3 | name: alsap_frontend 4 | 5 | volumes: 6 | - name: frond_end_dist 7 | host: 8 | path: /www/wwwroot/alsap.tracesec.cn 9 | - name: node_modules 10 | host: 11 | path: /home/drone/cache/node_modules 12 | steps: 13 | - name: npm-package 14 | image: node:18.20.4-alpine 15 | volumes: 16 | - name: frond_end_dist 17 | path: /usr/local/frond_end 18 | - name: node_modules 19 | path: /drone/src/node_modules 20 | commands: 21 | - pwd 22 | # - du -sh * 23 | # - npm config get registry 24 | # - npm config set registry https://registry.npmmirror.com/ 25 | # - npm config get registry 26 | # - npm install --legacy-peer-deps || npm install 27 | # - npm run build || max build 28 | # - cp -r ./dist /usr/local/frond_end/ 29 | 30 | 31 | trigger: 32 | branch: 33 | - main 34 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | 15 | [Makefile] 16 | indent_style = tab 17 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /lambda/ 2 | /scripts 3 | /config 4 | .history 5 | public 6 | dist 7 | .umi 8 | mock -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [require.resolve('@umijs/lint/dist/config/eslint')], 3 | globals: { 4 | page: true, 5 | REACT_APP_ENV: true, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | **/node_modules 5 | # roadhog-api-doc ignore 6 | /src/utils/request-temp.js 7 | _roadhog-api-doc 8 | note.md 9 | *.rar 10 | 11 | # production 12 | /dist 13 | src/services 14 | 15 | # misc 16 | .DS_Store 17 | npm-debug.log* 18 | yarn-error.log 19 | 20 | /coverage 21 | .idea 22 | yarn.lock 23 | package-lock.json 24 | *bak 25 | .vscode 26 | 27 | 28 | # visual studio code 29 | .history 30 | *.log 31 | functions/* 32 | .temp/** 33 | 34 | # umi 35 | .umi 36 | .umi-production 37 | .umi-test 38 | 39 | # screenshot 40 | screenshot 41 | .firebase 42 | .eslintcache 43 | 44 | build 45 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | **/*.svg 2 | .umi 3 | .umi-production 4 | /dist 5 | .dockerignore 6 | .DS_Store 7 | .eslintignore 8 | *.png 9 | *.toml 10 | docker 11 | .editorconfig 12 | Dockerfile* 13 | .gitignore 14 | .prettierignore 15 | LICENSE 16 | .eslintcache 17 | *.lock 18 | yarn-error.log 19 | .history 20 | CNAME 21 | /build 22 | /public 23 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | singleQuote: true, 3 | trailingComma: 'all', 4 | printWidth: 100, 5 | proseWrap: 'never', 6 | endOfLine: 'lf', 7 | overrides: [ 8 | { 9 | files: '.prettierrc', 10 | options: { 11 | parser: 'json', 12 | }, 13 | }, 14 | { 15 | files: 'document.ejs', 16 | options: { 17 | parser: 'html', 18 | }, 19 | }, 20 | ], 21 | plugins: [ 22 | 'prettier-plugin-organize-imports', 23 | 'prettier-plugin-packagejson', 24 | 'prettier-plugin-two-style-order', 25 | ], 26 | }; 27 | -------------------------------------------------------------------------------- /config/defaultSettings.ts: -------------------------------------------------------------------------------- 1 | import { ProLayoutProps } from '@ant-design/pro-components'; 2 | 3 | /** 4 | * @name 5 | */ 6 | const Settings: ProLayoutProps & { 7 | pwa?: boolean; 8 | logo?: string; 9 | } = { 10 | navTheme: 'light', 11 | // 拂晓蓝 12 | colorPrimary: '#1890ff', 13 | layout: 'top', 14 | contentWidth: 'Fluid', 15 | fixedHeader: true, 16 | fixSiderbar: true, 17 | colorWeak: false, 18 | title: '威胁情报利用平台', 19 | menu: { 20 | locale: false 21 | }, 22 | pwa: true, 23 | iconfontUrl: '', 24 | token: { 25 | // 参见ts声明,demo 见文档,通过token 修改样式 26 | //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 27 | }, 28 | }; 29 | 30 | export default Settings; 31 | -------------------------------------------------------------------------------- /config/proxy.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @name 代理的配置 3 | * @see 在生产环境 代理是无法生效的,所以这里没有生产环境的配置 4 | * ------------------------------- 5 | * The agent cannot take effect in the production environment 6 | * so there is no configuration of the production environment 7 | * For details, please see 8 | * https://pro.ant.design/docs/deploy 9 | * 10 | * @doc https://umijs.org/docs/guides/proxy 11 | */ 12 | export default { 13 | // 如果需要自定义本地开发服务器 请取消注释按需调整 14 | // dev: { 15 | // // localhost:8000/api/** -> https://preview.pro.ant.design/api/** 16 | // '/api/': { 17 | // // 要代理的地址 18 | // target: 'https://preview.pro.ant.design', 19 | // // 配置了这个可以从 http 代理到 https 20 | // // 依赖 origin 的功能可能需要这个,比如 cookie 21 | // changeOrigin: true, 22 | // }, 23 | // }, 24 | 25 | /** 26 | * @name 详细的代理配置 27 | * @doc https://github.com/chimurai/http-proxy-middleware 28 | */ 29 | test: { 30 | // localhost:8000/api/** -> https://preview.pro.ant.design/api/** 31 | '/api/': { 32 | target: 'https://proapi.azurewebsites.net', 33 | changeOrigin: true, 34 | pathRewrite: { '^': '' }, 35 | }, 36 | }, 37 | pre: { 38 | '/api/': { 39 | target: 'your pre url', 40 | changeOrigin: true, 41 | pathRewrite: { '^': '' }, 42 | }, 43 | }, 44 | }; 45 | -------------------------------------------------------------------------------- /config/routes.ts: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | path: '/user', 4 | layout: false, 5 | routes: [ 6 | { path: '/user/login', component: './User/Login' }, 7 | { path: '/user/register', component: './User/Register' }, 8 | ], 9 | }, 10 | { path: '/welcome', layout: false, icon: 'smile', component: './Welcome', name: '欢迎页' }, 11 | { 12 | path: '/information', 13 | icon: 'PieChartOutlined', 14 | name: '平台信息', 15 | component: './Home', 16 | }, 17 | { 18 | path: '/search', 19 | icon: 'PieChartOutlined', 20 | name: '平台信息', 21 | component: './Search', 22 | hideInMenu: true, 23 | }, 24 | { 25 | path: '/cti', 26 | icon: 'crown', 27 | name: '威胁情报', 28 | routes: [ 29 | { path: '/cti', redirect: '/cti/show' }, 30 | { 31 | path: '/cti/card/show', 32 | component: './Cti/CtiCardShow', 33 | name: '威胁情报展示', 34 | }, 35 | { 36 | path: '/cti/show', 37 | component: './Cti/CtiShow', 38 | name: '威胁情报管理', 39 | }, 40 | { path: '/cti/item/show', component: './Cti/ItemShow', name: '实体类型管理' }, 41 | { path: '/cti/relation/show', component: './Cti/RelationShow', name: '实体关系管理' }, 42 | ], 43 | }, 44 | { 45 | name: "威胁情报管理", 46 | path: '/cti/show', // 注意这里的路径调整 47 | routes: [ 48 | { 49 | path: '/cti/show/graph/:id', 50 | component: './Cti/Graph', 51 | name: '威胁情报图谱', 52 | }, 53 | { 54 | path: '/cti/show/anno/:id', 55 | component: './Cti/Annotation', 56 | name: '威胁情报标注', 57 | }, 58 | { 59 | path: '/cti/show/detail/:id', 60 | component: './Cti/Detail', 61 | name: '威胁情报内容', 62 | hideInMenu: true, 63 | }, 64 | ], 65 | parentKeys: ['/cti'], // 父级属性 66 | hideInMenu: true, 67 | }, 68 | { 69 | path: '/chat', 70 | icon: 'AppstoreAddOutlined', 71 | name: '大模型', 72 | routes: [ 73 | // { path: '/chat', redirect: '/cti/show' }, 74 | { path: '/chat/show', component: './Chat', name: '大模型Demo' }, 75 | { path: '/chat/llm', component: './Chat/LlmChat', name: '大模型对话' }, 76 | // { path: '/cti/anno', component: './Cti/Annotation', name: '威胁情报标注' }, 77 | ], 78 | }, 79 | { 80 | path: '/admin', 81 | icon: 'SettingOutlined', 82 | name: '管理页', 83 | access: 'canAdmin', 84 | routes: [ 85 | { path: '/admin', redirect: '/admin/user' }, 86 | { icon: 'table', path: '/admin/user', component: './Admin/User', name: '用户管理' }, 87 | ], 88 | }, 89 | { path: '/', redirect: '/welcome' }, 90 | { path: '*', layout: false, component: './404' }, 91 | { path: '/pressure', layout: false, component: './Pressure' }, 92 | ]; 93 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "react-jsx", 4 | "emitDecoratorMetadata": true, 5 | "experimentalDecorators": true, 6 | "baseUrl": ".", 7 | "paths": { 8 | "@/*": [ 9 | "./src/*" 10 | ] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /public/banner.2fbaee3a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/public/banner.2fbaee3a.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/public/favicon.ico -------------------------------------------------------------------------------- /public/graphicon/amplifg.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/graphicon/boost.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/graphicon/expand.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/graphicon/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/graphicon/socket.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/graphicon/zoom.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/hot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/public/hot.gif -------------------------------------------------------------------------------- /public/hot.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 热点 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /public/pro_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/scripts/inf_debugger.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | function ban() { 3 | setInterval(() => { debugger; }, 50); 4 | } 5 | try { 6 | ban(); 7 | } catch (err) { } 8 | })(); 9 | -------------------------------------------------------------------------------- /src/access.ts: -------------------------------------------------------------------------------- 1 | import ACCESS_ENUM from "@/constants/access/accessEnum"; 2 | 3 | /** 4 | * @see https://umijs.org/zh-CN/plugins/plugin-access 5 | * */ 6 | export default function access(initialState: { currentUser?: API.LoginUserVO } | undefined) { 7 | const { currentUser } = initialState ?? {}; 8 | return { 9 | canUser: currentUser, 10 | canAdmin: currentUser && currentUser.userRole === ACCESS_ENUM.ADMIN, 11 | }; 12 | } 13 | -------------------------------------------------------------------------------- /src/components/AnnotationComponent/EntityItem/index.tsx: -------------------------------------------------------------------------------- 1 | import { CloseOutlined } from '@ant-design/icons'; 2 | import '@umijs/max'; 3 | import React from 'react'; 4 | 5 | interface Props { 6 | id: number; 7 | text: string | null; 8 | label: string | null; 9 | color: string | null; 10 | removeEntity?: (annotationId: number) => void; 11 | } 12 | 13 | const EntityItem: React.FC = (props) => { 14 | const { id, text, label, color, removeEntity} = props; 15 | 16 | const idealColor = (hexString: string) => { 17 | // W3c offers a formula for calculating ideal color: 18 | // https://www.w3.org/TR/AERT/#color-contrast 19 | const r = parseInt(hexString.substr(1, 2), 16); 20 | const g = parseInt(hexString.substr(3, 2), 16); 21 | const b = parseInt(hexString.substr(5, 2), 16); 22 | return (r * 299 + g * 587 + b * 114) / 1000 < 128 ? '#ffffff' : '#000000'; 23 | }; 24 | 25 | return ( 26 | <> 27 | {label && color && id ? ( 28 | 29 | 30 | {text} 31 | removeEntity?.(id)} className="delete" /> 32 | 33 | 38 | 39 | ) : ( 40 | {text} 41 | )} 42 | 43 | ); 44 | }; 45 | export default EntityItem; 46 | -------------------------------------------------------------------------------- /src/components/AnnotationComponent/css/entityStyle.css: -------------------------------------------------------------------------------- 1 | .highlight.blue { 2 | background: #edf4fa !important; 3 | } 4 | 5 | .highlight.bottom { 6 | display: block; 7 | white-space: normal; 8 | } 9 | 10 | .highlight:first-child { 11 | margin-left: 0; 12 | } 13 | 14 | .highlight { 15 | border: 2px solid; 16 | margin: 4px 6px 4px 3px; 17 | vertical-align: middle; 18 | box-shadow: 2px 4px 20px rgba(0, 0, 0, 0.1); 19 | position: relative; 20 | cursor: default; 21 | min-width: 26px; 22 | line-height: 22px; 23 | text-align: center; 24 | } 25 | 26 | .highlight .delete { 27 | top: -15px; 28 | left: -13px; 29 | position: absolute; 30 | display: none; 31 | } 32 | 33 | .highlight:hover .delete { 34 | display: block; 35 | } 36 | 37 | .highlight__content { 38 | text-align: center; 39 | flex-wrap: wrap; 40 | align-items: center; 41 | padding: 2px 2px 0px 6px; 42 | } 43 | 44 | .highlight.bottom .highlight__content:after { 45 | content: " "; 46 | padding-right: 3px; 47 | } 48 | 49 | .highlight__label { 50 | line-height: 14px; 51 | padding-top: 1px; 52 | align-items: center; 53 | justify-content: center; 54 | display: flex; 55 | padding: 0 8px; 56 | text-align: center; 57 | -webkit-user-select: none; 58 | -moz-user-select: none; 59 | -ms-user-select: none; 60 | user-select: none; 61 | color: white; 62 | } 63 | 64 | .highlight__label::after { 65 | content: attr(data-label); 66 | display: block; 67 | font-size: 14px; 68 | -webkit-font-smoothing: subpixel-antialiased; 69 | letter-spacing: 0.1em; 70 | } 71 | 72 | .highlight-container.highlight-container--bottom-labels { 73 | align-items: flex-start; 74 | } 75 | 76 | .highlight-container { 77 | line-height: 42px !important; 78 | display: flex; 79 | position: relative; 80 | flex-wrap: wrap; 81 | white-space: pre-wrap; 82 | cursor: default; 83 | } 84 | 85 | .highlight-container.highlight-container--bottom-labels .highlight.bottom { 86 | margin-top: 6px; 87 | } 88 | 89 | .normal-text { 90 | display: inline; 91 | white-space: normal; 92 | word-break: break-word; 93 | flex-shrink: 1; 94 | } 95 | 96 | .entity-list-item { 97 | transition: background-color 0.3s, color 0.3s; /* 添加过渡效果 */ 98 | } 99 | 100 | .entity-list-item:hover { 101 | background-color: #dcdcdc; 102 | border: none; 103 | cursor: pointer; 104 | } 105 | 106 | .entity-list { 107 | min-width: 150px; 108 | max-height: 400px; 109 | overflow-y: auto; 110 | } 111 | 112 | 113 | /* 适用于整个.sticky-column类的自定义滚动条样式 */ 114 | .entity-list::-webkit-scrollbar { 115 | width: 8px; /* 设置滚动条的宽度 */ 116 | background-color: #f5f5f5; /* 滚动条的背景色 */ 117 | } 118 | 119 | .entity-list::-webkit-scrollbar-thumb { 120 | border-radius: 10px; /* 滚动条的圆角 */ 121 | background-color: #999898; /* 滚动条本身的颜色 */ 122 | box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); /* 滚动条的阴影效果 */ 123 | } 124 | 125 | .entity-list::-webkit-scrollbar-track { 126 | border-radius: 10px; /* 滚动轨道的圆角 */ 127 | background-color: #f5f5f5; /* 滚动轨道的背景色 */ 128 | box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1); /* 滚动轨道的阴影效果 */ 129 | } 130 | 131 | -------------------------------------------------------------------------------- /src/components/AnnotationComponent/types/AnnotationChunkType.d.ts: -------------------------------------------------------------------------------- 1 | interface ChunkType { 2 | id?: number; 3 | text: string | null; 4 | label: string | null; 5 | color: string | null; 6 | } 7 | -------------------------------------------------------------------------------- /src/components/FloatButtonComponent/index.tsx: -------------------------------------------------------------------------------- 1 | import '@/components/FloatButtonComponent/style/floatStyle.css'; 2 | import {QrcodeOutlined, WechatOutlined} from '@ant-design/icons'; 3 | import { FloatButton, Image } from 'antd'; 4 | import React from 'react'; 5 | 6 | /** 7 | * 存放页面右下方微信小程序的悬浮按钮,还有回到顶部按钮 8 | * @constructor 9 | */ 10 | const PageFloatButton: React.FC = () => { 11 | 12 | return ( 13 | <> 14 |
15 | 16 | 17 | } 22 | /> 23 |
24 | 28 |
29 | 30 | } 35 | /> 36 |
37 | 41 |
42 |
43 |
44 | 45 | ); 46 | }; 47 | 48 | export default PageFloatButton; 49 | -------------------------------------------------------------------------------- /src/components/FloatButtonComponent/style/floatStyle.css: -------------------------------------------------------------------------------- 1 | .float-container { 2 | position: relative; 3 | 4 | .wechat-button { 5 | 6 | } 7 | 8 | .float-miniprogramme{ 9 | position: absolute; 10 | bottom: 40px; 11 | right: 50px; 12 | display: block; 13 | opacity: 0; 14 | transform: translateY(-10px) scale(0.8); 15 | pointer-events: none; 16 | transition: opacity 0.3s ease, transform 0.3s ease; 17 | z-index: 9999; 18 | } 19 | 20 | .wechat-button:hover + .float-miniprogramme { 21 | opacity: 1; 22 | transform: translateY(0) scale(1); 23 | } 24 | 25 | .float-gzh{ 26 | position: absolute; 27 | bottom: -30px; 28 | right: 50px; 29 | display: block; 30 | opacity: 0; 31 | transform: translateY(-10px) scale(0.8); 32 | pointer-events: none; 33 | transition: opacity 0.3s ease, transform 0.3s ease; 34 | z-index: 9999; 35 | } 36 | 37 | .gzh-button:hover + .float-gzh { 38 | opacity: 1; 39 | transform: translateY(0) scale(1); 40 | } 41 | 42 | } 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/components/Footer/index.tsx: -------------------------------------------------------------------------------- 1 | import { GithubOutlined } from '@ant-design/icons'; 2 | import { DefaultFooter } from '@ant-design/pro-components'; 3 | import '@umijs/max'; 4 | import React from 'react'; 5 | 6 | const Footer: React.FC = () => { 7 | const defaultMessage = 'YxnMiracle'; 8 | const currentYear = new Date().getFullYear(); 9 | return ( 10 | 26 | 34 | 粤ICP备2021016064号 35 | 36 | ), 37 | href: 'https://beian.miit.gov.cn/', 38 | blankTarget: true, 39 | }, 40 | { 41 | key: 'github', 42 | title: ( 43 | <> 44 | GitHub 45 | 46 | ), 47 | href: 'https://github.com/YxinMiracle/alsap_frontend', 48 | blankTarget: true, 49 | }, 50 | ]} 51 | /> 52 | ); 53 | }; 54 | export default Footer; 55 | -------------------------------------------------------------------------------- /src/components/GraphComponent/JsxGraph/index.tsx: -------------------------------------------------------------------------------- 1 | import { useModel } from '@@/exports'; 2 | import G6 from '@antv/g6'; 3 | import '@umijs/max'; 4 | import React, { useEffect, useRef } from 'react'; 5 | 6 | interface Props { 7 | data: any; 8 | tagId: string; 9 | } 10 | 11 | const JsxGraph: React.FC = (props: Props) => { 12 | const { data, tagId } = props; 13 | 14 | const ref = useRef(null); 15 | 16 | const { initialState } = useModel('@@initialState'); 17 | 18 | /** 19 | * 根据系统当前的主题设定对应的背景颜色和字体颜色 20 | */ 21 | const setGraphTheme = () => { 22 | // 根据 navTheme 设置 fill 的颜色 23 | // @ts-ignore 24 | const navTheme = initialState.settings.navTheme; 25 | const fill = navTheme === 'light' ? 'rgba(0, 0, 0, 0.88)' : 'rgba(255, 255, 255, 0.85)'; 26 | data.edges.forEach((edge: any) => { 27 | edge.labelCfg = { 28 | refY: '7', 29 | style: { 30 | fill: fill, 31 | fontSize: '14', 32 | }, 33 | }; 34 | }); 35 | }; 36 | 37 | /** 38 | * 初始化图的样式 39 | */ 40 | const graphRegisterNode = () => { 41 | // 根据 navTheme 设置 fill 的颜色 42 | // @ts-ignore 43 | const navTheme = initialState.settings.navTheme; 44 | const fontFill = navTheme === 'light' ? '#000' : '#DDDDDD'; 45 | const backgroundFill = navTheme === 'light' ? '#ffffff' : '#1D1D1D'; 46 | G6.registerNode( 47 | 'rect-jsx', 48 | (cfg) => ` 49 | 50 | 51 | 59 | {{label}} 65 | 66 | 73 | 实体名称: {{meta.itemName}} 74 | 75 | 76 | `, 77 | ); 78 | }; 79 | // @ts-ignore 80 | useEffect(() => { 81 | if (ref.current) { 82 | setGraphTheme(); 83 | graphRegisterNode(); 84 | const container = ref.current; 85 | const graph = new G6.Graph({ 86 | container: container, 87 | width: 400, 88 | height: 100, 89 | // translate the graph to align the canvas's center, support by v3.5.1 90 | fitCenter: true, 91 | modes: { 92 | default: ['drag-node', 'zoom-canvas'], 93 | }, 94 | }); 95 | graph.data(data); 96 | graph.render(); 97 | // 返回清理函数 98 | return () => { 99 | graph.destroy(); // 销毁图表实例 100 | }; 101 | } 102 | }, [data]); // 依赖项数组中包括data,确保数据更新时可以重新渲染 103 | 104 | return ( 105 | <> 106 |
107 | 108 | ); 109 | }; 110 | export default JsxGraph; 111 | -------------------------------------------------------------------------------- /src/components/GraphComponent/style/graphDrawerStyle.css: -------------------------------------------------------------------------------- 1 | :where(.css-dev-only-do-not-override-r7v25l).ant-descriptions .ant-descriptions-item-container .ant-descriptions-item-content { 2 | display: block; 3 | align-items: baseline; 4 | min-width: 0; 5 | width: 100%; 6 | } 7 | 8 | .graph_view { 9 | height: 130px; 10 | width: 50px; 11 | border: 1px solid #fff; 12 | position: absolute; 13 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.521); 14 | background-color: rgb(247, 247, 247); 15 | border-radius: 10px; 16 | right: 10px; 17 | bottom: 10px; 18 | display: flex; 19 | flex-direction: column; 20 | align-items: center; 21 | justify-content: space-around; 22 | } 23 | 24 | #cti-graph-container { 25 | width: 100%; 26 | height: 750px; 27 | background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPjxkZWZzPjxwYXR0ZXJuIGlkPSJwYXR0ZXJuXzAiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCI+PHJlY3Qgd2lkdGg9IjEiIGhlaWdodD0iMSIgcng9IjEiIHJ5PSIxIiBmaWxsPSIjYWFhYWFhIi8+PC9wYXR0ZXJuPjwvZGVmcz48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI3BhdHRlcm5fMCkiLz48L3N2Zz4=); 28 | z-index: 1001 29 | } 30 | 31 | #cti-graph-minimap { 32 | position: absolute; 33 | width: 230px; 34 | height: 130px; 35 | top: 16px; 36 | right: 16px; 37 | border: 2px #d6d5d5 solid; 38 | background-color: #efefef 39 | } 40 | 41 | .g6-component-toolbar { 42 | position: absolute; 43 | list-style-type: none; 44 | padding: 16px; 45 | left: auto !important; 46 | top: auto !important; 47 | right: 16px !important; 48 | bottom: 16px !important; 49 | background-color: rgba(255, 255, 255, 0.9); 50 | border: 1px solid #e2e2e2; 51 | border-radius: 10px; 52 | box-shadow: 0 0 6px rgba(0, 0, 0, .521); 53 | font-size: 12px; 54 | color: #545454; 55 | display: flex; /* 添加flex布局 */ 56 | flex-direction: column; /* 设置主轴为垂直方向 */ 57 | } 58 | 59 | .g6-component-toolbar li { 60 | text-align: center; 61 | width: 100%; /* 设置宽度为100%,使每个列表项占满容器宽度 */ 62 | height: 24px; 63 | cursor: pointer; 64 | list-style-type: none; 65 | margin: 6px 0; /* 添加上下边距以分隔列表项,可以根据需要调整 */ 66 | } 67 | 68 | 69 | .g6-component-toolbar li:last-child { 70 | border-bottom: none; /* 最后一个列表项不添加分割线 */ 71 | } 72 | 73 | .g6-minimap { 74 | width: 100% !important; 75 | height: 100%!important; 76 | overflow: hidden; 77 | } 78 | 79 | .g6-minimap canvas { 80 | width: 100% !important; 81 | height: 100%!important; 82 | } 83 | -------------------------------------------------------------------------------- /src/components/HeaderDropdown/index.tsx: -------------------------------------------------------------------------------- 1 | import { useEmotionCss } from '@ant-design/use-emotion-css'; 2 | import { Dropdown } from 'antd'; 3 | import type { DropDownProps } from 'antd/es/dropdown'; 4 | import classNames from 'classnames'; 5 | import React from 'react'; 6 | 7 | export type HeaderDropdownProps = { 8 | overlayClassName?: string; 9 | placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topCenter' | 'topRight' | 'bottomCenter'; 10 | } & Omit; 11 | 12 | const HeaderDropdown: React.FC = ({ overlayClassName: cls, ...restProps }) => { 13 | const className = useEmotionCss(({ token }) => { 14 | return { 15 | [`@media screen and (max-width: ${token.screenXS})`]: { 16 | width: '100%', 17 | }, 18 | }; 19 | }); 20 | return ; 21 | }; 22 | 23 | export default HeaderDropdown; 24 | -------------------------------------------------------------------------------- /src/components/Image/index.tsx: -------------------------------------------------------------------------------- 1 | import { Skeleton } from 'antd'; 2 | import React, { useState } from 'react'; 3 | 4 | interface Props { 5 | src: string; 6 | alt?: string; 7 | style?: any; 8 | } 9 | 10 | const ImageLoader: React.FC = (props: Props) => { 11 | const { src, alt, style } = props; 12 | const [loaded, setLoaded] = useState(false); 13 | const [opacity, setOpacity] = useState(0); 14 | 15 | const handleImageLoaded = () => { 16 | setLoaded(true); 17 | setOpacity(1); 18 | }; 19 | 20 | const imageStyle = { 21 | ...style, 22 | opacity: opacity, 23 | transition: 'opacity 1s ease-in-out', // 平滑过渡效果 24 | }; 25 | 26 | return ( 27 |
28 | {!loaded && ( 29 | 30 | )} 31 | {alt} setLoaded(false)} 37 | /> 38 |
39 | ); 40 | }; 41 | 42 | export default ImageLoader; 43 | -------------------------------------------------------------------------------- /src/components/MarkdownComponent/index.tsx: -------------------------------------------------------------------------------- 1 | //@ts-ignore 2 | import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; 3 | //@ts-ignore 4 | import Markdown from 'react-markdown'; 5 | //@ts-ignore 6 | import { coldarkDark } from 'react-syntax-highlighter/dist/esm/styles/prism'; 7 | 8 | interface Props { 9 | message: string; 10 | } 11 | 12 | const MarkdownLoader: React.FC = (props: Props) => { 13 | const { message } = props; 14 | 15 | return ( 16 | 24 | {String(children).replace(/\n$/, '')} 25 | 26 | ) : ( 27 | 28 | {children} 29 | 30 | ); 31 | }, 32 | }} 33 | > 34 | {message} 35 | 36 | ); 37 | }; 38 | 39 | export default MarkdownLoader; 40 | -------------------------------------------------------------------------------- /src/constants/access/accessEnum.ts: -------------------------------------------------------------------------------- 1 | const ACCESS_ENUM = { 2 | NOT_LOGIN: "notLogin", 3 | USER: "user", 4 | ADMIN: "admin", 5 | }; 6 | 7 | export default ACCESS_ENUM; 8 | -------------------------------------------------------------------------------- /src/constants/car/carConstants.ts: -------------------------------------------------------------------------------- 1 | import { gsap } from 'gsap/all'; 2 | 3 | export interface CarInfo { 4 | id: string; 5 | duration: number; 6 | ease: string; 7 | position: { x: number; y: number }; 8 | repeat: number; 9 | repeatDelay: number; 10 | sound_effect: string; 11 | } 12 | 13 | export interface CarData { 14 | dom: Element; 15 | effect: gsap.core.Tween; 16 | listener: { click: () => void; dbclick: () => void }; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/constants/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 本地后端地址 3 | */ 4 | // export const BACKEND_HOST_LOCAL = 'http://localhost:8763'; 5 | export const BACKEND_HOST_LOCAL = 'https://alsap.tracesec.cn'; 6 | 7 | /** 8 | * 线上后端地址 9 | */ 10 | export const BACKEND_HOST_PROD = 'https://alsap.tracesec.cn'; 11 | 12 | export const COS_HOST = "https://cdn.yxinmiracle.com"; 13 | -------------------------------------------------------------------------------- /src/constants/ruleType/RuleEnum.ts: -------------------------------------------------------------------------------- 1 | export const RULE_TYPE_ENUM = { 2 | YARA_RULE: "yara", 3 | SNORT_RULE: "snort", 4 | }; 5 | 6 | export const RULE_TYPE_INTEGER_ENUM = { 7 | YARA_RULE: 1, 8 | SNORT_RULE: 2, 9 | }; 10 | 11 | export const RULE_LLM_RESULT_ENUM = { 12 | 1: { color: "error", text: "还未请求LLM" }, 13 | 2: { color: "processing", text: "已经请求LLM" }, 14 | 3: { color: "success", text: "已经获取规则数据" }, 15 | 4: { color: "error", text: "规则构建失败" }, 16 | }; 17 | 18 | export const RULE_FILE_RESULT_ENUM = { 19 | 1: { color: "error", text: "还未生成规则文件" }, 20 | 2: { color: "success", text: "已经生成规则文件" }, 21 | }; 22 | 23 | export const RULE_REQUEST_TYPE_ENUM = { 24 | CREATE_RULE: 1, 25 | UPDATE_RULE: 2, 26 | }; 27 | -------------------------------------------------------------------------------- /src/global.less: -------------------------------------------------------------------------------- 1 | .colorWeak { 2 | filter: invert(80%); 3 | } 4 | 5 | .ant-layout { 6 | min-height: 100vh; 7 | } 8 | 9 | .ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed { 10 | left: unset; 11 | } 12 | 13 | canvas { 14 | display: block; 15 | } 16 | 17 | body { 18 | text-rendering: optimizeLegibility; 19 | -webkit-font-smoothing: antialiased; 20 | -moz-osx-font-smoothing: grayscale; 21 | } 22 | 23 | ul, 24 | ol { 25 | list-style: none; 26 | } 27 | 28 | @media (max-width: 768px) { 29 | .ant-table { 30 | width: 100%; 31 | overflow-x: auto; 32 | 33 | &-thead > tr, 34 | &-tbody > tr { 35 | > th, 36 | > td { 37 | white-space: pre; 38 | 39 | > span { 40 | display: block; 41 | } 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/global.style.ts: -------------------------------------------------------------------------------- 1 | import { createStyles } from 'antd-style'; 2 | 3 | const useStyles = createStyles(({}) => { 4 | return { 5 | colorWeak: { 6 | filter: 'invert(80%)', 7 | }, 8 | 'ant-layout': { 9 | minHeight: '100vh', 10 | }, 11 | 'ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed': { 12 | left: 'unset', 13 | }, 14 | canvas: { 15 | display: 'block', 16 | }, 17 | body: { 18 | textRendering: 'optimizeLegibility', 19 | WebkitFontSmoothing: 'antialiased', 20 | MozOsxFontSmoothing: 'grayscale', 21 | }, 22 | 'ul,ol': { 23 | listStyle: 'none', 24 | }, 25 | '@media(max-width: 768px)': { 26 | 'ant-table': { 27 | width: '100%', 28 | overflowX: 'auto', 29 | '&-thead > tr, &-tbody > tr': { 30 | '> th, > td': { 31 | whiteSpace: 'pre', 32 | '> span': { 33 | display: 'block', 34 | }, 35 | }, 36 | }, 37 | }, 38 | }, 39 | }; 40 | }); 41 | 42 | export default useStyles; 43 | -------------------------------------------------------------------------------- /src/global.tsx: -------------------------------------------------------------------------------- 1 | import { useIntl } from '@umijs/max'; 2 | import { Button, message, notification } from 'antd'; 3 | import defaultSettings from '../config/defaultSettings'; 4 | 5 | const { pwa } = defaultSettings; 6 | const isHttps = document.location.protocol === 'https:'; 7 | 8 | const clearCache = () => { 9 | // remove all caches 10 | if (window.caches) { 11 | caches 12 | .keys() 13 | .then((keys) => { 14 | keys.forEach((key) => { 15 | caches.delete(key); 16 | }); 17 | }) 18 | .catch((e) => console.log(e)); 19 | } 20 | }; 21 | 22 | // if pwa is true 23 | if (pwa) { 24 | // Notify user if offline now 25 | window.addEventListener('sw.offline', () => { 26 | message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' })); 27 | }); 28 | 29 | // Pop up a prompt on the page asking the user if they want to use the latest version 30 | window.addEventListener('sw.updated', (event: Event) => { 31 | const e = event as CustomEvent; 32 | const reloadSW = async () => { 33 | // Check if there is sw whose state is waiting in ServiceWorkerRegistration 34 | // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration 35 | const worker = e.detail && e.detail.waiting; 36 | if (!worker) { 37 | return true; 38 | } 39 | // Send skip-waiting event to waiting SW with MessageChannel 40 | await new Promise((resolve, reject) => { 41 | const channel = new MessageChannel(); 42 | channel.port1.onmessage = (msgEvent) => { 43 | if (msgEvent.data.error) { 44 | reject(msgEvent.data.error); 45 | } else { 46 | resolve(msgEvent.data); 47 | } 48 | }; 49 | worker.postMessage({ type: 'skip-waiting' }, [channel.port2]); 50 | }); 51 | 52 | clearCache(); 53 | window.location.reload(); 54 | return true; 55 | }; 56 | const key = `open${Date.now()}`; 57 | const btn = ( 58 | 67 | ); 68 | notification.open({ 69 | message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }), 70 | description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }), 71 | btn, 72 | key, 73 | onClose: async () => null, 74 | }); 75 | }); 76 | } else if ('serviceWorker' in navigator && isHttps) { 77 | // unregister service worker 78 | const { serviceWorker } = navigator; 79 | if (serviceWorker.getRegistrations) { 80 | serviceWorker.getRegistrations().then((sws) => { 81 | sws.forEach((sw) => { 82 | sw.unregister(); 83 | }); 84 | }); 85 | } 86 | serviceWorker.getRegistration().then((sw) => { 87 | if (sw) sw.unregister(); 88 | }); 89 | 90 | clearCache(); 91 | } 92 | -------------------------------------------------------------------------------- /src/locales/bn-BD.ts: -------------------------------------------------------------------------------- 1 | import component from './bn-BD/component'; 2 | import globalHeader from './bn-BD/globalHeader'; 3 | import menu from './bn-BD/menu'; 4 | import pages from './bn-BD/pages'; 5 | import pwa from './bn-BD/pwa'; 6 | import settingDrawer from './bn-BD/settingDrawer'; 7 | import settings from './bn-BD/settings'; 8 | 9 | export default { 10 | 'navBar.lang': 'ভাষা', 11 | 'layout.user.link.help': 'সহায়তা', 12 | 'layout.user.link.privacy': 'গোপনীয়তা', 13 | 'layout.user.link.terms': 'শর্তাদি', 14 | 'app.preview.down.block': 'আপনার স্থানীয় প্রকল্পে এই পৃষ্ঠাটি ডাউনলোড করুন', 15 | 'app.welcome.link.fetch-blocks': 'সমস্ত ব্লক পান', 16 | 'app.welcome.link.block-list': 17 | '`block` ডেভেলপমেন্ট এর উপর ভিত্তি করে দ্রুত স্ট্যান্ডার্ড, পৃষ্ঠাসমূহ তৈরি করুন।', 18 | ...globalHeader, 19 | ...menu, 20 | ...settingDrawer, 21 | ...settings, 22 | ...pwa, 23 | ...component, 24 | ...pages, 25 | }; 26 | -------------------------------------------------------------------------------- /src/locales/bn-BD/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': 'বিস্তৃত', 3 | 'component.tagSelect.collapse': 'সঙ্কুচিত', 4 | 'component.tagSelect.all': 'সব', 5 | }; 6 | -------------------------------------------------------------------------------- /src/locales/bn-BD/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': 'অনুসন্ধান করুন', 3 | 'component.globalHeader.search.example1': 'অনুসন্ধান উদাহরণ ১', 4 | 'component.globalHeader.search.example2': 'অনুসন্ধান উদাহরণ ২', 5 | 'component.globalHeader.search.example3': 'অনুসন্ধান উদাহরণ ৩', 6 | 'component.globalHeader.help': 'সহায়তা', 7 | 'component.globalHeader.notification': 'বিজ্ঞপ্তি', 8 | 'component.globalHeader.notification.empty': 'আপনি সমস্ত বিজ্ঞপ্তি দেখেছেন।', 9 | 'component.globalHeader.message': 'বার্তা', 10 | 'component.globalHeader.message.empty': 'আপনি সমস্ত বার্তা দেখেছেন।', 11 | 'component.globalHeader.event': 'ঘটনা', 12 | 'component.globalHeader.event.empty': 'আপনি সমস্ত ইভেন্ট দেখেছেন।', 13 | 'component.noticeIcon.clear': 'সাফ', 14 | 'component.noticeIcon.cleared': 'সাফ করা হয়েছে', 15 | 'component.noticeIcon.empty': 'বিজ্ঞপ্তি নেই', 16 | 'component.noticeIcon.view-more': 'আরো দেখুন', 17 | }; 18 | -------------------------------------------------------------------------------- /src/locales/bn-BD/menu.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'menu.welcome': 'স্বাগতম', 3 | 'menu.more-blocks': 'আরও ব্লক', 4 | 'menu.home': 'নীড়', 5 | 'menu.admin': 'অ্যাডমিন', 6 | 'menu.admin.sub-page': 'উপ-পৃষ্ঠা', 7 | 'menu.login': 'প্রবেশ', 8 | 'menu.register': 'নিবন্ধন', 9 | 'menu.register-result': 'নিবন্ধনে ফলাফল', 10 | 'menu.dashboard': 'ড্যাশবোর্ড', 11 | 'menu.dashboard.analysis': 'বিশ্লেষণ', 12 | 'menu.dashboard.monitor': 'নিরীক্ষণ', 13 | 'menu.dashboard.workplace': 'কর্মক্ষেত্র', 14 | 'menu.exception.403': '403', 15 | 'menu.exception.404': '404', 16 | 'menu.exception.500': '500', 17 | 'menu.form': 'ফর্ম', 18 | 'menu.form.basic-form': 'বেসিক ফর্ম', 19 | 'menu.form.step-form': 'পদক্ষেপ ফর্ম', 20 | 'menu.form.step-form.info': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য লিখুন)', 21 | 'menu.form.step-form.confirm': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য নিশ্চিত করুন)', 22 | 'menu.form.step-form.result': 'পদক্ষেপ ফর্ম (সমাপ্ত)', 23 | 'menu.form.advanced-form': 'উন্নত ফর্ম', 24 | 'menu.list': 'তালিকা', 25 | 'menu.list.table-list': 'অনুসন্ধানের টেবিল', 26 | 'menu.list.basic-list': 'বেসিক তালিকা', 27 | 'menu.list.card-list': 'কার্ডের তালিকা', 28 | 'menu.list.search-list': 'অনুসন্ধানের তালিকা', 29 | 'menu.list.search-list.articles': 'অনুসন্ধানের তালিকা (নিবন্ধসমূহ)', 30 | 'menu.list.search-list.projects': 'অনুসন্ধানের তালিকা (প্রকল্পগুলি)', 31 | 'menu.list.search-list.applications': 'অনুসন্ধানের তালিকা (অ্যাপ্লিকেশন)', 32 | 'menu.profile': 'প্রোফাইল', 33 | 'menu.profile.basic': 'বেসিক প্রোফাইল', 34 | 'menu.profile.advanced': 'উন্নত প্রোফাইল', 35 | 'menu.result': 'ফলাফল', 36 | 'menu.result.success': 'সাফল্য', 37 | 'menu.result.fail': 'ব্যর্থ', 38 | 'menu.exception': 'ব্যতিক্রম', 39 | 'menu.exception.not-permission': '403', 40 | 'menu.exception.not-find': '404', 41 | 'menu.exception.server-error': '500', 42 | 'menu.exception.trigger': 'ট্রিগার', 43 | 'menu.account': 'হিসাব', 44 | 'menu.account.center': 'অ্যাকাউন্ট কেন্দ্র', 45 | 'menu.account.settings': 'অ্যাকাউন্ট সেটিংস', 46 | 'menu.account.trigger': 'ট্রিগার ত্রুটি', 47 | 'menu.account.logout': 'প্রস্থান', 48 | 'menu.editor': 'গ্রাফিক সম্পাদক', 49 | 'menu.editor.flow': 'ফ্লো এডিটর', 50 | 'menu.editor.mind': 'মাইন্ড এডিটর', 51 | 'menu.editor.koni': 'কোনি সম্পাদক', 52 | }; 53 | -------------------------------------------------------------------------------- /src/locales/bn-BD/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'আপনি এখন অফলাইন', 3 | 'app.pwa.serviceworker.updated': 'নতুন সামগ্রী উপলব্ধ', 4 | 'app.pwa.serviceworker.updated.hint': 5 | 'বর্তমান পৃষ্ঠাটি পুনরায় লোড করতে দয়া করে "রিফ্রেশ" বোতাম টিপুন', 6 | 'app.pwa.serviceworker.updated.ok': 'রিফ্রেশ', 7 | }; 8 | -------------------------------------------------------------------------------- /src/locales/bn-BD/settingDrawer.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.setting.pagestyle': 'পৃষ্ঠা স্টাইল সেটিং', 3 | 'app.setting.pagestyle.dark': 'ডার্ক স্টাইল', 4 | 'app.setting.pagestyle.light': 'লাইট স্টাইল', 5 | 'app.setting.content-width': 'সামগ্রীর প্রস্থ', 6 | 'app.setting.content-width.fixed': 'স্থির', 7 | 'app.setting.content-width.fluid': 'প্রবাহী', 8 | 'app.setting.themecolor': 'থিম রঙ', 9 | 'app.setting.themecolor.dust': 'ডাস্ট রেড', 10 | 'app.setting.themecolor.volcano': 'আগ্নেয়গিরি', 11 | 'app.setting.themecolor.sunset': 'সানসেট কমলা', 12 | 'app.setting.themecolor.cyan': 'সবুজাভ নীল', 13 | 'app.setting.themecolor.green': 'পোলার সবুজ', 14 | 'app.setting.themecolor.daybreak': 'দিবস ব্রেক ব্লু (ডিফল্ট)', 15 | 'app.setting.themecolor.geekblue': 'গিক আঠালো', 16 | 'app.setting.themecolor.purple': 'গোল্ডেন বেগুনি', 17 | 'app.setting.navigationmode': 'নেভিগেশন মোড', 18 | 'app.setting.sidemenu': 'সাইড মেনু লেআউট', 19 | 'app.setting.topmenu': 'টপ মেনু লেআউট', 20 | 'app.setting.fixedheader': 'স্থির হেডার', 21 | 'app.setting.fixedsidebar': 'স্থির সাইডবার', 22 | 'app.setting.fixedsidebar.hint': 'সাইড মেনু বিন্যাসে কাজ করে', 23 | 'app.setting.hideheader': 'স্ক্রোল করার সময় হেডার লুকানো', 24 | 'app.setting.hideheader.hint': 'লুকানো হেডার সক্ষম থাকলে কাজ করে', 25 | 'app.setting.othersettings': 'অন্যান্য সেটিংস্', 26 | 'app.setting.weakmode': 'দুর্বল মোড', 27 | 'app.setting.copy': 'সেটিং কপি করুন', 28 | 'app.setting.copyinfo': 'সাফল্যের অনুলিপি করুন - প্রতিস্থাপন করুন: src/models/setting.js', 29 | 'app.setting.production.hint': 30 | 'কেবল বিকাশের পরিবেশে প্যানেল শো সেট করা হচ্ছে, দয়া করে ম্যানুয়ালি সংশোধন করুন', 31 | }; 32 | -------------------------------------------------------------------------------- /src/locales/bn-BD/settings.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.settings.menuMap.basic': 'মৌলিক বৈশিষ্ট্যসহ', 3 | 'app.settings.menuMap.security': 'নিরাপত্তা বিন্যাস', 4 | 'app.settings.menuMap.binding': 'অ্যাকাউন্ট বাঁধাই', 5 | 'app.settings.menuMap.notification': 'নতুন বার্তা বিজ্ঞপ্তি', 6 | 'app.settings.basic.avatar': 'অবতার', 7 | 'app.settings.basic.change-avatar': 'অবতার পরিবর্তন করুন', 8 | 'app.settings.basic.email': 'ইমেইল', 9 | 'app.settings.basic.email-message': 'আপনার ইমেইল ইনপুট করুন!', 10 | 'app.settings.basic.nickname': 'ডাক নাম', 11 | 'app.settings.basic.nickname-message': 'আপনার ডাকনামটি ইনপুট করুন!', 12 | 'app.settings.basic.profile': 'ব্যক্তিগত প্রোফাইল', 13 | 'app.settings.basic.profile-message': 'আপনার ব্যক্তিগত প্রোফাইল ইনপুট করুন!', 14 | 'app.settings.basic.profile-placeholder': 'নিজের সাথে সংক্ষিপ্ত পরিচয়', 15 | 'app.settings.basic.country': 'দেশ/অঞ্চল', 16 | 'app.settings.basic.country-message': 'আপনার দেশ ইনপুট করুন!', 17 | 'app.settings.basic.geographic': 'প্রদেশ বা শহর', 18 | 'app.settings.basic.geographic-message': 'আপনার ভৌগলিক তথ্য ইনপুট করুন!', 19 | 'app.settings.basic.address': 'রাস্তার ঠিকানা', 20 | 'app.settings.basic.address-message': 'দয়া করে আপনার ঠিকানা ইনপুট করুন!', 21 | 'app.settings.basic.phone': 'ফোন নম্বর', 22 | 'app.settings.basic.phone-message': 'আপনার ফোন ইনপুট করুন!', 23 | 'app.settings.basic.update': 'তথ্য হালনাগাদ', 24 | 'app.settings.security.strong': 'শক্তিশালী', 25 | 'app.settings.security.medium': 'মধ্যম', 26 | 'app.settings.security.weak': 'দুর্বল', 27 | 'app.settings.security.password': 'অ্যাকাউন্টের পাসওয়ার্ড', 28 | 'app.settings.security.password-description': 'বর্তমান পাসওয়ার্ড শক্তি', 29 | 'app.settings.security.phone': 'সুরক্ষা ফোন', 30 | 'app.settings.security.phone-description': 'আবদ্ধ ফোন', 31 | 'app.settings.security.question': 'নিরাপত্তা প্রশ্ন', 32 | 'app.settings.security.question-description': 33 | 'সুরক্ষা প্রশ্ন সেট করা নেই, এবং সুরক্ষা নীতি কার্যকরভাবে অ্যাকাউন্ট সুরক্ষা রক্ষা করতে পারে', 34 | 'app.settings.security.email': 'ব্যাকআপ ইমেইল', 35 | 'app.settings.security.email-description': 'বাউন্ড ইমেইল', 36 | 'app.settings.security.mfa': 'MFA ডিভাইস', 37 | 'app.settings.security.mfa-description': 38 | "আনবাউন্ড এমএফএ ডিভাইস, বাঁধাইয়ের পরে, দু'বার নিশ্চিত করা যায়", 39 | 'app.settings.security.modify': 'পরিবর্তন করুন', 40 | 'app.settings.security.set': 'সেট', 41 | 'app.settings.security.bind': 'বাঁধাই', 42 | 'app.settings.binding.taobao': 'বাঁধাই তাওবাও', 43 | 'app.settings.binding.taobao-description': 'বর্তমানে আনবাউন্ড তাওবাও অ্যাকাউন্ট', 44 | 'app.settings.binding.alipay': 'বাইন্ডিং আলিপে', 45 | 'app.settings.binding.alipay-description': 'বর্তমানে আনবাউন্ড আলিপে অ্যাকাউন্ট', 46 | 'app.settings.binding.dingding': 'বাঁধাই ডিঙ্গটালক', 47 | 'app.settings.binding.dingding-description': 'বর্তমানে আনবাউন্ড ডিঙ্গটাল অ্যাকাউন্ট', 48 | 'app.settings.binding.bind': 'বাঁধাই', 49 | 'app.settings.notification.password': 'অ্যাকাউন্টের পাসওয়ার্ড', 50 | 'app.settings.notification.password-description': 51 | 'অন্যান্য ব্যবহারকারীর বার্তাগুলি স্টেশন চিঠি আকারে জানানো হবে', 52 | 'app.settings.notification.messages': 'সিস্টেম বার্তা', 53 | 'app.settings.notification.messages-description': 54 | 'সিস্টেম বার্তাগুলি স্টেশন চিঠির আকারে জানানো হবে', 55 | 'app.settings.notification.todo': 'করণীয় বিজ্ঞপ্তি', 56 | 'app.settings.notification.todo-description': 'করণীয় তালিকাটি স্টেশন থেকে চিঠি আকারে জানানো হবে', 57 | 'app.settings.open': 'খোলা', 58 | 'app.settings.close': 'বন্ধ', 59 | }; 60 | -------------------------------------------------------------------------------- /src/locales/en-US.ts: -------------------------------------------------------------------------------- 1 | import component from './en-US/component'; 2 | import globalHeader from './en-US/globalHeader'; 3 | import menu from './en-US/menu'; 4 | import pages from './en-US/pages'; 5 | import pwa from './en-US/pwa'; 6 | import settingDrawer from './en-US/settingDrawer'; 7 | import settings from './en-US/settings'; 8 | 9 | export default { 10 | 'navBar.lang': 'Languages', 11 | 'layout.user.link.help': 'Help', 12 | 'layout.user.link.privacy': 'Privacy', 13 | 'layout.user.link.terms': 'Terms', 14 | 'app.preview.down.block': 'Download this page to your local project', 15 | 'app.welcome.link.fetch-blocks': 'Get all block', 16 | 'app.welcome.link.block-list': 'Quickly build standard, pages based on `block` development', 17 | ...globalHeader, 18 | ...menu, 19 | ...settingDrawer, 20 | ...settings, 21 | ...pwa, 22 | ...component, 23 | ...pages, 24 | }; 25 | -------------------------------------------------------------------------------- /src/locales/en-US/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': 'Expand', 3 | 'component.tagSelect.collapse': 'Collapse', 4 | 'component.tagSelect.all': 'All', 5 | }; 6 | -------------------------------------------------------------------------------- /src/locales/en-US/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': 'Search', 3 | 'component.globalHeader.search.example1': 'Search example 1', 4 | 'component.globalHeader.search.example2': 'Search example 2', 5 | 'component.globalHeader.search.example3': 'Search example 3', 6 | 'component.globalHeader.help': 'Help', 7 | 'component.globalHeader.notification': 'Notification', 8 | 'component.globalHeader.notification.empty': 'You have viewed all notifications.', 9 | 'component.globalHeader.message': 'Message', 10 | 'component.globalHeader.message.empty': 'You have viewed all messsages.', 11 | 'component.globalHeader.event': 'Event', 12 | 'component.globalHeader.event.empty': 'You have viewed all events.', 13 | 'component.noticeIcon.clear': 'Clear', 14 | 'component.noticeIcon.cleared': 'Cleared', 15 | 'component.noticeIcon.empty': 'No notifications', 16 | 'component.noticeIcon.view-more': 'View more', 17 | }; 18 | -------------------------------------------------------------------------------- /src/locales/en-US/menu.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'menu.welcome': 'Welcome', 3 | 'menu.more-blocks': 'More Blocks', 4 | 'menu.home': 'Home', 5 | 'menu.admin': 'Admin', 6 | 'menu.admin.sub-page': 'Sub-Page', 7 | 'menu.login': 'Login', 8 | 'menu.register': 'Register', 9 | 'menu.register-result': 'Register Result', 10 | 'menu.dashboard': 'Dashboard', 11 | 'menu.dashboard.analysis': 'Analysis', 12 | 'menu.dashboard.monitor': 'Monitor', 13 | 'menu.dashboard.workplace': 'Workplace', 14 | 'menu.exception.403': '403', 15 | 'menu.exception.404': '404', 16 | 'menu.exception.500': '500', 17 | 'menu.form': 'Form', 18 | 'menu.form.basic-form': 'Basic Form', 19 | 'menu.form.step-form': 'Step Form', 20 | 'menu.form.step-form.info': 'Step Form(write transfer information)', 21 | 'menu.form.step-form.confirm': 'Step Form(confirm transfer information)', 22 | 'menu.form.step-form.result': 'Step Form(finished)', 23 | 'menu.form.advanced-form': 'Advanced Form', 24 | 'menu.list': 'List', 25 | 'menu.list.table-list': 'Search Table', 26 | 'menu.list.basic-list': 'Basic List', 27 | 'menu.list.card-list': 'Card List', 28 | 'menu.list.search-list': 'Search List', 29 | 'menu.list.search-list.articles': 'Search List(articles)', 30 | 'menu.list.search-list.projects': 'Search List(projects)', 31 | 'menu.list.search-list.applications': 'Search List(applications)', 32 | 'menu.profile': 'Profile', 33 | 'menu.profile.basic': 'Basic Profile', 34 | 'menu.profile.advanced': 'Advanced Profile', 35 | 'menu.result': 'Result', 36 | 'menu.result.success': 'Success', 37 | 'menu.result.fail': 'Fail', 38 | 'menu.exception': 'Exception', 39 | 'menu.exception.not-permission': '403', 40 | 'menu.exception.not-find': '404', 41 | 'menu.exception.server-error': '500', 42 | 'menu.exception.trigger': 'Trigger', 43 | 'menu.account': 'Account', 44 | 'menu.account.center': 'Account Center', 45 | 'menu.account.settings': 'Account Settings', 46 | 'menu.account.trigger': 'Trigger Error', 47 | 'menu.account.logout': 'Logout', 48 | 'menu.editor': 'Graphic Editor', 49 | 'menu.editor.flow': 'Flow Editor', 50 | 'menu.editor.mind': 'Mind Editor', 51 | 'menu.editor.koni': 'Koni Editor', 52 | }; 53 | -------------------------------------------------------------------------------- /src/locales/en-US/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'You are offline now', 3 | 'app.pwa.serviceworker.updated': 'New content is available', 4 | 'app.pwa.serviceworker.updated.hint': 'Please press the "Refresh" button to reload current page', 5 | 'app.pwa.serviceworker.updated.ok': 'Refresh', 6 | }; 7 | -------------------------------------------------------------------------------- /src/locales/en-US/settingDrawer.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.setting.pagestyle': 'Page style setting', 3 | 'app.setting.pagestyle.dark': 'Dark style', 4 | 'app.setting.pagestyle.light': 'Light style', 5 | 'app.setting.content-width': 'Content Width', 6 | 'app.setting.content-width.fixed': 'Fixed', 7 | 'app.setting.content-width.fluid': 'Fluid', 8 | 'app.setting.themecolor': 'Theme Color', 9 | 'app.setting.themecolor.dust': 'Dust Red', 10 | 'app.setting.themecolor.volcano': 'Volcano', 11 | 'app.setting.themecolor.sunset': 'Sunset Orange', 12 | 'app.setting.themecolor.cyan': 'Cyan', 13 | 'app.setting.themecolor.green': 'Polar Green', 14 | 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', 15 | 'app.setting.themecolor.geekblue': 'Geek Glue', 16 | 'app.setting.themecolor.purple': 'Golden Purple', 17 | 'app.setting.navigationmode': 'Navigation Mode', 18 | 'app.setting.sidemenu': 'Side Menu Layout', 19 | 'app.setting.topmenu': 'Top Menu Layout', 20 | 'app.setting.fixedheader': 'Fixed Header', 21 | 'app.setting.fixedsidebar': 'Fixed Sidebar', 22 | 'app.setting.fixedsidebar.hint': 'Works on Side Menu Layout', 23 | 'app.setting.hideheader': 'Hidden Header when scrolling', 24 | 'app.setting.hideheader.hint': 'Works when Hidden Header is enabled', 25 | 'app.setting.othersettings': 'Other Settings', 26 | 'app.setting.weakmode': 'Color Blind Friendly Mode', 27 | 'app.setting.copy': 'Copy Setting', 28 | 'app.setting.copyinfo': 'copy success, please replace defaultSettings in src/models/setting.js', 29 | 'app.setting.production.hint': 30 | 'Setting panel shows in development environment only, please manually modify', 31 | }; 32 | -------------------------------------------------------------------------------- /src/locales/en-US/settings.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.settings.menuMap.basic': 'Basic Settings', 3 | 'app.settings.menuMap.security': 'Security Settings', 4 | 'app.settings.menuMap.binding': 'Account Binding', 5 | 'app.settings.menuMap.notification': 'New Message Notification', 6 | 'app.settings.basic.avatar': 'Avatar', 7 | 'app.settings.basic.change-avatar': 'Change avatar', 8 | 'app.settings.basic.email': 'Email', 9 | 'app.settings.basic.email-message': 'Please input your email!', 10 | 'app.settings.basic.nickname': 'Nickname', 11 | 'app.settings.basic.nickname-message': 'Please input your Nickname!', 12 | 'app.settings.basic.profile': 'Personal profile', 13 | 'app.settings.basic.profile-message': 'Please input your personal profile!', 14 | 'app.settings.basic.profile-placeholder': 'Brief introduction to yourself', 15 | 'app.settings.basic.country': 'Country/Region', 16 | 'app.settings.basic.country-message': 'Please input your country!', 17 | 'app.settings.basic.geographic': 'Province or city', 18 | 'app.settings.basic.geographic-message': 'Please input your geographic info!', 19 | 'app.settings.basic.address': 'Street Address', 20 | 'app.settings.basic.address-message': 'Please input your address!', 21 | 'app.settings.basic.phone': 'Phone Number', 22 | 'app.settings.basic.phone-message': 'Please input your phone!', 23 | 'app.settings.basic.update': 'Update Information', 24 | 'app.settings.security.strong': 'Strong', 25 | 'app.settings.security.medium': 'Medium', 26 | 'app.settings.security.weak': 'Weak', 27 | 'app.settings.security.password': 'Account Password', 28 | 'app.settings.security.password-description': 'Current password strength', 29 | 'app.settings.security.phone': 'Security Phone', 30 | 'app.settings.security.phone-description': 'Bound phone', 31 | 'app.settings.security.question': 'Security Question', 32 | 'app.settings.security.question-description': 33 | 'The security question is not set, and the security policy can effectively protect the account security', 34 | 'app.settings.security.email': 'Backup Email', 35 | 'app.settings.security.email-description': 'Bound Email', 36 | 'app.settings.security.mfa': 'MFA Device', 37 | 'app.settings.security.mfa-description': 38 | 'Unbound MFA device, after binding, can be confirmed twice', 39 | 'app.settings.security.modify': 'Modify', 40 | 'app.settings.security.set': 'Set', 41 | 'app.settings.security.bind': 'Bind', 42 | 'app.settings.binding.taobao': 'Binding Taobao', 43 | 'app.settings.binding.taobao-description': 'Currently unbound Taobao account', 44 | 'app.settings.binding.alipay': 'Binding Alipay', 45 | 'app.settings.binding.alipay-description': 'Currently unbound Alipay account', 46 | 'app.settings.binding.dingding': 'Binding DingTalk', 47 | 'app.settings.binding.dingding-description': 'Currently unbound DingTalk account', 48 | 'app.settings.binding.bind': 'Bind', 49 | 'app.settings.notification.password': 'Account Password', 50 | 'app.settings.notification.password-description': 51 | 'Messages from other users will be notified in the form of a station letter', 52 | 'app.settings.notification.messages': 'System Messages', 53 | 'app.settings.notification.messages-description': 54 | 'System messages will be notified in the form of a station letter', 55 | 'app.settings.notification.todo': 'To-do Notification', 56 | 'app.settings.notification.todo-description': 57 | 'The to-do list will be notified in the form of a letter from the station', 58 | 'app.settings.open': 'Open', 59 | 'app.settings.close': 'Close', 60 | }; 61 | -------------------------------------------------------------------------------- /src/locales/fa-IR.ts: -------------------------------------------------------------------------------- 1 | import component from './fa-IR/component'; 2 | import globalHeader from './fa-IR/globalHeader'; 3 | import menu from './fa-IR/menu'; 4 | import pages from './fa-IR/pages'; 5 | import pwa from './fa-IR/pwa'; 6 | import settingDrawer from './fa-IR/settingDrawer'; 7 | import settings from './fa-IR/settings'; 8 | 9 | export default { 10 | 'navBar.lang': 'زبان ها ', 11 | 'layout.user.link.help': 'کمک', 12 | 'layout.user.link.privacy': 'حریم خصوصی', 13 | 'layout.user.link.terms': 'مقررات', 14 | 'app.preview.down.block': 'این صفحه را در پروژه محلی خود بارگیری کنید', 15 | 'app.welcome.link.fetch-blocks': 'دریافت تمام بلوک', 16 | 'app.welcome.link.block-list': 'به سرعت صفحات استاندارد مبتنی بر توسعه "بلوک" را بسازید', 17 | ...globalHeader, 18 | ...menu, 19 | ...settingDrawer, 20 | ...settings, 21 | ...pwa, 22 | ...component, 23 | ...pages, 24 | }; 25 | -------------------------------------------------------------------------------- /src/locales/fa-IR/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': 'باز', 3 | 'component.tagSelect.collapse': 'بسته ', 4 | 'component.tagSelect.all': 'همه', 5 | }; 6 | -------------------------------------------------------------------------------- /src/locales/fa-IR/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': 'جستجو ', 3 | 'component.globalHeader.search.example1': 'مثال 1 را جستجو کنید', 4 | 'component.globalHeader.search.example2': 'مثال 2 را جستجو کنید', 5 | 'component.globalHeader.search.example3': 'مثال 3 را جستجو کنید', 6 | 'component.globalHeader.help': 'کمک', 7 | 'component.globalHeader.notification': 'اعلان', 8 | 'component.globalHeader.notification.empty': 'شما همه اعلان ها را مشاهده کرده اید.', 9 | 'component.globalHeader.message': 'پیام', 10 | 'component.globalHeader.message.empty': 'شما همه پیام ها را مشاهده کرده اید.', 11 | 'component.globalHeader.event': 'رویداد', 12 | 'component.globalHeader.event.empty': 'شما همه رویدادها را مشاهده کرده اید.', 13 | 'component.noticeIcon.clear': 'پاک کردن', 14 | 'component.noticeIcon.cleared': 'پاک شد', 15 | 'component.noticeIcon.empty': 'بدون اعلان', 16 | 'component.noticeIcon.view-more': 'نمایش بیشتر', 17 | }; 18 | -------------------------------------------------------------------------------- /src/locales/fa-IR/menu.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'menu.welcome': 'خوش آمدید', 3 | 'menu.more-blocks': 'بلوک های بیشتر', 4 | 'menu.home': 'خانه', 5 | 'menu.admin': 'مدیر', 6 | 'menu.admin.sub-page': 'زیر صفحه', 7 | 'menu.login': 'ورود', 8 | 'menu.register': 'ثبت نام', 9 | 'menu.register-result': 'ثبت نام نتیجه', 10 | 'menu.dashboard': 'داشبورد', 11 | 'menu.dashboard.analysis': 'تحلیل و بررسی', 12 | 'menu.dashboard.monitor': 'نظارت', 13 | 'menu.dashboard.workplace': 'محل کار', 14 | 'menu.exception.403': '403', 15 | 'menu.exception.404': '404', 16 | 'menu.exception.500': '500', 17 | 'menu.form': 'فرم', 18 | 'menu.form.basic-form': 'فرم اساسی', 19 | 'menu.form.step-form': 'فرم مرحله', 20 | 'menu.form.step-form.info': 'فرم مرحله (نوشتن اطلاعات انتقال)', 21 | 'menu.form.step-form.confirm': 'فرم مرحله (تأیید اطلاعات انتقال)', 22 | 'menu.form.step-form.result': 'فرم مرحله (تمام شده)', 23 | 'menu.form.advanced-form': 'فرم پیشرفته', 24 | 'menu.list': 'لیست', 25 | 'menu.list.table-list': 'جدول جستجو', 26 | 'menu.list.basic-list': 'لیست اصلی', 27 | 'menu.list.card-list': 'لیست کارت', 28 | 'menu.list.search-list': 'لیست جستجو', 29 | 'menu.list.search-list.articles': 'لیست جستجو (مقالات)', 30 | 'menu.list.search-list.projects': 'لیست جستجو (پروژه ها)', 31 | 'menu.list.search-list.applications': 'لیست جستجو (برنامه ها)', 32 | 'menu.profile': 'مشخصات', 33 | 'menu.profile.basic': 'مشخصات عمومی', 34 | 'menu.profile.advanced': 'مشخصات پیشرفته', 35 | 'menu.result': 'نتیجه', 36 | 'menu.result.success': 'موفق', 37 | 'menu.result.fail': 'ناموفق', 38 | 'menu.exception': 'استثنا', 39 | 'menu.exception.not-permission': '403', 40 | 'menu.exception.not-find': '404', 41 | 'menu.exception.server-error': '500', 42 | 'menu.exception.trigger': 'راه اندازی', 43 | 'menu.account': 'حساب', 44 | 'menu.account.center': 'مرکز حساب', 45 | 'menu.account.settings': 'تنظیمات حساب', 46 | 'menu.account.trigger': 'خطای راه اندازی', 47 | 'menu.account.logout': 'خروج', 48 | 'menu.editor': 'ویرایشگر گرافیک', 49 | 'menu.editor.flow': 'ویرایشگر جریان', 50 | 'menu.editor.mind': 'ویرایشگر ذهن', 51 | 'menu.editor.koni': 'ویرایشگر Koni', 52 | }; 53 | -------------------------------------------------------------------------------- /src/locales/fa-IR/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'شما اکنون آفلاین هستید', 3 | 'app.pwa.serviceworker.updated': 'مطالب جدید در دسترس است', 4 | 'app.pwa.serviceworker.updated.hint': 5 | 'لطفاً برای بارگیری مجدد صفحه فعلی ، دکمه "تازه سازی" را فشار دهید', 6 | 'app.pwa.serviceworker.updated.ok': 'تازه سازی', 7 | }; 8 | -------------------------------------------------------------------------------- /src/locales/fa-IR/settingDrawer.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.setting.pagestyle': 'تنظیم نوع صفحه', 3 | 'app.setting.pagestyle.dark': 'سبک تیره', 4 | 'app.setting.pagestyle.light': 'سبک سبک', 5 | 'app.setting.content-width': 'عرض محتوا', 6 | 'app.setting.content-width.fixed': 'ثابت', 7 | 'app.setting.content-width.fluid': 'شناور', 8 | 'app.setting.themecolor': 'رنگ تم', 9 | 'app.setting.themecolor.dust': 'گرد و غبار قرمز', 10 | 'app.setting.themecolor.volcano': 'آتشفشان', 11 | 'app.setting.themecolor.sunset': 'غروب نارنجی', 12 | 'app.setting.themecolor.cyan': 'فیروزه ای', 13 | 'app.setting.themecolor.green': 'سبز قطبی', 14 | 'app.setting.themecolor.daybreak': 'آبی روشن(پیشفرض)', 15 | 'app.setting.themecolor.geekblue': 'چسب گیک', 16 | 'app.setting.themecolor.purple': 'بنفش طلایی', 17 | 'app.setting.navigationmode': 'حالت پیمایش', 18 | 'app.setting.sidemenu': 'طرح منوی کناری', 19 | 'app.setting.topmenu': 'طرح منوی بالایی', 20 | 'app.setting.fixedheader': 'سرصفحه ثابت', 21 | 'app.setting.fixedsidebar': 'نوار کناری ثابت', 22 | 'app.setting.fixedsidebar.hint': 'کار بر روی منوی کناری', 23 | 'app.setting.hideheader': 'هدر پنهان هنگام پیمایش', 24 | 'app.setting.hideheader.hint': 'وقتی Hidden Header فعال باشد کار می کند', 25 | 'app.setting.othersettings': 'تنظیمات دیگر', 26 | 'app.setting.weakmode': 'حالت ضعیف', 27 | 'app.setting.copy': 'تنظیمات کپی', 28 | 'app.setting.copyinfo': 29 | 'موفقیت در کپی کردن , لطفا defaultSettings را در src / models / setting.js جایگزین کنید', 30 | 'app.setting.production.hint': 31 | 'صفحه تنظیم فقط در محیط توسعه نمایش داده می شود ، لطفاً دستی تغییر دهید', 32 | }; 33 | -------------------------------------------------------------------------------- /src/locales/fa-IR/settings.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.settings.menuMap.basic': 'تنظیمات پایه ', 3 | 'app.settings.menuMap.security': 'تنظیمات امنیتی', 4 | 'app.settings.menuMap.binding': 'صحافی حساب', 5 | 'app.settings.menuMap.notification': 'اعلان پیام جدید', 6 | 'app.settings.basic.avatar': 'آواتار', 7 | 'app.settings.basic.change-avatar': 'آواتار را تغییر دهید', 8 | 'app.settings.basic.email': 'ایمیل', 9 | 'app.settings.basic.email-message': 'لطفا ایمیل خود را وارد کنید!', 10 | 'app.settings.basic.nickname': 'نام مستعار', 11 | 'app.settings.basic.nickname-message': 'لطفاً نام مستعار خود را وارد کنید!', 12 | 'app.settings.basic.profile': 'پروفایل شخصی', 13 | 'app.settings.basic.profile-message': 'لطفاً مشخصات شخصی خود را وارد کنید!', 14 | 'app.settings.basic.profile-placeholder': 'معرفی مختصر خودتان', 15 | 'app.settings.basic.country': 'کشور / منطقه', 16 | 'app.settings.basic.country-message': 'لطفاً کشور خود را وارد کنید!', 17 | 'app.settings.basic.geographic': 'استان یا شهر', 18 | 'app.settings.basic.geographic-message': 'لطفاً اطلاعات جغرافیایی خود را وارد کنید!', 19 | 'app.settings.basic.address': 'آدرس خیابان', 20 | 'app.settings.basic.address-message': 'لطفا آدرس خود را وارد کنید!', 21 | 'app.settings.basic.phone': 'شماره تلفن', 22 | 'app.settings.basic.phone-message': 'لطفاً تلفن خود را وارد کنید!', 23 | 'app.settings.basic.update': 'به روز رسانی اطلاعات', 24 | 'app.settings.security.strong': 'قوی', 25 | 'app.settings.security.medium': 'متوسط', 26 | 'app.settings.security.weak': 'ضعیف', 27 | 'app.settings.security.password': 'رمز عبور حساب کاربری', 28 | 'app.settings.security.password-description': 'قدرت رمز عبور فعلی', 29 | 'app.settings.security.phone': 'تلفن امنیتی', 30 | 'app.settings.security.phone-description': 'تلفن مقید', 31 | 'app.settings.security.question': 'سوال امنیتی', 32 | 'app.settings.security.question-description': 33 | 'سوال امنیتی تنظیم نشده است و سیاست امنیتی می تواند به طور موثر از امنیت حساب محافظت کند', 34 | 'app.settings.security.email': 'ایمیل پشتیبان', 35 | 'app.settings.security.email-description': 'ایمیل مقید', 36 | 'app.settings.security.mfa': 'دستگاه MFA', 37 | 'app.settings.security.mfa-description': 38 | 'دستگاه MFA بسته نشده ، پس از اتصال ، می تواند دو بار تأیید شود', 39 | 'app.settings.security.modify': 'تغییر', 40 | 'app.settings.security.set': 'تنظیم', 41 | 'app.settings.security.bind': 'بستن', 42 | 'app.settings.binding.taobao': 'اتصال Taobao', 43 | 'app.settings.binding.taobao-description': 'حساب Taobao در حال حاضر بسته نشده است', 44 | 'app.settings.binding.alipay': 'اتصال Alipay', 45 | 'app.settings.binding.alipay-description': 'حساب Alipay در حال حاضر بسته نشده است', 46 | 'app.settings.binding.dingding': 'اتصال DingTalk', 47 | 'app.settings.binding.dingding-description': 'حساب DingTalk در حال حاضر محدود نشده است', 48 | 'app.settings.binding.bind': 'بستن', 49 | 'app.settings.notification.password': 'رمز عبور حساب کاربری', 50 | 'app.settings.notification.password-description': 51 | 'پیام های سایر کاربران در قالب یک نامه ایستگاهی اعلام خواهد شد', 52 | 'app.settings.notification.messages': 'پیام های سیستم', 53 | 'app.settings.notification.messages-description': 54 | 'پیام های سیستم به صورت نامه ایستگاه مطلع می شوند', 55 | 'app.settings.notification.todo': 'اعلان کارها', 56 | 'app.settings.notification.todo-description': 57 | 'لیست کارها به صورت نامه ای از ایستگاه اطلاع داده می شود', 58 | 'app.settings.open': 'باز کن', 59 | 'app.settings.close': 'بستن', 60 | }; 61 | -------------------------------------------------------------------------------- /src/locales/id-ID.ts: -------------------------------------------------------------------------------- 1 | import component from './id-ID/component'; 2 | import globalHeader from './id-ID/globalHeader'; 3 | import menu from './id-ID/menu'; 4 | import pages from './id-ID/pages'; 5 | import pwa from './id-ID/pwa'; 6 | import settingDrawer from './id-ID/settingDrawer'; 7 | import settings from './id-ID/settings'; 8 | 9 | export default { 10 | 'navbar.lang': 'Bahasa', 11 | 'layout.user.link.help': 'Bantuan', 12 | 'layout.user.link.privacy': 'Privasi', 13 | 'layout.user.link.terms': 'Ketentuan', 14 | 'app.preview.down.block': 'Unduh halaman ini dalam projek lokal anda', 15 | 'app.welcome.link.fetch-blocks': 'Dapatkan semua blok', 16 | 'app.welcome.link.block-list': 17 | 'Buat standar dengan cepat, halaman-halaman berdasarkan pengembangan `block`', 18 | ...globalHeader, 19 | ...menu, 20 | ...settingDrawer, 21 | ...settings, 22 | ...pwa, 23 | ...component, 24 | ...pages, 25 | }; 26 | -------------------------------------------------------------------------------- /src/locales/id-ID/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': 'Perluas', 3 | 'component.tagSelect.collapse': 'Lipat', 4 | 'component.tagSelect.all': 'Semua', 5 | }; 6 | -------------------------------------------------------------------------------- /src/locales/id-ID/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': 'Pencarian', 3 | 'component.globalHeader.search.example1': 'Contoh 1 Pencarian', 4 | 'component.globalHeader.search.example2': 'Contoh 2 Pencarian', 5 | 'component.globalHeader.search.example3': 'Contoh 3 Pencarian', 6 | 'component.globalHeader.help': 'Bantuan', 7 | 'component.globalHeader.notification': 'Notifikasi', 8 | 'component.globalHeader.notification.empty': 'Anda telah membaca semua notifikasi', 9 | 'component.globalHeader.message': 'Pesan', 10 | 'component.globalHeader.message.empty': 'Anda telah membaca semua pesan.', 11 | 'component.globalHeader.event': 'Acara', 12 | 'component.globalHeader.event.empty': 'Anda telah melihat semua acara.', 13 | 'component.noticeIcon.clear': 'Kosongkan', 14 | 'component.noticeIcon.cleared': 'Berhasil dikosongkan', 15 | 'component.noticeIcon.empty': 'Tidak ada pemberitahuan', 16 | 'component.noticeIcon.view-more': 'Melihat lebih', 17 | }; 18 | -------------------------------------------------------------------------------- /src/locales/id-ID/menu.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'menu.welcome': 'Selamat Datang', 3 | 'menu.more-blocks': 'Blocks Lainnya', 4 | 'menu.home': 'Halaman Awal', 5 | 'menu.admin': 'Admin', 6 | 'menu.admin.sub-page': 'Sub-Halaman', 7 | 'menu.login': 'Masuk', 8 | 'menu.register': 'Pendaftaran', 9 | 'menu.register-result': 'Hasil Pendaftaran', 10 | 'menu.dashboard': 'Dasbor', 11 | 'menu.dashboard.analysis': 'Analisis', 12 | 'menu.dashboard.monitor': 'Monitor', 13 | 'menu.dashboard.workplace': 'Workplace', 14 | 'menu.exception.403': '403', 15 | 'menu.exception.404': '404', 16 | 'menu.exception.500': '500', 17 | 'menu.form': 'Form', 18 | 'menu.form.basic-form': 'Form Dasar', 19 | 'menu.form.step-form': 'Form Bertahap', 20 | 'menu.form.step-form.info': 'Form Bertahap(menulis informasi yang dibagikan)', 21 | 'menu.form.step-form.confirm': 'Form Bertahap(konfirmasi informasi yang dibagikan)', 22 | 'menu.form.step-form.result': 'Form Bertahap(selesai)', 23 | 'menu.form.advanced-form': 'Form Lanjutan', 24 | 'menu.list': 'Daftar', 25 | 'menu.list.table-list': 'Tabel Pencarian', 26 | 'menu.list.basic-list': 'Daftar Dasar', 27 | 'menu.list.card-list': 'Daftar Kartu', 28 | 'menu.list.search-list': 'Daftar Pencarian', 29 | 'menu.list.search-list.articles': 'Daftar Pencarian(artikel)', 30 | 'menu.list.search-list.projects': 'Daftar Pencarian(projek)', 31 | 'menu.list.search-list.applications': 'Daftar Pencarian(aplikasi)', 32 | 'menu.profile': 'Profil', 33 | 'menu.profile.basic': 'Profil Dasar', 34 | 'menu.profile.advanced': 'Profile Lanjutan', 35 | 'menu.result': 'Hasil', 36 | 'menu.result.success': 'Sukses', 37 | 'menu.result.fail': 'Gagal', 38 | 'menu.exception': 'Pengecualian', 39 | 'menu.exception.not-permission': '403', 40 | 'menu.exception.not-find': '404', 41 | 'menu.exception.server-error': '500', 42 | 'menu.exception.trigger': 'Jalankan', 43 | 'menu.account': 'Akun', 44 | 'menu.account.center': 'Detail Akun', 45 | 'menu.account.settings': 'Pengaturan Akun', 46 | 'menu.account.trigger': 'Mengaktivasi Error', 47 | 'menu.account.logout': 'Keluar', 48 | 'menu.editor': 'Penyusun Grafis', 49 | 'menu.editor.flow': 'Penyusun Alur', 50 | 'menu.editor.mind': 'Penyusun Mind', 51 | 'menu.editor.koni': 'Penyusun Koni', 52 | }; 53 | -------------------------------------------------------------------------------- /src/locales/id-ID/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'Koneksi anda terputus', 3 | 'app.pwa.serviceworker.updated': 'Konten baru sudah tersedia', 4 | 'app.pwa.serviceworker.updated.hint': 5 | 'Silahkan klik tombol "Refresh" untuk memuat ulang halaman ini', 6 | 'app.pwa.serviceworker.updated.ok': 'Memuat ulang', 7 | }; 8 | -------------------------------------------------------------------------------- /src/locales/id-ID/settingDrawer.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.setting.pagestyle': 'Pengaturan style Halaman', 3 | 'app.setting.pagestyle.dark': 'Style Gelap', 4 | 'app.setting.pagestyle.light': 'Style Cerah', 5 | 'app.setting.content-width': 'Lebar Konten', 6 | 'app.setting.content-width.fixed': 'Tetap', 7 | 'app.setting.content-width.fluid': 'Fluid', 8 | 'app.setting.themecolor': 'Theme Color', 9 | 'app.setting.themecolor.dust': 'Dust Red', 10 | 'app.setting.themecolor.volcano': 'Volcano', 11 | 'app.setting.themecolor.sunset': 'Sunset Orange', 12 | 'app.setting.themecolor.cyan': 'Cyan', 13 | 'app.setting.themecolor.green': 'Polar Green', 14 | 'app.setting.themecolor.daybreak': 'Daybreak Blue (bawaan)', 15 | 'app.setting.themecolor.geekblue': 'Geek Glue', 16 | 'app.setting.themecolor.purple': 'Golden Purple', 17 | 'app.setting.navigationmode': 'Mode Navigasi', 18 | 'app.setting.sidemenu': 'Susunan Menu Samping', 19 | 'app.setting.topmenu': 'Susunan Menu Atas', 20 | 'app.setting.fixedheader': 'Header Tetap', 21 | 'app.setting.fixedsidebar': 'Sidebar Tetap', 22 | 'app.setting.fixedsidebar.hint': 'Berjalan pada Susunan Menu Samping', 23 | 'app.setting.hideheader': 'Sembunyikan Header ketika gulir ke bawah', 24 | 'app.setting.hideheader.hint': 'Bekerja ketika Header tersembunyi dimunculkan', 25 | 'app.setting.othersettings': 'Pengaturan Lainnya', 26 | 'app.setting.weakmode': 'Mode Lemah', 27 | 'app.setting.copy': 'Salin Pengaturan', 28 | 'app.setting.copyinfo': 29 | 'Berhasil disalin, tolong ubah defaultSettings pada src/models/setting.js', 30 | 'app.setting.production.hint': 31 | 'Panel pengaturan hanya muncul pada lingkungan pengembangan, silahkan modifikasi secara menual', 32 | }; 33 | -------------------------------------------------------------------------------- /src/locales/id-ID/settings.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.settings.menuMap.basic': 'Pengaturan Dasar', 3 | 'app.settings.menuMap.security': 'Pengaturan Keamanan', 4 | 'app.settings.menuMap.binding': 'Pengikatan Akun', 5 | 'app.settings.menuMap.notification': 'Notifikasi Pesan Baru', 6 | 'app.settings.basic.avatar': 'Avatar', 7 | 'app.settings.basic.change-avatar': 'Ubah avatar', 8 | 'app.settings.basic.email': 'Email', 9 | 'app.settings.basic.email-message': 'Tolong masukkan email!', 10 | 'app.settings.basic.nickname': 'Nickname', 11 | 'app.settings.basic.nickname-message': 'Tolong masukkan Nickname!', 12 | 'app.settings.basic.profile': 'Profil Personal', 13 | 'app.settings.basic.profile-message': 'Tolong masukkan profil personal!', 14 | 'app.settings.basic.profile-placeholder': 'Perkenalan Singkat tentang Diri Anda', 15 | 'app.settings.basic.country': 'Negara/Wilayah', 16 | 'app.settings.basic.country-message': 'Tolong masukkan negara anda!', 17 | 'app.settings.basic.geographic': 'Provinsi atau kota', 18 | 'app.settings.basic.geographic-message': 'Tolong masukkan info geografis anda!', 19 | 'app.settings.basic.address': 'Alamat Jalan', 20 | 'app.settings.basic.address-message': 'Tolong masukkan Alamat Jalan anda!', 21 | 'app.settings.basic.phone': 'Nomor Ponsel', 22 | 'app.settings.basic.phone-message': 'Tolong masukkan Nomor Ponsel anda!', 23 | 'app.settings.basic.update': 'Perbarui Informasi', 24 | 'app.settings.security.strong': 'Kuat', 25 | 'app.settings.security.medium': 'Sedang', 26 | 'app.settings.security.weak': 'Lemah', 27 | 'app.settings.security.password': 'Kata Sandi Akun', 28 | 'app.settings.security.password-description': 'Kekuatan Kata Sandi saat ini', 29 | 'app.settings.security.phone': 'Keamanan Ponsel', 30 | 'app.settings.security.phone-description': 'Mengikat Ponsel', 31 | 'app.settings.security.question': 'Pertanyaan Keamanan', 32 | 'app.settings.security.question-description': 33 | 'Pertanyaan Keamanan belum diatur, dan kebijakan keamanan dapat melindungi akun secara efektif', 34 | 'app.settings.security.email': 'Email Cadangan', 35 | 'app.settings.security.email-description': 'Mengikat Email', 36 | 'app.settings.security.mfa': 'Perangka MFA', 37 | 'app.settings.security.mfa-description': 38 | 'Tidak mengikat Perangkat MFA, setelah diikat, dapat dikonfirmasi dua kali', 39 | 'app.settings.security.modify': 'Modifikasi', 40 | 'app.settings.security.set': 'Setel', 41 | 'app.settings.security.bind': 'Ikat', 42 | 'app.settings.binding.taobao': 'Mengikat Taobao', 43 | 'app.settings.binding.taobao-description': 'Tidak mengikat akun Taobao saat ini', 44 | 'app.settings.binding.alipay': 'Mengikat Alipay', 45 | 'app.settings.binding.alipay-description': 'Tidak mengikat akun Alipay saat ini', 46 | 'app.settings.binding.dingding': 'Mengikat DingTalk', 47 | 'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk', 48 | 'app.settings.binding.bind': 'Ikat', 49 | 'app.settings.notification.password': 'Kata Sandi Akun', 50 | 'app.settings.notification.password-description': 51 | 'Pesan dari pengguna lain akan diberitahu dalam bentuk surat', 52 | 'app.settings.notification.messages': 'Pesan Sistem', 53 | 'app.settings.notification.messages-description': 54 | 'Pesan sistem akan diberitahu dalam bentuk surat', 55 | 'app.settings.notification.todo': 'Notifikasi daftar To-do', 56 | 'app.settings.notification.todo-description': 57 | 'Daftar to-do akan diberitahukan dalam bentuk surat dari stasiun', 58 | 'app.settings.open': 'Buka', 59 | 'app.settings.close': 'Tutup', 60 | }; 61 | -------------------------------------------------------------------------------- /src/locales/ja-JP.ts: -------------------------------------------------------------------------------- 1 | import component from './ja-JP/component'; 2 | import globalHeader from './ja-JP/globalHeader'; 3 | import menu from './ja-JP/menu'; 4 | import pages from './ja-JP/pages'; 5 | import pwa from './ja-JP/pwa'; 6 | import settingDrawer from './ja-JP/settingDrawer'; 7 | import settings from './ja-JP/settings'; 8 | 9 | export default { 10 | 'navBar.lang': '言語', 11 | 'layout.user.link.help': 'ヘルプ', 12 | 'layout.user.link.privacy': 'プライバシー', 13 | 'layout.user.link.terms': '利用規約', 14 | 'app.preview.down.block': 'このページをローカルプロジェクトにダウンロードしてください', 15 | 'app.welcome.link.fetch-blocks': '', 16 | 'app.welcome.link.block-list': '', 17 | ...globalHeader, 18 | ...menu, 19 | ...settingDrawer, 20 | ...settings, 21 | ...pwa, 22 | ...component, 23 | ...pages, 24 | }; 25 | -------------------------------------------------------------------------------- /src/locales/ja-JP/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': '展開', 3 | 'component.tagSelect.collapse': '折りたたむ', 4 | 'component.tagSelect.all': 'すべて', 5 | }; 6 | -------------------------------------------------------------------------------- /src/locales/ja-JP/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': '検索', 3 | 'component.globalHeader.search.example1': '検索例1', 4 | 'component.globalHeader.search.example2': '検索例2', 5 | 'component.globalHeader.search.example3': '検索例3', 6 | 'component.globalHeader.help': 'ヘルプ', 7 | 'component.globalHeader.notification': '通知', 8 | 'component.globalHeader.notification.empty': 'すべての通知を表示しました。', 9 | 'component.globalHeader.message': 'メッセージ', 10 | 'component.globalHeader.message.empty': 'すべてのメッセージを表示しました。', 11 | 'component.globalHeader.event': 'イベント', 12 | 'component.globalHeader.event.empty': 'すべてのイベントを表示しました。', 13 | 'component.noticeIcon.clear': 'クリア', 14 | 'component.noticeIcon.cleared': 'クリア済み', 15 | 'component.noticeIcon.empty': '通知なし', 16 | 'component.noticeIcon.view-more': 'もっと見る', 17 | }; 18 | -------------------------------------------------------------------------------- /src/locales/ja-JP/menu.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'menu.welcome': 'ようこそ', 3 | 'menu.more-blocks': 'その他のブロック', 4 | 'menu.home': 'ホーム', 5 | 'menu.admin': '管理者', 6 | 'menu.admin.sub-page': 'サブページ', 7 | 'menu.login': 'ログイン', 8 | 'menu.register': '登録', 9 | 'menu.register-result': '登録結果', 10 | 'menu.dashboard': 'ダッシュボード', 11 | 'menu.dashboard.analysis': '分析', 12 | 'menu.dashboard.monitor': 'モニター', 13 | 'menu.dashboard.workplace': '職場', 14 | 'menu.exception.403': '403', 15 | 'menu.exception.404': '404', 16 | 'menu.exception.500': '500', 17 | 'menu.form': 'フォーム', 18 | 'menu.form.basic-form': '基本フォーム', 19 | 'menu.form.step-form': 'ステップフォーム', 20 | 'menu.form.step-form.info': 'ステップフォーム(転送情報の書き込み)', 21 | 'menu.form.step-form.confirm': 'ステップフォーム(転送情報の確認)', 22 | 'menu.form.step-form.result': 'ステップフォーム(完成)', 23 | 'menu.form.advanced-form': '高度なフォーム', 24 | 'menu.list': 'リスト', 25 | 'menu.list.table-list': '検索テーブル', 26 | 'menu.list.basic-list': '基本リスト', 27 | 'menu.list.card-list': 'カードリスト', 28 | 'menu.list.search-list': '検索リスト', 29 | 'menu.list.search-list.articles': '検索リスト(記事)', 30 | 'menu.list.search-list.projects': '検索リスト(プロジェクト)', 31 | 'menu.list.search-list.applications': '検索リスト(アプリ)', 32 | 'menu.profile': 'プロフィール', 33 | 'menu.profile.basic': '基本プロフィール', 34 | 'menu.profile.advanced': '高度なプロフィール', 35 | 'menu.result': '結果', 36 | 'menu.result.success': '成功', 37 | 'menu.result.fail': '失敗', 38 | 'menu.exception': '例外', 39 | 'menu.exception.not-permission': '403', 40 | 'menu.exception.not-find': '404', 41 | 'menu.exception.server-error': '500', 42 | 'menu.exception.trigger': 'トリガー', 43 | 'menu.account': 'アカウント', 44 | 'menu.account.center': 'アカウントセンター', 45 | 'menu.account.settings': 'アカウント設定', 46 | 'menu.account.trigger': 'トリガーエラー', 47 | 'menu.account.logout': 'ログアウト', 48 | 'menu.editor': 'グラフィックエディタ', 49 | 'menu.editor.flow': 'フローエディタ', 50 | 'menu.editor.mind': 'マインドエディター', 51 | 'menu.editor.koni': 'コニエディター', 52 | }; 53 | -------------------------------------------------------------------------------- /src/locales/ja-JP/pages.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'pages.layouts.userLayout.title': 'Ant Designは、西湖区で最も影響力のあるWebデザイン仕様です。', 3 | 'pages.login.accountLogin.tab': 'アカウントログイン', 4 | 'pages.login.accountLogin.errorMessage': 5 | 'ユーザー名/パスワードが正しくありません(admin/ant.design)', 6 | 'pages.login.failure': 'ログインに失敗したら、もう一度試してください!', 7 | 'pages.login.success': 'ログイン成功!', 8 | 'pages.login.username.placeholder': 'ユーザー名:adminまたはuser', 9 | 'pages.login.username.required': 'ユーザー名を入力してください!', 10 | 'pages.login.password.placeholder': 'パスワード:ant.design', 11 | 'pages.login.password.required': 'パスワードを入力してください!', 12 | 'pages.login.phoneLogin.tab': '電話ログイン', 13 | 'pages.login.phoneLogin.errorMessage': '検証コードエラー', 14 | 'pages.login.phoneNumber.placeholder': '電話番号', 15 | 'pages.login.phoneNumber.required': '電話番号を入力してください!', 16 | 'pages.login.phoneNumber.invalid': '電話番号が無効です!', 17 | 'pages.login.captcha.placeholder': '確認コード', 18 | 'pages.login.captcha.required': '確認コードを入力してください!', 19 | 'pages.login.phoneLogin.getVerificationCode': '確認コードを取得', 20 | 'pages.getCaptchaSecondText': '秒', 21 | 'pages.login.rememberMe': 'Remember me', 22 | 'pages.login.forgotPassword': 'パスワードをお忘れですか?', 23 | 'pages.login.submit': 'ログイン', 24 | 'pages.login.loginWith': 'その他のログイン方法:', 25 | 'pages.login.registerAccount': 'アカウント登録', 26 | 'pages.welcome.link': 'ようこそ', 27 | 'pages.welcome.alertMessage': 'より高速で強力な頑丈なコンポーネントがリリースされました。', 28 | 'pages.404.subTitle': '申し訳ありませんが、アクセスしたページは存在しません。', 29 | 'pages.404.buttonText': 'ホームに戻る', 30 | 'pages.admin.subPage.title': 'このページは管理者のみが表示できます', 31 | 'pages.admin.subPage.alertMessage': 32 | 'Umi uiがリリースされました。npm run uiを使用して体験してください。', 33 | 'pages.searchTable.createForm.newRule': '新しいルール', 34 | 'pages.searchTable.updateForm.ruleConfig': 'ルール構成', 35 | 'pages.searchTable.updateForm.basicConfig': '基本情報', 36 | 'pages.searchTable.updateForm.ruleName.nameLabel': 'ルール名', 37 | 'pages.searchTable.updateForm.ruleName.nameRules': 'ルール名を入力してください!', 38 | 'pages.searchTable.updateForm.ruleDesc.descLabel': 'ルールの説明', 39 | 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '5文字以上入力してください', 40 | 'pages.searchTable.updateForm.ruleDesc.descRules': '5文字以上のルールの説明を入力してください!', 41 | 'pages.searchTable.updateForm.ruleProps.title': 'プロパティの構成', 42 | 'pages.searchTable.updateForm.object': '監視対象', 43 | 'pages.searchTable.updateForm.ruleProps.templateLabel': 'ルールテンプレート', 44 | 'pages.searchTable.updateForm.ruleProps.typeLabel': 'ルールタイプ', 45 | 'pages.searchTable.updateForm.schedulingPeriod.title': 'スケジュール期間の設定', 46 | 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間', 47 | 'pages.searchTable.updateForm.schedulingPeriod.timeRules': '開始時間を選択してください!', 48 | 'pages.searchTable.titleDesc': '説明', 49 | 'pages.searchTable.ruleName': 'ルール名が必要です', 50 | 'pages.searchTable.titleCallNo': 'サービスコール数', 51 | 'pages.searchTable.titleStatus': 'ステータス', 52 | 'pages.searchTable.nameStatus.default': 'デフォルト', 53 | 'pages.searchTable.nameStatus.running': '起動中', 54 | 'pages.searchTable.nameStatus.online': 'オンライン', 55 | 'pages.searchTable.nameStatus.abnormal': '異常', 56 | 'pages.searchTable.titleUpdatedAt': '最終スケジュール', 57 | 'pages.searchTable.exception': '例外の理由を入力してください!', 58 | 'pages.searchTable.titleOption': 'オプション', 59 | 'pages.searchTable.config': '構成', 60 | 'pages.searchTable.subscribeAlert': 'アラートを購読する', 61 | 'pages.searchTable.title': 'お問い合わせフォーム', 62 | 'pages.searchTable.new': '新しい', 63 | 'pages.searchTable.chosen': '選んだ項目', 64 | 'pages.searchTable.item': '項目', 65 | 'pages.searchTable.totalServiceCalls': 'サービスコールの総数', 66 | 'pages.searchTable.tenThousand': '万', 67 | 'pages.searchTable.batchDeletion': 'バッチ削除', 68 | 'pages.searchTable.batchApproval': 'バッチ承認', 69 | }; 70 | -------------------------------------------------------------------------------- /src/locales/ja-JP/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'あなたは今オフラインです', 3 | 'app.pwa.serviceworker.updated': '新しいコンテンツが利用可能です', 4 | 'app.pwa.serviceworker.updated.hint': 5 | '現在のページをリロードするには、「更新」ボタンを押してください', 6 | 'app.pwa.serviceworker.updated.ok': 'リフレッシュ', 7 | }; 8 | -------------------------------------------------------------------------------- /src/locales/ja-JP/settingDrawer.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.setting.pagestyle': 'ページスタイル設定', 3 | 'app.setting.pagestyle.dark': 'ダークスタイル', 4 | 'app.setting.pagestyle.light': 'ライトスタイル', 5 | 'app.setting.content-width': 'コンテンツの幅', 6 | 'app.setting.content-width.fixed': '固定', 7 | 'app.setting.content-width.fluid': '流体', 8 | 'app.setting.themecolor': 'テーマカラー', 9 | 'app.setting.themecolor.dust': 'ダストレッド', 10 | 'app.setting.themecolor.volcano': 'ボルケ-ノ', 11 | 'app.setting.themecolor.sunset': 'サンセットオレンジ', 12 | 'app.setting.themecolor.cyan': 'シアン', 13 | 'app.setting.themecolor.green': 'ポーラーグリーン', 14 | 'app.setting.themecolor.daybreak': '夜明けの青(デフォルト)', 15 | 'app.setting.themecolor.geekblue': 'ギーク ブルー', 16 | 'app.setting.themecolor.purple': 'ゴールデンパープル', 17 | 'app.setting.navigationmode': 'ナビゲーションモード', 18 | 'app.setting.sidemenu': 'サイドメニューのレイアウト', 19 | 'app.setting.topmenu': 'トップメニューのレイアウト', 20 | 'app.setting.fixedheader': '固定ヘッダー', 21 | 'app.setting.fixedsidebar': '固定サイドバー', 22 | 'app.setting.fixedsidebar.hint': 'サイドメニューのレイアウトで動作します', 23 | 'app.setting.hideheader': 'スクロール時の非表示ヘッダー', 24 | 'app.setting.hideheader.hint': '非表示ヘッダーが有効になっている場合に機能します', 25 | 'app.setting.othersettings': 'その他の設定', 26 | 'app.setting.weakmode': 'ウィークモード', 27 | 'app.setting.copy': 'コピー設定', 28 | 'app.setting.copyinfo': 29 | 'コピーが成功しました。src/models/setting.jsのdefaultSettingsを置き換えてください', 30 | 'app.setting.production.hint': '設定パネルは開発環境でのみ表示されます。手動で変更してください', 31 | }; 32 | -------------------------------------------------------------------------------- /src/locales/ja-JP/settings.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.settings.menuMap.basic': '基本設定', 3 | 'app.settings.menuMap.security': 'セキュリティ設定', 4 | 'app.settings.menuMap.binding': 'アカウントのバインド', 5 | 'app.settings.menuMap.notification': '新しいメッセージの通知', 6 | 'app.settings.basic.avatar': 'アバター', 7 | 'app.settings.basic.change-avatar': 'アバターを変更する', 8 | 'app.settings.basic.email': 'メール', 9 | 'app.settings.basic.email-message': 'メールアドレスを入力してください!', 10 | 'app.settings.basic.nickname': 'ニックネーム', 11 | 'app.settings.basic.nickname-message': 'ニックネームを入力してください!', 12 | 'app.settings.basic.profile': '個人プロフィール', 13 | 'app.settings.basic.profile-message': '個人プロフィールを入力してください!', 14 | 'app.settings.basic.profile-placeholder': '自己紹介', 15 | 'app.settings.basic.country': '国/地域', 16 | 'app.settings.basic.country-message': 'あなたの国を入力してください!', 17 | 'app.settings.basic.geographic': '州または市', 18 | 'app.settings.basic.geographic-message': '地理情報を入力してください!', 19 | 'app.settings.basic.address': '住所', 20 | 'app.settings.basic.address-message': '住所を入力してください!', 21 | 'app.settings.basic.phone': '電話番号', 22 | 'app.settings.basic.phone-message': '電話番号を入力してください!', 23 | 'app.settings.basic.update': '更新情報', 24 | 'app.settings.security.strong': '強い', 25 | 'app.settings.security.medium': 'ミディアム', 26 | 'app.settings.security.weak': '弱い', 27 | 'app.settings.security.password': 'アカウントパスワード', 28 | 'app.settings.security.password-description': '現在のパスワードの強度', 29 | 'app.settings.security.phone': 'セキュリティ電話番号', 30 | 'app.settings.security.phone-description': 'バインドされた電話番号', 31 | 'app.settings.security.question': '秘密の質問', 32 | 'app.settings.security.question-description': 33 | 'セキュリティの質問が設定されてません。セキュリティポリシーはアカウントのセキュリティを効果的に保護できます', 34 | 'app.settings.security.email': 'バックアップメール', 35 | 'app.settings.security.email-description': 'バインドされたメール', 36 | 'app.settings.security.mfa': '多要素認証デバイス', 37 | 'app.settings.security.mfa-description': 38 | 'バインドされていない多要素認証デバイスは、バインド後、2回確認できます', 39 | 'app.settings.security.modify': '変更する', 40 | 'app.settings.security.set': 'セットする', 41 | 'app.settings.security.bind': 'バインド', 42 | 'app.settings.binding.taobao': 'タオバオをバインドする', 43 | 'app.settings.binding.taobao-description': '現在バインドされていないタオバオアカウント', 44 | 'app.settings.binding.alipay': 'アリペイをバインドする', 45 | 'app.settings.binding.alipay-description': '現在バインドされていないアリペイアカウント', 46 | 'app.settings.binding.dingding': 'ディントークをバインドする', 47 | 'app.settings.binding.dingding-description': '現在バインドされていないディントークアカウント', 48 | 'app.settings.binding.bind': 'バインド', 49 | 'app.settings.notification.password': 'アカウントパスワード', 50 | 'app.settings.notification.password-description': 51 | '他のユーザーからのメッセージは、ステーションレターの形式で通知されます', 52 | 'app.settings.notification.messages': 'システムメッセージ', 53 | 'app.settings.notification.messages-description': 54 | 'システムメッセージは、ステーションレターの形式で通知されます', 55 | 'app.settings.notification.todo': 'To Do(用事) 通知', 56 | 'app.settings.notification.todo-description': 'To Doタスクは、内部レターの形式で通知されます', 57 | 'app.settings.open': '開く', 58 | 'app.settings.close': '閉じる', 59 | }; 60 | -------------------------------------------------------------------------------- /src/locales/pt-BR.ts: -------------------------------------------------------------------------------- 1 | import component from './pt-BR/component'; 2 | import globalHeader from './pt-BR/globalHeader'; 3 | import menu from './pt-BR/menu'; 4 | import pages from './pt-BR/pages'; 5 | import pwa from './pt-BR/pwa'; 6 | import settingDrawer from './pt-BR/settingDrawer'; 7 | import settings from './pt-BR/settings'; 8 | 9 | export default { 10 | 'navBar.lang': 'Idiomas', 11 | 'layout.user.link.help': 'ajuda', 12 | 'layout.user.link.privacy': 'política de privacidade', 13 | 'layout.user.link.terms': 'termos de serviços', 14 | 'app.preview.down.block': 'Download this page to your local project', 15 | ...globalHeader, 16 | ...menu, 17 | ...settingDrawer, 18 | ...settings, 19 | ...pwa, 20 | ...component, 21 | ...pages, 22 | }; 23 | -------------------------------------------------------------------------------- /src/locales/pt-BR/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': 'Expandir', 3 | 'component.tagSelect.collapse': 'Diminuir', 4 | 'component.tagSelect.all': 'Todas', 5 | }; 6 | -------------------------------------------------------------------------------- /src/locales/pt-BR/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': 'Busca', 3 | 'component.globalHeader.search.example1': 'Exemplo de busca 1', 4 | 'component.globalHeader.search.example2': 'Exemplo de busca 2', 5 | 'component.globalHeader.search.example3': 'Exemplo de busca 3', 6 | 'component.globalHeader.help': 'Ajuda', 7 | 'component.globalHeader.notification': 'Notificação', 8 | 'component.globalHeader.notification.empty': 'Você visualizou todas as notificações.', 9 | 'component.globalHeader.message': 'Mensagem', 10 | 'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.', 11 | 'component.globalHeader.event': 'Evento', 12 | 'component.globalHeader.event.empty': 'Você visualizou todos os eventos.', 13 | 'component.noticeIcon.clear': 'Limpar', 14 | 'component.noticeIcon.cleared': 'Limpo', 15 | 'component.noticeIcon.empty': 'Sem notificações', 16 | 'component.noticeIcon.view-more': 'Veja mais', 17 | }; 18 | -------------------------------------------------------------------------------- /src/locales/pt-BR/menu.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'menu.welcome': 'Welcome', 3 | 'menu.more-blocks': 'More Blocks', 4 | 'menu.home': 'Início', 5 | 'menu.admin': 'Admin', 6 | 'menu.admin.sub-page': 'Sub-Page', 7 | 'menu.login': 'Login', 8 | 'menu.register': 'Registro', 9 | 'menu.register-result': 'Resultado de registro', 10 | 'menu.dashboard': 'Dashboard', 11 | 'menu.dashboard.analysis': 'Análise', 12 | 'menu.dashboard.monitor': 'Monitor', 13 | 'menu.dashboard.workplace': 'Ambiente de Trabalho', 14 | 'menu.exception.403': '403', 15 | 'menu.exception.404': '404', 16 | 'menu.exception.500': '500', 17 | 'menu.form': 'Formulário', 18 | 'menu.form.basic-form': 'Formulário Básico', 19 | 'menu.form.step-form': 'Formulário Assistido', 20 | 'menu.form.step-form.info': 'Formulário Assistido(gravar informações de transferência)', 21 | 'menu.form.step-form.confirm': 'Formulário Assistido(confirmar informações de transferência)', 22 | 'menu.form.step-form.result': 'Formulário Assistido(finalizado)', 23 | 'menu.form.advanced-form': 'Formulário Avançado', 24 | 'menu.list': 'Lista', 25 | 'menu.list.table-list': 'Tabela de Busca', 26 | 'menu.list.basic-list': 'Lista Básica', 27 | 'menu.list.card-list': 'Lista de Card', 28 | 'menu.list.search-list': 'Lista de Busca', 29 | 'menu.list.search-list.articles': 'Lista de Busca(artigos)', 30 | 'menu.list.search-list.projects': 'Lista de Busca(projetos)', 31 | 'menu.list.search-list.applications': 'Lista de Busca(aplicações)', 32 | 'menu.profile': 'Perfil', 33 | 'menu.profile.basic': 'Perfil Básico', 34 | 'menu.profile.advanced': 'Perfil Avançado', 35 | 'menu.result': 'Resultado', 36 | 'menu.result.success': 'Sucesso', 37 | 'menu.result.fail': 'Falha', 38 | 'menu.exception': 'Exceção', 39 | 'menu.exception.not-permission': '403', 40 | 'menu.exception.not-find': '404', 41 | 'menu.exception.server-error': '500', 42 | 'menu.exception.trigger': 'Disparar', 43 | 'menu.account': 'Conta', 44 | 'menu.account.center': 'Central da Conta', 45 | 'menu.account.settings': 'Configurar Conta', 46 | 'menu.account.trigger': 'Disparar Erro', 47 | 'menu.account.logout': 'Sair', 48 | 'menu.editor': 'Graphic Editor', 49 | 'menu.editor.flow': 'Flow Editor', 50 | 'menu.editor.mind': 'Mind Editor', 51 | 'menu.editor.koni': 'Koni Editor', 52 | }; 53 | -------------------------------------------------------------------------------- /src/locales/pt-BR/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'Você está offline agora', 3 | 'app.pwa.serviceworker.updated': 'Novo conteúdo está disponível', 4 | 'app.pwa.serviceworker.updated.hint': 5 | 'Por favor, pressione o botão "Atualizar" para recarregar a página atual', 6 | 'app.pwa.serviceworker.updated.ok': 'Atualizar', 7 | }; 8 | -------------------------------------------------------------------------------- /src/locales/pt-BR/settingDrawer.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.setting.pagestyle': 'Configuração de estilo da página', 3 | 'app.setting.pagestyle.dark': 'Dark style', 4 | 'app.setting.pagestyle.light': 'Light style', 5 | 'app.setting.content-width': 'Largura do conteúdo', 6 | 'app.setting.content-width.fixed': 'Fixo', 7 | 'app.setting.content-width.fluid': 'Fluido', 8 | 'app.setting.themecolor': 'Cor do Tema', 9 | 'app.setting.themecolor.dust': 'Dust Red', 10 | 'app.setting.themecolor.volcano': 'Volcano', 11 | 'app.setting.themecolor.sunset': 'Sunset Orange', 12 | 'app.setting.themecolor.cyan': 'Cyan', 13 | 'app.setting.themecolor.green': 'Polar Green', 14 | 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', 15 | 'app.setting.themecolor.geekblue': 'Geek Glue', 16 | 'app.setting.themecolor.purple': 'Golden Purple', 17 | 'app.setting.navigationmode': 'Modo de Navegação', 18 | 'app.setting.sidemenu': 'Layout do Menu Lateral', 19 | 'app.setting.topmenu': 'Layout do Menu Superior', 20 | 'app.setting.fixedheader': 'Cabeçalho fixo', 21 | 'app.setting.fixedsidebar': 'Barra lateral fixa', 22 | 'app.setting.fixedsidebar.hint': 'Funciona no layout do menu lateral', 23 | 'app.setting.hideheader': 'Esconder o cabeçalho quando rolar', 24 | 'app.setting.hideheader.hint': 'Funciona quando o esconder cabeçalho está abilitado', 25 | 'app.setting.othersettings': 'Outras configurações', 26 | 'app.setting.weakmode': 'Weak Mode', 27 | 'app.setting.copy': 'Copiar Configuração', 28 | 'app.setting.copyinfo': 29 | 'copiado com sucesso, por favor trocar o defaultSettings em src/models/setting.js', 30 | 'app.setting.production.hint': 31 | 'O painel de configuração apenas é exibido no ambiente de desenvolvimento, por favor modifique manualmente o', 32 | }; 33 | -------------------------------------------------------------------------------- /src/locales/zh-CN.ts: -------------------------------------------------------------------------------- 1 | import component from './zh-CN/component'; 2 | import globalHeader from './zh-CN/globalHeader'; 3 | import menu from './zh-CN/menu'; 4 | import pages from './zh-CN/pages'; 5 | import pwa from './zh-CN/pwa'; 6 | import settingDrawer from './zh-CN/settingDrawer'; 7 | import settings from './zh-CN/settings'; 8 | 9 | export default { 10 | 'navBar.lang': '语言', 11 | 'layout.user.link.help': '帮助', 12 | 'layout.user.link.privacy': '隐私', 13 | 'layout.user.link.terms': '条款', 14 | 'app.preview.down.block': '下载此页面到本地项目', 15 | 'app.welcome.link.fetch-blocks': '获取全部区块', 16 | 'app.welcome.link.block-list': '基于 block 开发,快速构建标准页面', 17 | ...pages, 18 | ...globalHeader, 19 | ...menu, 20 | ...settingDrawer, 21 | ...settings, 22 | ...pwa, 23 | ...component, 24 | }; 25 | -------------------------------------------------------------------------------- /src/locales/zh-CN/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': '展开', 3 | 'component.tagSelect.collapse': '收起', 4 | 'component.tagSelect.all': '全部', 5 | }; 6 | -------------------------------------------------------------------------------- /src/locales/zh-CN/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': '站内搜索', 3 | 'component.globalHeader.search.example1': '搜索提示一', 4 | 'component.globalHeader.search.example2': '搜索提示二', 5 | 'component.globalHeader.search.example3': '搜索提示三', 6 | 'component.globalHeader.help': '使用文档', 7 | 'component.globalHeader.notification': '通知', 8 | 'component.globalHeader.notification.empty': '你已查看所有通知', 9 | 'component.globalHeader.message': '消息', 10 | 'component.globalHeader.message.empty': '您已读完所有消息', 11 | 'component.globalHeader.event': '待办', 12 | 'component.globalHeader.event.empty': '你已完成所有待办', 13 | 'component.noticeIcon.clear': '清空', 14 | 'component.noticeIcon.cleared': '清空了', 15 | 'component.noticeIcon.empty': '暂无数据', 16 | 'component.noticeIcon.view-more': '查看更多', 17 | }; 18 | -------------------------------------------------------------------------------- /src/locales/zh-CN/menu.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'menu.welcome': '欢迎', 3 | 'menu.more-blocks': '更多区块', 4 | 'menu.home': '首页', 5 | 'menu.admin': '管理页', 6 | 'menu.admin.sub-page': '二级管理页', 7 | 'menu.login': '登录', 8 | 'menu.register': '注册', 9 | 'menu.register-result': '注册结果', 10 | 'menu.dashboard': 'Dashboard', 11 | 'menu.dashboard.analysis': '分析页', 12 | 'menu.dashboard.monitor': '监控页', 13 | 'menu.dashboard.workplace': '工作台', 14 | 'menu.exception.403': '403', 15 | 'menu.exception.404': '404', 16 | 'menu.exception.500': '500', 17 | 'menu.form': '表单页', 18 | 'menu.form.basic-form': '基础表单', 19 | 'menu.form.step-form': '分步表单', 20 | 'menu.form.step-form.info': '分步表单(填写转账信息)', 21 | 'menu.form.step-form.confirm': '分步表单(确认转账信息)', 22 | 'menu.form.step-form.result': '分步表单(完成)', 23 | 'menu.form.advanced-form': '高级表单', 24 | 'menu.list': '列表页', 25 | 'menu.list.table-list': '查询表格', 26 | 'menu.list.basic-list': '标准列表', 27 | 'menu.list.card-list': '卡片列表', 28 | 'menu.list.search-list': '搜索列表', 29 | 'menu.list.search-list.articles': '搜索列表(文章)', 30 | 'menu.list.search-list.projects': '搜索列表(项目)', 31 | 'menu.list.search-list.applications': '搜索列表(应用)', 32 | 'menu.profile': '详情页', 33 | 'menu.profile.basic': '基础详情页', 34 | 'menu.profile.advanced': '高级详情页', 35 | 'menu.result': '结果页', 36 | 'menu.result.success': '成功页', 37 | 'menu.result.fail': '失败页', 38 | 'menu.exception': '异常页', 39 | 'menu.exception.not-permission': '403', 40 | 'menu.exception.not-find': '404', 41 | 'menu.exception.server-error': '500', 42 | 'menu.exception.trigger': '触发错误', 43 | 'menu.account': '个人页', 44 | 'menu.account.center': '个人中心', 45 | 'menu.account.settings': '个人设置', 46 | 'menu.account.trigger': '触发报错', 47 | 'menu.account.logout': '退出登录', 48 | 'menu.editor': '图形编辑器', 49 | 'menu.editor.flow': '流程编辑器', 50 | 'menu.editor.mind': '脑图编辑器', 51 | 'menu.editor.koni': '拓扑编辑器', 52 | }; 53 | -------------------------------------------------------------------------------- /src/locales/zh-CN/pages.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'pages.layouts.userLayout.title': 'Ant Design 是西湖区最具影响力的 Web 设计规范', 3 | 'pages.login.accountLogin.tab': '账户密码登录', 4 | 'pages.login.accountLogin.errorMessage': '错误的用户名和密码(admin/ant.design)', 5 | 'pages.login.failure': '登录失败,请重试!', 6 | 'pages.login.success': '登录成功!', 7 | 'pages.login.username.placeholder': '用户名: admin or user', 8 | 'pages.login.username.required': '用户名是必填项!', 9 | 'pages.login.password.placeholder': '密码: ant.design', 10 | 'pages.login.password.required': '密码是必填项!', 11 | 'pages.login.phoneLogin.tab': '手机号登录', 12 | 'pages.login.phoneLogin.errorMessage': '验证码错误', 13 | 'pages.login.phoneNumber.placeholder': '请输入手机号!', 14 | 'pages.login.phoneNumber.required': '手机号是必填项!', 15 | 'pages.login.phoneNumber.invalid': '不合法的手机号!', 16 | 'pages.login.captcha.placeholder': '请输入验证码!', 17 | 'pages.login.captcha.required': '验证码是必填项!', 18 | 'pages.login.phoneLogin.getVerificationCode': '获取验证码', 19 | 'pages.getCaptchaSecondText': '秒后重新获取', 20 | 'pages.login.rememberMe': '自动登录', 21 | 'pages.login.forgotPassword': '忘记密码 ?', 22 | 'pages.login.submit': '登录', 23 | 'pages.login.loginWith': '其他登录方式 :', 24 | 'pages.login.registerAccount': '注册账户', 25 | 'pages.welcome.link': '欢迎使用', 26 | 'pages.welcome.alertMessage': '更快更强的重型组件,已经发布。', 27 | 'pages.404.subTitle': '抱歉,您访问的页面不存在。', 28 | 'pages.404.buttonText': '返回首页', 29 | 'pages.admin.subPage.title': ' 这个页面只有 admin 权限才能查看', 30 | 'pages.admin.subPage.alertMessage': 'umi ui 现已发布,欢迎使用 npm run ui 启动体验。', 31 | 'pages.searchTable.createForm.newRule': '新建规则', 32 | 'pages.searchTable.updateForm.ruleConfig': '规则配置', 33 | 'pages.searchTable.updateForm.basicConfig': '基本信息', 34 | 'pages.searchTable.updateForm.ruleName.nameLabel': '规则名称', 35 | 'pages.searchTable.updateForm.ruleName.nameRules': '请输入规则名称!', 36 | 'pages.searchTable.updateForm.ruleDesc.descLabel': '规则描述', 37 | 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '请输入至少五个字符', 38 | 'pages.searchTable.updateForm.ruleDesc.descRules': '请输入至少五个字符的规则描述!', 39 | 'pages.searchTable.updateForm.ruleProps.title': '配置规则属性', 40 | 'pages.searchTable.updateForm.object': '监控对象', 41 | 'pages.searchTable.updateForm.ruleProps.templateLabel': '规则模板', 42 | 'pages.searchTable.updateForm.ruleProps.typeLabel': '规则类型', 43 | 'pages.searchTable.updateForm.schedulingPeriod.title': '设定调度周期', 44 | 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '开始时间', 45 | 'pages.searchTable.updateForm.schedulingPeriod.timeRules': '请选择开始时间!', 46 | 'pages.searchTable.titleDesc': '描述', 47 | 'pages.searchTable.ruleName': '规则名称为必填项', 48 | 'pages.searchTable.titleCallNo': '服务调用次数', 49 | 'pages.searchTable.titleStatus': '状态', 50 | 'pages.searchTable.nameStatus.default': '关闭', 51 | 'pages.searchTable.nameStatus.running': '运行中', 52 | 'pages.searchTable.nameStatus.online': '已上线', 53 | 'pages.searchTable.nameStatus.abnormal': '异常', 54 | 'pages.searchTable.titleUpdatedAt': '上次调度时间', 55 | 'pages.searchTable.exception': '请输入异常原因!', 56 | 'pages.searchTable.titleOption': '操作', 57 | 'pages.searchTable.config': '配置', 58 | 'pages.searchTable.subscribeAlert': '订阅警报', 59 | 'pages.searchTable.title': '查询表格', 60 | 'pages.searchTable.new': '新建', 61 | 'pages.searchTable.chosen': '已选择', 62 | 'pages.searchTable.item': '项', 63 | 'pages.searchTable.totalServiceCalls': '服务调用次数总计', 64 | 'pages.searchTable.tenThousand': '万', 65 | 'pages.searchTable.batchDeletion': '批量删除', 66 | 'pages.searchTable.batchApproval': '批量审批', 67 | }; 68 | -------------------------------------------------------------------------------- /src/locales/zh-CN/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': '当前处于离线状态', 3 | 'app.pwa.serviceworker.updated': '有新内容', 4 | 'app.pwa.serviceworker.updated.hint': '请点击“刷新”按钮或者手动刷新页面', 5 | 'app.pwa.serviceworker.updated.ok': '刷新', 6 | }; 7 | -------------------------------------------------------------------------------- /src/locales/zh-CN/settingDrawer.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.setting.pagestyle': '整体风格设置', 3 | 'app.setting.pagestyle.dark': '暗色菜单风格', 4 | 'app.setting.pagestyle.light': '亮色菜单风格', 5 | 'app.setting.content-width': '内容区域宽度', 6 | 'app.setting.content-width.fixed': '定宽', 7 | 'app.setting.content-width.fluid': '流式', 8 | 'app.setting.themecolor': '主题色', 9 | 'app.setting.themecolor.dust': '薄暮', 10 | 'app.setting.themecolor.volcano': '火山', 11 | 'app.setting.themecolor.sunset': '日暮', 12 | 'app.setting.themecolor.cyan': '明青', 13 | 'app.setting.themecolor.green': '极光绿', 14 | 'app.setting.themecolor.daybreak': '拂晓蓝(默认)', 15 | 'app.setting.themecolor.geekblue': '极客蓝', 16 | 'app.setting.themecolor.purple': '酱紫', 17 | 'app.setting.navigationmode': '导航模式', 18 | 'app.setting.sidemenu': '侧边菜单布局', 19 | 'app.setting.topmenu': '顶部菜单布局', 20 | 'app.setting.fixedheader': '固定 Header', 21 | 'app.setting.fixedsidebar': '固定侧边菜单', 22 | 'app.setting.fixedsidebar.hint': '侧边菜单布局时可配置', 23 | 'app.setting.hideheader': '下滑时隐藏 Header', 24 | 'app.setting.hideheader.hint': '固定 Header 时可配置', 25 | 'app.setting.othersettings': '其他设置', 26 | 'app.setting.weakmode': '色弱模式', 27 | 'app.setting.copy': '拷贝设置', 28 | 'app.setting.copyinfo': '拷贝成功,请到 config/defaultSettings.js 中替换默认配置', 29 | 'app.setting.production.hint': 30 | '配置栏只在开发环境用于预览,生产环境不会展现,请拷贝后手动修改配置文件', 31 | }; 32 | -------------------------------------------------------------------------------- /src/locales/zh-CN/settings.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.settings.menuMap.basic': '基本设置', 3 | 'app.settings.menuMap.security': '安全设置', 4 | 'app.settings.menuMap.binding': '账号绑定', 5 | 'app.settings.menuMap.notification': '新消息通知', 6 | 'app.settings.basic.avatar': '头像', 7 | 'app.settings.basic.change-avatar': '更换头像', 8 | 'app.settings.basic.email': '邮箱', 9 | 'app.settings.basic.email-message': '请输入您的邮箱!', 10 | 'app.settings.basic.nickname': '昵称', 11 | 'app.settings.basic.nickname-message': '请输入您的昵称!', 12 | 'app.settings.basic.profile': '个人简介', 13 | 'app.settings.basic.profile-message': '请输入个人简介!', 14 | 'app.settings.basic.profile-placeholder': '个人简介', 15 | 'app.settings.basic.country': '国家/地区', 16 | 'app.settings.basic.country-message': '请输入您的国家或地区!', 17 | 'app.settings.basic.geographic': '所在省市', 18 | 'app.settings.basic.geographic-message': '请输入您的所在省市!', 19 | 'app.settings.basic.address': '街道地址', 20 | 'app.settings.basic.address-message': '请输入您的街道地址!', 21 | 'app.settings.basic.phone': '联系电话', 22 | 'app.settings.basic.phone-message': '请输入您的联系电话!', 23 | 'app.settings.basic.update': '更新基本信息', 24 | 'app.settings.security.strong': '强', 25 | 'app.settings.security.medium': '中', 26 | 'app.settings.security.weak': '弱', 27 | 'app.settings.security.password': '账户密码', 28 | 'app.settings.security.password-description': '当前密码强度', 29 | 'app.settings.security.phone': '密保手机', 30 | 'app.settings.security.phone-description': '已绑定手机', 31 | 'app.settings.security.question': '密保问题', 32 | 'app.settings.security.question-description': '未设置密保问题,密保问题可有效保护账户安全', 33 | 'app.settings.security.email': '备用邮箱', 34 | 'app.settings.security.email-description': '已绑定邮箱', 35 | 'app.settings.security.mfa': 'MFA 设备', 36 | 'app.settings.security.mfa-description': '未绑定 MFA 设备,绑定后,可以进行二次确认', 37 | 'app.settings.security.modify': '修改', 38 | 'app.settings.security.set': '设置', 39 | 'app.settings.security.bind': '绑定', 40 | 'app.settings.binding.taobao': '绑定淘宝', 41 | 'app.settings.binding.taobao-description': '当前未绑定淘宝账号', 42 | 'app.settings.binding.alipay': '绑定支付宝', 43 | 'app.settings.binding.alipay-description': '当前未绑定支付宝账号', 44 | 'app.settings.binding.dingding': '绑定钉钉', 45 | 'app.settings.binding.dingding-description': '当前未绑定钉钉账号', 46 | 'app.settings.binding.bind': '绑定', 47 | 'app.settings.notification.password': '账户密码', 48 | 'app.settings.notification.password-description': '其他用户的消息将以站内信的形式通知', 49 | 'app.settings.notification.messages': '系统消息', 50 | 'app.settings.notification.messages-description': '系统消息将以站内信的形式通知', 51 | 'app.settings.notification.todo': '待办任务', 52 | 'app.settings.notification.todo-description': '待办任务将以站内信的形式通知', 53 | 'app.settings.open': '开', 54 | 'app.settings.close': '关', 55 | }; 56 | -------------------------------------------------------------------------------- /src/locales/zh-TW.ts: -------------------------------------------------------------------------------- 1 | import component from './zh-TW/component'; 2 | import globalHeader from './zh-TW/globalHeader'; 3 | import menu from './zh-TW/menu'; 4 | import pwa from './zh-TW/pwa'; 5 | import settingDrawer from './zh-TW/settingDrawer'; 6 | import settings from './zh-TW/settings'; 7 | 8 | export default { 9 | 'navBar.lang': '語言', 10 | 'layout.user.link.help': '幫助', 11 | 'layout.user.link.privacy': '隱私', 12 | 'layout.user.link.terms': '條款', 13 | 'app.preview.down.block': '下載此頁面到本地項目', 14 | ...globalHeader, 15 | ...menu, 16 | ...settingDrawer, 17 | ...settings, 18 | ...pwa, 19 | ...component, 20 | }; 21 | -------------------------------------------------------------------------------- /src/locales/zh-TW/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': '展開', 3 | 'component.tagSelect.collapse': '收起', 4 | 'component.tagSelect.all': '全部', 5 | }; 6 | -------------------------------------------------------------------------------- /src/locales/zh-TW/globalHeader.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.globalHeader.search': '站內搜索', 3 | 'component.globalHeader.search.example1': '搜索提示壹', 4 | 'component.globalHeader.search.example2': '搜索提示二', 5 | 'component.globalHeader.search.example3': '搜索提示三', 6 | 'component.globalHeader.help': '使用手冊', 7 | 'component.globalHeader.notification': '通知', 8 | 'component.globalHeader.notification.empty': '妳已查看所有通知', 9 | 'component.globalHeader.message': '消息', 10 | 'component.globalHeader.message.empty': '您已讀完所有消息', 11 | 'component.globalHeader.event': '待辦', 12 | 'component.globalHeader.event.empty': '妳已完成所有待辦', 13 | 'component.noticeIcon.clear': '清空', 14 | 'component.noticeIcon.cleared': '清空了', 15 | 'component.noticeIcon.empty': '暫無資料', 16 | 'component.noticeIcon.view-more': '查看更多', 17 | }; 18 | -------------------------------------------------------------------------------- /src/locales/zh-TW/menu.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'menu.welcome': '歡迎', 3 | 'menu.more-blocks': '更多區塊', 4 | 'menu.home': '首頁', 5 | 'menu.admin': '权限', 6 | 'menu.admin.sub-page': '二级管理页', 7 | 'menu.login': '登錄', 8 | 'menu.register': '註冊', 9 | 'menu.register-result': '註冊結果', 10 | 'menu.dashboard': 'Dashboard', 11 | 'menu.dashboard.analysis': '分析頁', 12 | 'menu.dashboard.monitor': '監控頁', 13 | 'menu.dashboard.workplace': '工作臺', 14 | 'menu.exception.403': '403', 15 | 'menu.exception.404': '404', 16 | 'menu.exception.500': '500', 17 | 'menu.form': '表單頁', 18 | 'menu.form.basic-form': '基礎表單', 19 | 'menu.form.step-form': '分步表單', 20 | 'menu.form.step-form.info': '分步表單(填寫轉賬信息)', 21 | 'menu.form.step-form.confirm': '分步表單(確認轉賬信息)', 22 | 'menu.form.step-form.result': '分步表單(完成)', 23 | 'menu.form.advanced-form': '高級表單', 24 | 'menu.list': '列表頁', 25 | 'menu.list.table-list': '查詢表格', 26 | 'menu.list.basic-list': '標淮列表', 27 | 'menu.list.card-list': '卡片列表', 28 | 'menu.list.search-list': '搜索列表', 29 | 'menu.list.search-list.articles': '搜索列表(文章)', 30 | 'menu.list.search-list.projects': '搜索列表(項目)', 31 | 'menu.list.search-list.applications': '搜索列表(應用)', 32 | 'menu.profile': '詳情頁', 33 | 'menu.profile.basic': '基礎詳情頁', 34 | 'menu.profile.advanced': '高級詳情頁', 35 | 'menu.result': '結果頁', 36 | 'menu.result.success': '成功頁', 37 | 'menu.result.fail': '失敗頁', 38 | 'menu.exception': '异常页', 39 | 'menu.exception.not-permission': '403', 40 | 'menu.exception.not-find': '404', 41 | 'menu.exception.server-error': '500', 42 | 'menu.exception.trigger': '触发错误', 43 | 'menu.account': '個人頁', 44 | 'menu.account.center': '個人中心', 45 | 'menu.account.settings': '個人設置', 46 | 'menu.account.trigger': '觸發報錯', 47 | 'menu.account.logout': '退出登錄', 48 | 'menu.editor': '圖形編輯器', 49 | 'menu.editor.flow': '流程編輯器', 50 | 'menu.editor.mind': '腦圖編輯器', 51 | 'menu.editor.koni': '拓撲編輯器', 52 | }; 53 | -------------------------------------------------------------------------------- /src/locales/zh-TW/pages.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'pages.layouts.userLayout.title': 'Ant Design 是西湖區最具影響力的 Web 設計規範', 3 | 'pages.login.accountLogin.tab': '賬戶密碼登錄', 4 | 'pages.login.accountLogin.errorMessage': '錯誤的用戶名和密碼(admin/ant.design)', 5 | 'pages.login.failure': '登錄失敗,請重試!', 6 | 'pages.login.success': '登錄成功!', 7 | 'pages.login.username.placeholder': '用戶名: admin or user', 8 | 'pages.login.username.required': '用戶名是必填項!', 9 | 'pages.login.password.placeholder': '密碼: ant.design', 10 | 'pages.login.password.required': '密碼是必填項!', 11 | 'pages.login.phoneLogin.tab': '手機號登錄', 12 | 'pages.login.phoneLogin.errorMessage': '驗證碼錯誤', 13 | 'pages.login.phoneNumber.placeholder': '請輸入手機號!', 14 | 'pages.login.phoneNumber.required': '手機號是必填項!', 15 | 'pages.login.phoneNumber.invalid': '不合法的手機號!', 16 | 'pages.login.captcha.placeholder': '請輸入驗證碼!', 17 | 'pages.login.captcha.required': '驗證碼是必填項!', 18 | 'pages.login.phoneLogin.getVerificationCode': '獲取驗證碼', 19 | 'pages.getCaptchaSecondText': '秒後重新獲取', 20 | 'pages.login.rememberMe': '自動登錄', 21 | 'pages.login.forgotPassword': '忘記密碼 ?', 22 | 'pages.login.submit': '登錄', 23 | 'pages.login.loginWith': '其他登錄方式 :', 24 | 'pages.login.registerAccount': '註冊賬戶', 25 | 'pages.welcome.link': '歡迎使用', 26 | 'pages.welcome.alertMessage': '更快更強的重型組件,已經發布。', 27 | 'pages.404.subTitle': '抱歉,您訪問的頁面不存在。', 28 | 'pages.404.buttonText': '返回首頁', 29 | 'pages.admin.subPage.title': '這個頁面只有 admin 權限才能查看', 30 | 'pages.admin.subPage.alertMessage': 'umi ui 現已發佈,歡迎使用 npm run ui 啓動體驗。', 31 | 'pages.searchTable.createForm.newRule': '新建規則', 32 | 'pages.searchTable.updateForm.ruleConfig': '規則配置', 33 | 'pages.searchTable.updateForm.basicConfig': '基本信息', 34 | 'pages.searchTable.updateForm.ruleName.nameLabel': '規則名稱', 35 | 'pages.searchTable.updateForm.ruleName.nameRules': '請輸入規則名稱!', 36 | 'pages.searchTable.updateForm.ruleDesc.descLabel': '規則描述', 37 | 'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '請輸入至少五個字符', 38 | 'pages.searchTable.updateForm.ruleDesc.descRules': '請輸入至少五個字符的規則描述!', 39 | 'pages.searchTable.updateForm.ruleProps.title': '配置規則屬性', 40 | 'pages.searchTable.updateForm.object': '監控對象', 41 | 'pages.searchTable.updateForm.ruleProps.templateLabel': '規則模板', 42 | 'pages.searchTable.updateForm.ruleProps.typeLabel': '規則類型', 43 | 'pages.searchTable.updateForm.schedulingPeriod.title': '設定調度週期', 44 | 'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間', 45 | 'pages.searchTable.updateForm.schedulingPeriod.timeRules': '請選擇開始時間!', 46 | 'pages.searchTable.titleDesc': '描述', 47 | 'pages.searchTable.ruleName': '規則名稱爲必填項', 48 | 'pages.searchTable.titleCallNo': '服務調用次數', 49 | 'pages.searchTable.titleStatus': '狀態', 50 | 'pages.searchTable.nameStatus.default': '關閉', 51 | 'pages.searchTable.nameStatus.running': '運行中', 52 | 'pages.searchTable.nameStatus.online': '已上線', 53 | 'pages.searchTable.nameStatus.abnormal': '異常', 54 | 'pages.searchTable.titleUpdatedAt': '上次調度時間', 55 | 'pages.searchTable.exception': '請輸入異常原因!', 56 | 'pages.searchTable.titleOption': '操作', 57 | 'pages.searchTable.config': '配置', 58 | 'pages.searchTable.subscribeAlert': '訂閱警報', 59 | 'pages.searchTable.title': '查詢表格', 60 | 'pages.searchTable.new': '新建', 61 | 'pages.searchTable.chosen': '已選擇', 62 | 'pages.searchTable.item': '項', 63 | 'pages.searchTable.totalServiceCalls': '服務調用次數總計', 64 | 'pages.searchTable.tenThousand': '萬', 65 | 'pages.searchTable.batchDeletion': '批量刪除', 66 | 'pages.searchTable.batchApproval': '批量審批', 67 | }; 68 | -------------------------------------------------------------------------------- /src/locales/zh-TW/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': '當前處於離線狀態', 3 | 'app.pwa.serviceworker.updated': '有新內容', 4 | 'app.pwa.serviceworker.updated.hint': '請點擊“刷新”按鈕或者手動刷新頁面', 5 | 'app.pwa.serviceworker.updated.ok': '刷新', 6 | }; 7 | -------------------------------------------------------------------------------- /src/locales/zh-TW/settingDrawer.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.setting.pagestyle': '整體風格設置', 3 | 'app.setting.pagestyle.dark': '暗色菜單風格', 4 | 'app.setting.pagestyle.light': '亮色菜單風格', 5 | 'app.setting.content-width': '內容區域寬度', 6 | 'app.setting.content-width.fixed': '定寬', 7 | 'app.setting.content-width.fluid': '流式', 8 | 'app.setting.themecolor': '主題色', 9 | 'app.setting.themecolor.dust': '薄暮', 10 | 'app.setting.themecolor.volcano': '火山', 11 | 'app.setting.themecolor.sunset': '日暮', 12 | 'app.setting.themecolor.cyan': '明青', 13 | 'app.setting.themecolor.green': '極光綠', 14 | 'app.setting.themecolor.daybreak': '拂曉藍(默認)', 15 | 'app.setting.themecolor.geekblue': '極客藍', 16 | 'app.setting.themecolor.purple': '醬紫', 17 | 'app.setting.navigationmode': '導航模式', 18 | 'app.setting.sidemenu': '側邊菜單布局', 19 | 'app.setting.topmenu': '頂部菜單布局', 20 | 'app.setting.fixedheader': '固定 Header', 21 | 'app.setting.fixedsidebar': '固定側邊菜單', 22 | 'app.setting.fixedsidebar.hint': '側邊菜單布局時可配置', 23 | 'app.setting.hideheader': '下滑時隱藏 Header', 24 | 'app.setting.hideheader.hint': '固定 Header 時可配置', 25 | 'app.setting.othersettings': '其他設置', 26 | 'app.setting.weakmode': '色弱模式', 27 | 'app.setting.copy': '拷貝設置', 28 | 'app.setting.copyinfo': '拷貝成功,請到 config/defaultSettings.js 中替換默認配置', 29 | 'app.setting.production.hint': 30 | '配置欄只在開發環境用於預覽,生產環境不會展現,請拷貝後手動修改配置文件', 31 | }; 32 | -------------------------------------------------------------------------------- /src/locales/zh-TW/settings.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.settings.menuMap.basic': '基本設置', 3 | 'app.settings.menuMap.security': '安全設置', 4 | 'app.settings.menuMap.binding': '賬號綁定', 5 | 'app.settings.menuMap.notification': '新消息通知', 6 | 'app.settings.basic.avatar': '頭像', 7 | 'app.settings.basic.change-avatar': '更換頭像', 8 | 'app.settings.basic.email': '郵箱', 9 | 'app.settings.basic.email-message': '請輸入您的郵箱!', 10 | 'app.settings.basic.nickname': '昵稱', 11 | 'app.settings.basic.nickname-message': '請輸入您的昵稱!', 12 | 'app.settings.basic.profile': '個人簡介', 13 | 'app.settings.basic.profile-message': '請輸入個人簡介!', 14 | 'app.settings.basic.profile-placeholder': '個人簡介', 15 | 'app.settings.basic.country': '國家/地區', 16 | 'app.settings.basic.country-message': '請輸入您的國家或地區!', 17 | 'app.settings.basic.geographic': '所在省市', 18 | 'app.settings.basic.geographic-message': '請輸入您的所在省市!', 19 | 'app.settings.basic.address': '街道地址', 20 | 'app.settings.basic.address-message': '請輸入您的街道地址!', 21 | 'app.settings.basic.phone': '聯系電話', 22 | 'app.settings.basic.phone-message': '請輸入您的聯系電話!', 23 | 'app.settings.basic.update': '更新基本信息', 24 | 'app.settings.security.strong': '強', 25 | 'app.settings.security.medium': '中', 26 | 'app.settings.security.weak': '弱', 27 | 'app.settings.security.password': '賬戶密碼', 28 | 'app.settings.security.password-description': '當前密碼強度', 29 | 'app.settings.security.phone': '密保手機', 30 | 'app.settings.security.phone-description': '已綁定手機', 31 | 'app.settings.security.question': '密保問題', 32 | 'app.settings.security.question-description': '未設置密保問題,密保問題可有效保護賬戶安全', 33 | 'app.settings.security.email': '備用郵箱', 34 | 'app.settings.security.email-description': '已綁定郵箱', 35 | 'app.settings.security.mfa': 'MFA 設備', 36 | 'app.settings.security.mfa-description': '未綁定 MFA 設備,綁定後,可以進行二次確認', 37 | 'app.settings.security.modify': '修改', 38 | 'app.settings.security.set': '設置', 39 | 'app.settings.security.bind': '綁定', 40 | 'app.settings.binding.taobao': '綁定淘寶', 41 | 'app.settings.binding.taobao-description': '當前未綁定淘寶賬號', 42 | 'app.settings.binding.alipay': '綁定支付寶', 43 | 'app.settings.binding.alipay-description': '當前未綁定支付寶賬號', 44 | 'app.settings.binding.dingding': '綁定釘釘', 45 | 'app.settings.binding.dingding-description': '當前未綁定釘釘賬號', 46 | 'app.settings.binding.bind': '綁定', 47 | 'app.settings.notification.password': '賬戶密碼', 48 | 'app.settings.notification.password-description': '其他用戶的消息將以站內信的形式通知', 49 | 'app.settings.notification.messages': '系統消息', 50 | 'app.settings.notification.messages-description': '系統消息將以站內信的形式通知', 51 | 'app.settings.notification.todo': '待辦任務', 52 | 'app.settings.notification.todo-description': '待辦任務將以站內信的形式通知', 53 | 'app.settings.open': '開', 54 | 'app.settings.close': '關', 55 | }; 56 | -------------------------------------------------------------------------------- /src/pages/404.tsx: -------------------------------------------------------------------------------- 1 | import { history } from '@umijs/max'; 2 | import { Button, Result } from 'antd'; 3 | import React from 'react'; 4 | 5 | const NoFoundPage: React.FC = () => ( 6 | history.push('/')}> 12 | Back Home 13 | 14 | } 15 | /> 16 | ); 17 | 18 | export default NoFoundPage; 19 | -------------------------------------------------------------------------------- /src/pages/Admin.tsx: -------------------------------------------------------------------------------- 1 | import { HeartTwoTone, SmileTwoTone } from '@ant-design/icons'; 2 | import { PageContainer } from '@ant-design/pro-components'; 3 | import '@umijs/max'; 4 | import { Alert, Card, Typography } from 'antd'; 5 | import React from 'react'; 6 | 7 | const Admin: React.FC = () => { 8 | return ( 9 | 10 | 11 | 21 | 27 | Ant Design Pro You 28 | 29 | 30 |

36 | Want to add more pages? Please refer to{' '} 37 | 38 | use block 39 | 40 | 。 41 |

42 |
43 | ); 44 | }; 45 | export default Admin; 46 | -------------------------------------------------------------------------------- /src/pages/Admin/User/components/CreateModal.tsx: -------------------------------------------------------------------------------- 1 | import { addUserUsingPost } from '@/services/backend/userController'; 2 | import { ProColumns, ProTable } from '@ant-design/pro-components'; 3 | import '@umijs/max'; 4 | import { message, Modal } from 'antd'; 5 | import React from 'react'; 6 | 7 | interface Props { 8 | visible: boolean; 9 | columns: ProColumns[]; 10 | onSubmit: (values: API.UserAddRequest) => void; 11 | onCancel: () => void; 12 | } 13 | 14 | /** 15 | * 添加节点 16 | * @param fields 17 | */ 18 | const handleAdd = async (fields: API.UserAddRequest) => { 19 | const hide = message.loading('正在添加'); 20 | try { 21 | await addUserUsingPost(fields); 22 | hide(); 23 | message.success('创建成功'); 24 | return true; 25 | } catch (error: any) { 26 | hide(); 27 | message.error('创建失败,' + error.message); 28 | return false; 29 | } 30 | }; 31 | 32 | /** 33 | * 创建弹窗 34 | * @param props 35 | * @constructor 36 | */ 37 | const CreateModal: React.FC = (props) => { 38 | const { visible, columns, onSubmit, onCancel } = props; 39 | 40 | return ( 41 | { 47 | onCancel?.(); 48 | }} 49 | > 50 | { 54 | const success = await handleAdd(values); 55 | if (success) { 56 | onSubmit?.(values); 57 | } 58 | }} 59 | /> 60 | 61 | ); 62 | }; 63 | export default CreateModal; 64 | -------------------------------------------------------------------------------- /src/pages/Admin/User/components/UpdateModal.tsx: -------------------------------------------------------------------------------- 1 | import { updateUserUsingPost } from '@/services/backend/userController'; 2 | import { ProColumns, ProTable } from '@ant-design/pro-components'; 3 | import '@umijs/max'; 4 | import { message, Modal } from 'antd'; 5 | import React from 'react'; 6 | 7 | interface Props { 8 | oldData?: API.User; 9 | visible: boolean; 10 | columns: ProColumns[]; 11 | onSubmit: (values: API.UserAddRequest) => void; 12 | onCancel: () => void; 13 | } 14 | 15 | /** 16 | * 更新节点 17 | * 18 | * @param fields 19 | */ 20 | const handleUpdate = async (fields: API.UserUpdateRequest) => { 21 | const hide = message.loading('正在更新'); 22 | try { 23 | await updateUserUsingPost(fields); 24 | hide(); 25 | message.success('更新成功'); 26 | return true; 27 | } catch (error: any) { 28 | hide(); 29 | message.error('更新失败,' + error.message); 30 | return false; 31 | } 32 | }; 33 | 34 | /** 35 | * 更新弹窗 36 | * @param props 37 | * @constructor 38 | */ 39 | const UpdateModal: React.FC = (props) => { 40 | const { oldData, visible, columns, onSubmit, onCancel } = props; 41 | 42 | if (!oldData) { 43 | return <>; 44 | } 45 | 46 | return ( 47 | { 53 | onCancel?.(); 54 | }} 55 | > 56 | { 63 | const success = await handleUpdate({ 64 | ...values, 65 | id: oldData.id as any, 66 | }); 67 | if (success) { 68 | onSubmit?.(values); 69 | } 70 | }} 71 | /> 72 | 73 | ); 74 | }; 75 | export default UpdateModal; 76 | -------------------------------------------------------------------------------- /src/pages/Chat/LlmChat/style/llmChat.css: -------------------------------------------------------------------------------- 1 | 2 | .chat-llm-root .margin-top-16 { 3 | margin-top: 16px; 4 | } 5 | 6 | .btn-flex { 7 | display: flex; 8 | gap: 16px; 9 | } 10 | 11 | .btn-flex button { 12 | flex: 1; /* 让所有按钮等宽 */ 13 | } 14 | 15 | .chat-area { 16 | height: 380px; 17 | overflow-y: auto; 18 | } 19 | 20 | .chat-llm-root .chat-area-parent .ant-card-body:nth-child(2) { 21 | padding: 0; 22 | } 23 | 24 | /* 指定容器内的滚动条宽度和轨道颜色 */ 25 | .chat-llm-root .chat-area-parent .ant-card-body:nth-child(2) ::-webkit-scrollbar { 26 | width: 5px; /* 细滚动条 */ 27 | background: #f0f1f5; /* 轨道背景色 */ 28 | } 29 | 30 | /* 滚动条滑块颜色和样式 */ 31 | .chat-llm-root .chat-area-parent .ant-card-body:nth-child(2) ::-webkit-scrollbar-thumb { 32 | background-color: #ccd1d9; /* 滑块颜色 */ 33 | border-radius: 10px; /* 滑块圆角 */ 34 | } 35 | 36 | /* 可选: 滚动条轨道样式 */ 37 | .chat-llm-root .chat-area-parent .ant-card-body:nth-child(2) ::-webkit-scrollbar-track { 38 | background: #e1e4e8; /* 修改轨道颜色 */ 39 | } 40 | 41 | .chat-llm-root :where(.css-dev-only-do-not-override-no4izc).ant-card .ant-card-head { 42 | min-height: 40px; 43 | } 44 | 45 | .chat-llm-root .message.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 46 | position: relative; 47 | display: flex; 48 | flex-direction: column; 49 | align-self: flex-end; 50 | width: calc(100% - 16px); 51 | color: #1f2937; 52 | font-size: 16px; 53 | overflow-wrap: break-word; 54 | overflow-x: hidden; 55 | padding-right: 22px; 56 | padding: 20px; 57 | } 58 | 59 | 60 | .chat-llm-root .message-bubble-border.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 61 | border-width: 1px; 62 | border-radius: 22px; 63 | } 64 | 65 | .chat-llm-root .bot.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 66 | border-bottom-left-radius: 0; 67 | } 68 | 69 | .chat-llm-root .message-row.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d:last-of-type { 70 | margin-bottom: 16px; 71 | } 72 | 73 | .chat-llm-root .message-row.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 74 | display: flex; 75 | flex-direction: row; 76 | position: relative; 77 | } 78 | 79 | .chat-llm-root .bubble-gap.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 80 | gap: 18px; 81 | } 82 | 83 | .chat-llm-root .message-wrap.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 84 | display: flex; 85 | flex-direction: column; 86 | padding: 10px 12px 10px 12px; 87 | justify-content: space-between; 88 | } 89 | 90 | .chat-llm-root .user-row.bubble.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 91 | flex-direction: row; 92 | justify-content: flex-end; 93 | } 94 | 95 | .chat-llm-root .user.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 96 | align-self: flex-start; 97 | border-bottom-right-radius: 0; 98 | text-align: right; 99 | } 100 | 101 | .chat-llm-root .bot.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 102 | border-style: solid; 103 | border-width: 1px; 104 | border-color: #e5e7eb; 105 | background: #f6f6f6; 106 | } 107 | 108 | .chat-llm-root .user.svelte-gutj6d.svelte-gutj6d.svelte-gutj6d { 109 | border-style: solid; 110 | border-width: 1px; 111 | border-color: #e9d5ff; 112 | background-color: #faf5ff; 113 | } 114 | -------------------------------------------------------------------------------- /src/pages/Chat/components/BotChat/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import MarkdownLoader from "@/components/MarkdownComponent"; 3 | 4 | interface Props { 5 | message: string; 6 | } 7 | 8 | /** 9 | * 存放模型回复消息的消息框 10 | * @param props 11 | * @constructor 12 | */ 13 | const BotChatCard: React.FC = (props) => { 14 | const { message } = props; 15 | 16 | return ( 17 | <> 18 |
19 |
23 | 24 |
25 |
26 | 27 | ); 28 | }; 29 | export default BotChatCard; 30 | -------------------------------------------------------------------------------- /src/pages/Chat/components/UserChat/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface Props { 4 | message: string; 5 | } 6 | 7 | /** 8 | * 存放用户发出消息的消息框 9 | * @param props 10 | * @constructor 11 | */ 12 | const UserChatCard: React.FC = (props) => { 13 | const { message } = props; 14 | 15 | return ( 16 | <> 17 |
18 |
22 | {message} 23 |
24 |
25 | 26 | ); 27 | }; 28 | export default UserChatCard; 29 | -------------------------------------------------------------------------------- /src/pages/Chat/index.tsx: -------------------------------------------------------------------------------- 1 | import '@umijs/max'; 2 | import React from 'react'; 3 | import Markdown from 'react-markdown'; 4 | 5 | const Chat: React.FC = () => { 6 | const markdown = "# A demo of `react-markdown`\n" + 7 | "\n" + 8 | "`react-markdown` is a markdown component for React.\n" + 9 | "\n" + 10 | "👉 Changes are re-rendered as you type.\n" + 11 | "\n" + 12 | "👈 Try writing some markdown on the left.\n" + 13 | "\n" + 14 | "## Overview\n" + 15 | "\n" + 16 | "* Follows [CommonMark](https://commonmark.org)\n" + 17 | "* Optionally follows [GitHub Flavored Markdown](https://github.github.com/gfm/)\n" + 18 | "* Renders actual React elements instead of using `dangerouslySetInnerHTML`\n" + 19 | "* Lets you define your own components (to render `MyHeading` instead of `'h1'`)\n" + 20 | "* Has a lot of plugins\n" + 21 | "\n" + 22 | "## Contents\n" + 23 | "\n" + 24 | "Here is an example of a plugin in action\n" + 25 | "([`remark-toc`](https://github.com/remarkjs/remark-toc)).\n" + 26 | "**This section is replaced by an actual table of contents**.\n" + 27 | "\n" + 28 | "## Syntax highlighting\n" + 29 | "\n" + 30 | "Here is an example of a plugin to highlight code:\n" + 31 | "[`rehype-highlight`](https://github.com/rehypejs/rehype-highlight).\n" + 32 | "\n" + 33 | "```js\n" + 34 | "import React from 'react'\n" + 35 | "import ReactDOM from 'react-dom'\n" + 36 | "import Markdown from 'react-markdown'\n" + 37 | "import rehypeHighlight from 'rehype-highlight'"; 38 | 39 | return ( 40 | <> 41 | {markdown} 42 | 43 | ); 44 | }; 45 | export default Chat; 46 | -------------------------------------------------------------------------------- /src/pages/Cti/Annotation/style/annotationStyle.css: -------------------------------------------------------------------------------- 1 | .annotation-right-card { 2 | margin-bottom: 32px; 3 | } 4 | 5 | .annotation-right-card-btn { 6 | width: 100%; 7 | margin-bottom: 16px; 8 | } 9 | 10 | .annotation-sent-card { 11 | } 12 | 13 | .annotation-sent-card div{ 14 | display: flex; 15 | height: 20px; 16 | justify-content: center; 17 | align-items: center; 18 | margin: 0 auto; 19 | } 20 | 21 | .normal-text { 22 | padding-bottom: 12px; 23 | } 24 | 25 | .single-word-div { 26 | margin-bottom: 16px; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/pages/Cti/CtiCardShow/style/ctiCardPageStyle.css: -------------------------------------------------------------------------------- 1 | .cti-card-show-page .cti-description-parent { 2 | height: 180px; 3 | overflow-y: auto; 4 | } 5 | 6 | .cti-card-show-page .margin-top-8{ 7 | margin-top: 8px; 8 | } 9 | 10 | /* 指定容器内的滚动条宽度和轨道颜色 */ 11 | .cti-card-show-page .ant-card-meta-description ::-webkit-scrollbar { 12 | width: 5px; /* 细滚动条 */ 13 | background: #f0f1f5; /* 轨道背景色 */ 14 | } 15 | 16 | /* 滚动条滑块颜色和样式 */ 17 | .cti-card-show-page .ant-card-meta-description ::-webkit-scrollbar-thumb { 18 | background-color: #ccd1d9; /* 滑块颜色 */ 19 | border-radius: 10px; /* 滑块圆角 */ 20 | } 21 | 22 | /* 可选: 滚动条轨道样式 */ 23 | .cti-card-show-page .ant-card-meta-description ::-webkit-scrollbar-track { 24 | background: #e1e4e8; /* 修改轨道颜色 */ 25 | } 26 | -------------------------------------------------------------------------------- /src/pages/Cti/CtiShow/components/CreateModal.tsx: -------------------------------------------------------------------------------- 1 | import { ProColumns, ProTable } from '@ant-design/pro-components'; 2 | import '@umijs/max'; 3 | import { message, Modal } from 'antd'; 4 | import React from 'react'; 5 | import {addCtiReportUsingPost} from "@/services/backend/ctiController"; 6 | 7 | interface Props { 8 | visible: boolean; 9 | columns: ProColumns[]; 10 | onSubmit: (values: API.CtiAddRequest) => void; 11 | onCancel: () => void; 12 | } 13 | 14 | /** 15 | * 添加节点 16 | * @param fields 17 | */ 18 | const handleAdd = async (fields: API.CtiAddRequest) => { 19 | const hide = message.loading('正在添加'); 20 | try { 21 | await addCtiReportUsingPost(fields); 22 | hide(); 23 | message.success('创建成功'); 24 | return true; 25 | } catch (error: any) { 26 | hide(); 27 | message.error('创建失败,' + error.message); 28 | return false; 29 | } 30 | }; 31 | 32 | /** 33 | * 创建弹窗 34 | * @param props 35 | * @constructor 36 | */ 37 | const CreateModal: React.FC = (props) => { 38 | const { visible, columns, onSubmit, onCancel } = props; 39 | 40 | return ( 41 | { 47 | onCancel?.(); 48 | }} 49 | > 50 | { 54 | const success = await handleAdd(values); 55 | if (success) { 56 | onSubmit?.(values); 57 | } 58 | }} 59 | /> 60 | 61 | ); 62 | }; 63 | export default CreateModal; 64 | -------------------------------------------------------------------------------- /src/pages/Cti/Detail/components/AttckBehavior/index.tsx: -------------------------------------------------------------------------------- 1 | import '@/pages/Cti/Detail/style/detailPageStyle.css'; 2 | import { getTtpConfigByCtiIdUsingPost } from '@/services/backend/ttpController'; 3 | import '@umijs/max'; 4 | // @ts-ignore 5 | import React, { useEffect, useState } from 'react'; 6 | import {Card} from "antd"; 7 | import TtpGraph from "@/components/GraphComponent/TtpGraph"; 8 | 9 | interface Props { 10 | id: number; 11 | } 12 | 13 | const CtiDetailBehaviorPage: React.FC = (props: Props) => { 14 | const { id } = props; 15 | const [ttpConfigUrlPath, setTtpConfigUrlPath] = React.useState(); 16 | const [loading, setLoading] = useState(false); 17 | const [haveData, setHaveData] = useState(false); 18 | 19 | const loadData = async () => { 20 | try { 21 | const res = await getTtpConfigByCtiIdUsingPost({ 22 | ctiId: id, 23 | }); 24 | if (res.code === 0) { 25 | setHaveData(true); 26 | setTtpConfigUrlPath(res.data); 27 | } else { 28 | setHaveData(false); 29 | // message.error('该情报暂无TTP数据'); 30 | } 31 | } catch (e: any) { 32 | // message.error('该情报暂无TTP数据 ', e.message); 33 | } 34 | }; 35 | 36 | useEffect(() => { 37 | if (id !== null) { 38 | loadData(); 39 | } 40 | }, [id]); 41 | 42 | const handleLoad = () => { 43 | setLoading(false); 44 | }; 45 | 46 | return ( 47 |
48 |
49 | 50 | 51 | 52 |
53 |
54 | ); 55 | }; 56 | export default CtiDetailBehaviorPage; 57 | -------------------------------------------------------------------------------- /src/pages/Cti/Detail/components/Content/index.tsx: -------------------------------------------------------------------------------- 1 | import '@/pages/Cti/Detail/style/contentPageStyle.css'; 2 | import { Col, Row } from 'antd'; 3 | import DOMPurify from 'dompurify'; 4 | import React, { useState } from 'react'; 5 | 6 | interface Props { 7 | id: number; 8 | ctiDetailVo: API.CtiDetailVo; 9 | } 10 | 11 | const CtiContentPage: React.FC = (props: Props) => { 12 | const { id, ctiDetailVo } = props; 13 | const [htmlString] = useState(ctiDetailVo.htmlText ?? undefined); 14 | 15 | return ( 16 | <> 17 |
18 | 19 | 20 | {htmlString ? ( 21 |
22 | ) : ( 23 |
{ctiDetailVo.content}
24 | )} 25 |
{id}
26 | 27 | 28 |
29 | 30 | ); 31 | }; 32 | export default CtiContentPage; 33 | -------------------------------------------------------------------------------- /src/pages/Cti/Detail/components/Ttps/index.tsx: -------------------------------------------------------------------------------- 1 | import { COS_HOST } from '@/constants'; 2 | import '@/pages/Cti/Detail/style/detailPageStyle.css'; 3 | import { 4 | downloadTtpConfigByIdUsingGet, 5 | getTtpConfigByCtiIdUsingPost, 6 | } from '@/services/backend/ttpController'; 7 | import { DownloadOutlined } from '@ant-design/icons'; 8 | import '@umijs/max'; 9 | import { Button, Card, Empty } from 'antd'; 10 | // @ts-ignore 11 | import { saveAs } from 'file-saver'; 12 | import React, { useEffect, useState } from 'react'; 13 | 14 | interface Props { 15 | id: number; 16 | } 17 | 18 | const CtiDetailTtpPage: React.FC = (props: Props) => { 19 | const { id } = props; 20 | const [ttpConfigUrlPath, setTtpConfigUrlPath] = React.useState(); 21 | const [loading, setLoading] = useState(true); 22 | const [haveData, setHaveData] = useState(false); 23 | 24 | const loadData = async () => { 25 | try { 26 | const res = await getTtpConfigByCtiIdUsingPost({ 27 | ctiId: id, 28 | }); 29 | if (res.code === 0) { 30 | setHaveData(true); 31 | setTtpConfigUrlPath(res.data); 32 | } else { 33 | setHaveData(false); 34 | // message.error('该情报暂无TTP数据'); 35 | } 36 | } catch (e: any) { 37 | // message.error('该情报暂无TTP数据 ', e.message); 38 | } 39 | }; 40 | 41 | useEffect(() => { 42 | if (id !== null) { 43 | loadData(); 44 | } 45 | }, [id]); 46 | 47 | const handleLoad = () => { 48 | setLoading(false); 49 | }; 50 | 51 | return ( 52 |
53 | {loading ?? } 54 | {haveData ? ( 55 | 61 | ) : ( 62 | 63 | 64 | 65 | )} 66 | {!loading && ttpConfigUrlPath && ( 67 | 86 | )} 87 |
88 | ); 89 | }; 90 | export default CtiDetailTtpPage; 91 | -------------------------------------------------------------------------------- /src/pages/Cti/Detail/components/knowledge/index.tsx: -------------------------------------------------------------------------------- 1 | import CtiGraph from '@/components/GraphComponent/CtiGraph'; 2 | import '@/pages/Cti/Detail/style/detailPageStyle.css'; 3 | import { getGraphDataByCtiIdUsingPost } from '@/services/backend/graphController'; 4 | import GraphUtils from '@/utils/graphUtil'; 5 | import '@umijs/max'; 6 | import { Card, Empty, message } from 'antd'; 7 | import React, { useEffect, useState } from 'react'; 8 | 9 | interface Props { 10 | id: number; 11 | } 12 | 13 | const CtiDetailKnowledgePage: React.FC = (props: Props) => { 14 | const { id } = props; 15 | 16 | const [loading, setLoading] = useState(false); 17 | // 处理三元组数据 18 | const { listLoop } = GraphUtils(); 19 | // 处理页面loading逻辑 20 | 21 | const [graphMap, setGraphMap] = useState({ nodes: [], edges: [] }); 22 | 23 | const [hasGraph, setHasGraph] = useState(false); 24 | 25 | const initData = async () => { 26 | setLoading(true); 27 | try { 28 | const res = await getGraphDataByCtiIdUsingPost({ 29 | // @ts-ignore 30 | id: id, 31 | }); 32 | if (res.code === 0) { 33 | setHasGraph(res.data!.length !== 0); 34 | setGraphMap(listLoop(res.data)); 35 | } 36 | } catch (e: any) { 37 | message.error('获取图谱数据失败'); 38 | } 39 | setLoading(false); 40 | }; 41 | 42 | 43 | useEffect(() => { 44 | initData(); 45 | }, []); 46 | 47 | return ( 48 |
49 | 50 | {!hasGraph ? : graphMap && } 51 | 52 |
53 | ); 54 | }; 55 | export default CtiDetailKnowledgePage; 56 | -------------------------------------------------------------------------------- /src/pages/Cti/Detail/style/detailPageStyle.css: -------------------------------------------------------------------------------- 1 | 2 | .detail-page :where(.css-dev-only-do-not-override-r7v25l).ant-tabs .ant-tabs-tab { 3 | font-weight: 500; 4 | font-size: 0.975rem; 5 | font-family: "IBM Plex Sans", sans-serif; 6 | padding: 12px 25px; 7 | } 8 | 9 | .detail-page :where(.css-dev-only-do-not-override-fw79vu).ant-tabs .ant-tabs-tab { 10 | font-weight: 500 !important; 11 | padding: 12px 25px !important; 12 | font-size: 0.975rem !important; 13 | } 14 | 15 | .detail-page :where(.css-dev-only-do-not-override-fw79vu).ant-tabs > .ant-tabs-nav, :where(.css-dev-only-do-not-override-fw79vu).ant-tabs > div > .ant-tabs-nav { 16 | position: relative; 17 | display: flex; 18 | flex: none; 19 | align-items: center; 20 | margin-bottom: 16px; 21 | } 22 | 23 | .cti-short-title { 24 | display: -webkit-box; 25 | display: -moz-box; 26 | display: -webkit-flex; 27 | display: -ms-flexbox; 28 | display: flex; 29 | border-radius: 8px; 30 | -webkit-box-align: center; 31 | -moz-box-align: center; 32 | -o-box-align: center; 33 | -ms-flex-align: center; 34 | -webkit-align-items: center; 35 | align-items: center; 36 | padding: 0 5px; 37 | } 38 | 39 | .cti-short-title .ai-title-text { 40 | font-weight: 700; 41 | font-size: 24px; 42 | margin-left: 8px; 43 | } 44 | 45 | #ai-tag { 46 | background-color: #202040; 47 | color: rgba(255, 255, 255, .9); 48 | font-size: 24px; 49 | border-radius: 8px; 50 | line-height: 1; 51 | padding: 4px 5px; 52 | cursor: pointer; 53 | margin-left: auto; 54 | } 55 | 56 | .cti-detail-page-normal-margin-top { 57 | margin-top: 16px; 58 | } 59 | 60 | .cursor-ani { 61 | position: relative; 62 | } 63 | 64 | .cursor-ani::after { 65 | content: ''; 66 | position: absolute; 67 | width: 1px; 68 | height: 28px; 69 | background: #333; 70 | transform: translateX(3px) translateY(3px); 71 | animation: cursor-blinks 0.8s infinite forwards; 72 | } 73 | 74 | .msg-text { 75 | margin-top: 16px; 76 | font-size: 20px; 77 | padding-left: 12px; 78 | padding-right: 12px; 79 | } 80 | 81 | @keyframes cursor-blinks { 82 | from { 83 | opacity: 0; 84 | } 85 | to { 86 | opacity: 1; 87 | } 88 | } 89 | 90 | .list-item-hover:hover { 91 | background-color: rgba(239, 239, 239, 0.4); 92 | } 93 | 94 | :where(.css-dev-only-do-not-override-r7v25l).ant-tooltip .ant-tooltip-content { 95 | min-width: 32em !important; 96 | } 97 | 98 | .list-item-img { 99 | opacity: 1; 100 | transition: opacity 0.3s ease-in-out; 101 | } 102 | 103 | @media (max-width: 750px) { 104 | .list-item-img { 105 | display: none; 106 | } 107 | } 108 | 109 | iframe { 110 | border: none; 111 | } 112 | 113 | .detail-page-ttp { 114 | position: relative; 115 | } 116 | 117 | .detail-page-ttp .ttp-config-download { 118 | position: absolute; 119 | right: 15px; 120 | top: 0; 121 | height: 100px; 122 | width: 240px; 123 | } 124 | 125 | .rule-card { 126 | margin-bottom: 16px; 127 | } 128 | 129 | .ant-pro-page-container-children-container { 130 | padding-right: 25px; 131 | padding-left: 25px; 132 | } 133 | 134 | 135 | :where(.css-dev-only-do-not-override-no4izc).ant-spin-nested-loading > div > .ant-spin .ant-spin-text { 136 | top: 53%; 137 | } 138 | 139 | .ant-pro-page-container .ant-pro-page-container-warp-page-header { 140 | padding-right: 25px; 141 | padding-left: 25px; 142 | } 143 | -------------------------------------------------------------------------------- /src/pages/Cti/Graph/index.tsx: -------------------------------------------------------------------------------- 1 | import CtiGraph from '@/components/GraphComponent/CtiGraph'; 2 | import { getGraphDataByCtiIdUsingPost } from '@/services/backend/graphController'; 3 | import GraphUtils from '@/utils/graphUtil'; 4 | import { useParams } from '@@/exports'; 5 | import { PageContainer } from '@ant-design/pro-components'; 6 | import '@umijs/max'; 7 | import {Card, Col, message, Row} from 'antd'; 8 | import React, { useEffect, useState } from 'react'; 9 | 10 | const CtiGraphInformationPage: React.FC = () => { 11 | const { id } = useParams(); 12 | 13 | const { listLoop } = GraphUtils(); 14 | const [graphMap, setGraphMap] = useState({ nodes: [], edges: [] }); 15 | 16 | const initData = async () => { 17 | try { 18 | const res = await getGraphDataByCtiIdUsingPost({ 19 | // @ts-ignore 20 | id: id, 21 | }); 22 | if (res.code === 0) { 23 | message.success('图谱数据获取成功'); 24 | setGraphMap(listLoop(res.data)); 25 | } 26 | } catch (e: any) { 27 | message.error('获取图谱数据失败'); 28 | } 29 | }; 30 | 31 | useEffect(() => { 32 | initData(); 33 | }, []); 34 | 35 | return ( 36 | 37 | 38 | 39 | 40 | {graphMap && } 41 | 42 | 43 | 44 | 45 | ); 46 | }; 47 | export default CtiGraphInformationPage; 48 | -------------------------------------------------------------------------------- /src/pages/Home/components/history/index.tsx: -------------------------------------------------------------------------------- 1 | import '@/pages/Home/style/historyStyle.css'; 2 | import '@umijs/max'; 3 | import React, {useEffect, useState} from 'react'; 4 | import {useModel} from "@@/exports"; 5 | 6 | interface Props { 7 | historyList?: string[]; 8 | onItemClick: () => void; 9 | } 10 | 11 | /** 12 | * 创建弹窗 13 | * @param props 14 | * @constructor 15 | */ 16 | const HistoryBox: React.FC = (props) => { 17 | const { historyList, onItemClick } = props; 18 | const [themeState, setThemeState] = useState('light-theme'); 19 | const { initialState } = useModel('@@initialState'); 20 | 21 | 22 | useEffect(()=>{ 23 | //@ts-ignore 24 | setThemeState(initialState.settings.navTheme==='light' ? 'light-theme' : 'dark-theme') 25 | },[]) 26 | 27 | return ( 28 | <> 29 |
30 |
onItemClick?.()} 33 | > 34 | 2a734e2189ad40fdd8ad7d5a96cc85f6f4ed3bc1 35 |
36 |
onItemClick?.()}> 37 | hot.tenchier.com 38 |
39 |
onItemClick?.()}> 40 | xxx 41 |
42 |
onItemClick?.()}> 43 | xxx 44 |
45 |
onItemClick?.()}> 46 | xxx 47 |
48 |
onItemClick?.()}> 49 | xxx 50 |
51 |
onItemClick?.()}> 52 | xxx 53 |
54 |
onItemClick?.()}> 55 | xxx 56 |
57 |
58 | 59 | ); 60 | }; 61 | export default HistoryBox; 62 | -------------------------------------------------------------------------------- /src/pages/Home/components/hot/index.tsx: -------------------------------------------------------------------------------- 1 | import '@/pages/Home/style/hotStyle.css'; 2 | import { useModel } from '@@/exports'; 3 | import '@umijs/max'; 4 | import React, { useEffect, useState } from 'react'; 5 | import {Col, Row} from "antd"; 6 | 7 | interface Props { 8 | hotList: string[]; 9 | onItemClick: () => void; 10 | } 11 | 12 | /** 13 | * 创建弹窗 14 | * @param props 15 | * @constructor 16 | */ 17 | const HotBox: React.FC = (props) => { 18 | const { hotList, onItemClick } = props; 19 | const [themeState, setThemeState] = useState('light-theme'); 20 | const { initialState } = useModel('@@initialState'); 21 | 22 | useEffect(() => { 23 | //@ts-ignore 24 | setThemeState(initialState.settings.navTheme === 'light' ? 'light-theme' : 'dark-theme'); 25 | }, []); 26 | 27 | return ( 28 | <> 29 |
30 | {hotList?.length > 0 && 31 | hotList.map((hotName: string, i) => ( 32 |
onItemClick?.()}> 33 | 34 | 35 |
{i + 1}.
36 | 37 | 38 |
{hotName.trim()}
39 | 40 |
41 | 42 | 43 |
44 | ))} 45 |
46 | 47 | ); 48 | }; 49 | export default HotBox; 50 | -------------------------------------------------------------------------------- /src/pages/Home/style/historyStyle.css: -------------------------------------------------------------------------------- 1 | .history-box { 2 | padding: 10px 0 0 0; 3 | height: 250px!important; 4 | overflow-y: hidden; 5 | } 6 | 7 | .history-box .history-item { 8 | background-color: transparent; /* 设置初始背景颜色为透明 */ 9 | height: 24px; 10 | transition: background-color 0.2s ease; 11 | } 12 | 13 | .history-item:hover { 14 | cursor: pointer; 15 | } 16 | 17 | .light-theme:hover { 18 | background-color: #f6f6f6;; 19 | } 20 | 21 | .dark-theme:hover { 22 | background-color: rgba(241, 241, 241, 0.45);; 23 | } 24 | -------------------------------------------------------------------------------- /src/pages/Home/style/hotStyle.css: -------------------------------------------------------------------------------- 1 | .hot-box { 2 | padding: 10px 0 0 0; 3 | height: 250px !important; 4 | overflow-y: hidden; 5 | } 6 | 7 | .hot-box .hot-item { 8 | background-color: transparent; /* 设置初始背景颜色为透明 */ 9 | height: 24px; 10 | transition: background-color 0.2s ease; 11 | } 12 | 13 | .hot-item:hover { 14 | cursor: pointer; 15 | } 16 | 17 | .light-theme:hover { 18 | background-color: #f6f6f6; 19 | } 20 | 21 | .dark-theme:hover { 22 | background-color: rgba(241, 241, 241, 0.45);; 23 | } 24 | 25 | .hot-box .hot-item:nth-child(1) .hot-item-index { 26 | color: #f64141; 27 | } 28 | 29 | .hot-box .hot-item:nth-child(2) .hot-item-index { 30 | color: #fe8673; 31 | } 32 | 33 | .hot-box .hot-item:nth-child(3) .hot-item-index { 34 | color: #ffaa4e; 35 | } 36 | 37 | .hot-box .hot-item:nth-child(1) .hot-item-value::after, 38 | .hot-box .hot-item:nth-child(2) .hot-item-value::after, 39 | .hot-box .hot-item:nth-child(3) .hot-item-value::after{ 40 | content: url('http://localhost:8000/hot.svg'); 41 | display: inline-block; /* 或者 block,取决于你的具体布局需要 */ 42 | width: 20px; /* 设置图片的宽度 */ 43 | height: 20px; /* 设置图片的高度 */ 44 | margin-left: 6px; /* 在图片和前面的文本之间添加一些空间 */ 45 | } 46 | -------------------------------------------------------------------------------- /src/pages/Pressure.tsx: -------------------------------------------------------------------------------- 1 | import { history } from '@umijs/max'; 2 | import { Button, Result } from 'antd'; 3 | import React from 'react'; 4 | 5 | const PressurePage: React.FC = () => ( 6 | history.push('/')}> 12 | 返回 13 | 14 | } 15 | /> 16 | ); 17 | 18 | export default PressurePage; 19 | -------------------------------------------------------------------------------- /src/pages/Search/components/SearchDetail/index.tsx: -------------------------------------------------------------------------------- 1 | import {InsuranceTwoTone, PictureTwoTone, TagOutlined, ToolTwoTone} from '@ant-design/icons'; 2 | import { Col, Descriptions, Divider, Row, Tag } from 'antd'; 3 | import React from 'react'; 4 | 5 | interface Props { 6 | item: API.CtiVo; 7 | } 8 | 9 | const SearchDetailPage: React.FC = (props: Props) => { 10 | const { item } = props; 11 | 12 | return ( 13 | <> 14 |
15 |
16 | 17 | 18 | 图谱:{' '} 19 | {item.hasGraph! >= 1 ? ( 20 | 21 | ) : ( 22 | 23 | )} 24 | 25 | 26 | 规则:{' '} 27 | {item.hasRule! >= 1 ? ( 28 | 29 | ) : ( 30 | 31 | )} 32 | 33 | 34 | 技战术:{' '} 35 | {item.hasTtp! >= 1 ? ( 36 | 37 | ) : ( 38 | 39 | )} 40 | 41 | 42 |
43 | 44 | 45 | 46 |
47 | 72 |
73 |
74 | 75 | ); 76 | }; 77 | 78 | export default SearchDetailPage; 79 | -------------------------------------------------------------------------------- /src/pages/Search/style/searchStyle.css: -------------------------------------------------------------------------------- 1 | .search-root .search-left { 2 | position: relative; 3 | } 4 | 5 | .search-root .search-right .relative-cti { 6 | position: sticky; 7 | top: 56px; 8 | } 9 | 10 | .search-root .tabs-content { 11 | position: absolute; 12 | width: 85%; 13 | } 14 | 15 | .search-root .search-header { 16 | padding-bottom: 32px; 17 | box-shadow: 0 0; 18 | position: sticky; 19 | top: 56px; 20 | z-index: 999; 21 | } 22 | 23 | .search-root .information-card { 24 | position: sticky; 25 | top: 56px; 26 | } 27 | 28 | .search-root .from-card-gradient-from { 29 | --tw-gradient-from: #c0e3ff; 30 | --tw-gradient-to: #fff; 31 | --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(192, 227, 255, 0)); 32 | } 33 | 34 | .to-white { 35 | --tw-gradient-to: #fff; 36 | } 37 | 38 | .bg-gradient-to-b { 39 | background-image: linear-gradient(180deg, var(--tw-gradient-stops)); 40 | } 41 | 42 | .rounded-lg { 43 | border-radius: .5rem; 44 | } 45 | 46 | .w-full { 47 | width: 100%; 48 | } 49 | 50 | .left-0 { 51 | left: 0; 52 | } 53 | 54 | .top-0 { 55 | top: 0; 56 | } 57 | 58 | .font-bold { 59 | font-weight: 700; 60 | } 61 | .z-10 { 62 | z-index: 10; 63 | } 64 | .relative { 65 | position: relative; 66 | } 67 | 68 | .absolute { 69 | position: absolute; 70 | } 71 | 72 | .search-root :where(.css-dev-only-do-not-override-no4izc).ant-card { 73 | border-radius: 8px 0 8px 8px; 74 | } 75 | 76 | .search-root a { 77 | color: #345879; 78 | text-decoration: none; 79 | background-color: transparent; 80 | outline: none; 81 | cursor: pointer; 82 | -webkit-transition: color .3s; 83 | transition: color .3s; 84 | } 85 | 86 | .search-root .margin-top-16 { 87 | margin-top: 16px; 88 | } 89 | 90 | .search-root .red-text { 91 | color: red; 92 | font-size: 18px; 93 | } 94 | 95 | .search-root .p-2 { 96 | padding: 0.5rem; 97 | } 98 | 99 | .search-root .cursor-pointer { 100 | cursor: pointer; 101 | } 102 | 103 | .search-root .hover-gray:hover{ 104 | background-color: rgba(225, 225, 225, 0.5); 105 | } 106 | 107 | .search-root .text-ellipsis { 108 | display: -webkit-box; 109 | overflow: hidden; 110 | text-overflow: ellipsis; 111 | -webkit-box-orient: vertical; 112 | -webkit-line-clamp: 1; 113 | } 114 | 115 | .search-root .text-ellipsis-two-line { 116 | display: -webkit-box; 117 | overflow: hidden; 118 | text-overflow: ellipsis; 119 | -webkit-box-orient: vertical; 120 | -webkit-line-clamp: 2; 121 | } 122 | 123 | .search-root .text-ellipsis-three-line { 124 | display: -webkit-box; 125 | overflow: hidden; 126 | text-overflow: ellipsis; 127 | -webkit-box-orient: vertical; 128 | -webkit-line-clamp: 3; 129 | } 130 | 131 | .search-root .text-xs { 132 | font-size: .75rem; 133 | line-height: 1rem; 134 | } 135 | 136 | .information-card { 137 | 138 | } 139 | -------------------------------------------------------------------------------- /src/pages/User/Login/style/loginPage.css: -------------------------------------------------------------------------------- 1 | .ant-pro-form-login-container { 2 | height: auto; 3 | } 4 | 5 | .wx-login-item-style { 6 | width: 328px; 7 | margin: 0 auto; 8 | } 9 | 10 | .web_qrcode_wrp { 11 | text-align: center; 12 | line-height: 1.4; 13 | min-width: 200px; 14 | max-width: 75%; 15 | color: #000; 16 | color: rgba(0, 0, 0, .9); 17 | margin-top: -100px; 18 | } 19 | 20 | .web_qrcode_tips { 21 | margin-right: 10px; 22 | font-size: 17px; 23 | font-weight: 400; 24 | display: -webkit-box; 25 | display: -ms-flexbox; 26 | display: flex; 27 | -webkit-box-align: center; 28 | -ms-flex-align: center; 29 | align-items: center; 30 | -webkit-box-pack: center; 31 | -ms-flex-pack: center; 32 | justify-content: center; 33 | } 34 | 35 | .web_qrcode_tips_logo { 36 | display: inline-block; 37 | vertical-align: bottom; 38 | font-size: 24px; 39 | width: 1em; 40 | height: 1em; 41 | margin-right: 8px; 42 | background-size: cover; 43 | background-repeat: no-repeat; 44 | background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='24' height='24' viewBox='0 0 24 24'%3E %3Cdefs%3E %3Cpath id='0f20791c-6774-4e52-920f-6b6d8404b4dc-a' d='M6.724 0h10.552c2.338 0 3.186.243 4.04.7A4.766 4.766 0 0 1 23.3 2.684c.458.855.701 1.703.701 4.04v10.553c0 2.338-.243 3.186-.7 4.04a4.766 4.766 0 0 1-1.983 1.983c-.855.458-1.703.701-4.04.701H6.723c-2.338 0-3.186-.243-4.04-.7A4.766 4.766 0 0 1 .7 21.316c-.457-.854-.7-1.702-.7-4.039V6.723c0-2.338.243-3.186.7-4.04A4.766 4.766 0 0 1 2.684.7C3.538.243 4.386 0 6.723 0z'/%3E %3ClinearGradient id='0f20791c-6774-4e52-920f-6b6d8404b4dc-b' x1='50%25' x2='50%25' y1='0%25' y2='100%25'%3E %3Cstop offset='0%25' stop-color='%2302E36F'/%3E %3Cstop offset='100%25' stop-color='%2305CD65'/%3E %3Cstop offset='100%25' stop-color='%2307C160'/%3E %3C/linearGradient%3E %3C/defs%3E %3Cg fill='none' fill-rule='evenodd'%3E %3Cmask id='0f20791c-6774-4e52-920f-6b6d8404b4dc-c' fill='%23fff'%3E %3Cuse xlink:href='%230f20791c-6774-4e52-920f-6b6d8404b4dc-a'/%3E %3C/mask%3E %3Cpath fill='url(%230f20791c-6774-4e52-920f-6b6d8404b4dc-b)' d='M0 0h24v24H0z' mask='url(%230f20791c-6774-4e52-920f-6b6d8404b4dc-c)'/%3E %3Cpath fill='%23FFF' d='M19.095 17.63c1.141-.826 1.87-2.05 1.87-3.408 0-2.49-2.423-4.51-5.411-4.51-2.989 0-5.411 2.02-5.411 4.51 0 2.49 2.422 4.51 5.41 4.51.618 0 1.214-.089 1.767-.248a.543.543 0 0 1 .447.06l1.184.683c.033.02.065.034.104.034.1 0 .18-.08.18-.18 0-.045-.017-.09-.028-.132l-.244-.91a.36.36 0 0 1 .132-.409M13.75 13.5a.721.721 0 1 1 0-1.442.721.721 0 0 1 0 1.443M9.493 4.734c3.24 0 5.925 1.977 6.414 4.562a7.206 7.206 0 0 0-.353-.01c-3.27 0-5.922 2.21-5.922 4.936 0 .46.077.904.218 1.326a7.687 7.687 0 0 1-2.476-.288.651.651 0 0 0-.536.071l-1.421.82a.245.245 0 0 1-.125.041.216.216 0 0 1-.217-.216c0-.054.021-.107.035-.158l.292-1.092a.433.433 0 0 0-.159-.49C3.876 13.243 3 11.775 3 10.145c0-2.989 2.907-5.412 6.493-5.412zm7.865 7.323a.721.721 0 1 1 0 1.443.721.721 0 0 1 0-1.443zM7.328 7.548a.866.866 0 1 0 0 1.732.866.866 0 0 0 0-1.732zm4.33 0a.866.866 0 1 0 0 1.731.866.866 0 0 0 0-1.73z' mask='url(%230f20791c-6774-4e52-920f-6b6d8404b4dc-c)'/%3E %3C/g%3E%3C/svg%3E"); 45 | } 46 | 47 | .web_qrcode_app_wrp { 48 | font-size: 22px; 49 | margin-top: 24px; 50 | margin-bottom: 16px; 51 | font-weight: 500; 52 | display: -webkit-box; 53 | display: -ms-flexbox; 54 | display: flex; 55 | -webkit-box-pack: center; 56 | -ms-flex-pack: center; 57 | justify-content: center; 58 | letter-spacing: 1px; 59 | } 60 | -------------------------------------------------------------------------------- /src/service-worker.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-restricted-globals */ 2 | /* eslint-disable no-underscore-dangle */ 3 | /* globals workbox */ 4 | workbox.core.setCacheNameDetails({ 5 | prefix: 'antd-pro', 6 | suffix: 'v5', 7 | }); 8 | // Control all opened tabs ASAP 9 | workbox.clientsClaim(); 10 | 11 | /** 12 | * Use precaching list generated by workbox in build process. 13 | * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.precaching 14 | */ 15 | workbox.precaching.precacheAndRoute(self.__precacheManifest || []); 16 | 17 | /** 18 | * Register a navigation route. 19 | * https://developers.google.com/web/tools/workbox/modules/workbox-routing#how_to_register_a_navigation_route 20 | */ 21 | workbox.routing.registerNavigationRoute('/index.html'); 22 | 23 | /** 24 | * Use runtime cache: 25 | * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.routing#.registerRoute 26 | * 27 | * Workbox provides all common caching strategies including CacheFirst, NetworkFirst etc. 28 | * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.strategies 29 | */ 30 | 31 | /** Handle API requests */ 32 | workbox.routing.registerRoute(/\/api\//, workbox.strategies.networkFirst()); 33 | 34 | /** Handle third party requests */ 35 | workbox.routing.registerRoute( 36 | /^https:\/\/gw\.alipayobjects\.com\//, 37 | workbox.strategies.networkFirst(), 38 | ); 39 | workbox.routing.registerRoute( 40 | /^https:\/\/cdnjs\.cloudflare\.com\//, 41 | workbox.strategies.networkFirst(), 42 | ); 43 | workbox.routing.registerRoute(/\/color.less/, workbox.strategies.networkFirst()); 44 | 45 | /** Response to client after skipping waiting with MessageChannel */ 46 | addEventListener('message', (event) => { 47 | const replyPort = event.ports[0]; 48 | const message = event.data; 49 | if (replyPort && message && message.type === 'skip-waiting') { 50 | event.waitUntil( 51 | self.skipWaiting().then( 52 | () => { 53 | replyPort.postMessage({ 54 | error: null, 55 | }); 56 | }, 57 | (error) => { 58 | replyPort.postMessage({ 59 | error, 60 | }); 61 | }, 62 | ), 63 | ); 64 | } 65 | }); 66 | -------------------------------------------------------------------------------- /src/services.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/src/services.rar -------------------------------------------------------------------------------- /src/services/backend/ctiController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** 添加Cti情报 POST /api/cti/add */ 6 | export async function addCtiReportUsingPost( 7 | body: API.CtiAddRequest, 8 | options?: { [key: string]: any }, 9 | ) { 10 | return request('/api/cti/add', { 11 | method: 'POST', 12 | headers: { 13 | 'Content-Type': 'application/json', 14 | }, 15 | data: body, 16 | ...(options || {}), 17 | }); 18 | } 19 | 20 | /** 根据CtiId删除对应的Cti,需要管理员权限 POST /api/cti/delete */ 21 | export async function deleteCtiByCtiIdUsingPost( 22 | body: API.CtiDeleteRequest, 23 | options?: { [key: string]: any }, 24 | ) { 25 | return request('/api/cti/delete', { 26 | method: 'POST', 27 | headers: { 28 | 'Content-Type': 'application/json', 29 | }, 30 | data: body, 31 | ...(options || {}), 32 | }); 33 | } 34 | 35 | /** 根据ctiId获取对应的cti详情信息 POST /api/cti/detail */ 36 | export async function getDetailCtiUsingPost( 37 | body: API.CtiDetailQueryRequest, 38 | options?: { [key: string]: any }, 39 | ) { 40 | return request('/api/cti/detail', { 41 | method: 'POST', 42 | headers: { 43 | 'Content-Type': 'application/json', 44 | }, 45 | data: body, 46 | ...(options || {}), 47 | }); 48 | } 49 | 50 | /** getCtiDetailEntityData POST /api/cti/detail/entity */ 51 | export async function getCtiDetailEntityDataUsingPost( 52 | body: API.CtiDetailEntityRequest, 53 | options?: { [key: string]: any }, 54 | ) { 55 | return request('/api/cti/detail/entity', { 56 | method: 'POST', 57 | headers: { 58 | 'Content-Type': 'application/json', 59 | }, 60 | data: body, 61 | ...(options || {}), 62 | }); 63 | } 64 | 65 | /** 根据Cti查询信息返回CtiVo信息 POST /api/cti/list/page */ 66 | export async function getCtiByPageSentinelUsingPost( 67 | body: API.CtiQueryRequest, 68 | options?: { [key: string]: any }, 69 | ) { 70 | return request('/api/cti/list/page', { 71 | method: 'POST', 72 | headers: { 73 | 'Content-Type': 'application/json', 74 | }, 75 | data: body, 76 | ...(options || {}), 77 | }); 78 | } 79 | 80 | /** 从es中查询cti相关的数据 POST /api/cti/search/page/es/vo */ 81 | export async function searchCtiVoByPageUsingPost( 82 | body: API.CtiEsQueryRequest, 83 | options?: { [key: string]: any }, 84 | ) { 85 | return request('/api/cti/search/page/es/vo', { 86 | method: 'POST', 87 | headers: { 88 | 'Content-Type': 'application/json', 89 | }, 90 | data: body, 91 | ...(options || {}), 92 | }); 93 | } 94 | 95 | /** 获取模型已经标注好的数据 POST /api/cti/word/label/page/ */ 96 | export async function getPageCtiWordLabelListUsingPost( 97 | body: API.CtiModelWordLabelResultDto, 98 | options?: { [key: string]: any }, 99 | ) { 100 | return request('/api/cti/word/label/page/', { 101 | method: 'POST', 102 | headers: { 103 | 'Content-Type': 'application/json', 104 | }, 105 | data: body, 106 | ...(options || {}), 107 | }); 108 | } 109 | -------------------------------------------------------------------------------- /src/services/backend/ctiInnerController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** 内部请求,用于添加ctiChunk POST /api/inner/cti/add/chunk */ 6 | export async function addCtiChunkUsingPost( 7 | body: API.CtiChunkAddRequest, 8 | options?: { [key: string]: any }, 9 | ) { 10 | return request('/api/inner/cti/add/chunk', { 11 | method: 'POST', 12 | headers: { 13 | 'Content-Type': 'application/json', 14 | }, 15 | data: body, 16 | ...(options || {}), 17 | }); 18 | } 19 | 20 | /** 内部请求,用于添加cti实体 POST /api/inner/cti/add/entity */ 21 | export async function addCtiEntityUsingPost( 22 | body: API.CtiEntityInnerAddRequest, 23 | options?: { [key: string]: any }, 24 | ) { 25 | return request('/api/inner/cti/add/entity', { 26 | method: 'POST', 27 | headers: { 28 | 'Content-Type': 'application/json', 29 | }, 30 | data: body, 31 | ...(options || {}), 32 | }); 33 | } 34 | 35 | /** 内部请求,用于根据id改变内容 POST /api/inner/cti/update/content */ 36 | export async function updateCtiContentByCtiIdUsingPost( 37 | body: API.CtiUpdateRequest, 38 | options?: { [key: string]: any }, 39 | ) { 40 | return request('/api/inner/cti/update/content', { 41 | method: 'POST', 42 | headers: { 43 | 'Content-Type': 'application/json', 44 | }, 45 | data: body, 46 | ...(options || {}), 47 | }); 48 | } 49 | -------------------------------------------------------------------------------- /src/services/backend/entityInnerController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** addUniqueEntity POST /api/inner/entity/unique/add */ 6 | export async function addUniqueEntityUsingPost( 7 | body: API.EntityAddRequest, 8 | options?: { [key: string]: any }, 9 | ) { 10 | return request('/api/inner/entity/unique/add', { 11 | method: 'POST', 12 | headers: { 13 | 'Content-Type': 'application/json', 14 | }, 15 | data: body, 16 | ...(options || {}), 17 | }); 18 | } 19 | 20 | /** getUniqueEntityIdByCtiIdAndEntityName POST /api/inner/entity/unique/entity_id */ 21 | export async function getUniqueEntityIdByCtiIdAndEntityNameUsingPost( 22 | body: API.UniqueEntityIdQueryRequest, 23 | options?: { [key: string]: any }, 24 | ) { 25 | return request('/api/inner/entity/unique/entity_id', { 26 | method: 'POST', 27 | headers: { 28 | 'Content-Type': 'application/json', 29 | }, 30 | data: body, 31 | ...(options || {}), 32 | }); 33 | } 34 | -------------------------------------------------------------------------------- /src/services/backend/fileController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** uploadFile POST /api/file/upload */ 6 | export async function uploadFileUsingPost( 7 | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) 8 | params: API.uploadFileUsingPOSTParams, 9 | body: {}, 10 | file?: File, 11 | options?: { [key: string]: any }, 12 | ) { 13 | const formData = new FormData(); 14 | 15 | if (file) { 16 | formData.append('file', file); 17 | } 18 | 19 | Object.keys(body).forEach((ele) => { 20 | const item = (body as any)[ele]; 21 | 22 | if (item !== undefined && item !== null) { 23 | if (typeof item === 'object' && !(item instanceof File)) { 24 | if (item instanceof Array) { 25 | item.forEach((f) => formData.append(ele, f || '')); 26 | } else { 27 | formData.append(ele, JSON.stringify(item)); 28 | } 29 | } else { 30 | formData.append(ele, item); 31 | } 32 | } 33 | }); 34 | 35 | return request('/api/file/upload', { 36 | method: 'POST', 37 | params: { 38 | ...params, 39 | }, 40 | data: formData, 41 | requestType: 'form', 42 | ...(options || {}), 43 | }); 44 | } 45 | -------------------------------------------------------------------------------- /src/services/backend/graphController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** getGraphDataByCtiId POST /api/graph/cti */ 6 | export async function getGraphDataByCtiIdUsingPost( 7 | body: API.CtiGraphQueryRequest, 8 | options?: { [key: string]: any }, 9 | ) { 10 | return request('/api/graph/cti', { 11 | method: 'POST', 12 | headers: { 13 | 'Content-Type': 'application/json', 14 | }, 15 | data: body, 16 | ...(options || {}), 17 | }); 18 | } 19 | 20 | /** getNodeRelCtiData POST /api/graph/node/rel */ 21 | export async function getNodeRelCtiDataUsingPost( 22 | body: API.CtiNodeRelCtiQueryRequest, 23 | options?: { [key: string]: any }, 24 | ) { 25 | return request('/api/graph/node/rel', { 26 | method: 'POST', 27 | headers: { 28 | 'Content-Type': 'application/json', 29 | }, 30 | data: body, 31 | ...(options || {}), 32 | }); 33 | } 34 | -------------------------------------------------------------------------------- /src/services/backend/homeController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** getHomeCtiTotalCount GET /api/home/home/view/ctiTotalCount */ 6 | export async function getHomeCtiTotalCountUsingGet(options?: { [key: string]: any }) { 7 | return request('/api/home/home/view/ctiTotalCount', { 8 | method: 'GET', 9 | ...(options || {}), 10 | }); 11 | } 12 | 13 | /** getHomeScoItemsCount GET /api/home/home/view/scoItemsCount */ 14 | export async function getHomeScoItemsCountUsingGet(options?: { [key: string]: any }) { 15 | return request('/api/home/home/view/scoItemsCount', { 16 | method: 'GET', 17 | ...(options || {}), 18 | }); 19 | } 20 | 21 | /** getHomeSdoItemsCount GET /api/home/home/view/sdoItemsCount */ 22 | export async function getHomeSdoItemsCountUsingGet(options?: { [key: string]: any }) { 23 | return request('/api/home/home/view/sdoItemsCount', { 24 | method: 'GET', 25 | ...(options || {}), 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /src/services/backend/index.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | // API 更新时间: 4 | // API 唯一标识: 5 | import * as ctiController from './ctiController'; 6 | import * as fileController from './fileController'; 7 | import * as graphController from './graphController'; 8 | import * as homeController from './homeController'; 9 | import * as hotController from './hotController'; 10 | import * as ctiInnerController from './ctiInnerController'; 11 | import * as entityInnerController from './entityInnerController'; 12 | import * as itemInnerController from './itemInnerController'; 13 | import * as relationInnerController from './relationInnerController'; 14 | import * as relationTypeInnerController from './relationTypeInnerController'; 15 | import * as ttpInnerController from './ttpInnerController'; 16 | import * as itemController from './itemController'; 17 | import * as llmController from './llmController'; 18 | import * as postController from './postController'; 19 | import * as relationTypeController from './relationTypeController'; 20 | import * as ruleController from './ruleController'; 21 | import * as ttpController from './ttpController'; 22 | import * as userController from './userController'; 23 | import * as wechatController from './wechatController'; 24 | export default { 25 | ctiController, 26 | fileController, 27 | graphController, 28 | homeController, 29 | hotController, 30 | ctiInnerController, 31 | entityInnerController, 32 | itemInnerController, 33 | relationInnerController, 34 | relationTypeInnerController, 35 | ttpInnerController, 36 | itemController, 37 | llmController, 38 | postController, 39 | relationTypeController, 40 | ruleController, 41 | ttpController, 42 | userController, 43 | wechatController, 44 | }; 45 | -------------------------------------------------------------------------------- /src/services/backend/itemController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** 返回item的Map形数据, 这可以用来规定下拉框的选择 GET /api/item/all */ 6 | export async function getAllItemMapDataUsingGet(options?: { [key: string]: any }) { 7 | return request('/api/item/all', { 8 | method: 'GET', 9 | ...(options || {}), 10 | }); 11 | } 12 | 13 | /** 根据ItemId删除对应的Item,需要管理员权限 POST /api/item/delete */ 14 | export async function deleteItemByItemIdUsingPost( 15 | body: API.ItemDeleteRequest, 16 | options?: { [key: string]: any }, 17 | ) { 18 | return request('/api/item/delete', { 19 | method: 'POST', 20 | headers: { 21 | 'Content-Type': 'application/json', 22 | }, 23 | data: body, 24 | ...(options || {}), 25 | }); 26 | } 27 | 28 | /** 根据Item查询信息返回ItemVo信息 POST /api/item/list/page */ 29 | export async function getItemByPageUsingPost( 30 | body: API.ItemQueryRequest, 31 | options?: { [key: string]: any }, 32 | ) { 33 | return request('/api/item/list/page', { 34 | method: 'POST', 35 | headers: { 36 | 'Content-Type': 'application/json', 37 | }, 38 | data: body, 39 | ...(options || {}), 40 | }); 41 | } 42 | 43 | /** item更新,只有管理员 POST /api/item/update */ 44 | export async function updateItemUsingPost( 45 | body: API.ItemUpdateRequest, 46 | options?: { [key: string]: any }, 47 | ) { 48 | return request('/api/item/update', { 49 | method: 'POST', 50 | headers: { 51 | 'Content-Type': 'application/json', 52 | }, 53 | data: body, 54 | ...(options || {}), 55 | }); 56 | } 57 | -------------------------------------------------------------------------------- /src/services/backend/itemInnerController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** getItemIdByItemName POST /api/inner/item/${param0} */ 6 | export async function getItemIdByItemNameUsingPost( 7 | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) 8 | params: API.getItemIdByItemNameUsingPOSTParams, 9 | options?: { [key: string]: any }, 10 | ) { 11 | const { itemName: param0, ...queryParams } = params; 12 | return request(`/api/inner/item/${param0}`, { 13 | method: 'POST', 14 | params: { ...queryParams }, 15 | ...(options || {}), 16 | }); 17 | } 18 | -------------------------------------------------------------------------------- /src/services/backend/llmController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** getLlmAnsByStream GET /api/llm/forward */ 6 | export async function getLlmAnsByStreamUsingGet( 7 | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) 8 | params: API.getLlmAnsByStreamUsingGETParams, 9 | options?: { [key: string]: any }, 10 | ) { 11 | return request('/api/llm/forward', { 12 | method: 'GET', 13 | params: { 14 | ...params, 15 | }, 16 | ...(options || {}), 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /src/services/backend/postController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** addPost POST /api/post/add */ 6 | export async function addPostUsingPost(body: API.PostAddRequest, options?: { [key: string]: any }) { 7 | return request('/api/post/add', { 8 | method: 'POST', 9 | headers: { 10 | 'Content-Type': 'application/json', 11 | }, 12 | data: body, 13 | ...(options || {}), 14 | }); 15 | } 16 | 17 | /** deletePost POST /api/post/delete */ 18 | export async function deletePostUsingPost( 19 | body: API.DeleteRequest, 20 | options?: { [key: string]: any }, 21 | ) { 22 | return request('/api/post/delete', { 23 | method: 'POST', 24 | headers: { 25 | 'Content-Type': 'application/json', 26 | }, 27 | data: body, 28 | ...(options || {}), 29 | }); 30 | } 31 | 32 | /** editPost POST /api/post/edit */ 33 | export async function editPostUsingPost( 34 | body: API.PostEditRequest, 35 | options?: { [key: string]: any }, 36 | ) { 37 | return request('/api/post/edit', { 38 | method: 'POST', 39 | headers: { 40 | 'Content-Type': 'application/json', 41 | }, 42 | data: body, 43 | ...(options || {}), 44 | }); 45 | } 46 | 47 | /** getPostVOById GET /api/post/get/vo */ 48 | export async function getPostVoByIdUsingGet( 49 | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) 50 | params: API.getPostVOByIdUsingGETParams, 51 | options?: { [key: string]: any }, 52 | ) { 53 | return request('/api/post/get/vo', { 54 | method: 'GET', 55 | params: { 56 | ...params, 57 | }, 58 | ...(options || {}), 59 | }); 60 | } 61 | 62 | /** listPostByPage POST /api/post/list/page */ 63 | export async function listPostByPageUsingPost( 64 | body: API.PostQueryRequest, 65 | options?: { [key: string]: any }, 66 | ) { 67 | return request('/api/post/list/page', { 68 | method: 'POST', 69 | headers: { 70 | 'Content-Type': 'application/json', 71 | }, 72 | data: body, 73 | ...(options || {}), 74 | }); 75 | } 76 | 77 | /** listPostVOByPage POST /api/post/list/page/vo */ 78 | export async function listPostVoByPageUsingPost( 79 | body: API.PostQueryRequest, 80 | options?: { [key: string]: any }, 81 | ) { 82 | return request('/api/post/list/page/vo', { 83 | method: 'POST', 84 | headers: { 85 | 'Content-Type': 'application/json', 86 | }, 87 | data: body, 88 | ...(options || {}), 89 | }); 90 | } 91 | 92 | /** listMyPostVOByPage POST /api/post/my/list/page/vo */ 93 | export async function listMyPostVoByPageUsingPost( 94 | body: API.PostQueryRequest, 95 | options?: { [key: string]: any }, 96 | ) { 97 | return request('/api/post/my/list/page/vo', { 98 | method: 'POST', 99 | headers: { 100 | 'Content-Type': 'application/json', 101 | }, 102 | data: body, 103 | ...(options || {}), 104 | }); 105 | } 106 | 107 | /** updatePost POST /api/post/update */ 108 | export async function updatePostUsingPost( 109 | body: API.PostUpdateRequest, 110 | options?: { [key: string]: any }, 111 | ) { 112 | return request('/api/post/update', { 113 | method: 'POST', 114 | headers: { 115 | 'Content-Type': 'application/json', 116 | }, 117 | data: body, 118 | ...(options || {}), 119 | }); 120 | } 121 | -------------------------------------------------------------------------------- /src/services/backend/relationInnerController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** addRelationData POST /api/inner/relation/add */ 6 | export async function addRelationDataUsingPost( 7 | body: API.RelationAddRequest, 8 | options?: { [key: string]: any }, 9 | ) { 10 | return request('/api/inner/relation/add', { 11 | method: 'POST', 12 | headers: { 13 | 'Content-Type': 'application/json', 14 | }, 15 | data: body, 16 | ...(options || {}), 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /src/services/backend/relationTypeController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** 获取relation_type列表,这里的relation_type是去重的 GET /api/relationType/all */ 6 | export async function getRelationTypeNameListUsingGet(options?: { [key: string]: any }) { 7 | return request('/api/relationType/all', { 8 | method: 'GET', 9 | ...(options || {}), 10 | }); 11 | } 12 | 13 | /** 根据Item查询信息返回ItemVo信息 POST /api/relationType/list/page */ 14 | export async function getRelationTypeByPageUsingPost( 15 | body: API.RelationTypeQueryRequest, 16 | options?: { [key: string]: any }, 17 | ) { 18 | return request('/api/relationType/list/page', { 19 | method: 'POST', 20 | headers: { 21 | 'Content-Type': 'application/json', 22 | }, 23 | data: body, 24 | ...(options || {}), 25 | }); 26 | } 27 | 28 | /** relationType更新 POST /api/relationType/update */ 29 | export async function updateRelationTypeUsingPost( 30 | body: API.RelationTypeUpdateRequest, 31 | options?: { [key: string]: any }, 32 | ) { 33 | return request('/api/relationType/update', { 34 | method: 'POST', 35 | headers: { 36 | 'Content-Type': 'application/json', 37 | }, 38 | data: body, 39 | ...(options || {}), 40 | }); 41 | } 42 | -------------------------------------------------------------------------------- /src/services/backend/relationTypeInnerController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** getItemIdByItemName POST /api/inner/relation/type/is_relation/${param2}/${param0}/${param1} */ 6 | export async function getItemIdByItemNameUsingPost1( 7 | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) 8 | params: API.getItemIdByItemNameUsingPOST1Params, 9 | options?: { [key: string]: any }, 10 | ) { 11 | const { endItemId: param0, relationName: param1, startItemId: param2, ...queryParams } = params; 12 | return request( 13 | `/api/inner/relation/type/is_relation/${param2}/${param0}/${param1}`, 14 | { 15 | method: 'POST', 16 | params: { ...queryParams }, 17 | ...(options || {}), 18 | }, 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/services/backend/ruleController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** createRule POST /api/rule/create */ 6 | export async function createRuleUsingPost( 7 | body: API.CtiRuleRequest, 8 | options?: { [key: string]: any }, 9 | ) { 10 | return request('/api/rule/create', { 11 | method: 'POST', 12 | headers: { 13 | 'Content-Type': 'application/json', 14 | }, 15 | data: body, 16 | ...(options || {}), 17 | }); 18 | } 19 | 20 | /** removeRuleByRuleId POST /api/rule/delete */ 21 | export async function removeRuleByRuleIdUsingPost( 22 | body: API.CtiRuleDeleteRequest, 23 | options?: { [key: string]: any }, 24 | ) { 25 | return request('/api/rule/delete', { 26 | method: 'POST', 27 | headers: { 28 | 'Content-Type': 'application/json', 29 | }, 30 | data: body, 31 | ...(options || {}), 32 | }); 33 | } 34 | 35 | /** downloadRuleById GET /api/rule/download */ 36 | export async function downloadRuleByIdUsingGet( 37 | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) 38 | params: API.downloadRuleByIdUsingGETParams, 39 | options?: { [key: string]: any }, 40 | ) { 41 | return request('/api/rule/download', { 42 | method: 'GET', 43 | params: { 44 | ...params, 45 | }, 46 | ...(options || {}), 47 | }); 48 | } 49 | 50 | /** getRuleByCtiId POST /api/rule/list */ 51 | export async function getRuleByCtiIdUsingPost( 52 | body: API.CtiRuleQueryRequest, 53 | options?: { [key: string]: any }, 54 | ) { 55 | return request('/api/rule/list', { 56 | method: 'POST', 57 | headers: { 58 | 'Content-Type': 'application/json', 59 | }, 60 | data: body, 61 | ...(options || {}), 62 | }); 63 | } 64 | -------------------------------------------------------------------------------- /src/services/backend/ttpController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** 根据Cti查询信息返回CtiVo信息 POST /api/ttp/config */ 6 | export async function getTtpConfigByCtiIdUsingPost( 7 | body: API.TtpQueryRequest, 8 | options?: { [key: string]: any }, 9 | ) { 10 | return request('/api/ttp/config', { 11 | method: 'POST', 12 | headers: { 13 | 'Content-Type': 'application/json', 14 | }, 15 | data: body, 16 | ...(options || {}), 17 | }); 18 | } 19 | 20 | /** downloadTtpConfigById GET /api/ttp/download */ 21 | export async function downloadTtpConfigByIdUsingGet( 22 | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) 23 | params: API.downloadTtpConfigByIdUsingGETParams, 24 | options?: { [key: string]: any }, 25 | ) { 26 | return request('/api/ttp/download', { 27 | method: 'GET', 28 | params: { 29 | ...params, 30 | }, 31 | ...(options || {}), 32 | }); 33 | } 34 | -------------------------------------------------------------------------------- /src/services/backend/ttpInnerController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** 内部请求,用于添加ttp POST /api/inner/ttp/add */ 6 | export async function addCtiTtpUsingPost( 7 | body: API.TtpAddRequest, 8 | options?: { [key: string]: any }, 9 | ) { 10 | return request('/api/inner/ttp/add', { 11 | method: 'POST', 12 | headers: { 13 | 'Content-Type': 'application/json', 14 | }, 15 | data: body, 16 | ...(options || {}), 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /src/services/backend/wechatController.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | /* eslint-disable */ 3 | import { request } from '@umijs/max'; 4 | 5 | /** getGzhLoginReceive GET /api/wx/event */ 6 | export async function getGzhLoginReceiveUsingGet(options?: { [key: string]: any }) { 7 | return request('/api/wx/event', { 8 | method: 'GET', 9 | ...(options || {}), 10 | }); 11 | } 12 | 13 | /** postGzhLoginReceive POST /api/wx/event */ 14 | export async function postGzhLoginReceiveUsingPost(options?: { [key: string]: any }) { 15 | return request('/api/wx/event', { 16 | method: 'POST', 17 | ...(options || {}), 18 | }); 19 | } 20 | 21 | /** 根据Cti查询信息返回CtiVo信息 GET /api/wx/qrcode */ 22 | export async function createTempQrCodeUsingGet(options?: { [key: string]: any }) { 23 | return request('/api/wx/qrcode', { 24 | method: 'GET', 25 | ...(options || {}), 26 | }); 27 | } 28 | 29 | /** getTicket GET /api/wx/ticket */ 30 | export async function getTicketUsingGet(options?: { [key: string]: any }) { 31 | return request('/api/wx/ticket', { 32 | method: 'GET', 33 | ...(options || {}), 34 | }); 35 | } 36 | -------------------------------------------------------------------------------- /src/style/homePageStyle.css: -------------------------------------------------------------------------------- 1 | :where(.css-dev-only-do-not-override-c6yjzg).ant-menu-light.ant-menu-horizontal >.ant-menu-item-selected, :where(.css-dev-only-do-not-override-c6yjzg).ant-menu-light>.ant-menu.ant-menu-horizontal >.ant-menu-item-selected, :where(.css-dev-only-do-not-override-c6yjzg).ant-menu-light.ant-menu-horizontal >.ant-menu-submenu-selected, :where(.css-dev-only-do-not-override-c6yjzg).ant-menu-light>.ant-menu.ant-menu-horizontal >.ant-menu-submenu-selected{ 2 | border-bottom: 3px solid #005aff; 3 | } 4 | 5 | :where(.css-dev-only-do-not-override-fw79vu).ant-tabs-top >.ant-tabs-nav::before, :where(.css-dev-only-do-not-override-fw79vu).ant-tabs-top >div>.ant-tabs-nav::before { 6 | bottom: 0; 7 | display: none; 8 | } 9 | 10 | :where(.css-dev-only-do-not-override-fw79vu).ant-tabs >.ant-tabs-nav, :where(.css-dev-only-do-not-override-fw79vu).ant-tabs >div>.ant-tabs-nav { 11 | position: relative; 12 | display: flex; 13 | flex: none; 14 | align-items: center; 15 | margin-bottom: 0; 16 | } 17 | 18 | .ant-input-search :where(.css-dev-only-do-not-override-fw79vu).ant-input-group .ant-input-affix-wrapper:not(:last-child) { 19 | border-start-start-radius: 0; 20 | border-end-start-radius: 0; 21 | } 22 | 23 | .ant-pro-layout .ant-layout-header.ant-pro-layout-header-fixed-header { 24 | z-index: 2000!important; 25 | } 26 | 27 | /* 确保布局在500px以下保持不变 */ 28 | @media (max-width: 500px) { 29 | #root { 30 | width: 500px; /* 即使在小屏幕上,布局也保持不变 */ 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'slash2'; 2 | declare module '*.css'; 3 | declare module '*.less'; 4 | declare module '*.scss'; 5 | declare module '*.sass'; 6 | declare module '*.svg'; 7 | declare module '*.png'; 8 | declare module '*.jpg'; 9 | declare module '*.jpeg'; 10 | declare module '*.gif'; 11 | declare module '*.bmp'; 12 | declare module '*.tiff'; 13 | declare module 'omit.js'; 14 | declare module 'numeral'; 15 | declare module 'mockjs'; 16 | declare module 'react-fittext'; 17 | 18 | declare const REACT_APP_ENV: 'test' | 'dev' | 'pre' | false; 19 | 20 | /** 21 | * 分页信息 22 | */ 23 | interface PageInfo { 24 | current: number; 25 | size: number; 26 | total: number; 27 | records: T[]; 28 | } 29 | 30 | /** 31 | * 分页请求 32 | */ 33 | interface PageRequest { 34 | current?: number; 35 | pageSize?: number; 36 | sortField?: string; 37 | sortOrder?: 'ascend' | 'descend'; 38 | } 39 | 40 | /** 41 | * 删除请求 42 | */ 43 | interface DeleteRequest { 44 | id: number; 45 | } 46 | 47 | /** 48 | * 返回封装 49 | */ 50 | interface BaseResponse { 51 | code: number; 52 | data: T; 53 | message?: string; 54 | } 55 | 56 | /** 57 | * 全局初始化状态 58 | */ 59 | interface InitialState { 60 | currentUser?: API.LoginUserVO; 61 | settings?: Partial; 62 | } 63 | -------------------------------------------------------------------------------- /src/utils/checkTheme.ts: -------------------------------------------------------------------------------- 1 | import {useModel} from "@@/exports"; 2 | 3 | const { initialState } = useModel('@@initialState'); 4 | 5 | export const getNowSystemTheme = () => { 6 | if (initialState.settings.navTheme === "light"){ 7 | return 'light' 8 | }else { 9 | return 'dark' 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/utils/data/db.json: -------------------------------------------------------------------------------- 1 | { 2 | "car": [ 3 | { 4 | "id": "#red-car", 5 | "position": { 6 | "x": 2100, 7 | "y": 370 8 | }, 9 | "repeat": -1, 10 | "repeatDelay": 1, 11 | "ease": "none", 12 | "duration": 15, 13 | "sound_effect": "car1.wav" 14 | }, 15 | { 16 | "id": "#yellow-car", 17 | "position": { 18 | "x": 750, 19 | "y": 1200 20 | }, 21 | "repeat": -1, 22 | "ease": "none", 23 | "repeatDelay": 2, 24 | "duration": 10, 25 | "sound_effect": "car2.wav" 26 | }, 27 | { 28 | "id": "#blue-car", 29 | "position": { 30 | "x": 200, 31 | "y": 0 32 | }, 33 | "repeat": -1, 34 | "ease": "none", 35 | "repeatDelay": 3, 36 | "duration": 18, 37 | "sound_effect": "car3.wav" 38 | } 39 | ] 40 | } -------------------------------------------------------------------------------- /src/utils/fonts/Montserrat-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/src/utils/fonts/Montserrat-Light.ttf -------------------------------------------------------------------------------- /src/utils/fonts/Montserrat-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/src/utils/fonts/Montserrat-Medium.ttf -------------------------------------------------------------------------------- /src/utils/fonts/Montserrat-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/src/utils/fonts/Montserrat-Regular.ttf -------------------------------------------------------------------------------- /src/utils/fonts/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Montserrat'; 3 | src: url('./Montserrat-Light.ttf'); 4 | font-style: normal; 5 | font-weight: 300; 6 | } 7 | 8 | @font-face { 9 | font-family: 'Montserrat'; 10 | src: url('./Montserrat-Regular.ttf'); 11 | font-style: normal; 12 | font-weight: 400; 13 | } 14 | 15 | @font-face { 16 | font-family: 'Montserrat'; 17 | src: url('./Montserrat-Medium.ttf'); 18 | font-style: normal; 19 | font-weight: 500; 20 | } 21 | -------------------------------------------------------------------------------- /src/utils/graphUtil.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export const GraphUtils = () => { 4 | //@ts-ignore 5 | const listLoop = (graphdata) => { 6 | let graphMap = { nodes: [], edges: [] }; 7 | //@ts-ignore 8 | graphdata.forEach((item) => { 9 | //@ts-ignore 10 | graphMap.nodes.push({ 11 | ...item.startNode, 12 | id: String(item.startNode?.nodeId), 13 | size: 55, 14 | label: item.startNode?.entityName, 15 | oldlabel: item.startNode?.entityName, 16 | }); 17 | //@ts-ignore 18 | graphMap.nodes.push({ 19 | ...item.endNode, 20 | id: String(item.endNode?.nodeId), 21 | size: 55, 22 | label: item.endNode?.entityName, 23 | oldlabel: item.endNode?.entityName, 24 | }); 25 | if (String(item.endNode?.nodeId) !== 'undefined') { 26 | //@ts-ignore 27 | graphMap.edges.push({ 28 | ...item.relation, 29 | source: String(item.startNode?.nodeId), 30 | target: String(item.endNode?.nodeId), 31 | label: item.relation?.relationName, 32 | }); 33 | } 34 | }); 35 | 36 | // 去重和整理节点 37 | graphMap.nodes = _.uniqBy(graphMap.nodes, 'id'); 38 | 39 | // 处理边,合并重复项,并分配曲线偏移 40 | const edgesGroupedBySource = _.groupBy(graphMap.edges, 'source'); 41 | graphMap.edges = []; 42 | //@ts-ignore 43 | Object.entries(edgesGroupedBySource).forEach(([, edges]) => { 44 | const targetCounts = {}; 45 | edges.forEach((edge) => { 46 | //@ts-ignore 47 | targetCounts[edge.target] = (targetCounts[edge.target] || 0) + 1; 48 | //@ts-ignore 49 | edge.curveOffset = -30 * targetCounts[edge.target]; 50 | graphMap.edges.push(edge); 51 | }); 52 | }); 53 | 54 | return graphMap; 55 | }; 56 | 57 | return { listLoop }; 58 | }; 59 | 60 | export default GraphUtils; 61 | -------------------------------------------------------------------------------- /src/utils/graphicon/amplifg.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/graphicon/boost.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/graphicon/expand.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/graphicon/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/graphicon/socket.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/graphicon/zoom.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/utils/sound/car1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/src/utils/sound/car1.wav -------------------------------------------------------------------------------- /src/utils/sound/car2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/src/utils/sound/car2.wav -------------------------------------------------------------------------------- /src/utils/sound/car3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YxinMiracle/alsap_frontend/e93b3d465f0aefc4211cbb8fb7608316c77af6a9/src/utils/sound/car3.wav -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./", 4 | "target": "esnext", 5 | "moduleResolution": "node", 6 | "jsx": "react-jsx", 7 | "esModuleInterop": true, 8 | "experimentalDecorators": true, 9 | "strict": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "noImplicitReturns": true, 12 | "suppressImplicitAnyIndexErrors": true, 13 | "declaration": true, 14 | "skipLibCheck": true, 15 | "resolveJsonModule": true, 16 | "paths": { 17 | "@/*": [ 18 | "./src/*" 19 | ], 20 | "@@/*": [ 21 | "./src/.umi/*" 22 | ], 23 | "@@test/*": [ 24 | "./src/.umi-test/*" 25 | ] 26 | } 27 | }, 28 | "include": [ 29 | "./**/*.d.ts", 30 | "./**/*.ts", 31 | "./**/*.tsx" 32 | ] 33 | } 34 | --------------------------------------------------------------------------------