commit e66b4a3680bd93876d84f8e95b8a4f093b110c4a Author: kk <175049651@qq.com> Date: Wed Jul 8 18:00:33 2026 +0800 init diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..d276a09 --- /dev/null +++ b/.env.development @@ -0,0 +1,13 @@ + +#开发环境配置 +VITE_APP_ENV = 'development' + +#接口地址 +VITE_APP_API=/api + +#调试参数 +VITE_APP_DEBUG_KEY=saber +VITE_APP_DEBUG_SWITCH=false + +#页面基础路径 +VITE_APP_BASE=/ diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..fe5b8df --- /dev/null +++ b/.env.production @@ -0,0 +1,17 @@ +#生产环境配置 +VITE_APP_ENV = 'production' + +#接口地址 +#填写前缀 [/api] 需要用nginx进行反向代理 +#填写地址 [https://api.bladex.cn] 只需要保证接口支持跨域即可, 无需再做代理 +VITE_APP_API=/api + +#调试参数 +VITE_APP_DEBUG_KEY=saber +VITE_APP_DEBUG_SWITCH=false + +#页面基础路径 +VITE_APP_BASE=/ + +# 是否在打包时开启压缩,支持 gzip 和 brotli +VITE_BUILD_COMPRESS = gzip diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a148397 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +.DS_Store +node_modules +/dist + +/tests/e2e/videos/ +/tests/e2e/screenshots/ + +# local env files +.env.local +.env.*.local + +# log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* + +# ai +.claude diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..614e2bc --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +@saber:registry=https://center.javablade.com/api/packages/blade/npm/ +//center.javablade.com/api/packages/blade/npm/:_authToken=如何配置请见BladeX开发手册 1.3.0配置资源令牌 章节 diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..93a9551 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "printWidth": 100, + "tabWidth": 2, + "semi": true, + "singleAttributePerLine": false, + "bracketSpacing": true, + "singleQuote": true, + "arrowParens": "avoid" +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..00f3252 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,226 @@ +# CLAUDE.md +本文件用于指导 Claude Code (claude.ai/code) 在 Saber3 代码仓库中工作时的行为规范。 + +> 本规范适用于 Saber3 前端工程的所有开发任务,为强制性条款。除非用户显式豁免,任何条目都不得忽视或删减。 +> +> 作为 AI 助手参与本项目开发时,你必须: +> - 每次输出前深度理解 BladeX 微服务架构体系、Saber3 前端工程结构和 Vue 3 技术栈特征 +> - 当回答依赖外部知识时,先查询 Vue 3、Element Plus、Avue、Vite 等官方文档 +> - 若需求含糊,先复述已知信息并列出关键澄清问题 +> - 面对复杂需求,先拆分为可管理的子任务 +> +> 所有开发内容必须建立在深度思考过的基础之上,禁止机械生成与错误填充。 +> 如果你已了解所有规范,请在用户第一次对话时说明:"我已充分了解 BladeX 微服务平台开发规范。" + +--- + +## 1. 项目概览 + +**Saber3** 是 BladeX 微服务平台的官方前端工程,基于 Vue 3 生态构建的企业级后台管理系统。 + +### 1.1 技术栈 + +| 技术 | 版本 | 用途 | +| ------------------ | -------- | ------------------ | +| Vue | ^3.5.13 | 核心框架 | +| Element Plus | ^2.10.1 | UI 组件库 | +| @smallwei/avue | ^3.7.2 | 增强型 CRUD 组件库 | +| Vue Router | ^4.3.2 | 路由管理 | +| Vuex | ^4.1.0 | 状态管理 | +| Axios | ^1.8.3 | HTTP 客户端 | +| Vite | ^5.4.19 | 构建工具 | +| vue-i18n | ^11.1.3 | 国际化 | +| Sass | ^1.85.1 | CSS 预处理器 | +| crypto-js / sm-crypto | - | 加密(AES / SM2) | + +--- + +## 2. 项目架构 + +``` +Saber3/ +├── src/ +│ ├── main.js # 应用入口(全局组件注册、插件挂载) +│ ├── permission.js # 路由守卫(鉴权、标签页、锁屏) +│ ├── axios.js # HTTP 拦截器(Token 刷新、加密、错误处理) +│ ├── api/ # API 接口层(按业务模块组织) +│ ├── views/ # 业务页面(按模块目录组织) +│ ├── option/ # Avue 表格/表单配置(与 views/api 同构路径) +│ ├── const/ # 常量定义 +│ ├── config/ # 全局配置 +│ │ ├── website.js # 核心配置(认证、菜单、水印、OAuth2、设计器) +│ │ └── env.js # 环境变量(API 基础地址) +│ ├── store/ # Vuex 状态管理(user/common/tags/logs/dict) +│ ├── router/ # 路由系统 +│ │ ├── avue-router.js # 动态路由核心(菜单→路由、keep-alive 扁平化) +│ │ ├── page/ # 页面级路由(登录、锁屏、错误页) +│ │ └── views/ # 视图路由(首页、控制台等) +│ ├── components/ # 全局公共组件 +│ ├── mixins/ # 混入(crud.js 等) +│ ├── utils/ # 工具函数(auth/crypto/validate/util...) +│ ├── lang/ # 国际化(zh/en) +│ ├── styles/ # 全局样式 & 多主题 +│ ├── mac/ # macOS 风格主题 +│ └── page/ # 页面布局框架(主布局、登录、锁屏) +├── vite/ # Vite 插件配置 +├── vite.config.mjs # Vite 主配置 +└── package.json +``` + +### 2.1 路径别名 + +`@` → `./src`、`~` → `./`、`components` → `./src/components`、`styles` → `./src/styles`、`utils` → `./src/utils` + +--- + +## 3. 核心机制 + +### 3.1 Avue 组件代码生成(Skill 调用) + +当涉及 `avue-crud`、`avue-form`、`avue-tree` 等 Avue 组件的代码生成或配置时,**优先调用 `avue-design` Skill**。该 Skill 覆盖 Avue 全部组件类型,支持 Options API 和 Composition API 两种代码风格。 + +**触发场景**:用户要求创建 CRUD 表格、Avue 表单、树组件、数据展示页面,或提到 avue、crud 表格、动态表单、JSON 配置表单等关键词。 + +### 3.2 Avue Option 配置 + +Avue 表格/表单配置独立存放于 `src/option/` 目录,与 `views` 和 `api` 保持同构的模块路径映射。 + +### 3.3 API 接口规范 + +- 所有 API 通过 `src/axios.js` 封装的 Axios 实例发起,按业务模块组织于 `src/api/` +- 命名约定:列表 `getList(current, size, params)`、详情 `getDetail(id)`、新增 `add(row)`、更新 `update(row)`、删除 `remove(ids)`、树形 `getXxxTree()` +- 后端微服务前缀:`/blade-system/`、`/blade-resource/`、`/blade-flow/`、`/blade-desk/`、`/blade-log/`、`/blade-develop/` + +### 3.4 认证机制 + +- OAuth2:`Basic` 头传递 `clientId:clientSecret`(Base64 编码) +- Token:请求头 `Blade-Auth: bearer {token}`,支持 AES 加密模式 +- 存储:`saber3-access-token` / `saber3-refresh-token`(通过 `utils/auth.js` 管理) +- 401 自动刷新 Token,并发请求排队等待;登录密码使用 SM2 国密加密 + +### 3.5 路由系统 + +- 静态路由:`router/page/` + `router/views/` +- 动态路由:`avue-router.js` 将后端菜单数据转换为 Vue Router 路由 +- 多级路由自动扁平化为二级,支持 keep-alive 跨层级缓存 +- 外部链接自动转换为 iframe 路由,支持 Token 透传 + +### 3.6 权限控制 + +- 路由守卫:`permission.js` 控制登录态、锁屏、标签页 +- 按钮权限:`store.getters.permission`,格式 `{module}_{action}`(如 `dict_add`) +- 管理员判断:`userInfo.authority.includes('admin')` + +### 3.7 多租户 + +通过 `website.tenantMode` 控制开关,管理组租户编号 `000000`,后端自动通过请求头传递租户信息。 + +--- + +## 4. 开发规范 + +### 4.1 双 API 风格共存 + +项目同时支持 **Options API**(主流,绝大多数现有页面)和 **Composition API**(新组件可选)。 + +**选择原则**: +- 修改现有页面:保持该页面原有风格,不混用 +- 新建 CRUD 页面:调用 `avue-design` Skill 生成,或参考现有页面手动编写 +- 新建复杂交互页面:可使用 Composition API + ` + + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..94cf448 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": [ + "src/*" + ] + } + }, + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7384818 --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "saber", + "version": "4.10.0", + "scripts": { + "dev": "vite --host", + "prod": "vite --mode production", + "build": "vite build", + "build:prod": "vite build --mode production", + "serve": "vite preview --host" + }, + "dependencies": { + "element-plus": "^2.14.2", + "@element-plus/icons-vue": "^2.3.1", + "@smallwei/avue": "~3.9.2", + "avue-plugin-ueditor": "^1.0.4", + "@saber/nf-design-base-elp": "^1.3.0", + "@saber/nf-form-design-elp": "^1.6.1", + "@saber/nf-form-elp": "^1.6.3", + "animate.css": "^4.1.1", + "axios": "^1.13.5", + "codemirror": "^5.65.21", + "crypto-js": "^4.1.1", + "dayjs": "^1.10.6", + "disable-devtool": "^0.3.8", + "highlight.js": "^11.9.0", + "js-base64": "^3.7.4", + "js-cookie": "^3.0.0", + "js-md5": "^0.7.3", + "nprogress": "^0.2.0", + "sm-crypto": "^0.4.0", + "vue": "^3.5.13", + "vue-i18n": "^11.4.2", + "vue-router": "^4.3.2", + "vue3-clipboard": "^1.0.0", + "vuex": "^4.1.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.4", + "@vue/compiler-sfc": "^3.4.27", + "sass": "^1.85.1", + "prettier": "^2.8.7", + "terser": "^5.31.1", + "unplugin-auto-import": "^0.11.2", + "vite": "^5.4.19", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-vue-setup-extend": "^0.4.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..517b779 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3057 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@element-plus/icons-vue': + specifier: ^2.3.1 + version: 2.3.2(vue@3.5.34) + '@saber/nf-design-base-elp': + specifier: ^1.3.0 + version: 1.3.0 + '@saber/nf-form-design-elp': + specifier: ^1.6.1 + version: 1.6.1(vue@3.5.34) + '@saber/nf-form-elp': + specifier: ^1.6.3 + version: 1.7.0 + '@smallwei/avue': + specifier: ~3.9.2 + version: 3.9.2(@element-plus/icons-vue@2.3.2(vue@3.5.34))(element-plus@2.14.2(vue@3.5.34))(vue@3.5.34) + animate.css: + specifier: ^4.1.1 + version: 4.1.1 + avue-plugin-ueditor: + specifier: ^1.0.4 + version: 1.0.4(axios@1.16.0)(vue@3.5.34) + axios: + specifier: ^1.13.5 + version: 1.16.0 + codemirror: + specifier: ^5.65.21 + version: 5.65.21 + crypto-js: + specifier: ^4.1.1 + version: 4.2.0 + dayjs: + specifier: ^1.10.6 + version: 1.11.20 + disable-devtool: + specifier: ^0.3.8 + version: 0.3.9 + element-plus: + specifier: ^2.14.2 + version: 2.14.2(vue@3.5.34) + highlight.js: + specifier: ^11.9.0 + version: 11.11.1 + js-base64: + specifier: ^3.7.4 + version: 3.7.8 + js-cookie: + specifier: ^3.0.0 + version: 3.0.5 + js-md5: + specifier: ^0.7.3 + version: 0.7.3 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + sm-crypto: + specifier: ^0.4.0 + version: 0.4.0 + vue: + specifier: ^3.5.13 + version: 3.5.34 + vue-i18n: + specifier: ^11.4.2 + version: 11.4.2(vue@3.5.34) + vue-router: + specifier: ^4.3.2 + version: 4.6.4(vue@3.5.34) + vue3-clipboard: + specifier: ^1.0.0 + version: 1.0.0(vue@3.5.34) + vuex: + specifier: ^4.1.0 + version: 4.1.0(vue@3.5.34) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^5.2.4 + version: 5.2.4(vite@5.4.21(sass@1.99.0)(terser@5.46.2))(vue@3.5.34) + '@vue/compiler-sfc': + specifier: ^3.4.27 + version: 3.5.34 + prettier: + specifier: ^2.8.7 + version: 2.8.8 + sass: + specifier: ^1.85.1 + version: 1.99.0 + terser: + specifier: ^5.31.1 + version: 5.46.2 + unplugin-auto-import: + specifier: ^0.11.2 + version: 0.11.5(@vueuse/core@14.3.0(vue@3.5.34))(rollup@4.60.3) + vite: + specifier: ^5.4.19 + version: 5.4.21(sass@1.99.0)(terser@5.46.2) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(vite@5.4.21(sass@1.99.0)(terser@5.46.2)) + vite-plugin-vue-setup-extend: + specifier: ^0.4.0 + version: 0.4.0(vite@5.4.21(sass@1.99.0)(terser@5.46.2)) + +packages: + + '@amap/amap-jsapi-loader@1.0.1': + resolution: {integrity: sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==} + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@bpmn-io/diagram-js-ui@0.2.3': + resolution: {integrity: sha512-OGyjZKvGK8tHSZ0l7RfeKhilGoOGtFDcoqSGYkX0uhFlo99OVZ9Jn1K7TJGzcE9BdKwvA5Y5kGqHEhdTxHvFfw==} + + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + + '@element-plus/icons-vue@2.3.2': + resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==} + peerDependencies: + vue: ^3.2.0 + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@intlify/core-base@11.4.2': + resolution: {integrity: sha512-7fpuCcVmeLv2T9qHsARqGvh8xt+sV2fH+Q+gMHFwB/rPXzo85DpbJFKn7dBH1L5p0c2cSh2DW+2h/64EKrISmA==} + engines: {node: '>= 16'} + + '@intlify/devtools-types@11.4.2': + resolution: {integrity: sha512-3u8EN1kB6EMSi96KXs5k7a8y2X2g4+h3X6iwVZU47cP4n+mTuq//WMjG588BzSp/2XQ/dTXo2BLUXX+XS+PNfA==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@11.4.2': + resolution: {integrity: sha512-a6CDSGSMTGrg0BjD97x8TBYPf7qQMDlZipJ6UDfv/pd4OIym8TMlHu3MsH0bTNnRdAG2D6EFEykIgiQPqvtTkA==} + engines: {node: '>= 16'} + + '@intlify/shared@11.4.2': + resolution: {integrity: sha512-NzpHbguRCsOHDwxmlBa9qu/imc+/QWgsYUaK6FZeNC0wK8QfAbhqrktEp/haVzxU1aikH8IX4ytD+mfFEMi/9A==} + engines: {node: '>= 16'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.60.3': + resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.3': + resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.3': + resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.3': + resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.3': + resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.3': + resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.3': + resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.3': + resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.3': + resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.3': + resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.3': + resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.3': + resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.3': + resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.3': + resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.3': + resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.3': + resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.3': + resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.3': + resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.3': + resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.3': + resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.3': + resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} + cpu: [x64] + os: [win32] + + '@saber/nf-design-base-elp@1.3.0': + resolution: {integrity: sha512-sKUkhErjggUjH+hoBTVpcUC7j38KAkGUloIVXIRl6YP1WT14QXvtf3iu8iCIOBO8iPKHgrBiq4h80UW9+qqbjQ==, tarball: https://center.javablade.com/api/packages/blade/npm/%40saber%2Fnf-design-base-elp/-/1.3.0/nf-design-base-elp-1.3.0.tgz} + + '@saber/nf-form-design-elp@1.6.1': + resolution: {integrity: sha512-XAKbZebglIxVxj6azOu5YKlbyJV/i8B2Kayl9MsRUVfEhnegQveio35u2afVI4dFj3Ul9KMbaoyvVokh1EvmQQ==, tarball: https://center.javablade.com/api/packages/blade/npm/%40saber%2Fnf-form-design-elp/-/1.6.1/nf-form-design-elp-1.6.1.tgz} + engines: {node: ^20.19.0 || >=22.12.0} + + '@saber/nf-form-elp@1.7.0': + resolution: {integrity: sha512-M/W+bO1r0eZ3ITwd9bxl6+MbkfddZOf6qXWEkkmPM/xgqP5BidMVuYVlQUBSpw0d62IPS9htDZmrhDHntRPXSQ==, tarball: https://center.javablade.com/api/packages/blade/npm/%40saber%2Fnf-form-elp/-/1.7.0/nf-form-elp-1.7.0.tgz} + engines: {node: ^20.19.0 || >=22.12.0} + + '@smallwei/avue@3.9.2': + resolution: {integrity: sha512-kdkC/92Bidqt8F69IgR48/CW/H0o+tCyL2IyyxMxjytv9S+ZM/v+fRV7cukTjdhoy3LkfFuNOZkLOKjSiwvFwg==} + peerDependencies: + '@element-plus/icons-vue': '>=2.0.0' + element-plus: '>=2.2.0' + vue: '>=3.2.0' + + '@sxzz/popperjs-es@2.11.8': + resolution: {integrity: sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==} + + '@transloadit/prettier-bytes@0.0.7': + resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/event-emitter@0.3.5': + resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.24': + resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@uppy/companion-client@2.2.2': + resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==} + + '@uppy/core@2.3.4': + resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==} + + '@uppy/store-default@2.1.1': + resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==} + + '@uppy/utils@4.1.3': + resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==} + + '@uppy/xhr-upload@2.1.3': + resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==} + peerDependencies: + '@uppy/core': ^2.3.3 + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.34': + resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} + + '@vue/compiler-dom@3.5.34': + resolution: {integrity: sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==} + + '@vue/compiler-sfc@3.5.34': + resolution: {integrity: sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==} + + '@vue/compiler-ssr@3.5.34': + resolution: {integrity: sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/reactivity@3.5.34': + resolution: {integrity: sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==} + + '@vue/runtime-core@3.5.34': + resolution: {integrity: sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==} + + '@vue/runtime-dom@3.5.34': + resolution: {integrity: sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==} + + '@vue/server-renderer@3.5.34': + resolution: {integrity: sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==} + peerDependencies: + vue: 3.5.34 + + '@vue/shared@3.5.34': + resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==} + + '@vueuse/core@14.3.0': + resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@14.3.0': + resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} + + '@vueuse/shared@14.3.0': + resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + peerDependencies: + vue: ^3.5.0 + + '@wangeditor-next/basic-modules@2.0.0': + resolution: {integrity: sha512-oH7Cv6mHorvBkj5t3isP9wncgWABYLlQpoQZYOIFtWVwgsQatwoGVFHF6PoJzz+mTkt5UaJcyfDxFSo9Thvhdw==} + peerDependencies: + '@wangeditor-next/core': 1.8.0 + dom7: ^3.0.0 || ^4.0.0 + lodash.throttle: ^4.1.1 + nanoid: ^5.0.0 + slate: ^0.123.0 + snabbdom: ^3.6.0 + + '@wangeditor-next/code-highlight@2.0.0': + resolution: {integrity: sha512-A0m4KghOK+9jyufSBidTAtva5VssC2zW3oYItRdMi75p3WV8Kqb67q0kUeFcDzlm9H+IvXzwvSnQ8xl6Zk07nw==} + peerDependencies: + '@wangeditor-next/core': 1.8.0 + dom7: ^3.0.0 || ^4.0.0 + slate: ^0.123.0 + snabbdom: ^3.6.0 + + '@wangeditor-next/core@1.8.0': + resolution: {integrity: sha512-U2TlQ0Lpo6aLb0KD8oJgzG/rFAYO61cy+qbZu+t5lDfS3CECNjOhGIC3C7/dXIhiMQ8V/LY4cvrPt9R5G4vLjA==} + peerDependencies: + '@uppy/core': ^2.1.1 + '@uppy/xhr-upload': ^2.0.3 + dom7: ^3.0.0 || ^4.0.0 + is-hotkey: ^0.2.0 + lodash.camelcase: ^4.3.0 + lodash.clonedeep: ^4.5.0 + lodash.debounce: ^4.0.8 + lodash.foreach: ^4.5.0 + lodash.throttle: ^4.1.1 + lodash.toarray: ^4.4.0 + nanoid: ^5.0.0 + slate: ^0.123.0 + snabbdom: ^3.6.0 + + '@wangeditor-next/editor@5.7.0': + resolution: {integrity: sha512-bxkw/TeWBJz7AU4qXZnx5tx/s1yzx8XdLmSRN9ev4btArKnfXR/6hr3dqxUSsyea8q//IpEv1qr9tc2ureEAsA==} + + '@wangeditor-next/list-module@2.0.0': + resolution: {integrity: sha512-n7WruLV9VQxBFbav/pwWS+n5rsANqmEhVINwtngTSbScD/tDYRtLJ95SGKPU3gtBR9KHd06yEnXEgG3Pmy7A4A==} + peerDependencies: + '@wangeditor-next/core': 1.8.0 + dom7: ^3.0.0 || ^4.0.0 + slate: ^0.123.0 + snabbdom: ^3.6.0 + + '@wangeditor-next/table-module@2.0.0': + resolution: {integrity: sha512-uOj0QA6Esb/T75cCGYWByWDRX/i8EBYIJq0tNOhGxufKQVAS9/D8QshTKQpKniS1AR2PaZg4BEPkn6+QuipKTw==} + peerDependencies: + '@wangeditor-next/core': 1.8.0 + dom7: ^3.0.0 || ^4.0.0 + lodash.debounce: ^4.0.8 + lodash.throttle: ^4.1.1 + nanoid: ^5.0.0 + slate: ^0.123.0 + snabbdom: ^3.6.0 + + '@wangeditor-next/upload-image-module@2.0.0': + resolution: {integrity: sha512-mAZjCEpANWYmAZ1xkdda25AT+BMvEUqY5F3WHMB0zg3yPqUtzMv7FN1dpLl1ujErpnX+CdkL0iwon7nejpymjw==} + peerDependencies: + '@uppy/core': ^2.0.3 + '@uppy/xhr-upload': ^2.0.3 + '@wangeditor-next/basic-modules': 2.0.0 + '@wangeditor-next/core': 1.8.0 + dom7: ^3.0.0 || ^4.0.0 + lodash.foreach: ^4.5.0 + slate: ^0.123.0 + snabbdom: ^3.6.0 + + '@wangeditor-next/video-module@2.0.0': + resolution: {integrity: sha512-M21rIXlQ41rb5mjAlzEuZB9mRDDrNSsj8EmJBzAwKStEGpJhzMC44HCOFtzbRvh2W3J5mGAPXXWbdHGknxDa6g==} + peerDependencies: + '@uppy/core': ^2.1.4 + '@uppy/xhr-upload': ^2.0.7 + '@wangeditor-next/core': 1.8.0 + dom7: ^3.0.0 || ^4.0.0 + nanoid: ^5.0.0 + slate: ^0.123.0 + snabbdom: ^3.6.0 + + '@wangeditor/basic-modules@1.1.7': + resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/code-highlight@1.0.3': + resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/core@1.1.19': + resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==} + peerDependencies: + '@uppy/core': ^2.1.1 + '@uppy/xhr-upload': ^2.0.3 + dom7: ^3.0.0 + is-hotkey: ^0.2.0 + lodash.camelcase: ^4.3.0 + lodash.clonedeep: ^4.5.0 + lodash.debounce: ^4.0.8 + lodash.foreach: ^4.5.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + lodash.toarray: ^4.4.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/editor-for-vue@5.1.12': + resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==} + peerDependencies: + '@wangeditor/editor': '>=5.1.0' + vue: ^3.0.5 + + '@wangeditor/editor@5.1.23': + resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==} + + '@wangeditor/list-module@1.0.5': + resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/table-module@1.1.4': + resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/upload-image-module@1.0.2': + resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==} + peerDependencies: + '@uppy/core': ^2.0.3 + '@uppy/xhr-upload': ^2.0.3 + '@wangeditor/basic-modules': 1.x + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.foreach: ^4.5.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/video-module@1.1.4': + resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==} + peerDependencies: + '@uppy/core': ^2.1.4 + '@uppy/xhr-upload': ^2.0.7 + '@wangeditor/core': 1.x + dom7: ^3.0.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + animate.css@4.1.1: + resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + avue-plugin-ueditor@1.0.4: + resolution: {integrity: sha512-fFOFsduZI9yK3LE7FpLMqqLJoWp4xGTDj08wmSS2CkBL6H1+P8+7u9lEcvRejnvytUBhv87xKNhHdMuWru1Umg==} + peerDependencies: + axios: '>=0.18.0' + vue: '>=3.2.0' + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + axios@1.16.0: + resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} + + bpmn-js@11.5.0: + resolution: {integrity: sha512-Bdj53UvfiDtGE1wmiBmpgjl5RMLhCGV/C841dyC+t4kBHj7vApAeeHs2Qiycj390HO4B2U8UDROLT7yjdXEEUA==} + + bpmn-moddle@8.1.0: + resolution: {integrity: sha512-yI5OAFfYVJwViKTsTsonVfCBPtB3MlefADUORwNIxxBOMp21vnoxuxsdgUWlPH/dvAEZh/+mr8UtqOBNu8NC5Q==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + codemirror@5.65.21: + resolution: {integrity: sha512-6teYk0bA0nR3QP0ihGMoxuKzpl5W80FpnHpBJpgy66NK3cZv5b/d/HY8PnRvfSsCG1MTfr92u2WUl+wT0E40mQ==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + component-event@0.2.1: + resolution: {integrity: sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==} + + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + countup.js@1.9.3: + resolution: {integrity: sha512-UHf2P/mFKaESqdPq+UdBJm/1y8lYdlcDd0nTZHNC8cxWoJwZr1Eldm1PpWui446vDl5Pd8PtRYkr3q6K4+Qa5A==} + + countup.js@2.10.0: + resolution: {integrity: sha512-QQpZx7oYxsR+OeITlZe46fY/OQjV11oBqjY8wgIXzLU2jIz8GzOrbMhqKLysGY8bWI3T1ZNrYkwGzKb4JNgyzg==} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diagram-js-direct-editing@2.1.2: + resolution: {integrity: sha512-VpccLAnLqLF1cp3fk363QUbRVTd/qTcj2oOb+IqgcmOiWszJp7J9Ta6y5GjUvw48hDZpzCatlmWwA4CJ3MaYGQ==} + peerDependencies: + diagram-js: '*' + + diagram-js@11.13.1: + resolution: {integrity: sha512-6kO0rBN6aBIQiMELfv1oX2Ohes/brlIPuOVZUYAioeWM0EyuazhAXgHeq8iKFt29daU9NGRr4n78esGx8QjtjQ==} + + didi@9.0.2: + resolution: {integrity: sha512-q2+aj+lnJcUweV7A9pdUrwFr4LHVmRPwTmQLtHPFz4aT7IBoryN6Iy+jmFku+oIzr5ebBkvtBCOb87+dJhb7bg==} + + disable-devtool@0.3.9: + resolution: {integrity: sha512-WHCpC8f93Cn2DnTeaq57NFLcdw4921sovh1ammnp/2o8Snb704HK/Vw1/D2D1Pihc0zc8/mVKb5nchHtoadObQ==} + + dom7@3.0.0: + resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==} + + dom7@4.0.6: + resolution: {integrity: sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA==} + + domify@1.4.2: + resolution: {integrity: sha512-m4yreHcUWHBncGVV7U+yQzc12vIlq0jMrtHZ5mW6dQMiL/7skSYNVX9wqKwOtyO9SGCgevrAFEgOCAHmamHTUA==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + element-plus@2.14.2: + resolution: {integrity: sha512-eNH9uP3wQoNqieEIHXiNvIVv+zO5sZDU0CAZq5b0zqSN06DD0/V9xIq1R/qm3rw5k3nBTM1JvpxhCfRbaFLzDQ==} + peerDependencies: + vue: ^3.3.7 + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hammerjs@2.0.8: + resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} + engines: {node: '>=0.8.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + htm@3.1.1: + resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} + + html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + i18next@20.6.1: + resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==} + + i18next@23.16.8: + resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} + + ids@1.0.5: + resolution: {integrity: sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw==} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} + + inherits-browser@0.1.0: + resolution: {integrity: sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-md5@0.7.3: + resolution: {integrity: sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==} + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.foreach@4.5.0: + resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash.toarray@4.4.0: + resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-match@1.0.2: + resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + min-dash@4.2.3: + resolution: {integrity: sha512-VLMYQI5+FcD9Ad24VcB08uA83B07OhueAlZ88jBK6PyupTvEJwllTMUqMy0wPGYs7pZUEtEEMWdHB63m3LtEcg==} + + min-dom@4.2.1: + resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + moddle-xml@10.1.0: + resolution: {integrity: sha512-erWckwLt+dYskewKXJso9u+aAZ5172lOiYxSOqKCPTy7L/xmqH1PoeoA7eVC7oJTt3PqF5TkZzUmbjGH6soQBg==} + + moddle@6.2.3: + resolution: {integrity: sha512-bLVN+ZHL3aKnhxc19XtjUfvdJsS3EsiEJC7bT6YPD11qYmTzvsxrGgyYz1Ouof7TZuGw0lDJ1OLmEnxcpQWk3Q==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + namespace-emitter@2.0.1: + resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.11: + resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} + engines: {node: ^18 || >=20} + hasBin: true + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + object-refs@0.3.0: + resolution: {integrity: sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ==} + + path-intersection@2.2.1: + resolution: {integrity: sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.29.1: + resolution: {integrity: sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randomcolor@0.6.2: + resolution: {integrity: sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.60.3: + resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sass@1.99.0: + resolution: {integrity: sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==} + engines: {node: '>=14.0.0'} + hasBin: true + + saxen@8.1.2: + resolution: {integrity: sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==} + + scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + + signature_pad@5.1.3: + resolution: {integrity: sha512-zyxW5vuJVnQdGcU+kAj9FYl7WaAunY3kA5S7mPg0xJiujL9+sPAWfSQHS5tXaJXDUa4FuZeKhfdCDQ6K3wfkpQ==} + + slate-history@0.115.0: + resolution: {integrity: sha512-QdUm9aVyQFz6JG4a84Z6Um+tJpZJmsh9bjXwTVTvYiN4rdKbqL6+/4HT94on1WYxe10Q4vY6mA6BCpoYxgF3tQ==} + peerDependencies: + slate: '>=0.114.3' + + slate-history@0.66.0: + resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==} + peerDependencies: + slate: '>=0.65.3' + + slate@0.123.0: + resolution: {integrity: sha512-Oon3HR/QzJQBjuOUJT1jGGlp8Ff7t3Bkr/rJ2lDqxNT4H+cBnXpEVQ/si6hn1ZCHhD2xY/2N91PQoH/rD7kxTg==} + + slate@0.72.8: + resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==} + + sm-crypto@0.4.0: + resolution: {integrity: sha512-OexH2V1EqmhXuOIPGoCl55OjMF0wwPUM/zhUjT0Q6vHBeopSRvTNRy76/1eRoFs3VBKt39hdFnxwpFmooHYa2A==} + + snabbdom@3.6.3: + resolution: {integrity: sha512-W2lHLLw2qR2Vv0DcMmcxXqcfdBaIcoN+y/86SmHv8fn4DazEQSH6KN3TjZcWvwujW56OHiiirsbHWZb4vx/0fg==} + engines: {node: '>=12.17.0'} + + sortablejs@1.14.0: + resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + ssr-window@3.0.0: + resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==} + + ssr-window@4.0.2: + resolution: {integrity: sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==} + + strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + terser@5.46.2: + resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} + engines: {node: '>=10'} + hasBin: true + + tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + + tiny-svg@3.1.3: + resolution: {integrity: sha512-9mwnPqXInRsBmH/DO6NMxBE++9LsqpVXQSSTZGc5bomoKKvL5OX/Hlotw7XVXP6XLRcHWIzZpxfovGqWKgCypQ==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + unimport@1.3.0: + resolution: {integrity: sha512-fOkrdxglsHd428yegH0wPH/6IfaSdDeMXtdRGn6en/ccyzc2aaoxiUTMrJyc6Bu+xoa18RJRPMfLUHEzjz8atw==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin-auto-import@0.11.5: + resolution: {integrity: sha512-nvbL2AQwLRR8wbHpJ6L1EBVNmjN045RSedTa4NtsGRkSQFXkI1iKHs4dTqJwcKZsnFrZOAKtLPiN1/oQTObLZw==} + engines: {node: '>=14'} + peerDependencies: + '@vueuse/core': '*' + peerDependenciesMeta: + '@vueuse/core': + optional: true + + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + + vite-plugin-compression@0.5.1: + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-vue-setup-extend@0.4.0: + resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==} + peerDependencies: + vite: '>=2.0.0' + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vue-component-type-helpers@3.3.6: + resolution: {integrity: sha512-FkljacAwJ9BUoSUdpFe3VDy0sGigNlTH9+2zcXUWmZOjN8swiCkl3t48wOJun0OsUd2cEIda1l04tsxMiKIIrQ==} + + vue-i18n@11.4.2: + resolution: {integrity: sha512-sADDeKXqAGsPX6tK3t3y2ZiMpbVWN12tG+MhTiJ06rVoh58eGtM4wFyw3uWGbVkXByVp9Ne/AP+nSSzI+J9OAQ==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue3-clipboard@1.0.0: + resolution: {integrity: sha512-GUqKh1oO79xDpq0z+cCv/NDVTpcJGNDzeNgT3PmTdTp/WJh3gcTrDqIYKycKhzMFOtIFJ7hO/+usgyWtT+fNhA==} + peerDependencies: + vue: ^3.0.0 + + vue@3.5.34: + resolution: {integrity: sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vuedraggable@4.1.0: + resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==} + peerDependencies: + vue: ^3.0.1 + + vuex@4.1.0: + resolution: {integrity: sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==} + peerDependencies: + vue: ^3.2.0 + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + wildcard@1.1.2: + resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==} + +snapshots: + + '@amap/amap-jsapi-loader@1.0.1': {} + + '@antfu/utils@0.7.10': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.29.2': {} + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bpmn-io/diagram-js-ui@0.2.3': + dependencies: + htm: 3.1.1 + preact: 10.29.1 + + '@ctrl/tinycolor@4.2.0': {} + + '@element-plus/icons-vue@2.3.2(vue@3.5.34)': + dependencies: + vue: 3.5.34 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/utils@0.2.11': {} + + '@intlify/core-base@11.4.2': + dependencies: + '@intlify/devtools-types': 11.4.2 + '@intlify/message-compiler': 11.4.2 + '@intlify/shared': 11.4.2 + + '@intlify/devtools-types@11.4.2': + dependencies: + '@intlify/core-base': 11.4.2 + '@intlify/shared': 11.4.2 + + '@intlify/message-compiler@11.4.2': + dependencies: + '@intlify/shared': 11.4.2 + source-map-js: 1.2.1 + + '@intlify/shared@11.4.2': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true + + '@rollup/pluginutils@5.3.0(rollup@4.60.3)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.3 + + '@rollup/rollup-android-arm-eabi@4.60.3': + optional: true + + '@rollup/rollup-android-arm64@4.60.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.3': + optional: true + + '@rollup/rollup-darwin-x64@4.60.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.3': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.3': + optional: true + + '@saber/nf-design-base-elp@1.3.0': + dependencies: + bpmn-js: 11.5.0 + codemirror: 5.65.21 + randomcolor: 0.6.2 + + '@saber/nf-form-design-elp@1.6.1(vue@3.5.34)': + dependencies: + vuedraggable: 4.1.0(vue@3.5.34) + transitivePeerDependencies: + - vue + + '@saber/nf-form-elp@1.7.0': + dependencies: + '@amap/amap-jsapi-loader': 1.0.1 + '@wangeditor-next/editor': 5.7.0 + codemirror: 5.65.21 + countup.js: 2.10.0 + signature_pad: 5.1.3 + + '@smallwei/avue@3.9.2(@element-plus/icons-vue@2.3.2(vue@3.5.34))(element-plus@2.14.2(vue@3.5.34))(vue@3.5.34)': + dependencies: + '@element-plus/icons-vue': 2.3.2(vue@3.5.34) + axios: 0.21.4 + countup.js: 1.9.3 + dayjs: 1.11.20 + element-plus: 2.14.2(vue@3.5.34) + lodash: 4.18.1 + lodash-es: 4.18.1 + vue: 3.5.34 + transitivePeerDependencies: + - debug + + '@sxzz/popperjs-es@2.11.8': {} + + '@transloadit/prettier-bytes@0.0.7': {} + + '@types/estree@1.0.8': {} + + '@types/estree@1.0.9': {} + + '@types/event-emitter@0.3.5': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.24 + + '@types/lodash@4.17.24': {} + + '@types/web-bluetooth@0.0.21': {} + + '@uppy/companion-client@2.2.2': + dependencies: + '@uppy/utils': 4.1.3 + namespace-emitter: 2.0.1 + + '@uppy/core@2.3.4': + dependencies: + '@transloadit/prettier-bytes': 0.0.7 + '@uppy/store-default': 2.1.1 + '@uppy/utils': 4.1.3 + lodash.throttle: 4.1.1 + mime-match: 1.0.2 + namespace-emitter: 2.0.1 + nanoid: 3.3.12 + preact: 10.29.1 + + '@uppy/store-default@2.1.1': {} + + '@uppy/utils@4.1.3': + dependencies: + lodash.throttle: 4.1.1 + + '@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)': + dependencies: + '@uppy/companion-client': 2.2.2 + '@uppy/core': 2.3.4 + '@uppy/utils': 4.1.3 + nanoid: 3.3.12 + + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(sass@1.99.0)(terser@5.46.2))(vue@3.5.34)': + dependencies: + vite: 5.4.21(sass@1.99.0)(terser@5.46.2) + vue: 3.5.34 + + '@vue/compiler-core@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/shared': 3.5.34 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.34': + dependencies: + '@vue/compiler-core': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/compiler-sfc@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/compiler-core': 3.5.34 + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.14 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.34': + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/devtools-api@6.6.4': {} + + '@vue/reactivity@3.5.34': + dependencies: + '@vue/shared': 3.5.34 + + '@vue/runtime-core@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/runtime-dom@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/runtime-core': 3.5.34 + '@vue/shared': 3.5.34 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.34(vue@3.5.34)': + dependencies: + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + vue: 3.5.34 + + '@vue/shared@3.5.34': {} + + '@vueuse/core@14.3.0(vue@3.5.34)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.3.0 + '@vueuse/shared': 14.3.0(vue@3.5.34) + vue: 3.5.34 + + '@vueuse/metadata@14.3.0': {} + + '@vueuse/shared@14.3.0(vue@3.5.34)': + dependencies: + vue: 3.5.34 + + '@wangeditor-next/basic-modules@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': + dependencies: + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 4.0.6 + is-url: 1.2.4 + lodash.throttle: 4.1.1 + nanoid: 5.1.11 + slate: 0.123.0 + snabbdom: 3.6.3 + + '@wangeditor-next/code-highlight@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3)': + dependencies: + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 4.0.6 + prismjs: 1.30.0 + slate: 0.123.0 + snabbdom: 3.6.3 + + '@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': + dependencies: + '@types/event-emitter': 0.3.5 + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + dom7: 4.0.6 + event-emitter: 0.3.5 + html-void-elements: 3.0.0 + i18next: 23.16.8 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 5.1.11 + scroll-into-view-if-needed: 3.1.0 + slate: 0.123.0 + slate-history: 0.115.0(slate@0.123.0) + snabbdom: 3.6.3 + + '@wangeditor-next/editor@5.7.0': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor-next/basic-modules': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/code-highlight': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/list-module': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/table-module': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/upload-image-module': 2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/video-module': 2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 4.0.6 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 5.1.11 + slate: 0.123.0 + snabbdom: 3.6.3 + + '@wangeditor-next/list-module@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.123.0)(snabbdom@3.6.3)': + dependencies: + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 4.0.6 + slate: 0.123.0 + snabbdom: 3.6.3 + + '@wangeditor-next/table-module@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': + dependencies: + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 4.0.6 + lodash.debounce: 4.0.8 + lodash.throttle: 4.1.1 + nanoid: 5.1.11 + slate: 0.123.0 + snabbdom: 3.6.3 + + '@wangeditor-next/upload-image-module@2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.123.0)(snabbdom@3.6.3)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor-next/basic-modules': 2.0.0(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 4.0.6 + lodash.foreach: 4.5.0 + slate: 0.123.0 + snabbdom: 3.6.3 + + '@wangeditor-next/video-module@2.0.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor-next/core': 1.8.0(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 4.0.6 + nanoid: 5.1.11 + slate: 0.123.0 + snabbdom: 3.6.3 + + '@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 4.0.6 + is-url: 1.2.4 + lodash.throttle: 4.1.1 + nanoid: 5.1.11 + slate: 0.123.0 + snabbdom: 3.6.3 + + '@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 3.0.0 + prismjs: 1.30.0 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3)': + dependencies: + '@types/event-emitter': 0.3.5 + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + dom7: 4.0.6 + event-emitter: 0.3.5 + html-void-elements: 2.0.1 + i18next: 20.6.1 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 5.1.11 + scroll-into-view-if-needed: 2.2.31 + slate: 0.123.0 + slate-history: 0.66.0(slate@0.72.8) + snabbdom: 3.6.3 + + '@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.34)': + dependencies: + '@wangeditor/editor': 5.1.23 + vue: 3.5.34 + + '@wangeditor/editor@5.1.23': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.12 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 3.0.0 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 3.0.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + nanoid: 3.3.12 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 3.0.0 + lodash.foreach: 4.5.0 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(nanoid@3.3.12)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.11)(slate@0.123.0)(snabbdom@3.6.3) + dom7: 3.0.0 + nanoid: 3.3.12 + slate: 0.72.8 + snabbdom: 3.6.3 + + acorn@8.16.0: {} + + animate.css@4.1.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + avue-plugin-ueditor@1.0.4(axios@1.16.0)(vue@3.5.34): + dependencies: + '@wangeditor/editor': 5.1.23 + '@wangeditor/editor-for-vue': 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.34) + axios: 1.16.0 + vue: 3.5.34 + + axios@0.21.4: + dependencies: + follow-redirects: 1.16.0 + transitivePeerDependencies: + - debug + + axios@1.16.0: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + + bpmn-js@11.5.0: + dependencies: + bpmn-moddle: 8.1.0 + diagram-js: 11.13.1 + diagram-js-direct-editing: 2.1.2(diagram-js@11.13.1) + ids: 1.0.5 + inherits-browser: 0.1.0 + min-dash: 4.2.3 + min-dom: 4.2.1 + object-refs: 0.3.0 + tiny-svg: 3.1.3 + + bpmn-moddle@8.1.0: + dependencies: + min-dash: 4.2.3 + moddle: 6.2.3 + moddle-xml: 10.1.0 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-from@1.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + clipboard@2.0.11: + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + + clsx@1.2.1: {} + + codemirror@5.65.21: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + component-event@0.2.1: {} + + compute-scroll-into-view@1.0.20: {} + + compute-scroll-into-view@3.1.1: {} + + confbox@0.1.8: {} + + countup.js@1.9.3: {} + + countup.js@2.10.0: {} + + crypto-js@4.2.0: {} + + csstype@3.2.3: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dayjs@1.11.20: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + delayed-stream@1.0.0: {} + + delegate@3.2.0: {} + + detect-libc@2.1.2: + optional: true + + diagram-js-direct-editing@2.1.2(diagram-js@11.13.1): + dependencies: + diagram-js: 11.13.1 + min-dash: 4.2.3 + min-dom: 4.2.1 + + diagram-js@11.13.1: + dependencies: + '@bpmn-io/diagram-js-ui': 0.2.3 + clsx: 1.2.1 + didi: 9.0.2 + hammerjs: 2.0.8 + inherits-browser: 0.1.0 + min-dash: 4.2.3 + min-dom: 4.2.1 + object-refs: 0.3.0 + path-intersection: 2.2.1 + tiny-svg: 3.1.3 + + didi@9.0.2: {} + + disable-devtool@0.3.9: {} + + dom7@3.0.0: + dependencies: + ssr-window: 3.0.0 + + dom7@4.0.6: + dependencies: + ssr-window: 4.0.2 + + domify@1.4.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + element-plus@2.14.2(vue@3.5.34): + dependencies: + '@ctrl/tinycolor': 4.2.0 + '@element-plus/icons-vue': 2.3.2(vue@3.5.34) + '@floating-ui/dom': 1.7.6 + '@popperjs/core': '@sxzz/popperjs-es@2.11.8' + '@types/lodash': 4.17.24 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 14.3.0(vue@3.5.34) + async-validator: 4.2.5 + dayjs: 1.11.20 + lodash: 4.18.1 + lodash-es: 4.18.1 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.34 + vue-component-type-helpers: 3.3.6 + + entities@7.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escape-string-regexp@5.0.0: {} + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + estree-walker@2.0.2: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + ext@1.7.0: + dependencies: + type: 2.7.3 + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + follow-redirects@1.16.0: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.3 + mime-types: 2.1.35 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + good-listener@1.2.2: + dependencies: + delegate: 3.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + hammerjs@2.0.8: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + highlight.js@11.11.1: {} + + htm@3.1.1: {} + + html-void-elements@2.0.1: {} + + html-void-elements@3.0.0: {} + + i18next@20.6.1: + dependencies: + '@babel/runtime': 7.29.2 + + i18next@23.16.8: + dependencies: + '@babel/runtime': 7.29.2 + + ids@1.0.5: {} + + immer@9.0.21: {} + + immutable@5.1.5: {} + + inherits-browser@0.1.0: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hotkey@0.2.0: {} + + is-number@7.0.0: {} + + is-plain-object@5.0.0: {} + + is-url@1.2.4: {} + + js-base64@3.7.8: {} + + js-cookie@3.0.5: {} + + js-md5@0.7.3: {} + + jsbn@1.1.0: {} + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + local-pkg@0.4.3: {} + + lodash-es@4.18.1: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.18.1 + lodash-es: 4.18.1 + + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.debounce@4.0.8: {} + + lodash.foreach@4.5.0: {} + + lodash.isequal@4.5.0: {} + + lodash.throttle@4.1.1: {} + + lodash.toarray@4.4.0: {} + + lodash@4.18.1: {} + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.26.7: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.27.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + memoize-one@6.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.52.0: {} + + mime-match@1.0.2: + dependencies: + wildcard: 1.1.2 + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + min-dash@4.2.3: {} + + min-dom@4.2.1: + dependencies: + component-event: 0.2.1 + domify: 1.4.2 + min-dash: 4.2.3 + + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + moddle-xml@10.1.0: + dependencies: + min-dash: 4.2.3 + moddle: 6.2.3 + saxen: 8.1.2 + + moddle@6.2.3: + dependencies: + min-dash: 4.2.3 + + ms@2.1.3: {} + + namespace-emitter@2.0.1: {} + + nanoid@3.3.12: {} + + nanoid@5.1.11: {} + + next-tick@1.1.0: {} + + node-addon-api@7.1.1: + optional: true + + normalize-wheel-es@1.2.0: {} + + nprogress@0.2.0: {} + + object-refs@0.3.0: {} + + path-intersection@2.2.1: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + postcss@8.5.14: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.29.1: {} + + prettier@2.8.8: {} + + prismjs@1.30.0: {} + + proxy-from-env@2.1.0: {} + + queue-microtask@1.2.3: {} + + randomcolor@0.6.2: {} + + readdirp@4.1.2: {} + + reusify@1.1.0: {} + + rollup@4.60.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.3 + '@rollup/rollup-android-arm64': 4.60.3 + '@rollup/rollup-darwin-arm64': 4.60.3 + '@rollup/rollup-darwin-x64': 4.60.3 + '@rollup/rollup-freebsd-arm64': 4.60.3 + '@rollup/rollup-freebsd-x64': 4.60.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.3 + '@rollup/rollup-linux-arm-musleabihf': 4.60.3 + '@rollup/rollup-linux-arm64-gnu': 4.60.3 + '@rollup/rollup-linux-arm64-musl': 4.60.3 + '@rollup/rollup-linux-loong64-gnu': 4.60.3 + '@rollup/rollup-linux-loong64-musl': 4.60.3 + '@rollup/rollup-linux-ppc64-gnu': 4.60.3 + '@rollup/rollup-linux-ppc64-musl': 4.60.3 + '@rollup/rollup-linux-riscv64-gnu': 4.60.3 + '@rollup/rollup-linux-riscv64-musl': 4.60.3 + '@rollup/rollup-linux-s390x-gnu': 4.60.3 + '@rollup/rollup-linux-x64-gnu': 4.60.3 + '@rollup/rollup-linux-x64-musl': 4.60.3 + '@rollup/rollup-openbsd-x64': 4.60.3 + '@rollup/rollup-openharmony-arm64': 4.60.3 + '@rollup/rollup-win32-arm64-msvc': 4.60.3 + '@rollup/rollup-win32-ia32-msvc': 4.60.3 + '@rollup/rollup-win32-x64-gnu': 4.60.3 + '@rollup/rollup-win32-x64-msvc': 4.60.3 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sass@1.99.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.5 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.6 + + saxen@8.1.2: {} + + scroll-into-view-if-needed@2.2.31: + dependencies: + compute-scroll-into-view: 1.0.20 + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + + scule@1.3.0: {} + + select@1.1.2: {} + + signature_pad@5.1.3: {} + + slate-history@0.115.0(slate@0.123.0): + dependencies: + slate: 0.123.0 + + slate-history@0.66.0(slate@0.72.8): + dependencies: + is-plain-object: 5.0.0 + slate: 0.72.8 + + slate@0.123.0: {} + + slate@0.72.8: + dependencies: + immer: 9.0.21 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + + sm-crypto@0.4.0: + dependencies: + jsbn: 1.1.0 + + snabbdom@3.6.3: {} + + sortablejs@1.14.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sourcemap-codec@1.4.8: {} + + ssr-window@3.0.0: {} + + ssr-window@4.0.2: {} + + strip-literal@1.3.0: + dependencies: + acorn: 8.16.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + terser@5.46.2: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + tiny-emitter@2.1.0: {} + + tiny-svg@3.1.3: {} + + tiny-warning@1.0.3: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + type@2.7.3: {} + + ufo@1.6.4: {} + + unimport@1.3.0(rollup@4.60.3): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) + escape-string-regexp: 5.0.0 + fast-glob: 3.3.3 + local-pkg: 0.4.3 + magic-string: 0.27.0 + mlly: 1.8.2 + pathe: 1.1.2 + pkg-types: 1.3.1 + scule: 1.3.0 + strip-literal: 1.3.0 + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup + + universalify@2.0.1: {} + + unplugin-auto-import@0.11.5(@vueuse/core@14.3.0(vue@3.5.34))(rollup@4.60.3): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) + local-pkg: 0.4.3 + magic-string: 0.26.7 + unimport: 1.3.0(rollup@4.60.3) + unplugin: 1.16.1 + optionalDependencies: + '@vueuse/core': 14.3.0(vue@3.5.34) + transitivePeerDependencies: + - rollup + + unplugin@1.16.1: + dependencies: + acorn: 8.16.0 + webpack-virtual-modules: 0.6.2 + + vite-plugin-compression@0.5.1(vite@5.4.21(sass@1.99.0)(terser@5.46.2)): + dependencies: + chalk: 4.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + vite: 5.4.21(sass@1.99.0)(terser@5.46.2) + transitivePeerDependencies: + - supports-color + + vite-plugin-vue-setup-extend@0.4.0(vite@5.4.21(sass@1.99.0)(terser@5.46.2)): + dependencies: + '@vue/compiler-sfc': 3.5.34 + magic-string: 0.25.9 + vite: 5.4.21(sass@1.99.0)(terser@5.46.2) + + vite@5.4.21(sass@1.99.0)(terser@5.46.2): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.14 + rollup: 4.60.3 + optionalDependencies: + fsevents: 2.3.3 + sass: 1.99.0 + terser: 5.46.2 + + vue-component-type-helpers@3.3.6: {} + + vue-i18n@11.4.2(vue@3.5.34): + dependencies: + '@intlify/core-base': 11.4.2 + '@intlify/devtools-types': 11.4.2 + '@intlify/shared': 11.4.2 + '@vue/devtools-api': 6.6.4 + vue: 3.5.34 + + vue-router@4.6.4(vue@3.5.34): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.34 + + vue3-clipboard@1.0.0(vue@3.5.34): + dependencies: + clipboard: 2.0.11 + vue: 3.5.34 + + vue@3.5.34: + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-sfc': 3.5.34 + '@vue/runtime-dom': 3.5.34 + '@vue/server-renderer': 3.5.34(vue@3.5.34) + '@vue/shared': 3.5.34 + + vuedraggable@4.1.0(vue@3.5.34): + dependencies: + sortablejs: 1.14.0 + vue: 3.5.34 + + vuex@4.1.0(vue@3.5.34): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.34 + + webpack-virtual-modules@0.6.2: {} + + wildcard@1.1.2: {} diff --git a/public/css/loading.css b/public/css/loading.css new file mode 100644 index 0000000..a07c505 --- /dev/null +++ b/public/css/loading.css @@ -0,0 +1,116 @@ +.loading { + display: flex; + width: 100%; + height: 100%; + justify-content: center; + align-items: center; + flex-direction: column; + background-color: #f4f7f9 +} + +.loading .loading-wrap { + position: absolute; + top: 50%; + left: 50%; + display: flex; + -webkit-transform: translate3d(-50%, -50%, 0); + transform: translate3d(-50%, -50%, 0); + justify-content: center; + align-items: center; + flex-direction: column +} + +.loading .dots { + display: flex; + padding: 98px; + justify-content: center; + align-items: center +} + +.loading .loading-title { + display: flex; + font-weight: bold; + margin-top: 30px; + font-size: 18px; + color: rgba(0, 0, 0, .85); + justify-content: center; + align-items: center +} + + +.dot { + position: relative; + display: inline-block; + width: 40px; + height: 40px; + margin-top: 30px; + font-size: 28px; + transform: rotate(45deg); + box-sizing: border-box; + animation: antRotate 1.2s infinite linear +} + +.dot i { + position: absolute; + display: block; + width: 20px; + height: 20px; + background-color: #0065cc; + border-radius: 100%; + opacity: .3; + transform: scale(.75); + animation: antSpinMove 1s infinite linear alternate; + transform-origin: 50% 50% +} + +.dot i:nth-child(1) { + top: 0; + left: 0 +} + +.dot i:nth-child(2) { + top: 0; + right: 0; + -webkit-animation-delay: .4s; + animation-delay: .4s +} + +.dot i:nth-child(3) { + right: 0; + bottom: 0; + -webkit-animation-delay: .8s; + animation-delay: .8s +} + +.dot i:nth-child(4) { + bottom: 0; + left: 0; + -webkit-animation-delay: 1.2s; + animation-delay: 1.2s +} + +@keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg) + } +} + +@-webkit-keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg) + } +} + +@keyframes antSpinMove { + to { + opacity: 1 + } +} + +@-webkit-keyframes antSpinMove { + to { + opacity: 1 + } +} diff --git a/public/css/saber.css b/public/css/saber.css new file mode 100644 index 0000000..bc5c152 --- /dev/null +++ b/public/css/saber.css @@ -0,0 +1,88 @@ +html, +body, +#app { + height: 100%; + margin: 0; + padding: 0; +} + +#loader-wrapper { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 99999; + background-color: #151a26; +} + +#loader-wrapper .loader-box { + position: fixed; + left: calc(50% - 250px); + top: calc(50% - 100px); + margin: 0 auto; + width: 500px; + height: 200px; + text-align: center; + vertical-align: center; + font-weight: bold; + color: #87888E; + font-size: 35px; +} + +#loader-wrapper .loader-box > span { + opacity: 0.4; + display: inline-block; + animation: bouncingLoader 1s infinite alternate; +} + +#loader-wrapper .loader-box > span:nth-child(2) { + animation-delay: 0.1s; +} + +#loader-wrapper .loader-box > span:nth-child(3) { + animation-delay: 0.2s; +} + +#loader-wrapper .loader-box > span:nth-child(4) { + animation-delay: 0.3s; +} + +#loader-wrapper .loader-box > span:nth-child(5) { + animation-delay: 0.4s; +} + +#loader-wrapper .loader-box > span:nth-child(6) { + animation-delay: 0.5s; +} + +#loader-wrapper .loader-box > span:nth-child(7) { + animation-delay: 0.6s; +} + +@keyframes bouncingLoader { + 0% { + transform: translateY(0); + } + 50% { + transform: translateY(25px); + } + 100% { + transform: translateY(0); + } +} + +#loader-wrapper .loader-title { + font-weight: bold; + z-index: 1002; + position: absolute; + top: 50%; + margin-top: 15px; + color: #87888E; + font-size: 18px; + width: 100%; + height: 30px; + text-align: center; + opacity: 0.4; + line-height: 30px; +} diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..ecd70ca Binary files /dev/null and b/public/favicon.png differ diff --git a/public/iconfont/avue/iconfont.css b/public/iconfont/avue/iconfont.css new file mode 100644 index 0000000..d957b8a --- /dev/null +++ b/public/iconfont/avue/iconfont.css @@ -0,0 +1,201 @@ +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1611236720878'); /* IE9 */ + src: url('iconfont.eot?t=1611236720878#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), + url('iconfont.woff?t=1611236720878') format('woff'), + url('iconfont.ttf?t=1611236720878') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1611236720878#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-zhongyingwen:before { + content: "\e61d"; +} + +.icon-caidan:before { + content: "\e891"; +} + +.icon-rizhi1:before { + content: "\e6af"; +} + +.icon-suoping:before { + content: "\e6e9"; +} + +.icon-zhuti:before { + content: "\e620"; +} + +.icon-bug:before { + content: "\e649"; +} + +.icon-weixin1:before { + content: "\e679"; +} + +.icon-qq1:before { + content: "\e609"; +} + +.icon-yanzhengma:before { + content: "\e616"; +} + +.icon-yonghu:before { + content: "\e6b3"; +} + +.icon-mima:before { + content: "\e652"; +} + +.icon-shouji:before { + content: "\e65d"; +} + +.icon-iconset0265:before { + content: "\e6a4"; +} + +.icon-dongtai:before { + content: "\e6a7"; +} + +.icon-canshu:before { + content: "\e655"; +} + +.icon-shujuzhanshi2:before { + content: "\e651"; +} + +.icon-tuichuquanping:before { + content: "\e755"; +} + +.icon-rizhi:before { + content: "\e61c"; +} + +.icon-cuowutishitubiao:before { + content: "\e6a0"; +} + +.icon-iconset0216:before { + content: "\e673"; +} + +.icon-debug:before { + content: "\e611"; +} + +.icon-quanxian:before { + content: "\e63f"; +} + +.icon-shuaxin:before { + content: "\e6ba"; +} + +.icon-quanping:before { + content: "\e615"; +} + +.icon-bofangqi-suoping:before { + content: "\e699"; +} + +.icon-navicon:before { + content: "\e84e"; +} + +.icon-yuan:before { + content: "\e657"; +} + +.icon-biaodan:before { + content: "\e715"; +} + +.icon-liuliangyunpingtaitubiao08:before { + content: "\e68f"; +} + +.icon-caidanguanli:before { + content: "\e7c0"; +} + +.icon-yonghuguanli:before { + content: "\e610"; +} + +.icon-jiaoseguanli:before { + content: "\e624"; +} + +.icon-cuowu:before { + content: "\e626"; +} + +.icon-wxbgongju:before { + content: "\e61b"; +} + +.icon-tuichu:before { + content: "\e642"; +} + +.icon-daohanglanmoshi02:before { + content: "\e623"; +} + +.icon-changyonglogo27:before { + content: "\e714"; +} + +.icon-huanyingye:before { + content: "\e60c"; +} + +.icon-iframe:before { + content: "\e74c"; +} + +.icon-msnui-360:before { + content: "\e78a"; +} + +.icon-souhu:before { + content: "\e62d"; +} + +.icon-tubiao:before { + content: "\e630"; +} + +.icon-baidu1:before { + content: "\e621"; +} + +.icon-biaoge:before { + content: "\e6b5"; +} + +.icon-qq:before { + content: "\e631"; +} + +.icon-weixin:before { + content: "\e632"; +} + diff --git a/public/iconfont/avue/iconfont.eot b/public/iconfont/avue/iconfont.eot new file mode 100644 index 0000000..05c8789 Binary files /dev/null and b/public/iconfont/avue/iconfont.eot differ diff --git a/public/iconfont/avue/iconfont.js b/public/iconfont/avue/iconfont.js new file mode 100644 index 0000000..1d83d3c --- /dev/null +++ b/public/iconfont/avue/iconfont.js @@ -0,0 +1 @@ +!function(c){var l,h,t,a,o,i,s='',z=(z=document.getElementsByTagName("script"))[z.length-1].getAttribute("data-injectcss");if(z&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function M(){o||(o=!0,t())}l=function(){var c,l,h,t;(t=document.createElement("div")).innerHTML=s,s=null,(h=t.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",c=h,(l=document.body).firstChild?(t=c,(h=l.firstChild).parentNode.insertBefore(t,h)):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(h=function(){document.removeEventListener("DOMContentLoaded",h,!1),l()},document.addEventListener("DOMContentLoaded",h,!1)):document.attachEvent&&(t=l,a=c.document,o=!1,(i=function(){try{a.documentElement.doScroll("left")}catch(c){return void setTimeout(i,50)}M()})(),a.onreadystatechange=function(){"complete"==a.readyState&&(a.onreadystatechange=null,M())})}(window); \ No newline at end of file diff --git a/public/iconfont/avue/iconfont.json b/public/iconfont/avue/iconfont.json new file mode 100644 index 0000000..15c7207 --- /dev/null +++ b/public/iconfont/avue/iconfont.json @@ -0,0 +1,331 @@ +{ + "id": "567566", + "name": "avue-cli", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "5779983", + "name": "中英文", + "font_class": "zhongyingwen", + "unicode": "e61d", + "unicode_decimal": 58909 + }, + { + "icon_id": "6270863", + "name": "菜单", + "font_class": "caidan", + "unicode": "e891", + "unicode_decimal": 59537 + }, + { + "icon_id": "696478", + "name": "日志", + "font_class": "rizhi1", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "3416675", + "name": "锁屏", + "font_class": "suoping", + "unicode": "e6e9", + "unicode_decimal": 59113 + }, + { + "icon_id": "6631809", + "name": "主题", + "font_class": "zhuti", + "unicode": "e620", + "unicode_decimal": 58912 + }, + { + "icon_id": "1261208", + "name": "bug", + "font_class": "bug", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "288984", + "name": "微信", + "font_class": "weixin1", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "1037628", + "name": "qq", + "font_class": "qq1", + "unicode": "e609", + "unicode_decimal": 58889 + }, + { + "icon_id": "1046777", + "name": "验证码", + "font_class": "yanzhengma", + "unicode": "e616", + "unicode_decimal": 58902 + }, + { + "icon_id": "2559431", + "name": "用户", + "font_class": "yonghu", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "2678617", + "name": "密码", + "font_class": "mima", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "2678634", + "name": "手机", + "font_class": "shouji", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "554313", + "name": "wifi路由", + "font_class": "iconset0265", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "1149090", + "name": "动态", + "font_class": "dongtai", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "3851337", + "name": "参数", + "font_class": "canshu", + "unicode": "e655", + "unicode_decimal": 58965 + }, + { + "icon_id": "167168", + "name": "数据展示2", + "font_class": "shujuzhanshi2", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "1025135", + "name": "退出全屏", + "font_class": "tuichuquanping", + "unicode": "e755", + "unicode_decimal": 59221 + }, + { + "icon_id": "1166053", + "name": "日志", + "font_class": "rizhi", + "unicode": "e61c", + "unicode_decimal": 58908 + }, + { + "icon_id": "500861", + "name": "错误提示图标", + "font_class": "cuowutishitubiao", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "554205", + "name": "闪电", + "font_class": "iconset0216", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "1572731", + "name": "错误", + "font_class": "debug", + "unicode": "e611", + "unicode_decimal": 58897 + }, + { + "icon_id": "1305474", + "name": "权限", + "font_class": "quanxian", + "unicode": "e63f", + "unicode_decimal": 58943 + }, + { + "icon_id": "1684809", + "name": "刷新", + "font_class": "shuaxin", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "579385", + "name": "全屏", + "font_class": "quanping", + "unicode": "e615", + "unicode_decimal": 58901 + }, + { + "icon_id": "2154823", + "name": "播放器-(锁屏)_44", + "font_class": "bofangqi-suoping", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "1160830", + "name": "navicon", + "font_class": "navicon", + "unicode": "e84e", + "unicode_decimal": 59470 + }, + { + "icon_id": "1250665", + "name": "圆", + "font_class": "yuan", + "unicode": "e657", + "unicode_decimal": 58967 + }, + { + "icon_id": "680969", + "name": "表单", + "font_class": "biaodan", + "unicode": "e715", + "unicode_decimal": 59157 + }, + { + "icon_id": "1164693", + "name": "系统管理", + "font_class": "liuliangyunpingtaitubiao08", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "1723000", + "name": "菜单管理", + "font_class": "caidanguanli", + "unicode": "e7c0", + "unicode_decimal": 59328 + }, + { + "icon_id": "2486611", + "name": "用户管理", + "font_class": "yonghuguanli", + "unicode": "e610", + "unicode_decimal": 58896 + }, + { + "icon_id": "2959039", + "name": "角色管理", + "font_class": "jiaoseguanli", + "unicode": "e624", + "unicode_decimal": 58916 + }, + { + "icon_id": "1164841", + "name": "错误", + "font_class": "cuowu", + "unicode": "e626", + "unicode_decimal": 58918 + }, + { + "icon_id": "591722", + "name": "wxb工具", + "font_class": "wxbgongju", + "unicode": "e61b", + "unicode_decimal": 58907 + }, + { + "icon_id": "804054", + "name": "退出", + "font_class": "tuichu", + "unicode": "e642", + "unicode_decimal": 58946 + }, + { + "icon_id": "1191509", + "name": "导航栏_模式02", + "font_class": "daohanglanmoshi02", + "unicode": "e623", + "unicode_decimal": 58915 + }, + { + "icon_id": "1005775", + "name": "阿里巴巴", + "font_class": "changyonglogo27", + "unicode": "e714", + "unicode_decimal": 59156 + }, + { + "icon_id": "128369", + "name": "欢迎页", + "font_class": "huanyingye", + "unicode": "e60c", + "unicode_decimal": 58892 + }, + { + "icon_id": "586924", + "name": "iframe", + "font_class": "iframe", + "unicode": "e74c", + "unicode_decimal": 59212 + }, + { + "icon_id": "700335", + "name": "360", + "font_class": "msnui-360", + "unicode": "e78a", + "unicode_decimal": 59274 + }, + { + "icon_id": "833695", + "name": "搜狐", + "font_class": "souhu", + "unicode": "e62d", + "unicode_decimal": 58925 + }, + { + "icon_id": "1114667", + "name": "图标", + "font_class": "tubiao", + "unicode": "e630", + "unicode_decimal": 58928 + }, + { + "icon_id": "1346645", + "name": "百度1", + "font_class": "baidu1", + "unicode": "e621", + "unicode_decimal": 58913 + }, + { + "icon_id": "1789257", + "name": "表格", + "font_class": "biaoge", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "695468", + "name": "QQ", + "font_class": "qq", + "unicode": "e631", + "unicode_decimal": 58929 + }, + { + "icon_id": "851731", + "name": "微信", + "font_class": "weixin", + "unicode": "e632", + "unicode_decimal": 58930 + } + ] +} diff --git a/public/iconfont/avue/iconfont.svg b/public/iconfont/avue/iconfont.svg new file mode 100644 index 0000000..45815e9 --- /dev/null +++ b/public/iconfont/avue/iconfont.svg @@ -0,0 +1,164 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/iconfont/avue/iconfont.ttf b/public/iconfont/avue/iconfont.ttf new file mode 100644 index 0000000..9e40a79 Binary files /dev/null and b/public/iconfont/avue/iconfont.ttf differ diff --git a/public/iconfont/avue/iconfont.woff b/public/iconfont/avue/iconfont.woff new file mode 100644 index 0000000..8a88f4e Binary files /dev/null and b/public/iconfont/avue/iconfont.woff differ diff --git a/public/iconfont/avue/iconfont.woff2 b/public/iconfont/avue/iconfont.woff2 new file mode 100644 index 0000000..18195bd Binary files /dev/null and b/public/iconfont/avue/iconfont.woff2 differ diff --git a/public/iconfont/common/iconfont.css b/public/iconfont/common/iconfont.css new file mode 100644 index 0000000..126730f --- /dev/null +++ b/public/iconfont/common/iconfont.css @@ -0,0 +1,1043 @@ +@font-face { + font-family: "iconfont"; /* Project id 4454951 */ + src: url('iconfont.woff2?t=1709640575821') format('woff2'), + url('iconfont.woff?t=1709640575821') format('woff'), + url('iconfont.ttf?t=1709640575821') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-zidingyi:before { + content: "\eb7a"; +} + +.icon-xiajiantou:before { + content: "\eb7b"; +} + +.icon-shangjiantou:before { + content: "\eb7c"; +} + +.icon-icon_loading:before { + content: "\eb80"; +} + +.icon-biaodanzujian-shurukuang:before { + content: "\eb94"; +} + +.icon-biaodanzujian-biaoge:before { + content: "\eb95"; +} + +.icon-biaodanzujian-xialakuang:before { + content: "\eb96"; +} + +.icon-tubiao-bingtu:before { + content: "\eb97"; +} + +.icon-biaodanzujian-anniu:before { + content: "\eb98"; +} + +.icon-gongyezujian-yibiaopan:before { + content: "\eb99"; +} + +.icon-tubiao-qiapian:before { + content: "\eb9a"; +} + +.icon-gongyezujian-zhishideng:before { + content: "\eb9b"; +} + +.icon-tubiao-zhexiantu:before { + content: "\eb9c"; +} + +.icon-xingzhuang-juxing:before { + content: "\eb9d"; +} + +.icon-xingzhuang-jianxing:before { + content: "\eb9e"; +} + +.icon-gongyezujian-kaiguan:before { + content: "\eb9f"; +} + +.icon-tubiao-zhuzhuangtu:before { + content: "\eba0"; +} + +.icon-xingzhuang-tupian:before { + content: "\eba1"; +} + +.icon-xingzhuang-wenzi:before { + content: "\eba2"; +} + +.icon-xingzhuang-tuoyuanxing:before { + content: "\eba3"; +} + +.icon-xingzhuang-sanjiaoxing:before { + content: "\eba4"; +} + +.icon-xingzhuang-xingxing:before { + content: "\eba5"; +} + +.icon-guize:before { + content: "\ebb7"; +} + +.icon-shebeiguanli:before { + content: "\ebb8"; +} + +.icon-gongnengdingyi1:before { + content: "\ebb9"; +} + +.icon-jishufuwu1:before { + content: "\ebce"; +} + +.icon-yunyingzhongxin:before { + content: "\ebd0"; +} + +.icon-yunyingguanli:before { + content: "\ebd1"; +} + +.icon-zuzhixiaxia:before { + content: "\ebd8"; +} + +.icon-zuzhizhankai:before { + content: "\ebd9"; +} + +.icon-zuzhiqunzu:before { + content: "\ebda"; +} + +.icon-dakai:before { + content: "\ebdf"; +} + +.icon-yingwen:before { + content: "\ebe0"; +} + +.icon-zhongwen:before { + content: "\ebe2"; +} + +.icon-miwen:before { + content: "\ebe3"; +} + +.icon-xianhao:before { + content: "\ebe4"; +} + +.icon-kongxinduigou:before { + content: "\ebe5"; +} + +.icon-huixingzhen:before { + content: "\ebe6"; +} + +.icon-duigou:before { + content: "\ebe7"; +} + +.icon-xiayibu:before { + content: "\ebef"; +} + +.icon-shangyibu:before { + content: "\ebf0"; +} + +.icon-kongjianxuanzhong:before { + content: "\ebf1"; +} + +.icon-kongjianweixuan:before { + content: "\ebf2"; +} + +.icon-kongjianyixuan:before { + content: "\ebf3"; +} + +.icon--diangan:before { + content: "\ebfb"; +} + +.icon-rongxuejirongjiechi:before { + content: "\ebfc"; +} + +.icon-lubiantingchechang:before { + content: "\ebfd"; +} + +.icon--lumingpai:before { + content: "\ebfe"; +} + +.icon-jietouzuoyi:before { + content: "\ebff"; +} + +.icon--zhongdaweixian:before { + content: "\ec00"; +} + +.icon--jiaotongbiaozhipai:before { + content: "\ec01"; +} + +.icon-gongcezhishipai:before { + content: "\ec02"; +} + +.icon-fangkuai:before { + content: "\ec06"; +} + +.icon-fangkuai-:before { + content: "\ec07"; +} + +.icon-shuaxin:before { + content: "\ec08"; +} + +.icon-baocun:before { + content: "\ec09"; +} + +.icon-fabu:before { + content: "\ec0a"; +} + +.icon-xiayibu1:before { + content: "\ec0b"; +} + +.icon-shangyibu1:before { + content: "\ec0c"; +} + +.icon-xiangxiazhanhang:before { + content: "\ec0d"; +} + +.icon-xiangshangzhanhang:before { + content: "\ec0e"; +} + +.icon-tupianjiazaishibai:before { + content: "\ec0f"; +} + +.icon-fuwudiqiu:before { + content: "\ec10"; +} + +.icon-suoxiao:before { + content: "\ec13"; +} + +.icon-fangda:before { + content: "\ec14"; +} + +.icon-huanyuanhuabu:before { + content: "\ec15"; +} + +.icon-quanping:before { + content: "\ec16"; +} + +.icon-biaodanzujian-biaoge1:before { + content: "\ec17"; +} + +.icon-APIshuchu:before { + content: "\ec18"; +} + +.icon-APIjieru:before { + content: "\ec19"; +} + +.icon-wenjianjia:before { + content: "\ec1a"; +} + +.icon-DOC:before { + content: "\ec1b"; +} + +.icon-BMP:before { + content: "\ec1c"; +} + +.icon-GIF:before { + content: "\ec1d"; +} + +.icon-JPG:before { + content: "\ec1e"; +} + +.icon-PNG:before { + content: "\ec1f"; +} + +.icon-weizhigeshi:before { + content: "\ec20"; +} + +.icon-gengduo:before { + content: "\ec21"; +} + +.icon-yunduanxiazai:before { + content: "\ec22"; +} + +.icon-yunduanshangchuan:before { + content: "\ec23"; +} + +.icon-dian:before { + content: "\ec24"; +} + +.icon-mian:before { + content: "\ec25"; +} + +.icon-xian:before { + content: "\ec26"; +} + +.icon-shebeizhuangtai:before { + content: "\ec27"; +} + +.icon-fenzuguanli:before { + content: "\ec28"; +} + +.icon-kuaisubianpai:before { + content: "\ec29"; +} + +.icon-APPkaifa:before { + content: "\ec2a"; +} + +.icon-wentijieda:before { + content: "\ec2e"; +} + +.icon-kefu:before { + content: "\ec2f"; +} + +.icon-ruanjiankaifabao:before { + content: "\ec30"; +} + +.icon-sousuobianxiao:before { + content: "\ec32"; +} + +.icon-sousuofangda:before { + content: "\ec33"; +} + +.icon-dingwei:before { + content: "\ec34"; +} + +.icon-wumoxing:before { + content: "\ec35"; +} + +.icon-gaojing:before { + content: "\ec36"; +} + +.icon-renwujincheng:before { + content: "\ec37"; +} + +.icon-xiaoxitongzhi:before { + content: "\ec38"; +} + +.icon-youhui:before { + content: "\ec39"; +} + +.icon-gaojing1:before { + content: "\ec3a"; +} + +.icon-zhihangfankui:before { + content: "\ec3b"; +} + +.icon-gongdanqueren:before { + content: "\ec3c"; +} + +.icon-guangbo:before { + content: "\ec3d"; +} + +.icon-gongdan:before { + content: "\ec3e"; +} + +.icon-xiaoxi:before { + content: "\ec3f"; +} + +.icon-xinhao:before { + content: "\ec4a"; +} + +.icon-lanya:before { + content: "\ec4b"; +} + +.icon-Wi-Fi:before { + content: "\ec4c"; +} + +.icon-chaxun:before { + content: "\ec4d"; +} + +.icon-dianbiao:before { + content: "\ec4e"; +} + +.icon-anquan:before { + content: "\ec4f"; +} + +.icon-daibanshixiang:before { + content: "\ec50"; +} + +.icon-bingxiang:before { + content: "\ec51"; +} + +.icon-fanshe:before { + content: "\ec52"; +} + +.icon-fengche:before { + content: "\ec53"; +} + +.icon-guandao:before { + content: "\ec54"; +} + +.icon-guize1:before { + content: "\ec55"; +} + +.icon-guizeyinqing:before { + content: "\ec56"; +} + +.icon-huowudui:before { + content: "\ec57"; +} + +.icon-jianceqi:before { + content: "\ec58"; +} + +.icon-jinggai:before { + content: "\ec59"; +} + +.icon-liujisuan:before { + content: "\ec5a"; +} + +.icon-hanshu:before { + content: "\ec5b"; +} + +.icon-lianjieliu:before { + content: "\ec5c"; +} + +.icon-ludeng:before { + content: "\ec5d"; +} + +.icon-shexiangji:before { + content: "\ec5e"; +} + +.icon-rentijiance:before { + content: "\ec5f"; +} + +.icon-moshubang:before { + content: "\ec60"; +} + +.icon-shujuwajue:before { + content: "\ec61"; +} + +.icon-wangguan:before { + content: "\ec62"; +} + +.icon-shenjing:before { + content: "\ec63"; +} + +.icon-chucun:before { + content: "\ec64"; +} + +.icon-wuguan:before { + content: "\ec65"; +} + +.icon-yunduanshuaxin:before { + content: "\ec66"; +} + +.icon-yunhang:before { + content: "\ec67"; +} + +.icon-luyouqi:before { + content: "\ec68"; +} + +.icon-bug:before { + content: "\ec69"; +} + +.icon-get:before { + content: "\ec6a"; +} + +.icon-PIR:before { + content: "\ec6b"; +} + +.icon-zhexiantu:before { + content: "\ec6c"; +} + +.icon-shuibiao:before { + content: "\ec6d"; +} + +.icon-js:before { + content: "\ec6e"; +} + +.icon-zihangche:before { + content: "\ec6f"; +} + +.icon-liebiao:before { + content: "\ec70"; +} + +.icon-qichedingwei:before { + content: "\ec71"; +} + +.icon-dici:before { + content: "\ec72"; +} + +.icon-mysql:before { + content: "\ec73"; +} + +.icon-qiche:before { + content: "\ec74"; +} + +.icon-shenjing1:before { + content: "\ec75"; +} + +.icon-chengshi:before { + content: "\ec76"; +} + +.icon-tixingshixin:before { + content: "\ec77"; +} + +.icon-menci:before { + content: "\ec78"; +} + +.icon-chazuo:before { + content: "\ec79"; +} + +.icon-ranqijianceqi:before { + content: "\ec7a"; +} + +.icon-kaiguan:before { + content: "\ec7b"; +} + +.icon-chatou:before { + content: "\ec7c"; +} + +.icon-xiyiji:before { + content: "\ec7d"; +} + +.icon-yijiankaiguan:before { + content: "\ec7e"; +} + +.icon-yanwubaojingqi:before { + content: "\ec7f"; +} + +.icon-wuxiandianbo:before { + content: "\ec80"; +} + +.icon-fuzhi:before { + content: "\ec81"; +} + +.icon-shanchu:before { + content: "\ec82"; +} + +.icon-bianjisekuai:before { + content: "\ec83"; +} + +.icon-ishipinshixiao:before { + content: "\ec84"; +} + +.icon-iframetianjia:before { + content: "\ec85"; +} + +.icon-tupiantianjia:before { + content: "\ec86"; +} + +.icon-liebiaomoshi_kuai:before { + content: "\ec87"; +} + +.icon-qiapianmoshi_kuai:before { + content: "\ec88"; +} + +.icon-fenlan:before { + content: "\ec89"; +} + +.icon-fengexian:before { + content: "\ec8a"; +} + +.icon-dianzan:before { + content: "\ec8b"; +} + +.icon-charulianjie:before { + content: "\ec8c"; +} + +.icon-charutupian:before { + content: "\ec8d"; +} + +.icon-quxiaolianjie:before { + content: "\ec8e"; +} + +.icon-wuxupailie:before { + content: "\ec8f"; +} + +.icon-juzhongduiqi:before { + content: "\ec90"; +} + +.icon-yinyong:before { + content: "\ec91"; +} + +.icon-youxupailie:before { + content: "\ec92"; +} + +.icon-youduiqi:before { + content: "\ec93"; +} + +.icon-zitidaima:before { + content: "\ec94"; +} + +.icon-xiaolian:before { + content: "\ec95"; +} + +.icon-zitijiacu:before { + content: "\ec96"; +} + +.icon-zitishanchuxian:before { + content: "\ec97"; +} + +.icon-zitishangbiao:before { + content: "\ec98"; +} + +.icon-zitibiaoti:before { + content: "\ec99"; +} + +.icon-zitixiahuaxian:before { + content: "\ec9a"; +} + +.icon-zitixieti:before { + content: "\ec9b"; +} + +.icon-zitiyanse:before { + content: "\ec9c"; +} + +.icon-zuoduiqi:before { + content: "\ec9d"; +} + +.icon-zitiyulan:before { + content: "\ec9e"; +} + +.icon-zitixiabiao:before { + content: "\ec9f"; +} + +.icon-zuoyouduiqi:before { + content: "\eca0"; +} + +.icon-tianxie:before { + content: "\eca1"; +} + +.icon-huowudui1:before { + content: "\eca2"; +} + +.icon-yingjian:before { + content: "\eca3"; +} + +.icon-shebeikaifa:before { + content: "\eca4"; +} + +.icon-dianzan_kuai:before { + content: "\eca5"; +} + +.icon-zhihuan:before { + content: "\eca6"; +} + +.icon-tuoguan:before { + content: "\eca7"; +} + +.icon-duigoux:before { + content: "\eca8"; +} + +.icon-guanbi1:before { + content: "\eca9"; +} + +.icon-aixin_shixin:before { + content: "\ecaa"; +} + +.icon-ranqixieloubaojingqi:before { + content: "\ecab"; +} + +.icon-dianbiao_shiti:before { + content: "\ecac"; +} + +.icon-aixin:before { + content: "\ecad"; +} + +.icon-shuibiao_shiti:before { + content: "\ecae"; +} + +.icon-zhinengxiaofangshuan:before { + content: "\ecaf"; +} + +.icon-ranqibiao_shiti:before { + content: "\ecb0"; +} + +.icon-shexiangtou_shiti:before { + content: "\ecb1"; +} + +.icon-shexiangtou_guanbi:before { + content: "\ecb2"; +} + +.icon-shexiangtou:before { + content: "\ecb3"; +} + +.icon-shengyin_shiti:before { + content: "\ecb4"; +} + +.icon-shengyinkai:before { + content: "\ecb5"; +} + +.icon-shoucang_shixin:before { + content: "\ecb6"; +} + +.icon-shoucang:before { + content: "\ecb7"; +} + +.icon-shengyinwu:before { + content: "\ecb8"; +} + +.icon-shengyinjingyin:before { + content: "\ecb9"; +} + +.icon-zhunbeiliangchan:before { + content: "\ecba"; +} + +.icon-shebeikaifa1:before { + content: "\ecbb"; +} + +.icon-kongxinwenhao:before { + content: "\ed19"; +} + +.icon-cuowukongxin:before { + content: "\ed1a"; +} + +.icon-fangkuai1:before { + content: "\ed1b"; +} + +.icon-fangkuai2:before { + content: "\ed1c"; +} + +.icon-kongjianxuanzhong1:before { + content: "\ed1d"; +} + +.icon-kongxinduigou1:before { + content: "\ed1e"; +} + +.icon-xinxikongxin:before { + content: "\ed1f"; +} + +.icon-kongjian:before { + content: "\ed20"; +} + +.icon-gaojingkongxin:before { + content: "\ed21"; +} + +.icon-duigou_kuai:before { + content: "\ed22"; +} + +.icon-cuocha_kuai:before { + content: "\ed23"; +} + +.icon-jia_sekuai:before { + content: "\ed24"; +} + +.icon-jian_sekuai:before { + content: "\ed25"; +} + +.icon-tiaoshi:before { + content: "\eb61"; +} + +.icon-fenxiangfangshi:before { + content: "\ed2e"; +} + +.icon-changjingguanli:before { + content: "\eb62"; +} + +.icon-bianji:before { + content: "\eb63"; +} + +.icon-guanlianshebei:before { + content: "\eb64"; +} + +.icon-guanfangbanben:before { + content: "\eb65"; +} + +.icon-gongnengdingyi:before { + content: "\eb66"; +} + +.icon-jichuguanli:before { + content: "\eb67"; +} + +.icon-jishufuwu:before { + content: "\eb68"; +} + +.icon-hezuohuobanmiyueguanli:before { + content: "\eb69"; +} + +.icon-ceshishenqing:before { + content: "\eb6a"; +} + +.icon-jiedianguanli:before { + content: "\eb6b"; +} + +.icon-jinggao:before { + content: "\eb6c"; +} + +.icon-peiwangyindao:before { + content: "\eb6d"; +} + +.icon-renjijiaohu:before { + content: "\eb6e"; +} + +.icon-shiyongwendang:before { + content: "\eb6f"; +} + +.icon-quanxianshenpi:before { + content: "\eb70"; +} + +.icon-yishouquan:before { + content: "\eb71"; +} + +.icon-tianshenpi:before { + content: "\eb72"; +} + +.icon-shujukanban:before { + content: "\eb73"; +} + +.icon-yingyongguanli:before { + content: "\eb74"; +} + +.icon-yibiaopan:before { + content: "\eb75"; +} + +.icon-zhanghaoquanxianguanli:before { + content: "\eb76"; +} + +.icon-yuanquyunwei:before { + content: "\eb77"; +} + +.icon-jizhanguanli:before { + content: "\eb78"; +} + +.icon-guanbi:before { + content: "\eb79"; +} + diff --git a/public/iconfont/common/iconfont.js b/public/iconfont/common/iconfont.js new file mode 100644 index 0000000..a4840d7 --- /dev/null +++ b/public/iconfont/common/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_4454951='',function(l){var a=(a=document.getElementsByTagName("script"))[a.length-1],h=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var i,c,o,z,v,t=function(a,h){h.parentNode.insertBefore(a,h)};if(h&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}i=function(){var a,h=document.createElement("div");h.innerHTML=l._iconfont_svg_string_4454951,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(a=document.body).firstChild?t(h,a.firstChild):a.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(i,0):(c=function(){document.removeEventListener("DOMContentLoaded",c,!1),i()},document.addEventListener("DOMContentLoaded",c,!1)):document.attachEvent&&(o=i,z=l.document,v=!1,M(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,p())})}function p(){v||(v=!0,o())}function M(){try{z.documentElement.doScroll("left")}catch(a){return void setTimeout(M,50)}p()}}(window); \ No newline at end of file diff --git a/public/iconfont/common/iconfont.json b/public/iconfont/common/iconfont.json new file mode 100644 index 0000000..f06c8a3 --- /dev/null +++ b/public/iconfont/common/iconfont.json @@ -0,0 +1,1808 @@ +{ + "id": "4454951", + "name": "iot", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "4118040", + "name": "自定义", + "font_class": "zidingyi", + "unicode": "eb7a", + "unicode_decimal": 60282 + }, + { + "icon_id": "4175511", + "name": "下箭头", + "font_class": "xiajiantou", + "unicode": "eb7b", + "unicode_decimal": 60283 + }, + { + "icon_id": "4175512", + "name": "上箭头", + "font_class": "shangjiantou", + "unicode": "eb7c", + "unicode_decimal": 60284 + }, + { + "icon_id": "4325757", + "name": "icon_loading", + "font_class": "icon_loading", + "unicode": "eb80", + "unicode_decimal": 60288 + }, + { + "icon_id": "4354240", + "name": "表单组件-输入框", + "font_class": "biaodanzujian-shurukuang", + "unicode": "eb94", + "unicode_decimal": 60308 + }, + { + "icon_id": "4354241", + "name": "表单组件-表格", + "font_class": "biaodanzujian-biaoge", + "unicode": "eb95", + "unicode_decimal": 60309 + }, + { + "icon_id": "4354242", + "name": "表单组件-下拉框", + "font_class": "biaodanzujian-xialakuang", + "unicode": "eb96", + "unicode_decimal": 60310 + }, + { + "icon_id": "4354243", + "name": "图表-饼图", + "font_class": "tubiao-bingtu", + "unicode": "eb97", + "unicode_decimal": 60311 + }, + { + "icon_id": "4354244", + "name": "表单组件-按钮", + "font_class": "biaodanzujian-anniu", + "unicode": "eb98", + "unicode_decimal": 60312 + }, + { + "icon_id": "4354245", + "name": "工业组件-仪表盘", + "font_class": "gongyezujian-yibiaopan", + "unicode": "eb99", + "unicode_decimal": 60313 + }, + { + "icon_id": "4354246", + "name": "图表-卡片", + "font_class": "tubiao-qiapian", + "unicode": "eb9a", + "unicode_decimal": 60314 + }, + { + "icon_id": "4354247", + "name": "工业组件-指示灯", + "font_class": "gongyezujian-zhishideng", + "unicode": "eb9b", + "unicode_decimal": 60315 + }, + { + "icon_id": "4354248", + "name": "图表-折线图", + "font_class": "tubiao-zhexiantu", + "unicode": "eb9c", + "unicode_decimal": 60316 + }, + { + "icon_id": "4354249", + "name": "形状-矩形", + "font_class": "xingzhuang-juxing", + "unicode": "eb9d", + "unicode_decimal": 60317 + }, + { + "icon_id": "4354250", + "name": "形状-箭形", + "font_class": "xingzhuang-jianxing", + "unicode": "eb9e", + "unicode_decimal": 60318 + }, + { + "icon_id": "4354251", + "name": "工业组件-开关", + "font_class": "gongyezujian-kaiguan", + "unicode": "eb9f", + "unicode_decimal": 60319 + }, + { + "icon_id": "4354252", + "name": "图表-柱状图", + "font_class": "tubiao-zhuzhuangtu", + "unicode": "eba0", + "unicode_decimal": 60320 + }, + { + "icon_id": "4354253", + "name": "形状-图片", + "font_class": "xingzhuang-tupian", + "unicode": "eba1", + "unicode_decimal": 60321 + }, + { + "icon_id": "4354254", + "name": "形状-文字", + "font_class": "xingzhuang-wenzi", + "unicode": "eba2", + "unicode_decimal": 60322 + }, + { + "icon_id": "4354255", + "name": "形状-椭圆形", + "font_class": "xingzhuang-tuoyuanxing", + "unicode": "eba3", + "unicode_decimal": 60323 + }, + { + "icon_id": "4354256", + "name": "形状-三角形", + "font_class": "xingzhuang-sanjiaoxing", + "unicode": "eba4", + "unicode_decimal": 60324 + }, + { + "icon_id": "4354257", + "name": "形状-星形", + "font_class": "xingzhuang-xingxing", + "unicode": "eba5", + "unicode_decimal": 60325 + }, + { + "icon_id": "4506835", + "name": "规则", + "font_class": "guize", + "unicode": "ebb7", + "unicode_decimal": 60343 + }, + { + "icon_id": "4506836", + "name": "设备管理", + "font_class": "shebeiguanli", + "unicode": "ebb8", + "unicode_decimal": 60344 + }, + { + "icon_id": "4506837", + "name": "功能定义", + "font_class": "gongnengdingyi1", + "unicode": "ebb9", + "unicode_decimal": 60345 + }, + { + "icon_id": "4518043", + "name": "技术服务", + "font_class": "jishufuwu1", + "unicode": "ebce", + "unicode_decimal": 60366 + }, + { + "icon_id": "4518091", + "name": "运营中心", + "font_class": "yunyingzhongxin", + "unicode": "ebd0", + "unicode_decimal": 60368 + }, + { + "icon_id": "4518102", + "name": "运营管理", + "font_class": "yunyingguanli", + "unicode": "ebd1", + "unicode_decimal": 60369 + }, + { + "icon_id": "4521281", + "name": "组织下辖", + "font_class": "zuzhixiaxia", + "unicode": "ebd8", + "unicode_decimal": 60376 + }, + { + "icon_id": "4521282", + "name": "组织展开", + "font_class": "zuzhizhankai", + "unicode": "ebd9", + "unicode_decimal": 60377 + }, + { + "icon_id": "4521283", + "name": "组织群组", + "font_class": "zuzhiqunzu", + "unicode": "ebda", + "unicode_decimal": 60378 + }, + { + "icon_id": "4570294", + "name": "打开", + "font_class": "dakai", + "unicode": "ebdf", + "unicode_decimal": 60383 + }, + { + "icon_id": "4570298", + "name": "英文", + "font_class": "yingwen", + "unicode": "ebe0", + "unicode_decimal": 60384 + }, + { + "icon_id": "4573742", + "name": "中文", + "font_class": "zhongwen", + "unicode": "ebe2", + "unicode_decimal": 60386 + }, + { + "icon_id": "4574594", + "name": "密文", + "font_class": "miwen", + "unicode": "ebe3", + "unicode_decimal": 60387 + }, + { + "icon_id": "4574615", + "name": "显号", + "font_class": "xianhao", + "unicode": "ebe4", + "unicode_decimal": 60388 + }, + { + "icon_id": "4583613", + "name": "空心对勾", + "font_class": "kongxinduigou", + "unicode": "ebe5", + "unicode_decimal": 60389 + }, + { + "icon_id": "4611764", + "name": "回形针", + "font_class": "huixingzhen", + "unicode": "ebe6", + "unicode_decimal": 60390 + }, + { + "icon_id": "4611765", + "name": "对勾", + "font_class": "duigou", + "unicode": "ebe7", + "unicode_decimal": 60391 + }, + { + "icon_id": "4624184", + "name": "下一步", + "font_class": "xiayibu", + "unicode": "ebef", + "unicode_decimal": 60399 + }, + { + "icon_id": "4624185", + "name": "上一步", + "font_class": "shangyibu", + "unicode": "ebf0", + "unicode_decimal": 60400 + }, + { + "icon_id": "4624187", + "name": "控件选中", + "font_class": "kongjianxuanzhong", + "unicode": "ebf1", + "unicode_decimal": 60401 + }, + { + "icon_id": "4624217", + "name": "控件未选", + "font_class": "kongjianweixuan", + "unicode": "ebf2", + "unicode_decimal": 60402 + }, + { + "icon_id": "4624218", + "name": "控件已选", + "font_class": "kongjianyixuan", + "unicode": "ebf3", + "unicode_decimal": 60403 + }, + { + "icon_id": "4661015", + "name": "0117- 电杆", + "font_class": "-diangan", + "unicode": "ebfb", + "unicode_decimal": 60411 + }, + { + "icon_id": "4661016", + "name": "0309融雪剂溶解池*", + "font_class": "rongxuejirongjiechi", + "unicode": "ebfc", + "unicode_decimal": 60412 + }, + { + "icon_id": "4661017", + "name": "0215路边停车场*", + "font_class": "lubiantingchechang", + "unicode": "ebfd", + "unicode_decimal": 60413 + }, + { + "icon_id": "4661019", + "name": "0213-路名牌", + "font_class": "-lumingpai", + "unicode": "ebfe", + "unicode_decimal": 60414 + }, + { + "icon_id": "4661020", + "name": "0407街头座椅", + "font_class": "jietouzuoyi", + "unicode": "ebff", + "unicode_decimal": 60415 + }, + { + "icon_id": "4661022", + "name": "0601-重大危险", + "font_class": "-zhongdaweixian", + "unicode": "ec00", + "unicode_decimal": 60416 + }, + { + "icon_id": "4661130", + "name": "0209-交通标志牌", + "font_class": "-jiaotongbiaozhipai", + "unicode": "ec01", + "unicode_decimal": 60417 + }, + { + "icon_id": "4661132", + "name": "0303公厕指示牌", + "font_class": "gongcezhishipai", + "unicode": "ec02", + "unicode_decimal": 60418 + }, + { + "icon_id": "4682882", + "name": "方块+", + "font_class": "fangkuai", + "unicode": "ec06", + "unicode_decimal": 60422 + }, + { + "icon_id": "4682890", + "name": "方块-", + "font_class": "fangkuai-", + "unicode": "ec07", + "unicode_decimal": 60423 + }, + { + "icon_id": "4686545", + "name": "刷新", + "font_class": "shuaxin", + "unicode": "ec08", + "unicode_decimal": 60424 + }, + { + "icon_id": "4686546", + "name": "保存", + "font_class": "baocun", + "unicode": "ec09", + "unicode_decimal": 60425 + }, + { + "icon_id": "4686547", + "name": "发布", + "font_class": "fabu", + "unicode": "ec0a", + "unicode_decimal": 60426 + }, + { + "icon_id": "4686548", + "name": "下一步", + "font_class": "xiayibu1", + "unicode": "ec0b", + "unicode_decimal": 60427 + }, + { + "icon_id": "4686549", + "name": "上一步", + "font_class": "shangyibu1", + "unicode": "ec0c", + "unicode_decimal": 60428 + }, + { + "icon_id": "4694304", + "name": "向下占行", + "font_class": "xiangxiazhanhang", + "unicode": "ec0d", + "unicode_decimal": 60429 + }, + { + "icon_id": "4694305", + "name": "向上占行", + "font_class": "xiangshangzhanhang", + "unicode": "ec0e", + "unicode_decimal": 60430 + }, + { + "icon_id": "4723191", + "name": "图片加载失败", + "font_class": "tupianjiazaishibai", + "unicode": "ec0f", + "unicode_decimal": 60431 + }, + { + "icon_id": "4733921", + "name": "服务地球", + "font_class": "fuwudiqiu", + "unicode": "ec10", + "unicode_decimal": 60432 + }, + { + "icon_id": "4777227", + "name": "缩小", + "font_class": "suoxiao", + "unicode": "ec13", + "unicode_decimal": 60435 + }, + { + "icon_id": "4777229", + "name": "放大", + "font_class": "fangda", + "unicode": "ec14", + "unicode_decimal": 60436 + }, + { + "icon_id": "4777231", + "name": "还原画布", + "font_class": "huanyuanhuabu", + "unicode": "ec15", + "unicode_decimal": 60437 + }, + { + "icon_id": "4777232", + "name": "全屏", + "font_class": "quanping", + "unicode": "ec16", + "unicode_decimal": 60438 + }, + { + "icon_id": "4779612", + "name": "表单组件-表格", + "font_class": "biaodanzujian-biaoge1", + "unicode": "ec17", + "unicode_decimal": 60439 + }, + { + "icon_id": "4780412", + "name": "API输出", + "font_class": "APIshuchu", + "unicode": "ec18", + "unicode_decimal": 60440 + }, + { + "icon_id": "4780413", + "name": "API接入", + "font_class": "APIjieru", + "unicode": "ec19", + "unicode_decimal": 60441 + }, + { + "icon_id": "4893191", + "name": "文件夹", + "font_class": "wenjianjia", + "unicode": "ec1a", + "unicode_decimal": 60442 + }, + { + "icon_id": "4893192", + "name": "DOC", + "font_class": "DOC", + "unicode": "ec1b", + "unicode_decimal": 60443 + }, + { + "icon_id": "4893193", + "name": "BMP", + "font_class": "BMP", + "unicode": "ec1c", + "unicode_decimal": 60444 + }, + { + "icon_id": "4893194", + "name": "GIF", + "font_class": "GIF", + "unicode": "ec1d", + "unicode_decimal": 60445 + }, + { + "icon_id": "4893195", + "name": "JPG", + "font_class": "JPG", + "unicode": "ec1e", + "unicode_decimal": 60446 + }, + { + "icon_id": "4893196", + "name": "PNG", + "font_class": "PNG", + "unicode": "ec1f", + "unicode_decimal": 60447 + }, + { + "icon_id": "4893199", + "name": "未知格式", + "font_class": "weizhigeshi", + "unicode": "ec20", + "unicode_decimal": 60448 + }, + { + "icon_id": "4896380", + "name": "更多", + "font_class": "gengduo", + "unicode": "ec21", + "unicode_decimal": 60449 + }, + { + "icon_id": "4932635", + "name": "云端下载", + "font_class": "yunduanxiazai", + "unicode": "ec22", + "unicode_decimal": 60450 + }, + { + "icon_id": "4932636", + "name": "云端上传", + "font_class": "yunduanshangchuan", + "unicode": "ec23", + "unicode_decimal": 60451 + }, + { + "icon_id": "4933869", + "name": "点", + "font_class": "dian", + "unicode": "ec24", + "unicode_decimal": 60452 + }, + { + "icon_id": "4933870", + "name": "面", + "font_class": "mian", + "unicode": "ec25", + "unicode_decimal": 60453 + }, + { + "icon_id": "4933871", + "name": "线", + "font_class": "xian", + "unicode": "ec26", + "unicode_decimal": 60454 + }, + { + "icon_id": "5401578", + "name": "设备状态", + "font_class": "shebeizhuangtai", + "unicode": "ec27", + "unicode_decimal": 60455 + }, + { + "icon_id": "5401579", + "name": "分组管理", + "font_class": "fenzuguanli", + "unicode": "ec28", + "unicode_decimal": 60456 + }, + { + "icon_id": "5401580", + "name": "快速编排", + "font_class": "kuaisubianpai", + "unicode": "ec29", + "unicode_decimal": 60457 + }, + { + "icon_id": "5401581", + "name": "APP开发", + "font_class": "APPkaifa", + "unicode": "ec2a", + "unicode_decimal": 60458 + }, + { + "icon_id": "5460559", + "name": "问题解答", + "font_class": "wentijieda", + "unicode": "ec2e", + "unicode_decimal": 60462 + }, + { + "icon_id": "5460560", + "name": "客服", + "font_class": "kefu", + "unicode": "ec2f", + "unicode_decimal": 60463 + }, + { + "icon_id": "5460561", + "name": "软件开发包", + "font_class": "ruanjiankaifabao", + "unicode": "ec30", + "unicode_decimal": 60464 + }, + { + "icon_id": "5732757", + "name": "搜索变小", + "font_class": "sousuobianxiao", + "unicode": "ec32", + "unicode_decimal": 60466 + }, + { + "icon_id": "5732758", + "name": "搜索放大", + "font_class": "sousuofangda", + "unicode": "ec33", + "unicode_decimal": 60467 + }, + { + "icon_id": "5732759", + "name": "定位", + "font_class": "dingwei", + "unicode": "ec34", + "unicode_decimal": 60468 + }, + { + "icon_id": "5763920", + "name": "物模型", + "font_class": "wumoxing", + "unicode": "ec35", + "unicode_decimal": 60469 + }, + { + "icon_id": "5764445", + "name": "告警", + "font_class": "gaojing", + "unicode": "ec36", + "unicode_decimal": 60470 + }, + { + "icon_id": "5767874", + "name": "任务进程", + "font_class": "renwujincheng", + "unicode": "ec37", + "unicode_decimal": 60471 + }, + { + "icon_id": "5767876", + "name": "消息通知", + "font_class": "xiaoxitongzhi", + "unicode": "ec38", + "unicode_decimal": 60472 + }, + { + "icon_id": "5767877", + "name": "优惠", + "font_class": "youhui", + "unicode": "ec39", + "unicode_decimal": 60473 + }, + { + "icon_id": "5767878", + "name": "告警", + "font_class": "gaojing1", + "unicode": "ec3a", + "unicode_decimal": 60474 + }, + { + "icon_id": "5767879", + "name": "执行反馈", + "font_class": "zhihangfankui", + "unicode": "ec3b", + "unicode_decimal": 60475 + }, + { + "icon_id": "5769241", + "name": "工单确认", + "font_class": "gongdanqueren", + "unicode": "ec3c", + "unicode_decimal": 60476 + }, + { + "icon_id": "5769242", + "name": "广播", + "font_class": "guangbo", + "unicode": "ec3d", + "unicode_decimal": 60477 + }, + { + "icon_id": "5769243", + "name": "工单", + "font_class": "gongdan", + "unicode": "ec3e", + "unicode_decimal": 60478 + }, + { + "icon_id": "5882682", + "name": "消息", + "font_class": "xiaoxi", + "unicode": "ec3f", + "unicode_decimal": 60479 + }, + { + "icon_id": "5928197", + "name": "信号", + "font_class": "xinhao", + "unicode": "ec4a", + "unicode_decimal": 60490 + }, + { + "icon_id": "5928198", + "name": "蓝牙", + "font_class": "lanya", + "unicode": "ec4b", + "unicode_decimal": 60491 + }, + { + "icon_id": "5930292", + "name": "Wi-Fi", + "font_class": "Wi-Fi", + "unicode": "ec4c", + "unicode_decimal": 60492 + }, + { + "icon_id": "5961297", + "name": "查询", + "font_class": "chaxun", + "unicode": "ec4d", + "unicode_decimal": 60493 + }, + { + "icon_id": "5961298", + "name": "电表", + "font_class": "dianbiao", + "unicode": "ec4e", + "unicode_decimal": 60494 + }, + { + "icon_id": "5961299", + "name": "安全", + "font_class": "anquan", + "unicode": "ec4f", + "unicode_decimal": 60495 + }, + { + "icon_id": "5961300", + "name": "待办事项", + "font_class": "daibanshixiang", + "unicode": "ec50", + "unicode_decimal": 60496 + }, + { + "icon_id": "5961301", + "name": "冰箱", + "font_class": "bingxiang", + "unicode": "ec51", + "unicode_decimal": 60497 + }, + { + "icon_id": "5961302", + "name": "反射", + "font_class": "fanshe", + "unicode": "ec52", + "unicode_decimal": 60498 + }, + { + "icon_id": "5961303", + "name": "风车", + "font_class": "fengche", + "unicode": "ec53", + "unicode_decimal": 60499 + }, + { + "icon_id": "5961304", + "name": "管道", + "font_class": "guandao", + "unicode": "ec54", + "unicode_decimal": 60500 + }, + { + "icon_id": "5961305", + "name": "规则", + "font_class": "guize1", + "unicode": "ec55", + "unicode_decimal": 60501 + }, + { + "icon_id": "5961306", + "name": "规则引擎", + "font_class": "guizeyinqing", + "unicode": "ec56", + "unicode_decimal": 60502 + }, + { + "icon_id": "5961307", + "name": "货物堆", + "font_class": "huowudui", + "unicode": "ec57", + "unicode_decimal": 60503 + }, + { + "icon_id": "5961308", + "name": "检测器", + "font_class": "jianceqi", + "unicode": "ec58", + "unicode_decimal": 60504 + }, + { + "icon_id": "5961309", + "name": "井盖", + "font_class": "jinggai", + "unicode": "ec59", + "unicode_decimal": 60505 + }, + { + "icon_id": "5961310", + "name": "流计算", + "font_class": "liujisuan", + "unicode": "ec5a", + "unicode_decimal": 60506 + }, + { + "icon_id": "5961311", + "name": "函数", + "font_class": "hanshu", + "unicode": "ec5b", + "unicode_decimal": 60507 + }, + { + "icon_id": "5961312", + "name": "连接流", + "font_class": "lianjieliu", + "unicode": "ec5c", + "unicode_decimal": 60508 + }, + { + "icon_id": "5961313", + "name": "路灯", + "font_class": "ludeng", + "unicode": "ec5d", + "unicode_decimal": 60509 + }, + { + "icon_id": "5961314", + "name": "摄像机", + "font_class": "shexiangji", + "unicode": "ec5e", + "unicode_decimal": 60510 + }, + { + "icon_id": "5961315", + "name": "人体检测", + "font_class": "rentijiance", + "unicode": "ec5f", + "unicode_decimal": 60511 + }, + { + "icon_id": "5961316", + "name": "魔术棒", + "font_class": "moshubang", + "unicode": "ec60", + "unicode_decimal": 60512 + }, + { + "icon_id": "5961317", + "name": "数据挖掘", + "font_class": "shujuwajue", + "unicode": "ec61", + "unicode_decimal": 60513 + }, + { + "icon_id": "5961318", + "name": "网关", + "font_class": "wangguan", + "unicode": "ec62", + "unicode_decimal": 60514 + }, + { + "icon_id": "5961319", + "name": "人脑", + "font_class": "shenjing", + "unicode": "ec63", + "unicode_decimal": 60515 + }, + { + "icon_id": "5961320", + "name": "储存", + "font_class": "chucun", + "unicode": "ec64", + "unicode_decimal": 60516 + }, + { + "icon_id": "5961321", + "name": "AI", + "font_class": "wuguan", + "unicode": "ec65", + "unicode_decimal": 60517 + }, + { + "icon_id": "5961322", + "name": "云端刷新", + "font_class": "yunduanshuaxin", + "unicode": "ec66", + "unicode_decimal": 60518 + }, + { + "icon_id": "5961323", + "name": "运行", + "font_class": "yunhang", + "unicode": "ec67", + "unicode_decimal": 60519 + }, + { + "icon_id": "5961324", + "name": "路由器", + "font_class": "luyouqi", + "unicode": "ec68", + "unicode_decimal": 60520 + }, + { + "icon_id": "5961325", + "name": "bug", + "font_class": "bug", + "unicode": "ec69", + "unicode_decimal": 60521 + }, + { + "icon_id": "5961326", + "name": "get", + "font_class": "get", + "unicode": "ec6a", + "unicode_decimal": 60522 + }, + { + "icon_id": "5961327", + "name": "PIR", + "font_class": "PIR", + "unicode": "ec6b", + "unicode_decimal": 60523 + }, + { + "icon_id": "5961328", + "name": "折线图", + "font_class": "zhexiantu", + "unicode": "ec6c", + "unicode_decimal": 60524 + }, + { + "icon_id": "5961329", + "name": "水表", + "font_class": "shuibiao", + "unicode": "ec6d", + "unicode_decimal": 60525 + }, + { + "icon_id": "5961331", + "name": "js", + "font_class": "js", + "unicode": "ec6e", + "unicode_decimal": 60526 + }, + { + "icon_id": "5961332", + "name": "自行车", + "font_class": "zihangche", + "unicode": "ec6f", + "unicode_decimal": 60527 + }, + { + "icon_id": "5961366", + "name": "列表", + "font_class": "liebiao", + "unicode": "ec70", + "unicode_decimal": 60528 + }, + { + "icon_id": "5961390", + "name": "汽车定位", + "font_class": "qichedingwei", + "unicode": "ec71", + "unicode_decimal": 60529 + }, + { + "icon_id": "5961391", + "name": "地磁", + "font_class": "dici", + "unicode": "ec72", + "unicode_decimal": 60530 + }, + { + "icon_id": "5961392", + "name": "mysql", + "font_class": "mysql", + "unicode": "ec73", + "unicode_decimal": 60531 + }, + { + "icon_id": "5961393", + "name": "汽车", + "font_class": "qiche", + "unicode": "ec74", + "unicode_decimal": 60532 + }, + { + "icon_id": "5961430", + "name": "神经", + "font_class": "shenjing1", + "unicode": "ec75", + "unicode_decimal": 60533 + }, + { + "icon_id": "5975445", + "name": "城市", + "font_class": "chengshi", + "unicode": "ec76", + "unicode_decimal": 60534 + }, + { + "icon_id": "5982568", + "name": "告警实心", + "font_class": "tixingshixin", + "unicode": "ec77", + "unicode_decimal": 60535 + }, + { + "icon_id": "5982851", + "name": "门磁", + "font_class": "menci", + "unicode": "ec78", + "unicode_decimal": 60536 + }, + { + "icon_id": "5982852", + "name": "插座", + "font_class": "chazuo", + "unicode": "ec79", + "unicode_decimal": 60537 + }, + { + "icon_id": "5982853", + "name": "燃气监测器", + "font_class": "ranqijianceqi", + "unicode": "ec7a", + "unicode_decimal": 60538 + }, + { + "icon_id": "5982854", + "name": "开关", + "font_class": "kaiguan", + "unicode": "ec7b", + "unicode_decimal": 60539 + }, + { + "icon_id": "5982855", + "name": "插头", + "font_class": "chatou", + "unicode": "ec7c", + "unicode_decimal": 60540 + }, + { + "icon_id": "5982856", + "name": "洗衣机", + "font_class": "xiyiji", + "unicode": "ec7d", + "unicode_decimal": 60541 + }, + { + "icon_id": "5982858", + "name": "一键开关", + "font_class": "yijiankaiguan", + "unicode": "ec7e", + "unicode_decimal": 60542 + }, + { + "icon_id": "5982859", + "name": "烟雾报警器", + "font_class": "yanwubaojingqi", + "unicode": "ec7f", + "unicode_decimal": 60543 + }, + { + "icon_id": "5983093", + "name": "无线电波", + "font_class": "wuxiandianbo", + "unicode": "ec80", + "unicode_decimal": 60544 + }, + { + "icon_id": "5993150", + "name": "复制", + "font_class": "fuzhi", + "unicode": "ec81", + "unicode_decimal": 60545 + }, + { + "icon_id": "6061533", + "name": "删除", + "font_class": "shanchu", + "unicode": "ec82", + "unicode_decimal": 60546 + }, + { + "icon_id": "6194670", + "name": "编辑色块", + "font_class": "bianjisekuai", + "unicode": "ec83", + "unicode_decimal": 60547 + }, + { + "icon_id": "6195942", + "name": "i视频失效", + "font_class": "ishipinshixiao", + "unicode": "ec84", + "unicode_decimal": 60548 + }, + { + "icon_id": "6195943", + "name": "iframe添加", + "font_class": "iframetianjia", + "unicode": "ec85", + "unicode_decimal": 60549 + }, + { + "icon_id": "6195944", + "name": "图片添加", + "font_class": "tupiantianjia", + "unicode": "ec86", + "unicode_decimal": 60550 + }, + { + "icon_id": "6237287", + "name": "列表模式_块", + "font_class": "liebiaomoshi_kuai", + "unicode": "ec87", + "unicode_decimal": 60551 + }, + { + "icon_id": "6237288", + "name": "卡片模式_块", + "font_class": "qiapianmoshi_kuai", + "unicode": "ec88", + "unicode_decimal": 60552 + }, + { + "icon_id": "6337453", + "name": "分栏", + "font_class": "fenlan", + "unicode": "ec89", + "unicode_decimal": 60553 + }, + { + "icon_id": "6337454", + "name": "分割线", + "font_class": "fengexian", + "unicode": "ec8a", + "unicode_decimal": 60554 + }, + { + "icon_id": "6337455", + "name": "点赞", + "font_class": "dianzan", + "unicode": "ec8b", + "unicode_decimal": 60555 + }, + { + "icon_id": "6337456", + "name": "插入链接", + "font_class": "charulianjie", + "unicode": "ec8c", + "unicode_decimal": 60556 + }, + { + "icon_id": "6337457", + "name": "插入图片", + "font_class": "charutupian", + "unicode": "ec8d", + "unicode_decimal": 60557 + }, + { + "icon_id": "6337458", + "name": "取消链接", + "font_class": "quxiaolianjie", + "unicode": "ec8e", + "unicode_decimal": 60558 + }, + { + "icon_id": "6337459", + "name": "无序排列", + "font_class": "wuxupailie", + "unicode": "ec8f", + "unicode_decimal": 60559 + }, + { + "icon_id": "6337460", + "name": "居中对齐", + "font_class": "juzhongduiqi", + "unicode": "ec90", + "unicode_decimal": 60560 + }, + { + "icon_id": "6337461", + "name": "引用", + "font_class": "yinyong", + "unicode": "ec91", + "unicode_decimal": 60561 + }, + { + "icon_id": "6337462", + "name": "有序排列", + "font_class": "youxupailie", + "unicode": "ec92", + "unicode_decimal": 60562 + }, + { + "icon_id": "6337463", + "name": "右对齐", + "font_class": "youduiqi", + "unicode": "ec93", + "unicode_decimal": 60563 + }, + { + "icon_id": "6337464", + "name": "字体代码", + "font_class": "zitidaima", + "unicode": "ec94", + "unicode_decimal": 60564 + }, + { + "icon_id": "6337465", + "name": "笑脸", + "font_class": "xiaolian", + "unicode": "ec95", + "unicode_decimal": 60565 + }, + { + "icon_id": "6337466", + "name": "字体加粗", + "font_class": "zitijiacu", + "unicode": "ec96", + "unicode_decimal": 60566 + }, + { + "icon_id": "6337467", + "name": "字体删除线", + "font_class": "zitishanchuxian", + "unicode": "ec97", + "unicode_decimal": 60567 + }, + { + "icon_id": "6337468", + "name": "字体上标", + "font_class": "zitishangbiao", + "unicode": "ec98", + "unicode_decimal": 60568 + }, + { + "icon_id": "6337469", + "name": "字体标题", + "font_class": "zitibiaoti", + "unicode": "ec99", + "unicode_decimal": 60569 + }, + { + "icon_id": "6337470", + "name": "字体下划线", + "font_class": "zitixiahuaxian", + "unicode": "ec9a", + "unicode_decimal": 60570 + }, + { + "icon_id": "6337471", + "name": "字体斜体", + "font_class": "zitixieti", + "unicode": "ec9b", + "unicode_decimal": 60571 + }, + { + "icon_id": "6337472", + "name": "字体颜色", + "font_class": "zitiyanse", + "unicode": "ec9c", + "unicode_decimal": 60572 + }, + { + "icon_id": "6337473", + "name": "左对齐", + "font_class": "zuoduiqi", + "unicode": "ec9d", + "unicode_decimal": 60573 + }, + { + "icon_id": "6337474", + "name": "字体预览", + "font_class": "zitiyulan", + "unicode": "ec9e", + "unicode_decimal": 60574 + }, + { + "icon_id": "6337475", + "name": "字体下标", + "font_class": "zitixiabiao", + "unicode": "ec9f", + "unicode_decimal": 60575 + }, + { + "icon_id": "6337476", + "name": "左右对齐", + "font_class": "zuoyouduiqi", + "unicode": "eca0", + "unicode_decimal": 60576 + }, + { + "icon_id": "6337498", + "name": "编辑", + "font_class": "tianxie", + "unicode": "eca1", + "unicode_decimal": 60577 + }, + { + "icon_id": "6348675", + "name": "集成打包", + "font_class": "huowudui1", + "unicode": "eca2", + "unicode_decimal": 60578 + }, + { + "icon_id": "6348676", + "name": "硬件", + "font_class": "yingjian", + "unicode": "eca3", + "unicode_decimal": 60579 + }, + { + "icon_id": "6348833", + "name": "设备开发", + "font_class": "shebeikaifa", + "unicode": "eca4", + "unicode_decimal": 60580 + }, + { + "icon_id": "6380878", + "name": "点赞_块", + "font_class": "dianzan_kuai", + "unicode": "eca5", + "unicode_decimal": 60581 + }, + { + "icon_id": "6476391", + "name": "置换", + "font_class": "zhihuan", + "unicode": "eca6", + "unicode_decimal": 60582 + }, + { + "icon_id": "6482368", + "name": "托管", + "font_class": "tuoguan", + "unicode": "eca7", + "unicode_decimal": 60583 + }, + { + "icon_id": "6616926", + "name": "对勾", + "font_class": "duigoux", + "unicode": "eca8", + "unicode_decimal": 60584 + }, + { + "icon_id": "6616997", + "name": "关闭", + "font_class": "guanbi1", + "unicode": "eca9", + "unicode_decimal": 60585 + }, + { + "icon_id": "6775641", + "name": "爱心 _实心", + "font_class": "aixin_shixin", + "unicode": "ecaa", + "unicode_decimal": 60586 + }, + { + "icon_id": "6775642", + "name": "燃气泄漏报警器", + "font_class": "ranqixieloubaojingqi", + "unicode": "ecab", + "unicode_decimal": 60587 + }, + { + "icon_id": "6775643", + "name": "电表_实体", + "font_class": "dianbiao_shiti", + "unicode": "ecac", + "unicode_decimal": 60588 + }, + { + "icon_id": "6775644", + "name": "爱心", + "font_class": "aixin", + "unicode": "ecad", + "unicode_decimal": 60589 + }, + { + "icon_id": "6775645", + "name": "水表_实体", + "font_class": "shuibiao_shiti", + "unicode": "ecae", + "unicode_decimal": 60590 + }, + { + "icon_id": "6775648", + "name": "智能消防栓", + "font_class": "zhinengxiaofangshuan", + "unicode": "ecaf", + "unicode_decimal": 60591 + }, + { + "icon_id": "6775689", + "name": "燃气表_实体", + "font_class": "ranqibiao_shiti", + "unicode": "ecb0", + "unicode_decimal": 60592 + }, + { + "icon_id": "6776381", + "name": "摄像头_实体", + "font_class": "shexiangtou_shiti", + "unicode": "ecb1", + "unicode_decimal": 60593 + }, + { + "icon_id": "6776383", + "name": "摄像头_关闭", + "font_class": "shexiangtou_guanbi", + "unicode": "ecb2", + "unicode_decimal": 60594 + }, + { + "icon_id": "6776384", + "name": "摄像头", + "font_class": "shexiangtou", + "unicode": "ecb3", + "unicode_decimal": 60595 + }, + { + "icon_id": "6776386", + "name": "声音_实体", + "font_class": "shengyin_shiti", + "unicode": "ecb4", + "unicode_decimal": 60596 + }, + { + "icon_id": "6776387", + "name": "声音开", + "font_class": "shengyinkai", + "unicode": "ecb5", + "unicode_decimal": 60597 + }, + { + "icon_id": "6776388", + "name": "收藏_实心", + "font_class": "shoucang_shixin", + "unicode": "ecb6", + "unicode_decimal": 60598 + }, + { + "icon_id": "6776389", + "name": "收藏", + "font_class": "shoucang", + "unicode": "ecb7", + "unicode_decimal": 60599 + }, + { + "icon_id": "6776390", + "name": "声音无", + "font_class": "shengyinwu", + "unicode": "ecb8", + "unicode_decimal": 60600 + }, + { + "icon_id": "6776437", + "name": "声音静音", + "font_class": "shengyinjingyin", + "unicode": "ecb9", + "unicode_decimal": 60601 + }, + { + "icon_id": "6909426", + "name": "准备量产", + "font_class": "zhunbeiliangchan", + "unicode": "ecba", + "unicode_decimal": 60602 + }, + { + "icon_id": "6909428", + "name": "设备开发", + "font_class": "shebeikaifa1", + "unicode": "ecbb", + "unicode_decimal": 60603 + }, + { + "icon_id": "7947379", + "name": "空心问号", + "font_class": "kongxinwenhao", + "unicode": "ed19", + "unicode_decimal": 60697 + }, + { + "icon_id": "7947748", + "name": "错误空心", + "font_class": "cuowukongxin", + "unicode": "ed1a", + "unicode_decimal": 60698 + }, + { + "icon_id": "7947749", + "name": "方块", + "font_class": "fangkuai1", + "unicode": "ed1b", + "unicode_decimal": 60699 + }, + { + "icon_id": "7947750", + "name": "方块+", + "font_class": "fangkuai2", + "unicode": "ed1c", + "unicode_decimal": 60700 + }, + { + "icon_id": "7947751", + "name": "控件选中", + "font_class": "kongjianxuanzhong1", + "unicode": "ed1d", + "unicode_decimal": 60701 + }, + { + "icon_id": "7947752", + "name": "空心对勾", + "font_class": "kongxinduigou1", + "unicode": "ed1e", + "unicode_decimal": 60702 + }, + { + "icon_id": "7947753", + "name": "信息空心", + "font_class": "xinxikongxin", + "unicode": "ed1f", + "unicode_decimal": 60703 + }, + { + "icon_id": "7947754", + "name": "控件", + "font_class": "kongjian", + "unicode": "ed20", + "unicode_decimal": 60704 + }, + { + "icon_id": "7947755", + "name": "告警空心", + "font_class": "gaojingkongxin", + "unicode": "ed21", + "unicode_decimal": 60705 + }, + { + "icon_id": "7954334", + "name": "对勾_块", + "font_class": "duigou_kuai", + "unicode": "ed22", + "unicode_decimal": 60706 + }, + { + "icon_id": "7954390", + "name": "错叉_块", + "font_class": "cuocha_kuai", + "unicode": "ed23", + "unicode_decimal": 60707 + }, + { + "icon_id": "7956834", + "name": "加_色块", + "font_class": "jia_sekuai", + "unicode": "ed24", + "unicode_decimal": 60708 + }, + { + "icon_id": "7956835", + "name": "减_色块", + "font_class": "jian_sekuai", + "unicode": "ed25", + "unicode_decimal": 60709 + }, + { + "icon_id": "3868257", + "name": "调试", + "font_class": "tiaoshi", + "unicode": "eb61", + "unicode_decimal": 60257 + }, + { + "icon_id": "8481279", + "name": "分享方式", + "font_class": "fenxiangfangshi", + "unicode": "ed2e", + "unicode_decimal": 60718 + }, + { + "icon_id": "3868258", + "name": "场景管理", + "font_class": "changjingguanli", + "unicode": "eb62", + "unicode_decimal": 60258 + }, + { + "icon_id": "3868263", + "name": "编辑", + "font_class": "bianji", + "unicode": "eb63", + "unicode_decimal": 60259 + }, + { + "icon_id": "3868264", + "name": "关联设备", + "font_class": "guanlianshebei", + "unicode": "eb64", + "unicode_decimal": 60260 + }, + { + "icon_id": "3868265", + "name": "官方版本", + "font_class": "guanfangbanben", + "unicode": "eb65", + "unicode_decimal": 60261 + }, + { + "icon_id": "3868266", + "name": "功能定义", + "font_class": "gongnengdingyi", + "unicode": "eb66", + "unicode_decimal": 60262 + }, + { + "icon_id": "3868267", + "name": "基础管理", + "font_class": "jichuguanli", + "unicode": "eb67", + "unicode_decimal": 60263 + }, + { + "icon_id": "3868269", + "name": "技术服务", + "font_class": "jishufuwu", + "unicode": "eb68", + "unicode_decimal": 60264 + }, + { + "icon_id": "3868270", + "name": "合作伙伴密钥管理", + "font_class": "hezuohuobanmiyueguanli", + "unicode": "eb69", + "unicode_decimal": 60265 + }, + { + "icon_id": "3868271", + "name": "测试申请", + "font_class": "ceshishenqing", + "unicode": "eb6a", + "unicode_decimal": 60266 + }, + { + "icon_id": "3868272", + "name": "节点管理", + "font_class": "jiedianguanli", + "unicode": "eb6b", + "unicode_decimal": 60267 + }, + { + "icon_id": "3868273", + "name": "警告", + "font_class": "jinggao", + "unicode": "eb6c", + "unicode_decimal": 60268 + }, + { + "icon_id": "3868274", + "name": "配网引导", + "font_class": "peiwangyindao", + "unicode": "eb6d", + "unicode_decimal": 60269 + }, + { + "icon_id": "3868275", + "name": "人机交互", + "font_class": "renjijiaohu", + "unicode": "eb6e", + "unicode_decimal": 60270 + }, + { + "icon_id": "3868276", + "name": "使用文档", + "font_class": "shiyongwendang", + "unicode": "eb6f", + "unicode_decimal": 60271 + }, + { + "icon_id": "3868278", + "name": "权限审批", + "font_class": "quanxianshenpi", + "unicode": "eb70", + "unicode_decimal": 60272 + }, + { + "icon_id": "3868279", + "name": "已授权", + "font_class": "yishouquan", + "unicode": "eb71", + "unicode_decimal": 60273 + }, + { + "icon_id": "3868280", + "name": "提案审批", + "font_class": "tianshenpi", + "unicode": "eb72", + "unicode_decimal": 60274 + }, + { + "icon_id": "3868281", + "name": "数据看板", + "font_class": "shujukanban", + "unicode": "eb73", + "unicode_decimal": 60275 + }, + { + "icon_id": "3868282", + "name": "应用管理", + "font_class": "yingyongguanli", + "unicode": "eb74", + "unicode_decimal": 60276 + }, + { + "icon_id": "3868284", + "name": "仪表盘", + "font_class": "yibiaopan", + "unicode": "eb75", + "unicode_decimal": 60277 + }, + { + "icon_id": "3868287", + "name": "账号权限管理", + "font_class": "zhanghaoquanxianguanli", + "unicode": "eb76", + "unicode_decimal": 60278 + }, + { + "icon_id": "3868288", + "name": "园区运维", + "font_class": "yuanquyunwei", + "unicode": "eb77", + "unicode_decimal": 60279 + }, + { + "icon_id": "3886487", + "name": "基站管理", + "font_class": "jizhanguanli", + "unicode": "eb78", + "unicode_decimal": 60280 + }, + { + "icon_id": "4118038", + "name": "关闭", + "font_class": "guanbi", + "unicode": "eb79", + "unicode_decimal": 60281 + } + ] +} diff --git a/public/iconfont/common/iconfont.ttf b/public/iconfont/common/iconfont.ttf new file mode 100644 index 0000000..23d0127 Binary files /dev/null and b/public/iconfont/common/iconfont.ttf differ diff --git a/public/iconfont/common/iconfont.woff b/public/iconfont/common/iconfont.woff new file mode 100644 index 0000000..1ea14e7 Binary files /dev/null and b/public/iconfont/common/iconfont.woff differ diff --git a/public/iconfont/common/iconfont.woff2 b/public/iconfont/common/iconfont.woff2 new file mode 100644 index 0000000..38d473b Binary files /dev/null and b/public/iconfont/common/iconfont.woff2 differ diff --git a/public/iconfont/index.css b/public/iconfont/index.css new file mode 100644 index 0000000..c097181 --- /dev/null +++ b/public/iconfont/index.css @@ -0,0 +1,23 @@ + +[class^="icon-"]{ + font-family: "iconfont" !important; + /* 以下内容参照第三方图标库本身的规则 */ + font-size: 18px !important; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.el-menu-item [class^=icon-] { + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; + vertical-align: middle; +} +.el-submenu [class^=icon-] { + vertical-align: middle; + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; +} diff --git a/public/iconfont/saber/iconfont.css b/public/iconfont/saber/iconfont.css new file mode 100644 index 0000000..75a799a --- /dev/null +++ b/public/iconfont/saber/iconfont.css @@ -0,0 +1,345 @@ +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1611211499158'); /* IE9 */ + src: url('iconfont.eot?t=1611211499158#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), + url('iconfont.woff?t=1611211499158') format('woff'), + url('iconfont.ttf?t=1611211499158') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1611211499158#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icongitee2:before { + content: "\e6d6"; +} + +.icongithub:before { + content: "\e709"; +} + +.iconicon_wechat:before { + content: "\ebde"; +} + +.iconicon_exchange:before { + content: "\eba7"; +} + +.iconicon_ding:before { + content: "\eba8"; +} + +.iconicon_down:before { + content: "\eba9"; +} + +.iconicon_glass:before { + content: "\ebaa"; +} + +.iconicon_GPS:before { + content: "\ebab"; +} + +.iconicon_hardware_fill:before { + content: "\ebac"; +} + +.iconicon_im_more:before { + content: "\ebad"; +} + +.iconicon_group:before { + content: "\ebae"; +} + +.iconicon_horn:before { + content: "\ebaf"; +} + +.iconicon_im_face:before { + content: "\ebb0"; +} + +.iconicon_launch_page:before { + content: "\ebb1"; +} + +.iconicon_likegood:before { + content: "\ebb2"; +} + +.iconicon_index_line:before { + content: "\ebb3"; +} + +.iconicon_live:before { + content: "\ebb4"; +} + +.iconicon_link:before { + content: "\ebb5"; +} + +.iconicon_im_voice:before { + content: "\ebb6"; +} + +.iconicon_mobilephone:before { + content: "\ebb7"; +} + +.iconicon_dmail:before { + content: "\ebb8"; +} + +.iconicon_message:before { + content: "\ebb9"; +} + +.iconicon_more:before { + content: "\ebba"; +} + +.iconicon_left:before { + content: "\ebbb"; +} + +.iconicon_next_arrow:before { + content: "\ebbc"; +} + +.iconicon_notice:before { + content: "\ebbd"; +} + +.iconicon_namecard:before { + content: "\ebbe"; +} + +.iconicon_phone:before { + content: "\ebbf"; +} + +.iconicon_qq:before { + content: "\ebc0"; +} + +.iconicon_photo:before { + content: "\ebc1"; +} + +.iconicon_redpacket:before { + content: "\ebc2"; +} + +.iconicon_patriarch:before { + content: "\ebc3"; +} + +.iconicon_roundclose:before { + content: "\ebc4"; +} + +.iconicon_im_keyboard:before { + content: "\ebc5"; +} + +.iconicon_roundreduce:before { + content: "\ebc6"; +} + +.iconicon_QRcode:before { + content: "\ebc7"; +} + +.iconicon_savememo:before { + content: "\ebc8"; +} + +.iconicon_roundadd:before { + content: "\ebc9"; +} + +.iconicon_refresh:before { + content: "\ebca"; +} + +.iconicon_search:before { + content: "\ebcb"; +} + +.iconicon_scan:before { + content: "\ebcc"; +} + +.iconicon_send:before { + content: "\ebcd"; +} + +.iconicon_principal:before { + content: "\ebce"; +} + +.iconicon_scan_namecard:before { + content: "\ebcf"; +} + +.iconicon_secret:before { + content: "\ebd0"; +} + +.iconicon_share:before { + content: "\ebd1"; +} + +.iconicon_sms:before { + content: "\ebd2"; +} + +.iconicon_setting:before { + content: "\ebd3"; +} + +.iconicon_star:before { + content: "\ebd4"; +} + +.iconicon_subordinate:before { + content: "\ebd5"; +} + +.iconicon_task:before { + content: "\ebd6"; +} + +.iconicon_study:before { + content: "\ebd7"; +} + +.iconicon_work:before { + content: "\ebd8"; +} + +.iconicon_safety:before { + content: "\ebd9"; +} + +.iconicon_voipphone:before { + content: "\ebda"; +} + +.iconicon_shakehands:before { + content: "\ebdb"; +} + +.iconicon_task_done:before { + content: "\ebdc"; +} + +.iconicon_workfile_line:before { + content: "\ebdd"; +} + +.iconicon_add:before { + content: "\eb8f"; +} + +.iconicon_addmessage:before { + content: "\eb90"; +} + +.iconicon_addresslist:before { + content: "\eb91"; +} + +.iconicon_affiliations_li:before { + content: "\eb92"; +} + +.iconicon_addperson:before { + content: "\eb93"; +} + +.iconicon_boss:before { + content: "\eb94"; +} + +.iconicon_alipay_line:before { + content: "\eb95"; +} + +.iconicon_addressbook:before { + content: "\eb96"; +} + +.iconicon_at:before { + content: "\eb97"; +} + +.iconicon_airplay:before { + content: "\eb98"; +} + +.iconicon_calendar:before { + content: "\eb99"; +} + +.iconicon_attestation:before { + content: "\eb9a"; +} + +.iconicon_camera:before { + content: "\eb9b"; +} + +.iconicon_certificate_fil:before { + content: "\eb9c"; +} + +.iconicon_coinpurse_line:before { + content: "\eb9d"; +} + +.iconicon_compile:before { + content: "\eb9e"; +} + +.iconicon_details:before { + content: "\eb9f"; +} + +.iconicon_cloud_history:before { + content: "\eba0"; +} + +.iconicon_community_line:before { + content: "\eba1"; +} + +.iconicon_discovery:before { + content: "\eba2"; +} + +.iconicon_delete:before { + content: "\eba3"; +} + +.iconicon_dispose:before { + content: "\eba4"; +} + +.iconicon_doc:before { + content: "\eba5"; +} + +.iconicon_cspace:before { + content: "\eba6"; +} + diff --git a/public/iconfont/saber/iconfont.eot b/public/iconfont/saber/iconfont.eot new file mode 100644 index 0000000..e49550a Binary files /dev/null and b/public/iconfont/saber/iconfont.eot differ diff --git a/public/iconfont/saber/iconfont.js b/public/iconfont/saber/iconfont.js new file mode 100644 index 0000000..6ed8198 --- /dev/null +++ b/public/iconfont/saber/iconfont.js @@ -0,0 +1 @@ +!function(c){var o,h,s,l,i,a,m='',v=(v=document.getElementsByTagName("script"))[v.length-1].getAttribute("data-injectcss");if(v&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function t(){i||(i=!0,s())}o=function(){var c,o,h,s;(s=document.createElement("div")).innerHTML=m,m=null,(h=s.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",c=h,(o=document.body).firstChild?(s=c,(h=o.firstChild).parentNode.insertBefore(s,h)):o.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(o,0):(h=function(){document.removeEventListener("DOMContentLoaded",h,!1),o()},document.addEventListener("DOMContentLoaded",h,!1)):document.attachEvent&&(s=o,l=c.document,i=!1,(a=function(){try{l.documentElement.doScroll("left")}catch(c){return void setTimeout(a,50)}t()})(),l.onreadystatechange=function(){"complete"==l.readyState&&(l.onreadystatechange=null,t())})}(window); \ No newline at end of file diff --git a/public/iconfont/saber/iconfont.json b/public/iconfont/saber/iconfont.json new file mode 100644 index 0000000..39f6ffd --- /dev/null +++ b/public/iconfont/saber/iconfont.json @@ -0,0 +1,583 @@ +{ + "id": "1066523", + "name": "saber", + "font_family": "iconfont", + "css_prefix_text": "icon", + "description": "saber图标库", + "glyphs": [ + { + "icon_id": "7396772", + "name": "gitee", + "font_class": "gitee2", + "unicode": "e6d6", + "unicode_decimal": 59094 + }, + { + "icon_id": "431779", + "name": "github", + "font_class": "github", + "unicode": "e709", + "unicode_decimal": 59145 + }, + { + "icon_id": "7766806", + "name": "icon_wechat", + "font_class": "icon_wechat", + "unicode": "ebde", + "unicode_decimal": 60382 + }, + { + "icon_id": "7766735", + "name": "icon_exchange", + "font_class": "icon_exchange", + "unicode": "eba7", + "unicode_decimal": 60327 + }, + { + "icon_id": "7766736", + "name": "icon_ding", + "font_class": "icon_ding", + "unicode": "eba8", + "unicode_decimal": 60328 + }, + { + "icon_id": "7766737", + "name": "icon_down", + "font_class": "icon_down", + "unicode": "eba9", + "unicode_decimal": 60329 + }, + { + "icon_id": "7766740", + "name": "icon_glass", + "font_class": "icon_glass", + "unicode": "ebaa", + "unicode_decimal": 60330 + }, + { + "icon_id": "7766742", + "name": "icon_GPS", + "font_class": "icon_GPS", + "unicode": "ebab", + "unicode_decimal": 60331 + }, + { + "icon_id": "7766743", + "name": "icon_hardware_fill", + "font_class": "icon_hardware_fill", + "unicode": "ebac", + "unicode_decimal": 60332 + }, + { + "icon_id": "7766745", + "name": "icon_im_more", + "font_class": "icon_im_more", + "unicode": "ebad", + "unicode_decimal": 60333 + }, + { + "icon_id": "7766747", + "name": "icon_group", + "font_class": "icon_group", + "unicode": "ebae", + "unicode_decimal": 60334 + }, + { + "icon_id": "7766748", + "name": "icon_horn", + "font_class": "icon_horn", + "unicode": "ebaf", + "unicode_decimal": 60335 + }, + { + "icon_id": "7766749", + "name": "icon_im_face", + "font_class": "icon_im_face", + "unicode": "ebb0", + "unicode_decimal": 60336 + }, + { + "icon_id": "7766752", + "name": "icon_launch_page", + "font_class": "icon_launch_page", + "unicode": "ebb1", + "unicode_decimal": 60337 + }, + { + "icon_id": "7766753", + "name": "icon_likegood", + "font_class": "icon_likegood", + "unicode": "ebb2", + "unicode_decimal": 60338 + }, + { + "icon_id": "7766754", + "name": "icon_index_line", + "font_class": "icon_index_line", + "unicode": "ebb3", + "unicode_decimal": 60339 + }, + { + "icon_id": "7766755", + "name": "icon_live", + "font_class": "icon_live", + "unicode": "ebb4", + "unicode_decimal": 60340 + }, + { + "icon_id": "7766756", + "name": "icon_link", + "font_class": "icon_link", + "unicode": "ebb5", + "unicode_decimal": 60341 + }, + { + "icon_id": "7766757", + "name": "icon_im_voice", + "font_class": "icon_im_voice", + "unicode": "ebb6", + "unicode_decimal": 60342 + }, + { + "icon_id": "7766758", + "name": "icon_mobilephone", + "font_class": "icon_mobilephone", + "unicode": "ebb7", + "unicode_decimal": 60343 + }, + { + "icon_id": "7766759", + "name": "icon_dmail", + "font_class": "icon_dmail", + "unicode": "ebb8", + "unicode_decimal": 60344 + }, + { + "icon_id": "7766760", + "name": "icon_message", + "font_class": "icon_message", + "unicode": "ebb9", + "unicode_decimal": 60345 + }, + { + "icon_id": "7766763", + "name": "icon_more", + "font_class": "icon_more", + "unicode": "ebba", + "unicode_decimal": 60346 + }, + { + "icon_id": "7766764", + "name": "icon_left", + "font_class": "icon_left", + "unicode": "ebbb", + "unicode_decimal": 60347 + }, + { + "icon_id": "7766765", + "name": "icon_next_arrow", + "font_class": "icon_next_arrow", + "unicode": "ebbc", + "unicode_decimal": 60348 + }, + { + "icon_id": "7766766", + "name": "icon_notice", + "font_class": "icon_notice", + "unicode": "ebbd", + "unicode_decimal": 60349 + }, + { + "icon_id": "7766769", + "name": "icon_namecard", + "font_class": "icon_namecard", + "unicode": "ebbe", + "unicode_decimal": 60350 + }, + { + "icon_id": "7766770", + "name": "icon_phone", + "font_class": "icon_phone", + "unicode": "ebbf", + "unicode_decimal": 60351 + }, + { + "icon_id": "7766771", + "name": "icon_qq", + "font_class": "icon_qq", + "unicode": "ebc0", + "unicode_decimal": 60352 + }, + { + "icon_id": "7766772", + "name": "icon_photo", + "font_class": "icon_photo", + "unicode": "ebc1", + "unicode_decimal": 60353 + }, + { + "icon_id": "7766774", + "name": "icon_redpacket", + "font_class": "icon_redpacket", + "unicode": "ebc2", + "unicode_decimal": 60354 + }, + { + "icon_id": "7766775", + "name": "icon_patriarch", + "font_class": "icon_patriarch", + "unicode": "ebc3", + "unicode_decimal": 60355 + }, + { + "icon_id": "7766776", + "name": "icon_roundclose", + "font_class": "icon_roundclose", + "unicode": "ebc4", + "unicode_decimal": 60356 + }, + { + "icon_id": "7766777", + "name": "icon_im_keyboard", + "font_class": "icon_im_keyboard", + "unicode": "ebc5", + "unicode_decimal": 60357 + }, + { + "icon_id": "7766778", + "name": "icon_roundreduce", + "font_class": "icon_roundreduce", + "unicode": "ebc6", + "unicode_decimal": 60358 + }, + { + "icon_id": "7766780", + "name": "icon_QRcode", + "font_class": "icon_QRcode", + "unicode": "ebc7", + "unicode_decimal": 60359 + }, + { + "icon_id": "7766781", + "name": "icon_savememo", + "font_class": "icon_savememo", + "unicode": "ebc8", + "unicode_decimal": 60360 + }, + { + "icon_id": "7766782", + "name": "icon_roundadd", + "font_class": "icon_roundadd", + "unicode": "ebc9", + "unicode_decimal": 60361 + }, + { + "icon_id": "7766783", + "name": "icon_refresh", + "font_class": "icon_refresh", + "unicode": "ebca", + "unicode_decimal": 60362 + }, + { + "icon_id": "7766784", + "name": "icon_search", + "font_class": "icon_search", + "unicode": "ebcb", + "unicode_decimal": 60363 + }, + { + "icon_id": "7766785", + "name": "icon_scan", + "font_class": "icon_scan", + "unicode": "ebcc", + "unicode_decimal": 60364 + }, + { + "icon_id": "7766786", + "name": "icon_send", + "font_class": "icon_send", + "unicode": "ebcd", + "unicode_decimal": 60365 + }, + { + "icon_id": "7766787", + "name": "icon_principal", + "font_class": "icon_principal", + "unicode": "ebce", + "unicode_decimal": 60366 + }, + { + "icon_id": "7766789", + "name": "icon_scan_namecard", + "font_class": "icon_scan_namecard", + "unicode": "ebcf", + "unicode_decimal": 60367 + }, + { + "icon_id": "7766790", + "name": "icon_secret", + "font_class": "icon_secret", + "unicode": "ebd0", + "unicode_decimal": 60368 + }, + { + "icon_id": "7766791", + "name": "icon_share", + "font_class": "icon_share", + "unicode": "ebd1", + "unicode_decimal": 60369 + }, + { + "icon_id": "7766793", + "name": "icon_sms", + "font_class": "icon_sms", + "unicode": "ebd2", + "unicode_decimal": 60370 + }, + { + "icon_id": "7766795", + "name": "icon_setting", + "font_class": "icon_setting", + "unicode": "ebd3", + "unicode_decimal": 60371 + }, + { + "icon_id": "7766798", + "name": "icon_star", + "font_class": "icon_star", + "unicode": "ebd4", + "unicode_decimal": 60372 + }, + { + "icon_id": "7766799", + "name": "icon_subordinate", + "font_class": "icon_subordinate", + "unicode": "ebd5", + "unicode_decimal": 60373 + }, + { + "icon_id": "7766800", + "name": "icon_task", + "font_class": "icon_task", + "unicode": "ebd6", + "unicode_decimal": 60374 + }, + { + "icon_id": "7766803", + "name": "icon_study", + "font_class": "icon_study", + "unicode": "ebd7", + "unicode_decimal": 60375 + }, + { + "icon_id": "7766808", + "name": "icon_work", + "font_class": "icon_work", + "unicode": "ebd8", + "unicode_decimal": 60376 + }, + { + "icon_id": "7766811", + "name": "icon_safety", + "font_class": "icon_safety", + "unicode": "ebd9", + "unicode_decimal": 60377 + }, + { + "icon_id": "7766813", + "name": "icon_voipphone", + "font_class": "icon_voipphone", + "unicode": "ebda", + "unicode_decimal": 60378 + }, + { + "icon_id": "7766815", + "name": "icon_shakehands", + "font_class": "icon_shakehands", + "unicode": "ebdb", + "unicode_decimal": 60379 + }, + { + "icon_id": "7766817", + "name": "icon_task_done", + "font_class": "icon_task_done", + "unicode": "ebdc", + "unicode_decimal": 60380 + }, + { + "icon_id": "7766820", + "name": "icon_workfile_line", + "font_class": "icon_workfile_line", + "unicode": "ebdd", + "unicode_decimal": 60381 + }, + { + "icon_id": "7766709", + "name": "icon_add", + "font_class": "icon_add", + "unicode": "eb8f", + "unicode_decimal": 60303 + }, + { + "icon_id": "7766710", + "name": "icon_addmessage", + "font_class": "icon_addmessage", + "unicode": "eb90", + "unicode_decimal": 60304 + }, + { + "icon_id": "7766711", + "name": "icon_addresslist", + "font_class": "icon_addresslist", + "unicode": "eb91", + "unicode_decimal": 60305 + }, + { + "icon_id": "7766712", + "name": "icon_affiliations_li", + "font_class": "icon_affiliations_li", + "unicode": "eb92", + "unicode_decimal": 60306 + }, + { + "icon_id": "7766713", + "name": "icon_addperson", + "font_class": "icon_addperson", + "unicode": "eb93", + "unicode_decimal": 60307 + }, + { + "icon_id": "7766714", + "name": "icon_boss", + "font_class": "icon_boss", + "unicode": "eb94", + "unicode_decimal": 60308 + }, + { + "icon_id": "7766715", + "name": "icon_alipay_line", + "font_class": "icon_alipay_line", + "unicode": "eb95", + "unicode_decimal": 60309 + }, + { + "icon_id": "7766716", + "name": "icon_addressbook", + "font_class": "icon_addressbook", + "unicode": "eb96", + "unicode_decimal": 60310 + }, + { + "icon_id": "7766717", + "name": "icon_at", + "font_class": "icon_at", + "unicode": "eb97", + "unicode_decimal": 60311 + }, + { + "icon_id": "7766718", + "name": "icon_airplay", + "font_class": "icon_airplay", + "unicode": "eb98", + "unicode_decimal": 60312 + }, + { + "icon_id": "7766719", + "name": "icon_calendar", + "font_class": "icon_calendar", + "unicode": "eb99", + "unicode_decimal": 60313 + }, + { + "icon_id": "7766720", + "name": "icon_attestation", + "font_class": "icon_attestation", + "unicode": "eb9a", + "unicode_decimal": 60314 + }, + { + "icon_id": "7766721", + "name": "icon_camera", + "font_class": "icon_camera", + "unicode": "eb9b", + "unicode_decimal": 60315 + }, + { + "icon_id": "7766722", + "name": "icon_certificate_fil", + "font_class": "icon_certificate_fil", + "unicode": "eb9c", + "unicode_decimal": 60316 + }, + { + "icon_id": "7766723", + "name": "icon_coinpurse_line", + "font_class": "icon_coinpurse_line", + "unicode": "eb9d", + "unicode_decimal": 60317 + }, + { + "icon_id": "7766725", + "name": "icon_compile", + "font_class": "icon_compile", + "unicode": "eb9e", + "unicode_decimal": 60318 + }, + { + "icon_id": "7766726", + "name": "icon_details", + "font_class": "icon_details", + "unicode": "eb9f", + "unicode_decimal": 60319 + }, + { + "icon_id": "7766728", + "name": "icon_cloud_history", + "font_class": "icon_cloud_history", + "unicode": "eba0", + "unicode_decimal": 60320 + }, + { + "icon_id": "7766729", + "name": "icon_community_line", + "font_class": "icon_community_line", + "unicode": "eba1", + "unicode_decimal": 60321 + }, + { + "icon_id": "7766730", + "name": "icon_discovery", + "font_class": "icon_discovery", + "unicode": "eba2", + "unicode_decimal": 60322 + }, + { + "icon_id": "7766731", + "name": "icon_delete", + "font_class": "icon_delete", + "unicode": "eba3", + "unicode_decimal": 60323 + }, + { + "icon_id": "7766732", + "name": "icon_dispose", + "font_class": "icon_dispose", + "unicode": "eba4", + "unicode_decimal": 60324 + }, + { + "icon_id": "7766733", + "name": "icon_doc", + "font_class": "icon_doc", + "unicode": "eba5", + "unicode_decimal": 60325 + }, + { + "icon_id": "7766734", + "name": "icon_cspace", + "font_class": "icon_cspace", + "unicode": "eba6", + "unicode_decimal": 60326 + } + ] +} diff --git a/public/iconfont/saber/iconfont.svg b/public/iconfont/saber/iconfont.svg new file mode 100644 index 0000000..f96dc36 --- /dev/null +++ b/public/iconfont/saber/iconfont.svg @@ -0,0 +1,272 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/iconfont/saber/iconfont.ttf b/public/iconfont/saber/iconfont.ttf new file mode 100644 index 0000000..4a0beab Binary files /dev/null and b/public/iconfont/saber/iconfont.ttf differ diff --git a/public/iconfont/saber/iconfont.woff b/public/iconfont/saber/iconfont.woff new file mode 100644 index 0000000..3119113 Binary files /dev/null and b/public/iconfont/saber/iconfont.woff differ diff --git a/public/iconfont/saber/iconfont.woff2 b/public/iconfont/saber/iconfont.woff2 new file mode 100644 index 0000000..a391ec4 Binary files /dev/null and b/public/iconfont/saber/iconfont.woff2 differ diff --git a/public/img/403.svg b/public/img/403.svg new file mode 100644 index 0000000..610f136 --- /dev/null +++ b/public/img/403.svg @@ -0,0 +1,508 @@ + + + + Group 9 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/404.svg b/public/img/404.svg new file mode 100644 index 0000000..5531d05 --- /dev/null +++ b/public/img/404.svg @@ -0,0 +1,314 @@ + + + + Group 4 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/500.svg b/public/img/500.svg new file mode 100644 index 0000000..de723b1 --- /dev/null +++ b/public/img/500.svg @@ -0,0 +1,208 @@ + + + + Group 4 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/bg.jpg b/public/img/bg.jpg new file mode 100644 index 0000000..18a3394 Binary files /dev/null and b/public/img/bg.jpg differ diff --git a/public/img/bg/403.svg b/public/img/bg/403.svg new file mode 100644 index 0000000..610f136 --- /dev/null +++ b/public/img/bg/403.svg @@ -0,0 +1,508 @@ + + + + Group 9 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/bg/404.svg b/public/img/bg/404.svg new file mode 100644 index 0000000..5531d05 --- /dev/null +++ b/public/img/bg/404.svg @@ -0,0 +1,314 @@ + + + + Group 4 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/bg/500.svg b/public/img/bg/500.svg new file mode 100644 index 0000000..de723b1 --- /dev/null +++ b/public/img/bg/500.svg @@ -0,0 +1,208 @@ + + + + Group 4 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/bg/bg.jpg b/public/img/bg/bg.jpg new file mode 100644 index 0000000..7f08086 Binary files /dev/null and b/public/img/bg/bg.jpg differ diff --git a/public/img/bg/bg1.jpg b/public/img/bg/bg1.jpg new file mode 100644 index 0000000..c13e5c9 Binary files /dev/null and b/public/img/bg/bg1.jpg differ diff --git a/public/img/bg/bg2.jpg b/public/img/bg/bg2.jpg new file mode 100644 index 0000000..a16b980 Binary files /dev/null and b/public/img/bg/bg2.jpg differ diff --git a/public/img/bg/bg3.jpg b/public/img/bg/bg3.jpg new file mode 100644 index 0000000..b72458d Binary files /dev/null and b/public/img/bg/bg3.jpg differ diff --git a/public/img/bg/bg4.jpg b/public/img/bg/bg4.jpg new file mode 100644 index 0000000..5b5248a Binary files /dev/null and b/public/img/bg/bg4.jpg differ diff --git a/public/img/bg/cloud.jpg b/public/img/bg/cloud.jpg new file mode 100644 index 0000000..151a000 Binary files /dev/null and b/public/img/bg/cloud.jpg differ diff --git a/public/img/bg/img-logo.png b/public/img/bg/img-logo.png new file mode 100644 index 0000000..a4bf80c Binary files /dev/null and b/public/img/bg/img-logo.png differ diff --git a/public/img/bg/login.png b/public/img/bg/login.png new file mode 100644 index 0000000..eb92779 Binary files /dev/null and b/public/img/bg/login.png differ diff --git a/public/img/bg/logo.png b/public/img/bg/logo.png new file mode 100644 index 0000000..b3e40cc Binary files /dev/null and b/public/img/bg/logo.png differ diff --git a/public/img/bg/star-squashed.jpg b/public/img/bg/star-squashed.jpg new file mode 100644 index 0000000..2176e39 Binary files /dev/null and b/public/img/bg/star-squashed.jpg differ diff --git a/public/img/bg/vip1.png b/public/img/bg/vip1.png new file mode 100644 index 0000000..babbf10 Binary files /dev/null and b/public/img/bg/vip1.png differ diff --git a/public/img/bg/vip2.png b/public/img/bg/vip2.png new file mode 100644 index 0000000..3071122 Binary files /dev/null and b/public/img/bg/vip2.png differ diff --git a/public/img/bg/vip3.png b/public/img/bg/vip3.png new file mode 100644 index 0000000..256f837 Binary files /dev/null and b/public/img/bg/vip3.png differ diff --git a/public/img/bg/vip4.png b/public/img/bg/vip4.png new file mode 100644 index 0000000..3ece581 Binary files /dev/null and b/public/img/bg/vip4.png differ diff --git a/public/img/bg1.jpg b/public/img/bg1.jpg new file mode 100644 index 0000000..c13e5c9 Binary files /dev/null and b/public/img/bg1.jpg differ diff --git a/public/img/bg2.jpg b/public/img/bg2.jpg new file mode 100644 index 0000000..a16b980 Binary files /dev/null and b/public/img/bg2.jpg differ diff --git a/public/img/bg3.jpg b/public/img/bg3.jpg new file mode 100644 index 0000000..b72458d Binary files /dev/null and b/public/img/bg3.jpg differ diff --git a/public/img/bg4.jpg b/public/img/bg4.jpg new file mode 100644 index 0000000..5b5248a Binary files /dev/null and b/public/img/bg4.jpg differ diff --git a/public/img/login-bg.svg b/public/img/login-bg.svg new file mode 100644 index 0000000..a637a49 --- /dev/null +++ b/public/img/login-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logo.png b/public/img/logo.png new file mode 100644 index 0000000..305c622 Binary files /dev/null and b/public/img/logo.png differ diff --git a/public/img/star-squashed.jpg b/public/img/star-squashed.jpg new file mode 100644 index 0000000..2176e39 Binary files /dev/null and b/public/img/star-squashed.jpg differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..65adfd5 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/src/api/base/region.js b/src/api/base/region.js new file mode 100644 index 0000000..01bcd16 --- /dev/null +++ b/src/api/base/region.js @@ -0,0 +1,52 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/region/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getLazyTree = (parentCode, params) => { + return request({ + url: '/blade-system/region/lazy-tree', + method: 'get', + params: { + ...params, + parentCode, + }, + }); +}; + +export const getDetail = code => { + return request({ + url: '/blade-system/region/detail', + method: 'get', + params: { + code, + }, + }); +}; + +export const remove = id => { + return request({ + url: '/blade-system/region/remove', + method: 'post', + params: { + id, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-system/region/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/common.js b/src/api/common.js new file mode 100644 index 0000000..4851b67 --- /dev/null +++ b/src/api/common.js @@ -0,0 +1,15 @@ +import request from '@/axios'; + +/** + * 文件流返回 + * @param url 接口地址 + * @param params 接口参数 + */ +export const exportBlob = (url, params) => { + return request({ + url: url, + params: params, + method: 'get', + responseType: 'blob', + }); +}; diff --git a/src/api/data/record.js b/src/api/data/record.js new file mode 100644 index 0000000..951b440 --- /dev/null +++ b/src/api/data/record.js @@ -0,0 +1,63 @@ +import request from '@/axios'; + +// 获取数据审计表列表 +export const getRecordList = (current, size, params = {}) => { + return request({ + url: '/blade-system/record-data/list', + method: 'get', + params: { + current, + size, + ...params, + }, + }); +}; + +// 获取数据审计表详情 +export const getRecordDetail = id => { + return request({ + url: '/blade-system/record-data/detail', + method: 'get', + params: { + id, + }, + }); +}; + +// 新增数据审计表记录 +export const addRecord = data => { + return request({ + url: '/blade-system/record-data/save', + method: 'post', + data, + }); +}; + +// 修改数据审计表记录 +export const updateRecord = data => { + return request({ + url: '/blade-system/record-data/update', + method: 'post', + data, + }); +}; + +// 新增或修改数据审计表记录 +export const submitRecord = data => { + return request({ + url: '/blade-system/record-data/submit', + method: 'post', + data, + }); +}; + +// 删除数据审计表记录 +export const removeRecord = ids => { + return request({ + url: '/blade-system/record-data/remove', + method: 'post', + params: { + ids, + }, + }); +}; \ No newline at end of file diff --git a/src/api/desk/notice.js b/src/api/desk/notice.js new file mode 100644 index 0000000..708da65 --- /dev/null +++ b/src/api/desk/notice.js @@ -0,0 +1,59 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-desk/notice/list', + method: 'get', + params: { + ...params, + current, + size, + }, + cryptoToken: false, + cryptoData: false, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-desk/notice/remove', + method: 'post', + params: { + ids, + }, + cryptoToken: false, + cryptoData: false, + }); +}; + +export const add = row => { + return request({ + url: '/blade-desk/notice/submit', + method: 'post', + data: row, + cryptoToken: false, + cryptoData: false, + }); +}; + +export const update = row => { + return request({ + url: '/blade-desk/notice/submit', + method: 'post', + data: row, + cryptoToken: false, + cryptoData: false, + }); +}; + +export const getNotice = id => { + return request({ + url: '/blade-desk/notice/detail', + method: 'get', + params: { + id, + }, + cryptoToken: false, + cryptoData: false, + }); +}; diff --git a/src/api/flow/flow.js b/src/api/flow/flow.js new file mode 100644 index 0000000..24f8fd1 --- /dev/null +++ b/src/api/flow/flow.js @@ -0,0 +1,122 @@ +import request from '@/axios'; + +export const modelList = (current, size, params) => { + return request({ + url: '/blade-flow/model/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const managerList = (current, size, params) => { + return request({ + url: '/blade-flow/manager/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const followList = (current, size, params) => { + return request({ + url: '/blade-flow/follow/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const removeModel = ids => { + return request({ + url: '/blade-flow/model/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const deployModel = params => { + return request({ + url: '/blade-flow/model/deploy', + method: 'post', + params, + }); +}; + +export const changeState = params => { + return request({ + url: '/blade-flow/manager/change-state', + method: 'post', + params, + }); +}; + +export const deployUpload = (category, tenantIds, files) => { + const formData = new FormData(); + formData.append('category', category); + formData.append('tenantIds', tenantIds); + files.forEach(file => { + formData.append('files', file); + }); + return request({ + headers: { + 'Content-Type': 'multipart/form-data', + }, + url: '/blade-flow/manager/deploy-upload', + method: 'post', + data: formData, + }); +}; + +export const deleteDeployment = deploymentIds => { + return request({ + url: '/blade-flow/manager/delete-deployment', + method: 'post', + params: { + deploymentIds, + }, + }); +}; + +export const deleteProcessInstance = params => { + return request({ + url: '/blade-flow/follow/delete-process-instance', + method: 'post', + params, + }); +}; + +export const submitModel = data => { + return request({ + url: '/blade-flow/model/submit', + method: 'post', + data, + }); +}; + +export const detail = params => { + return request({ + url: '/blade-flow/model/detail', + method: 'get', + params, + }); +}; + +export const modelView = params => { + return request({ + url: '/blade-flow/process/model-view', + method: 'get', + params, + }); +}; diff --git a/src/api/job/jobinfo.js b/src/api/job/jobinfo.js new file mode 100644 index 0000000..bf6baf8 --- /dev/null +++ b/src/api/job/jobinfo.js @@ -0,0 +1,78 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-job/job-info/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-job/job-info/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-job/job-info/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-job/job-info/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-job/job-info/submit', + method: 'post', + data: row, + }); +}; + +export const change = row => { + return request({ + url: '/blade-job/job-info/change', + method: 'post', + params: { + id: row.id, + enable: row.enable, + }, + }); +}; + +export const run = row => { + return request({ + url: '/blade-job/job-info/run', + method: 'post', + params: { + id: row.id, + }, + }); +}; + +export const sync = row => { + return request({ + url: '/blade-job/job-info/sync', + method: 'post', + data: row, + }); +}; diff --git a/src/api/job/jobserver.js b/src/api/job/jobserver.js new file mode 100644 index 0000000..8ac8d9f --- /dev/null +++ b/src/api/job/jobserver.js @@ -0,0 +1,57 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-job/job-server/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-job/job-server/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-job/job-server/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-job/job-server/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-job/job-server/submit', + method: 'post', + data: row, + }); +}; + +export const sync = row => { + return request({ + url: '/blade-job/job-server/sync', + method: 'post', + data: row, + }); +}; diff --git a/src/api/logs.js b/src/api/logs.js new file mode 100644 index 0000000..9368365 --- /dev/null +++ b/src/api/logs.js @@ -0,0 +1,62 @@ +import request from '@/axios'; + +export const getUsualList = (current, size) => { + return request({ + url: '/blade-log/usual/list', + method: 'get', + params: { + current, + size, + }, + }); +}; + +export const getApiList = (current, size) => { + return request({ + url: '/blade-log/api/list', + method: 'get', + params: { + current, + size, + }, + }); +}; + +export const getErrorList = (current, size) => { + return request({ + url: '/blade-log/error/list', + method: 'get', + params: { + current, + size, + }, + }); +}; + +export const getUsualLogs = id => { + return request({ + url: '/blade-log/usual/detail', + method: 'get', + params: { + id, + }, + }); +}; +export const getApiLogs = id => { + return request({ + url: '/blade-log/api/detail', + method: 'get', + params: { + id, + }, + }); +}; +export const getErrorLogs = id => { + return request({ + url: '/blade-log/error/detail', + method: 'get', + params: { + id, + }, + }); +}; diff --git a/src/api/report/report.js b/src/api/report/report.js new file mode 100644 index 0000000..3ea1ced --- /dev/null +++ b/src/api/report/report.js @@ -0,0 +1,22 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-report/report/rest/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; +export const remove = ids => { + return request({ + url: '/blade-report/report/rest/remove', + method: 'post', + params: { + ids, + }, + }); +}; diff --git a/src/api/resource/attach.js b/src/api/resource/attach.js new file mode 100644 index 0000000..a5954bf --- /dev/null +++ b/src/api/resource/attach.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-resource/attach/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-resource/attach/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-resource/attach/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-resource/attach/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-resource/attach/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/resource/oss.js b/src/api/resource/oss.js new file mode 100644 index 0000000..c126296 --- /dev/null +++ b/src/api/resource/oss.js @@ -0,0 +1,59 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-resource/oss/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-resource/oss/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-resource/oss/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-resource/oss/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-resource/oss/submit', + method: 'post', + data: row, + }); +}; + +export const enable = id => { + return request({ + url: '/blade-resource/oss/enable', + method: 'post', + params: { + id, + }, + }); +}; diff --git a/src/api/resource/sms.js b/src/api/resource/sms.js new file mode 100644 index 0000000..2433398 --- /dev/null +++ b/src/api/resource/sms.js @@ -0,0 +1,71 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-resource/sms/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-resource/sms/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-resource/sms/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-resource/sms/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-resource/sms/submit', + method: 'post', + data: row, + }); +}; + +export const enable = id => { + return request({ + url: '/blade-resource/sms/enable', + method: 'post', + params: { + id, + }, + }); +}; + +export const send = (code, phones, params) => { + return request({ + url: '/blade-resource/sms/endpoint/send-message', + method: 'post', + params: { + code, + phones, + params, + }, + }); +}; diff --git a/src/api/system/apikey.js b/src/api/system/apikey.js new file mode 100644 index 0000000..31032ea --- /dev/null +++ b/src/api/system/apikey.js @@ -0,0 +1,77 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/api-key/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/api-key/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/api-key/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/api-key/save', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/api-key/update', + method: 'post', + data: row, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-system/api-key/submit', + method: 'post', + data: row, + }); +}; + +export const enable = ids => { + return request({ + url: '/blade-system/api-key/enable', + method: 'post', + params: { + ids, + }, + }); +}; + +export const disable = ids => { + return request({ + url: '/blade-system/api-key/disable', + method: 'post', + params: { + ids, + }, + }); +}; diff --git a/src/api/system/apikeylog.js b/src/api/system/apikeylog.js new file mode 100644 index 0000000..7a33125 --- /dev/null +++ b/src/api/system/apikeylog.js @@ -0,0 +1,23 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/api-key-log/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/api-key-log/detail', + method: 'get', + params: { + id, + }, + }); +}; diff --git a/src/api/system/authlock.js b/src/api/system/authlock.js new file mode 100644 index 0000000..ccf5c13 --- /dev/null +++ b/src/api/system/authlock.js @@ -0,0 +1,45 @@ +import request from '@/axios'; + +export const getAuthLockPage = (current, size, params) => { + return request({ + url: '/blade-system/auth-lock/page', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getAuthLockDetail = id => { + return request({ + url: '/blade-system/auth-lock/detail', + method: 'get', + params: { id }, + }); +}; + +export const authLockUnlock = (id, unlockReason) => { + return request({ + url: '/blade-system/auth-lock/unlock', + method: 'post', + params: { + id, + unlockReason, + }, + }); +}; + +export const lockUser = (userId, lockReason, lockBeginTime, lockEndTime) => { + return request({ + url: '/blade-system/auth-lock/lock', + method: 'post', + params: { + userId, + lockReason, + lockBeginTime, + lockEndTime, + }, + }); +}; diff --git a/src/api/system/authlog.js b/src/api/system/authlog.js new file mode 100644 index 0000000..a093c66 --- /dev/null +++ b/src/api/system/authlog.js @@ -0,0 +1,21 @@ +import request from '@/axios'; + +export const getAuthLogPage = (current, size, params) => { + return request({ + url: '/blade-system/auth-log/page', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getAuthLogDetail = id => { + return request({ + url: '/blade-system/auth-log/detail', + method: 'get', + params: { id }, + }); +}; diff --git a/src/api/system/client.js b/src/api/system/client.js new file mode 100644 index 0000000..0912288 --- /dev/null +++ b/src/api/system/client.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/client/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/client/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/client/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/client/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/client/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/system/dept.js b/src/api/system/dept.js new file mode 100644 index 0000000..ba96954 --- /dev/null +++ b/src/api/system/dept.js @@ -0,0 +1,80 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/dept/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getLazyList = (parentId, params) => { + return request({ + url: '/blade-system/dept/lazy-list', + method: 'get', + params: { + ...params, + parentId, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/dept/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/dept/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/dept/submit', + method: 'post', + data: row, + }); +}; + +export const getDept = id => { + return request({ + url: '/blade-system/dept/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const getDeptTree = tenantId => { + return request({ + url: '/blade-system/dept/tree', + method: 'get', + params: { + tenantId, + }, + }); +}; + +export const getDeptLazyTree = parentId => { + return request({ + url: '/blade-system/dept/lazy-tree', + method: 'get', + params: { + parentId, + }, + }); +}; diff --git a/src/api/system/dict.js b/src/api/system/dict.js new file mode 100644 index 0000000..51daacc --- /dev/null +++ b/src/api/system/dict.js @@ -0,0 +1,88 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/dict/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getParentList = (current, size, params) => { + return request({ + url: '/blade-system/dict/parent-list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getChildList = (current, size, parentId, params) => { + return request({ + url: '/blade-system/dict/child-list', + method: 'get', + params: { + ...params, + current, + size, + parentId: parentId, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/dict/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/dict/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/dict/submit', + method: 'post', + data: row, + }); +}; + +export const getDict = id => { + return request({ + url: '/blade-system/dict/detail', + method: 'get', + params: { + id, + }, + }); +}; +export const getDictTree = () => { + return request({ + url: '/blade-system/dict/tree?code=DICT', + method: 'get', + }); +}; + +export const getDictionary = params => { + return request({ + url: '/blade-system/dict/dictionary', + method: 'get', + params, + }); +}; diff --git a/src/api/system/dictbiz.js b/src/api/system/dictbiz.js new file mode 100644 index 0000000..6c7ee7e --- /dev/null +++ b/src/api/system/dictbiz.js @@ -0,0 +1,88 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/dict-biz/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getParentList = (current, size, params) => { + return request({ + url: '/blade-system/dict-biz/parent-list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getChildList = (current, size, parentId, params) => { + return request({ + url: '/blade-system/dict-biz/child-list', + method: 'get', + params: { + ...params, + current, + size, + parentId: parentId, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/dict-biz/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/dict-biz/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/dict-biz/submit', + method: 'post', + data: row, + }); +}; + +export const getDict = id => { + return request({ + url: '/blade-system/dict-biz/detail', + method: 'get', + params: { + id, + }, + }); +}; +export const getDictTree = () => { + return request({ + url: '/blade-system/dict-biz/tree?code=DICT', + method: 'get', + }); +}; + +export const getDictionary = params => { + return request({ + url: '/blade-system/dict-biz/dictionary', + method: 'get', + params, + }); +}; diff --git a/src/api/system/menu.js b/src/api/system/menu.js new file mode 100644 index 0000000..0a15044 --- /dev/null +++ b/src/api/system/menu.js @@ -0,0 +1,114 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/menu/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getLazyList = (parentId, params) => { + return request({ + url: '/blade-system/menu/lazy-list', + method: 'get', + params: { + ...params, + parentId, + }, + }); +}; + +export const getLazyMenuList = (parentId, params) => { + return request({ + url: '/blade-system/menu/lazy-menu-list', + method: 'get', + params: { + ...params, + parentId, + }, + }); +}; + +export const getMenuList = (current, size, params) => { + return request({ + url: '/blade-system/menu/menu-list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getMenuTree = tenantId => { + return request({ + url: '/blade-system/menu/tree', + method: 'get', + params: { + tenantId, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/menu/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/menu/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/menu/submit', + method: 'post', + data: row, + }); +}; + +export const getMenu = id => { + return request({ + url: '/blade-system/menu/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const getTopMenu = () => + request({ + url: '/blade-system/menu/top-menu', + method: 'get', + }); + +export const getRoutes = topMenuId => + request({ + url: '/blade-system/menu/routes', + method: 'get', + params: { + topMenuId, + }, + }); + +export const getMainMenu = () => + request({ + url: '/blade-system/menu/main-menu', + method: 'get', + }); diff --git a/src/api/system/param.js b/src/api/system/param.js new file mode 100644 index 0000000..be23977 --- /dev/null +++ b/src/api/system/param.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/param/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/param/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/param/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/param/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/param/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/system/post.js b/src/api/system/post.js new file mode 100644 index 0000000..01de371 --- /dev/null +++ b/src/api/system/post.js @@ -0,0 +1,59 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/post/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getPostList = tenantId => { + return request({ + url: '/blade-system/post/select', + method: 'get', + params: { + tenantId, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/post/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/post/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/post/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/post/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/system/ratelimit.js b/src/api/system/ratelimit.js new file mode 100644 index 0000000..3a1d3f7 --- /dev/null +++ b/src/api/system/ratelimit.js @@ -0,0 +1,77 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/rate-limit/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/rate-limit/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/rate-limit/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/rate-limit/save', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/rate-limit/update', + method: 'post', + data: row, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-system/rate-limit/submit', + method: 'post', + data: row, + }); +}; + +export const enable = ids => { + return request({ + url: '/blade-system/rate-limit/enable', + method: 'post', + params: { + ids, + }, + }); +}; + +export const disable = ids => { + return request({ + url: '/blade-system/rate-limit/disable', + method: 'post', + params: { + ids, + }, + }); +}; diff --git a/src/api/system/ratelimitlog.js b/src/api/system/ratelimitlog.js new file mode 100644 index 0000000..be70d4e --- /dev/null +++ b/src/api/system/ratelimitlog.js @@ -0,0 +1,23 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/rate-limit-log/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/rate-limit-log/detail', + method: 'get', + params: { + id, + }, + }); +}; diff --git a/src/api/system/role.js b/src/api/system/role.js new file mode 100644 index 0000000..22dfe54 --- /dev/null +++ b/src/api/system/role.js @@ -0,0 +1,96 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/role/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; +export const grantTree = () => { + return request({ + url: '/blade-system/menu/grant-tree', + method: 'get', + }); +}; + +export const grant = (roleIds, menuIds, dataScopeIds, apiScopeIds) => { + return request({ + url: '/blade-system/role/grant', + method: 'post', + data: { + roleIds, + menuIds, + dataScopeIds, + apiScopeIds, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/role/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/role/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/role/submit', + method: 'post', + data: row, + }); +}; + +export const getRole = roleIds => { + return request({ + url: '/blade-system/menu/role-tree-keys', + method: 'get', + params: { + roleIds, + }, + }); +}; + +export const getRoleTree = tenantId => { + return request({ + url: '/blade-system/role/tree', + method: 'get', + params: { + tenantId, + }, + }); +}; + +export const getRoleTreeById = roleId => { + return request({ + url: '/blade-system/role/tree-by-id', + method: 'get', + params: { + roleId, + }, + }); +}; + +export const getRoleAlias = () => { + return request({ + url: '/blade-system/role/alias', + method: 'get', + params: {}, + }); +}; diff --git a/src/api/system/scope.js b/src/api/system/scope.js new file mode 100644 index 0000000..efc098f --- /dev/null +++ b/src/api/system/scope.js @@ -0,0 +1,97 @@ +import request from '@/axios'; + +export const getListDataScope = (current, size, params) => { + return request({ + url: '/blade-system/data-scope/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const removeDataScope = ids => { + return request({ + url: '/blade-system/data-scope/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const addDataScope = row => { + return request({ + url: '/blade-system/data-scope/submit', + method: 'post', + data: row, + }); +}; + +export const updateDataScope = row => { + return request({ + url: '/blade-system/data-scope/submit', + method: 'post', + data: row, + }); +}; + +export const getMenuDataScope = id => { + return request({ + url: '/blade-system/data-scope/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const getListApiScope = (current, size, params) => { + return request({ + url: '/blade-system/api-scope/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const removeApiScope = ids => { + return request({ + url: '/blade-system/api-scope/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const addApiScope = row => { + return request({ + url: '/blade-system/api-scope/submit', + method: 'post', + data: row, + }); +}; + +export const updateApiScope = row => { + return request({ + url: '/blade-system/api-scope/submit', + method: 'post', + data: row, + }); +}; + +export const getMenuApiScope = id => { + return request({ + url: '/blade-system/api-scope/detail', + method: 'get', + params: { + id, + }, + }); +}; diff --git a/src/api/system/tenant.js b/src/api/system/tenant.js new file mode 100644 index 0000000..be2c549 --- /dev/null +++ b/src/api/system/tenant.js @@ -0,0 +1,122 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/tenant/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/tenant/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/tenant/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/tenant/submit', + method: 'post', + data: row, + }); +}; + +export const setting = (ids, form) => { + return request({ + url: '/blade-system/tenant/setting', + method: 'post', + params: { + ...form, + ids, + }, + }); +}; + +export const datasource = (tenantId, datasourceId) => { + return request({ + url: '/blade-system/tenant/datasource', + method: 'post', + params: { + tenantId, + datasourceId, + }, + }); +}; + +export const info = domain => { + return request({ + url: '/blade-system/tenant/info', + method: 'get', + params: { + domain, + }, + }); +}; + +export const packageInfo = tenantId => { + return request({ + url: '/blade-system/tenant/package-detail', + method: 'get', + params: { + tenantId, + }, + }); +}; + +export const packageSetting = (tenantId, packageId) => { + return request({ + url: '/blade-system/tenant/package-setting', + method: 'post', + params: { + tenantId, + packageId, + }, + }); +}; + +export const recycle = ids => { + return request({ + url: '/blade-system/tenant/recycle', + method: 'post', + params: { + ids, + }, + }); +}; + +export const pass = ids => { + return request({ + url: '/blade-system/tenant/pass', + method: 'post', + params: { + ids, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/tenant/remove', + method: 'post', + params: { + ids, + }, + }); +}; diff --git a/src/api/system/tenantdatasource.js b/src/api/system/tenantdatasource.js new file mode 100644 index 0000000..a56c985 --- /dev/null +++ b/src/api/system/tenantdatasource.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/tenant-datasource/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/tenant-datasource/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/tenant-datasource/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/tenant-datasource/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/tenant-datasource/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/system/tenantpackage.js b/src/api/system/tenantpackage.js new file mode 100644 index 0000000..cf6fb1a --- /dev/null +++ b/src/api/system/tenantpackage.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/tenant-package/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/tenant-package/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/tenant-package/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/tenant-package/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/tenant-package/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/system/topmenu.js b/src/api/system/topmenu.js new file mode 100644 index 0000000..3c85da2 --- /dev/null +++ b/src/api/system/topmenu.js @@ -0,0 +1,87 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/topmenu/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/topmenu/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/topmenu/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/topmenu/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/topmenu/submit', + method: 'post', + data: row, + }); +}; + +export const grantTree = () => { + return request({ + url: '/blade-system/menu/grant-top-tree', + method: 'get', + }); +}; + +export const getTopTree = topMenuIds => { + return request({ + url: '/blade-system/menu/top-tree-keys', + method: 'get', + params: { + topMenuIds, + }, + }); +}; + +export const grant = (topMenuIds, menuIds) => { + return request({ + url: '/blade-system/topmenu/grant', + method: 'post', + data: { + topMenuIds, + menuIds, + }, + }); +}; + +export const enable = id => { + return request({ + url: '/blade-system/topmenu/enable', + method: 'post', + params: { + id, + }, + }); +}; diff --git a/src/api/system/user.js b/src/api/system/user.js new file mode 100644 index 0000000..f62c5ff --- /dev/null +++ b/src/api/system/user.js @@ -0,0 +1,175 @@ +import request from '@/axios'; + +export const getList = (current, size, params, deptId) => { + return request({ + url: '/blade-system/user/page', + method: 'get', + params: { + ...params, + current, + size, + deptId, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/user/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-system/user/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-system/user/update', + method: 'post', + data: row, + }); +}; + +export const updatePlatform = (userId, userType, userExt) => { + return request({ + url: '/blade-system/user/update-platform', + method: 'post', + params: { + userId, + userType, + userExt, + }, + }); +}; + +export const getUser = id => { + return request({ + url: '/blade-system/user/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const getUserPlatform = id => { + return request({ + url: '/blade-system/user/platform-detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const getUserInfo = () => { + return request({ + url: '/blade-system/user/info', + method: 'get', + }); +}; + +export const resetPassword = userIds => { + return request({ + url: '/blade-system/user/reset-password', + method: 'post', + params: { + userIds, + }, + }); +}; + +export const updatePassword = (oldPassword, newPassword, newPassword1) => { + return request({ + url: '/blade-system/user/update-password', + method: 'post', + params: { + oldPassword, + newPassword, + newPassword1, + }, + }); +}; + +export const updateInfo = row => { + return request({ + url: '/blade-system/user/update-info', + method: 'post', + data: row, + }); +}; + +export const grant = (userIds, roleIds) => { + return request({ + url: '/blade-system/user/grant', + method: 'post', + params: { + userIds, + roleIds, + }, + }); +}; + +export const auditPass = userIds => { + return request({ + url: '/blade-system/user/audit-pass', + method: 'post', + params: { + userIds, + }, + }); +}; + +export const auditRefuse = userIds => { + return request({ + url: '/blade-system/user/audit-refuse', + method: 'post', + params: { + userIds, + }, + }); +}; + +export const setLeader = userId => { + return request({ + url: '/blade-system/user/set-leader', + method: 'post', + params: { + userId, + }, + }); +}; + +export const getLeaderList = (tenantId, realName) => { + return request({ + url: '/blade-system/user/leader-list', + method: 'get', + params: { + tenantId, + realName, + }, + }); +}; + +export const getUserPage = (current, size, account, name) => { + return request({ + url: '/blade-system/user/user-page', + method: 'get', + params: { + current, + size, + account, + name, + }, + }); +}; + diff --git a/src/api/tool/code.js b/src/api/tool/code.js new file mode 100644 index 0000000..b619f47 --- /dev/null +++ b/src/api/tool/code.js @@ -0,0 +1,78 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-develop/code/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const build = ids => { + return request({ + url: '/blade-develop/code/gen-code', + method: 'post', + params: { + ids, + system: 'saber', + }, + }); +}; + +export const buildFast = form => { + return request({ + url: '/blade-develop/code/gen-code-fast', + method: 'post', + data: form, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-develop/code/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-develop/code/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-develop/code/submit', + method: 'post', + data: row, + }); +}; + +export const copy = id => { + return request({ + url: '/blade-develop/code/copy', + method: 'post', + params: { + id, + }, + }); +}; + +export const getCode = id => { + return request({ + url: '/blade-develop/code/detail', + method: 'get', + params: { + id, + }, + }); +}; diff --git a/src/api/tool/codesetting.js b/src/api/tool/codesetting.js new file mode 100644 index 0000000..d4c8aaa --- /dev/null +++ b/src/api/tool/codesetting.js @@ -0,0 +1,88 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-develop/code-setting/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-develop/code-setting/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-develop/code-setting/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-develop/code-setting/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-develop/code-setting/submit', + method: 'post', + data: row, + }); +}; + +export const enable = id => { + return request({ + url: '/blade-develop/code-setting/enable', + method: 'post', + params: { + id, + }, + }); +}; + +export const getEnableDetail = () => { + return request({ + url: '/blade-develop/code-setting/enable-detail', + method: 'get', + params: {}, + }); +}; + +export const getTableForm = tableName => { + return request({ + url: '/blade-develop/code-setting/table-form', + method: 'get', + params: { + tableName, + }, + }); +}; + +export const getTablePrototype = (tableName, datasourceId) => { + return request({ + url: '/blade-develop/code-setting/table-prototype', + method: 'get', + params: { + tableName, + datasourceId, + }, + }); +}; diff --git a/src/api/tool/datasource.js b/src/api/tool/datasource.js new file mode 100644 index 0000000..b1e0ea8 --- /dev/null +++ b/src/api/tool/datasource.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-develop/datasource/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-develop/datasource/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-develop/datasource/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-develop/datasource/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-develop/datasource/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/tool/model.js b/src/api/tool/model.js new file mode 100644 index 0000000..65c4284 --- /dev/null +++ b/src/api/tool/model.js @@ -0,0 +1,110 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-develop/model/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-develop/model/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-develop/model/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-develop/model/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-develop/model/submit', + method: 'post', + data: row, + }); +}; + +export const getTableList = datasourceId => { + return request({ + url: '/blade-develop/model/table-list', + method: 'get', + params: { + datasourceId, + }, + }); +}; + +export const getTableInfo = (modelId, datasourceId) => { + return request({ + url: '/blade-develop/model/table-info', + method: 'get', + params: { + modelId, + datasourceId, + }, + }); +}; + +export const getTableInfoByName = (tableName, datasourceId) => { + return request({ + url: '/blade-develop/model/table-info', + method: 'get', + params: { + tableName, + datasourceId, + }, + }); +}; + +export const getModelPrototype = (modelId, datasourceId) => { + return request({ + url: '/blade-develop/model/model-prototype', + method: 'get', + params: { + modelId, + datasourceId, + }, + }); +}; + +export const submitModelPrototype = row => { + return request({ + url: '/blade-develop/model-prototype/submit-list', + method: 'post', + data: row, + }); +}; + +export const prototypeDetail = modelId => { + return request({ + url: '/blade-develop/model-prototype/select', + method: 'get', + params: { + modelId, + }, + }); +}; diff --git a/src/api/user.js b/src/api/user.js new file mode 100644 index 0000000..75f3531 --- /dev/null +++ b/src/api/user.js @@ -0,0 +1,196 @@ +import request from '@/axios'; + +import website from '@/config/website'; +import func from '@/utils/func'; + +export const loginByUsername = (tenantId, deptId, roleId, username, password, type, key, code) => + request({ + url: '/blade-auth/oauth/token', + method: 'post', + headers: { + 'Tenant-Id': tenantId, + 'Dept-Id': func.toStr(deptId), + 'Role-Id': func.toStr(roleId), + 'Captcha-Key': key, + 'Captcha-Code': code, + }, + params: { + tenantId, + username, + password, + grant_type: website.captchaMode + ? website.captchaType === 'behavior' + ? 'behavior' + : 'captcha' + : 'password', + scope: 'all', + type, + }, + }); + +export const loginBySocial = (tenantId, source, code, state) => + request({ + url: '/blade-auth/oauth/token', + method: 'post', + headers: { + 'Tenant-Id': tenantId, + }, + params: { + tenantId, + source, + code, + state, + grant_type: 'social', + scope: 'all', + }, + }); + +export const loginBySso = (state, code) => + request({ + url: '/blade-auth/oauth/token', + method: 'post', + headers: { + 'Tenant-Id': state, + }, + params: { + tenantId: state, + code, + grant_type: 'authorization_code', + scope: 'all', + redirect_uri: website.oauth2.redirectUri, + }, + }); + +export const loginByPhone = (tenantId, phone, id, value) => + request({ + url: '/blade-auth/oauth/token', + method: 'post', + headers: { + 'Tenant-Id': tenantId, + }, + params: { + tenantId, + phone, + id, + value, + grant_type: 'sms_code', + scope: 'all', + }, + }); + +export const refreshToken = (refresh_token, tenantId, deptId, roleId) => + request({ + url: '/blade-auth/oauth/token', + method: 'post', + headers: { + 'Tenant-Id': tenantId, + 'Dept-Id': func.toStr(deptId), + 'Role-Id': func.toStr(roleId), + }, + params: { + tenantId, + refresh_token, + grant_type: 'refresh_token', + scope: 'all', + }, + }); + +export const registerUser = (tenantId, name, account, password, phone, email) => + request({ + url: '/blade-auth/oauth/token', + method: 'post', + headers: { + 'Tenant-Id': tenantId, + }, + params: { + name, + username: account, + account, + password, + phone, + email, + grant_type: 'register', + scope: 'all', + }, + }); + +export const registerGuest = (form, oauthId) => + request({ + url: '/blade-system/user/register-guest', + method: 'post', + params: { + tenantId: form.tenantId, + name: form.name, + account: form.account, + password: form.password, + oauthId, + }, + }); + +export const getButtons = () => + request({ + url: '/blade-system/menu/buttons', + method: 'get', + }); + +export const getCaptcha = () => + request({ + url: '/blade-auth/oauth/captcha', + method: 'get', + authorization: false, + }); + +export const getBehavior = () => + request({ + url: '/blade-auth/oauth/behavior', + method: 'get', + authorization: false, + }); + +export const checkBehavior = (key, answer) => + request({ + url: '/blade-auth/oauth/behavior/check', + method: 'post', + authorization: false, + params: { + key, + answer, + }, + }); + +export const logout = () => + request({ + url: '/blade-auth/oauth/logout', + method: 'get', + authorization: false, + }); + +export const getUserInfo = () => + request({ + url: '/blade-auth/oauth/user-info', + method: 'get', + }); + +export const sendLogs = list => + request({ + url: '/blade-auth/oauth/logout', + method: 'post', + data: list, + }); + +export const clearCache = () => + request({ + url: '/blade-auth/oauth/clear-cache', + method: 'get', + authorization: false, + }); + +export const sendSms = (tenantId, phone) => + request({ + url: '/blade-auth/oauth/sms/send-validate', + method: 'post', + params: { + tenantId, + phone, + }, + }); diff --git a/src/api/work/process.js b/src/api/work/process.js new file mode 100644 index 0000000..4654a64 --- /dev/null +++ b/src/api/work/process.js @@ -0,0 +1,33 @@ +import request from '@/axios'; + +// =====================参数=========================== + +export const historyFlowList = processInstanceId => { + return request({ + url: '/blade-flow/process/history-flow-list', + method: 'get', + params: { + processInstanceId, + }, + }); +}; + +// =====================请假流程=========================== + +export const leaveProcess = data => { + return request({ + url: '/blade-desk/process/leave/start-process', + method: 'post', + data, + }); +}; + +export const leaveDetail = businessId => { + return request({ + url: '/blade-desk/process/leave/detail', + method: 'get', + params: { + businessId, + }, + }); +}; diff --git a/src/api/work/work.js b/src/api/work/work.js new file mode 100644 index 0000000..360e396 --- /dev/null +++ b/src/api/work/work.js @@ -0,0 +1,79 @@ +import request from '@/axios'; + +export const startList = (current, size, params) => { + return request({ + url: '/blade-flow/work/start-list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const claimList = (current, size, params) => { + return request({ + url: '/blade-flow/work/claim-list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const todoList = (current, size, params) => { + return request({ + url: '/blade-flow/work/todo-list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const sendList = (current, size, params) => { + return request({ + url: '/blade-flow/work/send-list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const doneList = (current, size, params) => { + return request({ + url: '/blade-flow/work/done-list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const claimTask = taskId => { + return request({ + url: '/blade-flow/work/claim-task', + method: 'post', + params: { + taskId, + }, + }); +}; + +export const completeTask = data => { + return request({ + url: '/blade-flow/work/complete-task', + method: 'post', + data, + }); +}; diff --git a/src/axios.js b/src/axios.js new file mode 100644 index 0000000..a4719cd --- /dev/null +++ b/src/axios.js @@ -0,0 +1,226 @@ +/** + * 全站http配置 + * + * axios参数说明 + * isSerialize是否开启form表单提交 + * isToken是否需要token + */ +import axios from 'axios'; +import store from '@/store/'; +import router from '@/router/'; +import { serialize } from '@/utils/util'; +import { getToken, getRefreshToken, removeToken, removeRefreshToken } from '@/utils/auth'; +import { isURL, validatenull } from '@/utils/validate'; +import { ElMessage } from 'element-plus'; +import website from '@/config/website'; +import NProgress from 'nprogress'; // progress bar +import 'nprogress/nprogress.css'; // progress bar style +import { Base64 } from 'js-base64'; +import { baseUrl } from '@/config/env'; +import crypto from '@/utils/crypto'; + +// 刷新令牌授权类型,其自身失败由 401 拦截逻辑统一收口 +const REFRESH_GRANT_TYPE = 'refresh_token'; +// 会话失效后只提示一次并跳转登录,在重新登录前抑制所有重复的失效提示 +let isSessionExpired = false; +// 标记当前是否正在刷新令牌,避免并发请求重复发起刷新 +let isRefreshing = false; +// 共享的刷新令牌 Promise,令并发的失效请求复用同一次刷新结果 +let refreshTokenPromise = null; + +// 判断是否为刷新令牌请求 +const isRefreshTokenRequest = config => + (config.url || '').includes('/oauth/token') && + (config.params || {}).grant_type === REFRESH_GRANT_TYPE; + +// 判断是否为重新登录请求:会开启新的会话周期 +const isLoginRequest = config => { + const grantType = (config.params || {}).grant_type; + return ( + (config.url || '').includes('/oauth/token') && !!grantType && grantType !== REFRESH_GRANT_TYPE + ); +}; + +// 为请求写入最新的访问令牌,供初始请求与刷新后的重放共用 +const applyToken = config => { + const meta = config.meta || {}; + if (meta.isToken === false) return; + const token = getToken(); + if (!token) return; + config.headers[website.tokenHeader] = + config.cryptoToken === true + ? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey) + : 'bearer ' + token; +}; + +// 会话失效统一出口:整段失效期内只提示一次,清理登录态并跳转登录页 +const redirectToLogin = () => { + if (isSessionExpired) return; + isSessionExpired = true; + ElMessage({ + message: '登录状态已失效,请重新登录', + type: 'error', + }); + removeToken(); + removeRefreshToken(); + store.dispatch('FedLogOut').then(() => router.push({ path: '/login' })); +}; + +axios.defaults.timeout = 10000; +//返回其他状态码 +axios.defaults.validateStatus = function (status) { + return status >= 200 && status <= 500; // 默认的 +}; +//跨域请求,允许保存cookie +axios.defaults.withCredentials = true; +// NProgress Configuration +NProgress.configure({ + showSpinner: false, +}); + +//http request拦截 +axios.interceptors.request.use( + config => { + // start progress bar + NProgress.start(); + //地址为已经配置状态则不添加前缀 + if (!isURL(config.url) && !config.url.startsWith(baseUrl)) { + config.url = baseUrl + config.url; + } + //安全请求header + config.headers['Blade-Requested-With'] = 'BladeHttpRequest'; + //设置语言请求头 + config.headers['Accept-Language'] = store.getters.language || 'zh-CN'; + //headers判断是否需要 + const authorization = config.authorization === false; + if (!authorization) { + config.headers['Authorization'] = `Basic ${Base64.encode( + `${website.clientId}:${website.clientSecret}` + )}`; + } + //headers判断请求是否携带token + const meta = config.meta || {}; + // 重新登录会开启新的会话周期,解除失效锁以便后续失效提示能再次触发 + if (isLoginRequest(config)) { + isSessionExpired = false; + } + // 写入访问令牌 + applyToken(config); + //判断传递数据是否加密 + const cryptoData = config.cryptoData === true; + // 开启报文加密 + if (cryptoData) { + if (config.params) { + const data = crypto.encryptAES(JSON.stringify(config.params), crypto.aesKey); + config.params = { data }; + } + if (config.data) { + config.text = true; + config.data = crypto.encryptAES(JSON.stringify(config.data), crypto.aesKey); + } + } + //headers中配置text请求 + if (config.text === true) { + config.headers['Content-Type'] = 'text/plain'; + } + //headers中配置serialize为true开启序列化 + if (config.method === 'post' && meta.isSerialize === true) { + config.data = serialize(config.data); + } + return config; + }, + error => { + return Promise.reject(error); + } +); + +//http response拦截 +axios.interceptors.response.use( + res => { + NProgress.done(); + //获取配置信息 + const config = res.config; + const cryptoData = config.cryptoData === true; + //解析加密报文 + if (cryptoData) { + res.data = JSON.parse(crypto.decryptAES(res.data, crypto.aesKey)); + } + //获取状态信息 + const status = res.data.error_code || res.data.code || res.status; + const statusWhiteList = website.statusWhiteList || []; + const message = res.data.msg || res.data.error_description || '系统错误'; + //如果在白名单里则自行catch逻辑处理 + if (statusWhiteList.includes(status)) return Promise.reject(res); + + // 令牌失效且尚未重试:尝试刷新令牌后重放原请求 + if (status === 401 && !config._retry) { + // 已登出(本地无令牌):残留请求的 401 属预期,后端已拒绝,前端静默忽略即可 + if (!getToken()) { + return Promise.reject(new Error(message)); + } + config._retry = true; + + // 无刷新令牌时不再发起空刷新,直接进入失效流程 + if (validatenull(getRefreshToken())) { + redirectToLogin(); + return Promise.reject(new Error(message)); + } + + // 并发的失效请求复用同一次刷新,避免重复刷新与重复提示 + if (!isRefreshing) { + isRefreshing = true; + refreshTokenPromise = store + .dispatch('RefreshToken') + .catch(error => { + redirectToLogin(); + return Promise.reject(error); + }) + .finally(() => { + isRefreshing = false; + }); + } + + return refreshTokenPromise.then(() => { + applyToken(config); + return axios(config); + }); + } + + // 刷新后仍然失效:会话已不可恢复,统一跳转登录 + if (status === 401 && config._retry) { + redirectToLogin(); + return Promise.reject(new Error(message)); + } + + // 刷新令牌请求:成功响应(200)须放行给刷新动作取用新令牌;仅其自身失败(error_code)时静默丢弃, + // 交由上方 401 逻辑统一收口,避免与失效跳转重复提示 + if (isRefreshTokenRequest(config) && status !== 200) { + return Promise.reject(new Error(message)); + } + + // OAuth2 业务错误码提示 + if (status > 2000 && !validatenull(res.data.error_description)) { + ElMessage({ + message: message, + type: 'error', + }); + return Promise.reject(new Error(message)); + } + + // 其余非 200 响应统一提示 + if (status !== 200) { + ElMessage({ + message: message, + type: 'error', + }); + return Promise.reject(new Error(message)); + } + return res; + }, + error => { + NProgress.done(); + return Promise.reject(new Error(error)); + } +); + +export default axios; diff --git a/src/components/basic-block/main.vue b/src/components/basic-block/main.vue new file mode 100644 index 0000000..6f69fc1 --- /dev/null +++ b/src/components/basic-block/main.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/src/components/basic-container/main.vue b/src/components/basic-container/main.vue new file mode 100644 index 0000000..e98f520 --- /dev/null +++ b/src/components/basic-container/main.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/components/basic-video/main.vue b/src/components/basic-video/main.vue new file mode 100644 index 0000000..6b0089f --- /dev/null +++ b/src/components/basic-video/main.vue @@ -0,0 +1,140 @@ + + + + diff --git a/src/components/basic-video/plugin.js b/src/components/basic-video/plugin.js new file mode 100644 index 0000000..a304bee --- /dev/null +++ b/src/components/basic-video/plugin.js @@ -0,0 +1,88 @@ +export default class RecordVideo { + /** + * 构造函数 + * + * @param {Object} videoObj 视频对象 + */ + constructor(videoObj) { + this.video = videoObj; + this.mediaRecorder = null; + this.chunks = []; + } + + /** + * 初始化 + * + * @return {Object} promise + */ + init() { + // 返回Promise对象 + // resolve 正常处理 + // reject 处理异常情况 + return new Promise((resovle, reject) => { + navigator.mediaDevices + .getUserMedia({ + audio: true, + video: true, + // video: { + // width: this.videoWidth, + // height: this.videoHeight + // } + }) + // 返回一个媒体内容的流 + .then(stream => { + // 检测是否支持 srcObject,该属性在新的浏览器支持 + if ('srcObject' in this.video) { + this.video.srcObject = stream; + } else { + // 兼容旧的浏览器 + this.video.src = window.URL.createObjectURL(stream); + } + + // 当视频的元数据已经加载时触发 + this.video.addEventListener('loadmetadata', () => { + this.video.play(); + }); + this.mediaRecorder = new MediaRecorder(stream); + this.mediaRecorder.addEventListener('dataavailable', e => { + this.chunks.push(e.data); + }); + resovle(); + }) + // 异常抓取,包括用于禁用麦克风、摄像头 + .catch(error => { + reject(error); + }); + }); + } + + /** + * 视频开始录制 + */ + startRecord() { + if (this.mediaRecorder.state === 'inactive') { + this.mediaRecorder.start(); + } + } + + /** + * 视频结束录制 + */ + stopRecord() { + if (this.mediaRecorder.state === 'recording') { + this.mediaRecorder.stop(); + } + } + + /** + * 检测当前浏览器对否支持 + * + * @return {boolean} 当前浏览器是否支持 + */ + isSupport() { + const flag = navigator.mediaDevices && navigator.mediaDevices.getUserMedia; + if (flag) { + return true; + } + } +} diff --git a/src/components/behavior-captcha/concat-panel.vue b/src/components/behavior-captcha/concat-panel.vue new file mode 100644 index 0000000..7b40a9b --- /dev/null +++ b/src/components/behavior-captcha/concat-panel.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/components/behavior-captcha/index.vue b/src/components/behavior-captcha/index.vue new file mode 100644 index 0000000..49cf263 --- /dev/null +++ b/src/components/behavior-captcha/index.vue @@ -0,0 +1,528 @@ + + + + + diff --git a/src/components/behavior-captcha/puzzle-panel.vue b/src/components/behavior-captcha/puzzle-panel.vue new file mode 100644 index 0000000..f4664fe --- /dev/null +++ b/src/components/behavior-captcha/puzzle-panel.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/src/components/behavior-captcha/rotate-panel.vue b/src/components/behavior-captcha/rotate-panel.vue new file mode 100644 index 0000000..513b329 --- /dev/null +++ b/src/components/behavior-captcha/rotate-panel.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/components/behavior-captcha/track-slider.vue b/src/components/behavior-captcha/track-slider.vue new file mode 100644 index 0000000..c1502c6 --- /dev/null +++ b/src/components/behavior-captcha/track-slider.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/src/components/behavior-captcha/word-panel.vue b/src/components/behavior-captcha/word-panel.vue new file mode 100644 index 0000000..02cc6ec --- /dev/null +++ b/src/components/behavior-captcha/word-panel.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/src/components/code-editor/main.vue b/src/components/code-editor/main.vue new file mode 100644 index 0000000..3e24cfc --- /dev/null +++ b/src/components/code-editor/main.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/src/components/cron-editor/main.vue b/src/components/cron-editor/main.vue new file mode 100644 index 0000000..9f2679c --- /dev/null +++ b/src/components/cron-editor/main.vue @@ -0,0 +1,597 @@ + + + + + diff --git a/src/components/error-page/403.vue b/src/components/error-page/403.vue new file mode 100644 index 0000000..aca4544 --- /dev/null +++ b/src/components/error-page/403.vue @@ -0,0 +1,23 @@ + + + + diff --git a/src/components/error-page/404.vue b/src/components/error-page/404.vue new file mode 100644 index 0000000..c6a7f28 --- /dev/null +++ b/src/components/error-page/404.vue @@ -0,0 +1,23 @@ + + + + diff --git a/src/components/error-page/500.vue b/src/components/error-page/500.vue new file mode 100644 index 0000000..05df75c --- /dev/null +++ b/src/components/error-page/500.vue @@ -0,0 +1,23 @@ + + + + diff --git a/src/components/error-page/style.scss b/src/components/error-page/style.scss new file mode 100644 index 0000000..fc151dd --- /dev/null +++ b/src/components/error-page/style.scss @@ -0,0 +1,35 @@ +.error-page { + background: #f0f2f5; + margin-top: -30px; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + + .img { + margin-right: 80px; + height: 360px; + width: 100%; + max-width: 430px; + background-repeat: no-repeat; + background-position: 50% 50%; + background-size: contain; + } + + .content { + h1 { + color: #434e59; + font-size: 72px; + font-weight: 600; + line-height: 72px; + margin-bottom: 24px; + } + + .desc { + color: rgba(0, 0, 0, 0.45); + font-size: 20px; + line-height: 28px; + margin-bottom: 16px; + } + } +} diff --git a/src/components/flow-design-step/main.vue b/src/components/flow-design-step/main.vue new file mode 100644 index 0000000..081c714 --- /dev/null +++ b/src/components/flow-design-step/main.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/src/components/flow-design/main.vue b/src/components/flow-design/main.vue new file mode 100644 index 0000000..11d8666 --- /dev/null +++ b/src/components/flow-design/main.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/components/highlight/main.vue b/src/components/highlight/main.vue new file mode 100644 index 0000000..4e0be41 --- /dev/null +++ b/src/components/highlight/main.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/components/iframe/main.vue b/src/components/iframe/main.vue new file mode 100644 index 0000000..d11b344 --- /dev/null +++ b/src/components/iframe/main.vue @@ -0,0 +1,82 @@ + + + + diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..9d34f1d --- /dev/null +++ b/src/main.js @@ -0,0 +1,81 @@ +import { createApp } from 'vue'; +import website from './config/website'; +import axios from './axios'; +import router from './router/'; +import store from './store'; +import i18n from './lang/'; +import { language, messages } from './lang/'; +import * as ElementPlusIconsVue from '@element-plus/icons-vue'; +import ElementPlus from 'element-plus'; +import 'element-plus/dist/index.css'; +import Avue from '@smallwei/avue'; +import '@smallwei/avue/lib/index.css'; +import avueUeditor from 'avue-plugin-ueditor'; +import crudCommon from '@/mixins/crud.js'; +import { getScreen, findColumn } from './utils/util'; +import './permission'; +import error from './error'; +import App from './App.vue'; +import 'animate.css'; +import dayjs from 'dayjs'; +import 'styles/common.scss'; +// 系统组件 +import debug from './debug'; +import VueClipboard from 'vue3-clipboard'; +import highlight from './components/highlight/main.vue'; +import codeEditor from './components/code-editor/main.vue'; +import cronEditor from './components/cron-editor/main.vue'; +import basicBlock from './components/basic-block/main.vue'; +import basicContainer from './components/basic-container/main.vue'; +import thirdRegister from './components/third-register/main.vue'; +import flowDesign from './components/flow-design/main.vue'; +import flowDesignStep from './components/flow-design-step/main.vue'; +// 业务组件 +import codeSetting from './views/tool/codesetting.vue'; +import formSetting from './views/tool/formsetting.vue'; +import tenantPackage from './views/system/tenantpackage.vue'; +import tenantDatasource from './views/system/tenantdatasource.vue'; + +window.$crudCommon = crudCommon; +debug(); +window.axios = axios; +const app = createApp(App); +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component); +} +app.component('basicContainer', basicContainer); +app.component('basicBlock', basicBlock); +app.component('highlight', highlight); +app.component('codeEditor', codeEditor); +app.component('cronEditor', cronEditor); +app.component('thirdRegister', thirdRegister); +app.component('flowDesign', flowDesign); +app.component('flowDesignStep', flowDesignStep); +app.component('codeSetting', codeSetting); +app.component('formSetting', formSetting); +app.component('tenantPackage', tenantPackage); +app.component('tenantDatasource', tenantDatasource); +app.config.globalProperties.$app = app; +app.config.globalProperties.$dayjs = dayjs; +app.config.globalProperties.website = website; +app.config.globalProperties.getScreen = getScreen; +app.config.globalProperties.findColumn = findColumn; +app.use(error); +app.use(i18n); +app.use(store); +app.use(router); +app.use(ElementPlus, { + locale: messages[language], +}); +app.use(Avue, { + axios, + calcHeight: 10, + locale: language, + i18n: (key, options) => i18n.global.t(key, options), +}); +app.use(avueUeditor, { axios }); +app.use(VueClipboard, { + autoSetContainer: true, + appendToBody: true, // 这可以帮助解决一些更复杂的使用场景下的问题 +}); +app.mount('#app'); diff --git a/src/mixins/crud.js b/src/mixins/crud.js new file mode 100644 index 0000000..f297a12 --- /dev/null +++ b/src/mixins/crud.js @@ -0,0 +1,217 @@ +import { mapGetters } from 'vuex'; + +export default (app, option = {}) => { + let optionObj = import.meta.glob(`../option/**/**`)[`../option/${option.name}.js`]; + let apiObj = import.meta.glob(`../api/**/**`)[`../api/${option.name}.js`]; + let mixins = { + data() { + return { + data: [], + form: {}, + params: {}, + option: {}, + api: {}, + loading: false, + page: {}, + }; + }, + created() { + optionObj().then(mode => (this.option = mode.default)); + apiObj().then(mode => { + this.api = mode; + this.getList(); + }); + }, + computed: { + ...mapGetters(['userInfo', 'permission', 'roles']), + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele[this.rowKey]); + }); + return ids.join(','); + }, + bindVal() { + return { + ref: 'crud', + option: this.option, + data: this.data, + tableLoading: this.loading, + }; + }, + onEvent() { + return { + 'size-change': this.sizeChange, + 'current-change': this.currentChange, + 'row-save': this.rowSave, + 'row-update': this.rowUpdate, + 'row-del': this.rowDel, + 'refresh-change': this.refreshChange, + 'search-reset': this.searchChange, + 'search-change': this.searchChange, + }; + }, + rowKey() { + return option.rowKey || 'id'; + }, + }, + methods: { + getList() { + const callback = () => { + this.loading = true; + this.data = []; + this.api[option.list || 'getList']( + this.page.currentPage, + this.page.pageSize, + this.params + ).then(res => { + this.loading = false; + let data; + if (option.res) { + data = option.res(res.data); + } else { + data = res.data.data; + } + this.page.total = data[option.total || 'total']; + const result = data[option.data || 'records']; + this.data = result; + if (this.listAfter) { + this.listAfter(data); + } + }); + }; + if (this.listBefore) { + this.listBefore(); + } + callback(); + }, + rowSave(row, done, loading) { + const callback = () => { + delete this.form.params; + this.api[option.add || 'add'](this.form) + .then(data => { + this.getList(); + if (this.addAfter) { + this.addAfter(data); + } else { + this.$message.success('新增成功'); + } + done(); + }) + .catch(() => { + loading(); + }); + }; + if (this.addBefore) { + this.addBefore(); + } + callback(); + }, + rowUpdate(row, index, done, loading) { + const callback = () => { + delete this.form.params; + this.api[option.update || 'update'](this.form) + .then(data => { + this.getList(); + if (this.updateAfter) { + this.updateAfter(data); + } else { + this.$message.success('更新成功'); + } + done(); + }) + .catch(() => { + loading(); + }); + }; + if (this.updateBefore) { + this.updateBefore(); + } + callback(); + }, + rowDel(row, index) { + const callback = () => { + this.api[option.del || 'del'](row[this.rowKey], row).then(data => { + this.getList(); + if (this.delAfter) { + this.delAfter(data, row, index); + } else { + this.$message.success('删除成功'); + } + }); + }; + if (this.delBefore) { + this.delBefore(); + callback(); + } else { + this.$confirm('确定将选择数据删除?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + callback(); + }); + } + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + this.api[option.del || 'remove'](this.ids).then(data => { + this.getList(); + if (this.delMultiAfter) { + this.delMultiAfter(data, this.ids); + } else { + this.$message.success('删除成功'); + } + }); + }); + }, + searchChange(params, done) { + if (done) done(); + this.params = params; + this.page.currentPage = 1; + this.getList(); + }, + dateChange(date) { + if (date) { + this.params.createTime_dategt = date[0]; + this.params.createTime_datelt = date[1]; + } else { + delete this.params.createTime_dategt; + delete this.params.createTime_datelt; + } + this.page.currentPage = 1; + this.getList(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + refreshChange() { + this.getList(); + }, + sizeChange(val) { + this.page.currentPage = 1; + this.page.pageSize = val; + this.getList(); + }, + currentChange(val) { + this.page.currentPage = val; + this.getList(); + }, + }, + }; + app.mixins = app.mixins || []; + app.mixins.push(mixins); + return app; +}; diff --git a/src/mixins/index.js b/src/mixins/index.js new file mode 100644 index 0000000..5cf8ec5 --- /dev/null +++ b/src/mixins/index.js @@ -0,0 +1,45 @@ +import { validatenull } from '@/utils/validate'; +import { getStore } from '@/utils/store.js'; + +export default { + data() { + return { + //刷新token锁 + refreshLock: false, + //刷新token的时间 + refreshTime: '', + }; + }, + created() { + //实时检测刷新token + //this.refreshToken(); + }, + methods: { + //实时检测刷新token + refreshToken() { + this.refreshTime = setInterval(() => { + const token = + getStore({ + name: 'token', + debug: true, + }) || {}; + let date1 = this.$dayjs(token.datetime); + let date2 = this.$dayjs(); + const date = date2.diff(date1, 'seconds'); + if (validatenull(date)) return; + if (date >= this.website.tokenTime && !this.refreshLock) { + this.refreshLock = true; + this.$store + .dispatch('RefreshToken') + .then(() => { + this.refreshLock = false; + }) + .catch(err => { + console.log(err); + this.refreshLock = false; + }); + } + }, 1000); + }, + }, +}; diff --git a/src/mockProdServer.js b/src/mockProdServer.js new file mode 100644 index 0000000..d13afa4 --- /dev/null +++ b/src/mockProdServer.js @@ -0,0 +1,9 @@ +import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'; + +import menuModule from '../mock/menu'; +import userModule from '../mock/user'; +import crudModule from '../mock/crud'; + +export const setupProdMockServer = () => { + createProdMockServer([...menuModule, ...userModule, ...crudModule]); +}; diff --git a/src/option/job/jobinfo.js b/src/option/job/jobinfo.js new file mode 100644 index 0000000..b4de472 --- /dev/null +++ b/src/option/job/jobinfo.js @@ -0,0 +1,515 @@ +export const timeExpressionTypeDic = [ + { + label: 'API', + value: 1, + }, + { + label: 'CRON', + value: 2, + }, + { + label: '固定频率(毫秒)', + value: 3, + }, + { + label: '固定延迟(毫秒)', + value: 4, + }, + { + label: '工作流', + value: 5, + }, +]; + +export const executeTypeDic = [ + { + label: '单机执行', + value: 1, + }, + { + label: '广播执行', + value: 2, + }, + { + label: 'MapReduce', + value: 3, + }, +]; + +export const processorTypeDic = [ + { + label: '内建处理器', + value: 1, + }, + { + label: '外部处理器(动态加载)', + value: 4, + }, +]; + +export const dispatchStrategyDic = [ + { + label: 'HEALTH_FIRST', + value: 1, + }, + { + label: 'RANDOM', + value: 2, + }, +]; + +export const enableDic = [ + { + label: '暂停', + value: 0, + }, + { + label: '启用', + value: 1, + }, +]; + +export const logTypeDic = [ + { + label: 'ONLINE', + value: 1, + }, + { + label: 'LOCAL', + value: 2, + }, + { + label: 'STDOUT', + value: 3, + }, + { + label: 'LOCAL_AND_ONLINE', + value: 4, + }, + { + label: 'NULL', + value: 999, + }, +]; + +export const logLevelDic = [ + { + label: 'DEBUG', + value: 1, + }, + { + label: 'INFO', + value: 2, + }, + { + label: 'WARN', + value: 3, + }, + { + label: 'ERROR', + value: 4, + }, + { + label: 'OFF', + value: 99, + }, +]; + +export default { + height: 'auto', + calcHeight: 30, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + grid: true, + labelWidth: 180, + menuWidth: 350, + dialogWidth: 1200, + dialogClickModal: false, + tabs: true, + column: [ + { + label: '任务应用', + prop: 'jobServerId', + type: 'select', + dicUrl: '/blade-job/job-server/select', + props: { + label: 'jobAppName', + value: 'id', + }, + search: true, + display: false, + }, + { + label: '任务ID', + prop: 'jobId', + type: 'input', + search: true, + width: 80, + display: false, + }, + { + label: '任务名称', + prop: 'jobName', + type: 'input', + search: true, + width: 200, + display: false, + }, + { + label: '定时信息', + labelTip: '时间表达式类型', + prop: 'timeExpressionType', + type: 'select', + dicData: timeExpressionTypeDic, + rules: [ + { + required: true, + message: '请选择定时信息', + trigger: 'blur', + }, + ], + width: 120, + display: false, + }, + { + label: '执行类型', + labelTip: '枚举值', + prop: 'executeType', + type: 'select', + dicData: executeTypeDic, + rules: [ + { + required: true, + message: '请选择执行器类型', + trigger: 'blur', + }, + ], + width: 110, + display: false, + }, + { + label: '处理器类型', + labelTip: '枚举值', + prop: 'processorType', + type: 'select', + dicData: processorTypeDic, + rules: [ + { + required: true, + message: '请选择处理器类型', + trigger: 'blur', + }, + ], + width: 180, + display: false, + }, + { + label: '任务状态', + labelTip: '未启用的任务不会被调度', + prop: 'enable', + type: 'switch', + dicData: enableDic, + slot: true, + width: 100, + display: false, + }, + ], + group: [ + { + label: '基础配置', + prop: 'modelSetting', + icon: 'el-icon-tickets', + column: [ + { + label: '任务应用', + prop: 'jobServerId', + type: 'select', + dicUrl: '/blade-job/job-server/select', + props: { + label: 'jobAppName', + value: 'id', + }, + editDisabled: true, + rules: [ + { + required: true, + message: '请选择任务应用', + trigger: 'blur', + }, + ], + }, + { + label: '任务状态', + labelTip: '未启用的任务不会被调度', + prop: 'enable', + type: 'switch', + value: 1, + rules: [ + { + required: true, + message: '请选择是否开启', + trigger: 'blur', + }, + ], + }, + { + label: '任务名称', + prop: 'jobName', + type: 'input', + rules: [ + { + required: true, + message: '请输入任务名称', + trigger: 'blur', + }, + ], + }, + { + label: '生命周期', + labelTip: '预留,用于指定定时调度任务的生效时间范围)', + prop: 'lifecycle', + type: 'datetimerange', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + startPlaceholder: '任务开始时间', + endPlaceholder: '任务结束时间', + }, + { + label: '定时类型', + labelTip: '时间表达式类型', + prop: 'timeExpressionType', + type: 'select', + dicData: timeExpressionTypeDic, + value: 2, + rules: [ + { + required: true, + message: '请选择定时信息', + trigger: 'blur', + }, + ], + }, + { + label: '时间表达式', + labelTip: '填写类型由 定时类型 决定,比如 CRON 需要填写 CRON 表达式', + prop: 'timeExpression', + type: 'input', + }, + { + label: '执行类型', + labelTip: '枚举值', + prop: 'executeType', + type: 'select', + dicData: executeTypeDic, + value: 1, + rules: [ + { + required: true, + message: '请选择执行器类型', + trigger: 'blur', + }, + ], + }, + { + label: '运行时配置', + labelTip: '目前支持随机(RANDOM)和健康度优先(HEALTH_FIRST)', + prop: 'dispatchStrategy', + type: 'select', + dicData: dispatchStrategyDic, + value: 1, + rules: [ + { + required: true, + message: '请选择运行时配置', + trigger: 'blur', + }, + ], + }, + { + label: '处理器类型', + labelTip: '枚举值', + prop: 'processorType', + type: 'select', + dicData: processorTypeDic, + value: 1, + rules: [ + { + required: true, + message: '请选择处理器类型', + trigger: 'blur', + }, + ], + }, + { + label: '处理器参数', + labelTip: + '如Java处理器需要填写全限定类名,如:org.springblade.demo.MapReduceProcessorDemo', + prop: 'processorInfo', + type: 'input', + rules: [ + { + required: true, + message: '请输入处理器参数', + trigger: 'blur', + }, + ], + }, + { + label: '任务参数', + labelTip: '方法入参 TaskContext 对象的 json 字段', + prop: 'jobParams', + type: 'input', + span: 24, + }, + { + label: '任务描述', + prop: 'jobDescription', + type: 'textarea', + minRows: 3, + span: 24, + }, + ], + }, + { + label: '高级配置', + prop: 'templateSetting', + icon: 'el-icon-copy-document', + column: [ + { + label: '最大实例数', + labelTip: + '该任务同时执行的数量(任务和实例就像是类和对象的关系,任务被调度执行后被称为实例)', + prop: 'maxInstanceNum', + type: 'number', + value: 0, + }, + { + label: '单机线程并发数', + labelTip: '该实例执行过程中每个 Worker 使用的线程数量', + prop: 'concurrency', + type: 'number', + value: 5, + }, + { + label: '任务实例运行时间限制', + labelTip: '0 代表无任何限制,超时会被打断并判定为执行失败', + prop: 'instanceTimeLimit', + type: 'number', + value: 0, + }, + { + label: '任务实例重试次数', + labelTip: '任务实例重试次数,整个任务失败时重试,代价大,不推荐使用', + prop: 'instanceRetryNum', + type: 'number', + value: 0, + }, + { + label: '任务作业重试次数', + labelTip: 'Task 重试次数,每个子 Task 失败后单独重试,代价小,推荐使用', + prop: 'taskRetryNum', + type: 'number', + value: 0, + }, + { + label: '最低CPU核心', + labelTip: + '最小可用 CPU 核心数,CPU 可用核心数小于该值的 Worker 将不会执行该任务,0 代表无任何限制', + prop: 'minCpuCores', + type: 'number', + value: 0, + }, + { + label: '最低内存(GB)', + labelTip: '可用内存小于该值的Worker 将不会执行该任务,0 代表无任何限制', + prop: 'minMemorySpace', + type: 'number', + value: 0, + }, + { + label: '最低磁盘空间(GB)', + labelTip: '可用磁盘空间小于该值的Worker 将不会执行该任务,0 代表无任何限制', + prop: 'minDiskSpace', + type: 'number', + value: 0, + }, + { + label: '执行机器地址', + labelTip: '设置该参数后只有列表中的机器允许执行该任务,空代表不指定机器', + prop: 'designatedWorkers', + type: 'input', + }, + { + label: '最大执行机器数量', + labelTip: '限定调动执行的机器数量,0代表无限制', + prop: 'maxWorkerCount', + type: 'number', + value: 0, + }, + ], + }, + { + label: '其他配置', + prop: 'codingSetting', + icon: 'el-icon-printer', + column: [ + { + label: '报警人员ID列表', + labelTip: '接收报警的用户ID列表', + prop: 'notifyUserIds', + type: 'input', + }, + { + label: '错误阈值', + labelTip: '错误阈值,0代表不限制', + prop: 'alertThreshold', + type: 'number', + value: 0, + }, + { + label: '统计窗口(s)', + labelTip: '统计的窗口长度(s),0代表不限制', + prop: 'statisticWindowLen', + type: 'number', + value: 0, + }, + { + label: '沉默窗口(s)', + labelTip: '沉默时间窗口(s),0代表不限制', + prop: 'silenceWindowLen', + type: 'number', + value: 0, + }, + { + label: '日志配置', + labelTip: '日志配置', + prop: 'logType', + type: 'select', + value: 1, + dicData: logTypeDic, + }, + { + label: '日志级别', + labelTip: '日志级别', + prop: 'logLevel', + type: 'select', + value: 2, + dicData: logLevelDic, + }, + { + label: '扩展字段', + labelTip: '供开发者使用,用于功能扩展,powerjob 自身不会使用该字段', + prop: 'extra', + type: 'textarea', + minRows: 3, + span: 24, + }, + ], + }, + ], +}; diff --git a/src/option/job/jobserver.js b/src/option/job/jobserver.js new file mode 100644 index 0000000..27914be --- /dev/null +++ b/src/option/job/jobserver.js @@ -0,0 +1,78 @@ +export default { + height: 'auto', + calcHeight: 30, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + grid: true, + labelWidth: 100, + menuWidth: 350, + dialogClickModal: false, + column: [ + { + label: '服务名称', + prop: 'jobServerName', + type: 'input', + span: 24, + search: true, + rules: [ + { + required: true, + message: '请输入服务名称', + trigger: 'blur', + }, + ], + }, + { + label: '服务器地址', + prop: 'jobServerUrl', + type: 'input', + span: 24, + rules: [ + { + required: true, + message: '请输入服务器地址', + trigger: 'blur', + }, + ], + }, + { + label: '应用名称', + prop: 'jobAppName', + type: 'input', + span: 24, + search: true, + rules: [ + { + required: true, + message: '请输入应用名称', + trigger: 'blur', + }, + ], + }, + { + label: '应用密码', + prop: 'jobAppPassword', + type: 'input', + span: 24, + rules: [ + { + required: true, + message: '请输入应用密码', + trigger: 'blur', + }, + ], + }, + { + label: '任务备注', + prop: 'jobRemark', + type: 'textarea', + minRows: 3, + span: 24, + }, + ], +}; diff --git a/src/option/system/authlock.js b/src/option/system/authlock.js new file mode 100644 index 0000000..1c8601c --- /dev/null +++ b/src/option/system/authlock.js @@ -0,0 +1,111 @@ +export const LOCK_TYPE_DIC = [ + { label: '系统锁定', value: 'SYSTEM' }, + { label: '手动锁定', value: 'MANUAL' }, +]; + +export const LOCK_STATUS_DIC = [ + { label: '待锁定', value: 'PRE_LOCKED' }, + { label: '锁定中', value: 'LOCKED' }, + { label: '已解锁', value: 'UN_LOCKED' }, +]; + +export const authLockOption = { + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + addBtn: false, + viewBtn: false, + editBtn: false, + delBtn: false, + menuWidth: 160, + dialogType: 'drawer', + dialogWidth: 800, + dialogClickModal: false, + column: [ + { + label: '锁定目标', + prop: 'lockTarget', + slot: true, + search: true, + span: 24, + searchPlaceholder: '请输入账号或IP', + }, + { + label: '用户姓名', + prop: 'userName', + slot: true, + width: 100, + }, + { + label: '请求IP', + prop: 'remoteIp', + slot: true, + search: true, + searchPlaceholder: '请输入IP地址', + width: 160, + }, + { + label: '失败次数', + prop: 'failCount', + width: 80, + align: 'center', + hide: true, + }, + { + label: '用户代理', + prop: 'userAgent', + hide: true, + overHidden: true, + }, + { + label: '锁定类型', + prop: 'lockType', + slot: true, + type: 'select', + dicData: LOCK_TYPE_DIC, + width: 90, + align: 'center', + }, + { + label: '锁定状态', + prop: 'lockStatus', + slot: true, + type: 'select', + search: true, + dicData: LOCK_STATUS_DIC, + width: 90, + align: 'center', + }, + { + label: '锁定开始', + prop: 'lockBeginTime', + slot: true, + width: 120, + }, + { + label: '锁定结束', + prop: 'lockEndTime', + slot: true, + width: 120, + }, + { + label: '锁定原因', + prop: 'lockReason', + type: 'textarea', + hide: true, + overHidden: true, + minWidth: 160, + span: 24, + }, + { + label: '解锁原因', + prop: 'unlockReason', + type: 'textarea', + hide: true, + overHidden: true, + span: 24, + }, + ], +}; diff --git a/src/option/system/authlog.js b/src/option/system/authlog.js new file mode 100644 index 0000000..af3456f --- /dev/null +++ b/src/option/system/authlog.js @@ -0,0 +1,94 @@ +export const GRANT_TYPE_DIC = [ + { label: '密码登录', value: 'password' }, + { label: '验证码登录', value: 'captcha' }, + { label: '短信登录', value: 'sms' }, + { label: '社交登录', value: 'social' }, + { label: '客户端凭证', value: 'client_credentials' }, + { label: '刷新令牌', value: 'refresh_token' }, +]; + +export const authLogOption = { + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + addBtn: false, + viewBtn: false, + editBtn: false, + delBtn: false, + menu: true, + menuWidth: 100, + dialogType: 'drawer', + dialogWidth: 800, + dialogClickModal: false, + column: [ + { + label: '授权账号', + prop: 'account', + slot: true, + search: true, + searchPlaceholder: '请输入账号', + }, + { + label: '用户姓名', + prop: 'realName', + }, + { + label: '授权类型', + prop: 'grantType', + type: 'select', + search: true, + dicData: GRANT_TYPE_DIC, + width: 110, + align: 'center', + }, + { + label: '请求IP', + prop: 'remoteIp', + slot: true, + search: true, + searchPlaceholder: '请输入IP地址', + width: 160, + }, + { + label: '服务ID', + prop: 'serviceId', + hide: true, + width: 120, + }, + { + label: '服务器IP', + prop: 'serverIp', + hide: true, + width: 160, + }, + { + label: '环境', + prop: 'env', + slot: true, + width: 80, + align: 'center', + }, + { + label: '服务器名', + prop: 'serverHost', + hide: true, + width: 120, + }, + { + label: '登录时间', + prop: 'loginTime', + span: 24, + width: 180, + }, + { + label: '用户代理', + prop: 'userAgent', + type: 'textarea', + span: 24, + hide: true, + overHidden: true, + }, + ], +}; diff --git a/src/option/system/dict.js b/src/option/system/dict.js new file mode 100644 index 0000000..aac2d8a --- /dev/null +++ b/src/option/system/dict.js @@ -0,0 +1,210 @@ +export const optionParent = { + height: 'auto', + calcHeight: 32, + tip: false, + searchShow: true, + searchMenuSpan: 10, + border: true, + index: true, + selection: true, + viewBtn: true, + menuWidth: 250, + dialogWidth: 880, + dialogClickModal: false, + column: [ + { + label: '字典编号', + prop: 'code', + search: true, + slot: true, + span: 24, + rules: [ + { + required: true, + message: '请输入字典编号', + trigger: 'blur', + }, + ], + }, + { + label: '字典名称', + prop: 'dictValue', + search: true, + align: 'center', + rules: [ + { + required: true, + message: '请输入字典名称', + trigger: 'blur', + }, + ], + }, + { + label: '字典排序', + prop: 'sort', + type: 'number', + align: 'right', + width: 100, + rules: [ + { + required: true, + message: '请输入字典排序', + trigger: 'blur', + }, + ], + }, + { + label: '封存', + prop: 'isSealed', + type: 'switch', + align: 'center', + width: 100, + dicData: [ + { + label: '否', + value: 0, + }, + { + label: '是', + value: 1, + }, + ], + value: 0, + slot: true, + rules: [ + { + required: true, + message: '请选择封存', + trigger: 'blur', + }, + ], + }, + { + label: '字典备注', + prop: 'remark', + hide: true, + }, + ], +}; + +export const optionChild = { + height: 'auto', + calcHeight: 95, + tip: false, + searchShow: true, + searchMenuSpan: 10, + tree: true, + border: true, + index: true, + selection: true, + viewBtn: true, + menuWidth: 300, + dialogWidth: 880, + dialogClickModal: false, + column: [ + { + label: '字典编号', + prop: 'code', + addDisabled: true, + editDisabled: true, + search: true, + span: 24, + rules: [ + { + required: true, + message: '请输入字典编号', + trigger: 'blur', + }, + ], + }, + { + label: '字典名称', + prop: 'dictValue', + search: true, + align: 'center', + rules: [ + { + required: true, + message: '请输入字典名称', + trigger: 'blur', + }, + ], + }, + { + label: '上级字典', + prop: 'parentId', + type: 'tree', + dicData: [], + hide: true, + props: { + label: 'title', + }, + addDisabled: true, + editDisabled: true, + rules: [ + { + required: false, + message: '请选择上级字典', + trigger: 'click', + }, + ], + }, + { + label: '字典键值', + prop: 'dictKey', + width: 85, + rules: [ + { + required: true, + message: '请输入字典键值', + trigger: 'blur', + }, + ], + }, + { + label: '字典排序', + prop: 'sort', + type: 'number', + align: 'right', + hide: true, + rules: [ + { + required: true, + message: '请输入字典排序', + trigger: 'blur', + }, + ], + }, + { + label: '封存', + prop: 'isSealed', + type: 'switch', + align: 'center', + width: 80, + dicData: [ + { + label: '否', + value: 0, + }, + { + label: '是', + value: 1, + }, + ], + value: 0, + slot: true, + rules: [ + { + required: true, + message: '请选择封存', + trigger: 'blur', + }, + ], + }, + { + label: '字典备注', + prop: 'remark', + hide: true, + }, + ], +}; diff --git a/src/option/system/dictbiz.js b/src/option/system/dictbiz.js new file mode 100644 index 0000000..18a884b --- /dev/null +++ b/src/option/system/dictbiz.js @@ -0,0 +1,211 @@ +export const optionParent = { + height: 'auto', + calcHeight: 32, + tip: false, + searchShow: true, + searchMenuSpan: 10, + border: true, + index: true, + selection: true, + viewBtn: true, + menuWidth: 250, + dialogWidth: 880, + dialogClickModal: false, + column: [ + { + label: '字典编号', + prop: 'code', + search: true, + slot: true, + span: 24, + rules: [ + { + required: true, + message: '请输入字典编号', + trigger: 'blur', + }, + ], + }, + { + label: '字典名称', + prop: 'dictValue', + search: true, + align: 'center', + rules: [ + { + required: true, + message: '请输入字典名称', + trigger: 'blur', + }, + ], + }, + { + label: '字典排序', + prop: 'sort', + type: 'number', + align: 'right', + width: 100, + hide: true, + rules: [ + { + required: true, + message: '请输入字典排序', + trigger: 'blur', + }, + ], + }, + { + label: '封存', + prop: 'isSealed', + type: 'switch', + align: 'center', + width: 100, + dicData: [ + { + label: '否', + value: 0, + }, + { + label: '是', + value: 1, + }, + ], + value: 0, + slot: true, + rules: [ + { + required: true, + message: '请选择封存', + trigger: 'blur', + }, + ], + }, + { + label: '字典备注', + prop: 'remark', + hide: true, + }, + ], +}; + +export const optionChild = { + height: 'auto', + calcHeight: 95, + tip: false, + searchShow: true, + searchMenuSpan: 10, + tree: true, + border: true, + index: true, + selection: true, + viewBtn: true, + menuWidth: 300, + dialogWidth: 880, + dialogClickModal: false, + column: [ + { + label: '字典编号', + prop: 'code', + addDisabled: true, + editDisabled: true, + search: true, + span: 24, + rules: [ + { + required: true, + message: '请输入字典编号', + trigger: 'blur', + }, + ], + }, + { + label: '字典名称', + prop: 'dictValue', + search: true, + align: 'center', + rules: [ + { + required: true, + message: '请输入字典名称', + trigger: 'blur', + }, + ], + }, + { + label: '上级字典', + prop: 'parentId', + type: 'tree', + dicData: [], + hide: true, + props: { + label: 'title', + }, + addDisabled: true, + editDisabled: true, + rules: [ + { + required: false, + message: '请选择上级字典', + trigger: 'click', + }, + ], + }, + { + label: '字典键值', + prop: 'dictKey', + width: 85, + rules: [ + { + required: true, + message: '请输入字典键值', + trigger: 'blur', + }, + ], + }, + { + label: '字典排序', + prop: 'sort', + type: 'number', + align: 'right', + hide: true, + rules: [ + { + required: true, + message: '请输入字典排序', + trigger: 'blur', + }, + ], + }, + { + label: '封存', + prop: 'isSealed', + type: 'switch', + align: 'center', + width: 80, + dicData: [ + { + label: '否', + value: 0, + }, + { + label: '是', + value: 1, + }, + ], + value: 0, + slot: true, + rules: [ + { + required: true, + message: '请选择封存', + trigger: 'blur', + }, + ], + }, + { + label: '字典备注', + prop: 'remark', + hide: true, + }, + ], +}; diff --git a/src/option/system/user.js b/src/option/system/user.js new file mode 100644 index 0000000..89ac5c9 --- /dev/null +++ b/src/option/system/user.js @@ -0,0 +1,534 @@ +import website from '@/config/website'; +import { getDeptLazyTree } from '@/api/system/dept'; + +export const userOption = safe => { + const validatePass = (rule, value, callback) => { + if (value === '') { + callback(new Error('请输入密码')); + } else { + callback(); + } + }; + const validatePass2 = (rule, value, callback) => { + if (value === '') { + callback(new Error('请再次输入密码')); + } else if (value !== safe.form.password) { + callback(new Error('两次输入密码不一致!')); + } else { + callback(); + } + }; + return { + height: 'auto', + calcHeight: 150, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + selection: true, + addBtn: false, + viewBtn: true, + dialogType: 'drawer', + dialogWidth: 1000, + dialogClickModal: false, + column: [ + { + label: '登录账号', + prop: 'account', + search: true, + display: false, + }, + { + label: '所属租户', + prop: 'tenantName', + slot: true, + display: false, + }, + { + label: '用户姓名', + prop: 'realName', + search: true, + display: false, + }, + { + label: '所属角色', + prop: 'roleName', + slot: true, + overHidden: true, + display: false, + }, + { + label: '所属部门', + prop: 'deptName', + slot: true, + overHidden: true, + display: false, + }, + { + label: '用户平台', + prop: 'userTypeName', + width: 100, + slot: true, + display: false, + }, + { + label: '用户平台', + type: 'select', + dicUrl: '/blade-system/dict/dictionary?code=user_type', + props: { + label: 'dictValue', + value: 'dictKey', + }, + dataType: 'number', + search: true, + hide: true, + display: false, + prop: 'userType', + rules: [ + { + required: true, + message: '请选择用户平台', + trigger: 'blur', + }, + ], + }, + ], + group: [ + { + label: '基础信息', + prop: 'baseInfo', + icon: 'el-icon-user-solid', + column: [ + { + label: '所属租户', + prop: 'tenantId', + type: 'tree', + dicUrl: '/blade-system/tenant/select', + props: { + label: 'tenantName', + value: 'tenantId', + }, + hide: !website.tenantMode, + addDisplay: website.tenantMode, + editDisplay: website.tenantMode, + viewDisplay: website.tenantMode, + rules: [ + { + required: true, + message: '请输入所属租户', + trigger: 'click', + }, + ], + span: 24, + }, + { + label: '登录账号', + prop: 'account', + rules: [ + { + required: true, + message: '请输入登录账号', + trigger: 'blur', + }, + ], + }, + { + label: '用户平台', + type: 'select', + dicUrl: '/blade-system/dict/dictionary?code=user_type', + props: { + label: 'dictValue', + value: 'dictKey', + }, + dataType: 'number', + slot: true, + prop: 'userType', + rules: [ + { + required: true, + message: '请选择用户平台', + trigger: 'blur', + }, + ], + }, + { + label: '密码', + prop: 'password', + hide: true, + editDisplay: false, + viewDisplay: false, + rules: [{ required: true, validator: validatePass, trigger: 'blur' }], + }, + { + label: '确认密码', + prop: 'password2', + hide: true, + editDisplay: false, + viewDisplay: false, + rules: [{ required: true, validator: validatePass2, trigger: 'blur' }], + }, + ], + }, + { + label: '详细信息', + prop: 'detailInfo', + icon: 'el-icon-s-order', + column: [ + { + label: '用户昵称', + prop: 'name', + hide: true, + rules: [ + { + required: true, + message: '请输入用户昵称', + trigger: 'blur', + }, + ], + }, + { + label: '用户姓名', + prop: 'realName', + rules: [ + { + required: true, + message: '请输入用户姓名', + trigger: 'blur', + }, + { + min: 2, + max: 10, + message: '姓名长度在2到5个字符', + }, + ], + }, + { + label: '手机号码', + prop: 'phone', + overHidden: true, + }, + { + label: '电子邮箱', + prop: 'email', + hide: true, + overHidden: true, + }, + { + label: '用户性别', + prop: 'sex', + type: 'select', + dicData: [ + { + label: '男', + value: 1, + }, + { + label: '女', + value: 2, + }, + { + label: '未知', + value: 3, + }, + ], + hide: true, + }, + { + label: '用户生日', + type: 'date', + prop: 'birthday', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + hide: true, + }, + { + label: '账号状态', + prop: 'statusName', + hide: true, + display: false, + }, + ], + }, + { + label: '职责信息', + prop: 'dutyInfo', + icon: 'el-icon-s-custom', + column: [ + { + label: '用户编号', + prop: 'code', + }, + { + label: '所属角色', + prop: 'roleId', + multiple: true, + type: 'tree', + dicData: [], + props: { + label: 'title', + }, + checkStrictly: true, + slot: true, + rules: [ + { + required: true, + message: '请选择所属角色', + trigger: 'click', + }, + ], + }, + { + label: '所属部门', + prop: 'deptId', + type: 'tree', + multiple: true, + dicData: [], + props: { + label: 'title', + }, + checkStrictly: true, + slot: true, + rules: [ + { + required: true, + message: '请选择所属部门', + trigger: 'click', + }, + ], + }, + { + label: '所属岗位', + prop: 'postId', + type: 'tree', + multiple: true, + dicData: [], + props: { + label: 'postName', + value: 'id', + }, + rules: [ + { + required: true, + message: '请选择所属岗位', + trigger: 'click', + }, + ], + }, + { + label: '直属主管', + prop: 'leaderId', + type: 'tree', + multiple: true, + filterable: true, + dicData: [], + props: { + label: 'realName', + value: 'id', + }, + clearable: true, + }, + { + label: '是否主管', + prop: 'isLeader', + type: 'switch', + dicData: [ + { + label: '否', + value: 0, + }, + { + label: '是', + value: 1, + }, + ], + value: 0, + }, + ], + }, + ], + }; +}; + +export const platformOption = { + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + selection: true, + viewBtn: true, + dialogClickModal: false, + menuWidth: 120, + editBtnText: '配置', + column: [ + { + label: '登录账号', + prop: 'account', + search: true, + display: false, + }, + { + label: '所属租户', + prop: 'tenantName', + slot: true, + display: false, + }, + { + label: '用户姓名', + prop: 'realName', + search: true, + display: false, + }, + { + label: '用户平台', + prop: 'userTypeName', + slot: true, + display: false, + }, + { + label: '用户平台', + type: 'select', + dicUrl: '/blade-system/dict/dictionary?code=user_type', + props: { + label: 'dictValue', + value: 'dictKey', + }, + dataType: 'number', + search: true, + hide: true, + display: false, + prop: 'userType', + rules: [ + { + required: true, + message: '请选择用户平台', + trigger: 'blur', + }, + ], + }, + { + label: '用户拓展', + prop: 'userExt', + type: 'textarea', + minRows: 8, + span: 24, + overHidden: true, + row: true, + hide: true, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-system/user/import-user', + }, + { + label: '数据覆盖', + prop: 'isCovered', + type: 'switch', + align: 'center', + width: 80, + dicData: [ + { + label: '否', + value: 0, + }, + { + label: '是', + value: 1, + }, + ], + value: 0, + slot: true, + rules: [ + { + required: true, + message: '请选择是否覆盖', + trigger: 'blur', + }, + ], + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; + +export const platformFormOption = { + submitBtn: false, + emptyBtn: false, + labelWidth: 100, + column: [ + { + label: '用户账号', + prop: 'account', + disabled: true, + span: 24, + }, + { + label: '用户平台', + type: 'select', + prop: 'userType', + dicUrl: '/blade-system/dict/dictionary?code=user_type', + props: { + label: 'dictValue', + value: 'dictKey', + }, + dataType: 'number', + span: 24, + rules: [{ required: true, message: '请选择用户平台', trigger: 'blur' }], + }, + { + label: '用户拓展', + prop: 'userExt', + type: 'textarea', + minRows: 8, + span: 24, + }, + ], +}; + +export const treeOption = { + nodeKey: 'id', + lazy: true, + treeLoad: function (node, resolve) { + const parentId = node.level === 0 ? 0 : node.data.id; + getDeptLazyTree(parentId).then(res => { + resolve( + res.data.data.map(item => { + return { + ...item, + leaf: !item.hasChildren, + }; + }) + ); + }); + }, + addBtn: false, + menu: false, + size: 'small', + props: { + labelText: '标题', + label: 'title', + value: 'value', + children: 'children', + }, +}; diff --git a/src/option/tool/code.js b/src/option/tool/code.js new file mode 100644 index 0000000..2447102 --- /dev/null +++ b/src/option/tool/code.js @@ -0,0 +1,665 @@ +import { templateDic } from '@/const/tool/model'; + +export const codeOption = { + height: 'auto', + calcHeight: 32, + dialogWidth: 900, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + selection: true, + labelWidth: 120, + menuWidth: 350, + viewBtn: true, + dialogClickModal: false, + tabs: true, + column: [ + { + label: '模块名', + prop: 'codeName', + search: true, + display: false, + }, + { + label: '模版类型', + prop: 'templateType', + type: 'select', + dicData: templateDic, + display: false, + }, + { + label: '表名', + prop: 'tableName', + search: true, + display: false, + }, + { + label: '服务名', + prop: 'serviceName', + search: true, + display: false, + }, + { + label: '包名', + prop: 'packageName', + display: false, + }, + ], + group: [ + { + label: '模型配置', + prop: 'modelSetting', + icon: 'el-icon-tickets', + column: [ + { + label: '上级菜单', + prop: 'menuId', + type: 'tree', + dicData: [], + span: 24, + hide: true, + addDisabled: false, + props: { + label: 'title', + }, + rules: [ + { + required: true, + message: '请选择上级菜单', + trigger: 'click', + }, + ], + }, + { + label: '数据模型', + prop: 'modelId', + search: true, + span: 24, + type: 'select', + dicUrl: '/blade-develop/model/select', + props: { + label: 'modelName', + value: 'id', + }, + rules: [ + { + required: true, + message: '请选择数据模型', + trigger: 'blur', + }, + ], + }, + { + label: '模块名', + prop: 'codeName', + search: true, + rules: [ + { + required: true, + message: '请输入模块名', + trigger: 'blur', + }, + ], + }, + { + label: '表名', + prop: 'tableName', + rules: [ + { + required: true, + message: '请输入表名', + trigger: 'blur', + }, + ], + }, + { + label: '表前缀', + prop: 'tablePrefix', + hide: true, + rules: [ + { + required: true, + message: '请输入表前缀', + trigger: 'blur', + }, + ], + }, + { + label: '主键名', + prop: 'pkName', + hide: true, + rules: [ + { + required: true, + message: '请输入主键名', + trigger: 'blur', + }, + ], + }, + { + label: '服务名', + prop: 'serviceName', + search: true, + rules: [ + { + required: true, + message: '请输入服务名', + trigger: 'blur', + }, + ], + }, + { + label: '包名', + prop: 'packageName', + overHidden: true, + rules: [ + { + required: true, + message: '请输入包名', + trigger: 'blur', + }, + ], + }, + ], + }, + { + label: '模版配置', + prop: 'templateSetting', + icon: 'el-icon-copy-document', + column: [ + { + label: '模版类型', + prop: 'templateType', + type: 'select', + dicData: templateDic, + value: 'crud', + rules: [ + { + required: true, + message: '请选择模版类型', + trigger: 'blur', + }, + ], + }, + { + label: '作者信息', + prop: 'author', + value: 'BladeX', + rules: [ + { + required: true, + message: '请输入作者', + trigger: 'blur', + }, + ], + }, + { + label: '子表模型', + prop: 'subModelId', + type: 'select', + dicUrl: '/blade-develop/model/select', + props: { + label: 'modelName', + value: 'id', + }, + display: false, + hide: true, + }, + { + label: '子表外键', + prop: 'subFkId', + display: false, + hide: true, + }, + { + label: '树主键字段', + prop: 'treeId', + type: 'select', + dicData: [], + props: { + label: 'jdbcComment', + value: 'jdbcName', + }, + display: false, + hide: true, + }, + { + label: '树父主键字段', + prop: 'treePid', + type: 'select', + dicData: [], + props: { + label: 'jdbcComment', + value: 'jdbcName', + }, + display: false, + hide: true, + }, + { + label: '树名称字段', + prop: 'treeName', + type: 'select', + dicData: [], + props: { + label: 'jdbcComment', + value: 'jdbcName', + }, + display: false, + hide: true, + }, + ], + }, + { + label: '生成配置', + prop: 'codingSetting', + icon: 'el-icon-printer', + column: [ + { + label: '基础业务', + labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能', + prop: 'baseMode', + type: 'radio', + dicUrl: '/blade-system/dict/dictionary?code=yes_no', + props: { + label: 'dictValue', + value: 'dictKey', + }, + value: 2, + dataType: 'number', + hide: true, + rules: [ + { + required: true, + message: '请选择基础业务', + trigger: 'blur', + }, + ], + }, + { + label: '包装器', + labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段', + prop: 'wrapMode', + type: 'radio', + dicUrl: '/blade-system/dict/dictionary?code=yes_no', + props: { + label: 'dictValue', + value: 'dictKey', + }, + value: 2, + dataType: 'number', + hide: true, + rules: [ + { + required: true, + message: '请选择包装器', + trigger: 'blur', + }, + ], + }, + { + label: '远程调用', + labelTip: '配置是否使用Feign远程调用', + prop: 'feignMode', + type: 'radio', + dicUrl: '/blade-system/dict/dictionary?code=yes_no', + props: { + label: 'dictValue', + value: 'dictKey', + }, + value: 1, + dataType: 'number', + hide: true, + rules: [ + { + required: true, + message: '请选择基础业务', + trigger: 'blur', + }, + ], + }, + { + label: '代码风格', + labelTip: '选择不同底层实现的代码模版', + prop: 'codeStyle', + type: 'radio', + dicData: [ + { + label: 'saber3', + value: 'saber3', + }, + { + label: 'element-plus', + value: 'element-plus', + }, + ], + value: 'saber3', + hide: true, + rules: [ + { + required: true, + message: '请选择代码风格', + trigger: 'blur', + }, + ], + }, + { + label: '后端生成路径', + prop: 'apiPath', + span: 24, + hide: true, + rules: [ + { + required: true, + message: '请输入后端生成路径', + trigger: 'blur', + }, + ], + }, + { + label: '前端生成路径', + prop: 'webPath', + span: 24, + hide: true, + rules: [ + { + required: true, + message: '请输入前端生成路径', + trigger: 'blur', + }, + ], + }, + ], + }, + ], +}; + +export const genOption = { + labelWidth: 120, + column: [ + { + label: '上级菜单', + prop: 'menuId', + type: 'tree', + dicData: [], + span: 24, + hide: true, + addDisabled: false, + props: { + label: 'title', + }, + rules: [ + { + required: true, + message: '请选择上级菜单', + trigger: 'click', + }, + ], + }, + { + label: '数据源', + prop: 'datasourceId', + search: true, + span: 24, + type: 'select', + dicUrl: '/blade-develop/datasource/select', + props: { + label: 'name', + value: 'id', + }, + rules: [ + { + required: true, + message: '请选择数据源', + trigger: 'blur', + }, + ], + }, + { + label: '物理表名', + prop: 'modelTable', + type: 'tree', + slot: true, + filterable: true, + span: 24, + display: true, + dicData: [], + props: { + label: 'comment', + value: 'name', + }, + rules: [ + { + required: true, + message: '请输入数据库表名', + trigger: 'blur', + }, + ], + }, + { + label: '表单设计', + prop: 'modelForm', + type: 'select', + props: { + label: 'name', + value: 'id', + }, + dicData: [], + filterable: true, + display: false, + span: 24, + }, + { + label: '模型类名', + prop: 'modelClass', + display: false, + disabled: true, + rules: [ + { + required: true, + message: '请输入模型类名', + trigger: 'blur', + }, + ], + }, + { + label: '模型编号', + prop: 'modelCode', + display: false, + rules: [ + { + required: true, + message: '请输入模型编号', + trigger: 'blur', + }, + ], + }, + { + label: '模块名', + prop: 'codeName', + display: false, + rules: [ + { + required: true, + message: '请输入模块名', + trigger: 'blur', + }, + ], + }, + { + label: '表名', + prop: 'tableName', + display: false, + rules: [ + { + required: true, + message: '请输入表名', + trigger: 'blur', + }, + ], + }, + { + label: '表前缀', + prop: 'tablePrefix', + display: false, + rules: [ + { + required: true, + message: '请输入表前缀', + trigger: 'blur', + }, + ], + }, + { + label: '主键名', + prop: 'pkName', + display: false, + rules: [ + { + required: true, + message: '请输入主键名', + trigger: 'blur', + }, + ], + }, + { + label: '服务名', + prop: 'serviceName', + search: true, + rules: [ + { + required: true, + message: '请输入服务名', + trigger: 'blur', + }, + ], + }, + { + label: '包名', + prop: 'packageName', + overHidden: true, + rules: [ + { + required: true, + message: '请输入包名', + trigger: 'blur', + }, + ], + }, + { + label: '基础业务', + labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能', + prop: 'baseMode', + type: 'radio', + dicUrl: '/blade-system/dict/dictionary?code=yes_no', + props: { + label: 'dictValue', + value: 'dictKey', + }, + value: 2, + dataType: 'number', + hide: true, + rules: [ + { + required: true, + message: '请选择基础业务', + trigger: 'blur', + }, + ], + }, + { + label: '包装器', + labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段', + prop: 'wrapMode', + type: 'radio', + dicUrl: '/blade-system/dict/dictionary?code=yes_no', + props: { + label: 'dictValue', + value: 'dictKey', + }, + value: 2, + dataType: 'number', + hide: true, + rules: [ + { + required: true, + message: '请选择包装器', + trigger: 'blur', + }, + ], + }, + { + label: '远程调用', + labelTip: '配置是否使用Feign远程调用', + prop: 'feignMode', + type: 'radio', + dicUrl: '/blade-system/dict/dictionary?code=yes_no', + props: { + label: 'dictValue', + value: 'dictKey', + }, + value: 1, + dataType: 'number', + hide: true, + rules: [ + { + required: true, + message: '请选择基础业务', + trigger: 'blur', + }, + ], + }, + { + label: '代码风格', + labelTip: '选择不同底层实现的代码模版', + prop: 'codeStyle', + type: 'radio', + dicData: [ + { + label: 'saber3', + value: 'saber3', + }, + { + label: 'element-plus', + value: 'element-plus', + }, + ], + value: 'saber3', + hide: true, + rules: [ + { + required: true, + message: '请选择代码风格', + trigger: 'blur', + }, + ], + }, + { + label: '后端生成路径', + prop: 'apiPath', + span: 24, + hide: true, + rules: [ + { + required: true, + message: '请输入后端生成路径', + trigger: 'blur', + }, + ], + }, + { + label: '前端生成路径', + prop: 'webPath', + span: 24, + hide: true, + rules: [ + { + required: true, + message: '请输入前端生成路径', + trigger: 'blur', + }, + ], + }, + ], +}; diff --git a/src/option/tool/codesetting.js b/src/option/tool/codesetting.js new file mode 100644 index 0000000..2d53d2c --- /dev/null +++ b/src/option/tool/codesetting.js @@ -0,0 +1,229 @@ +export default { + height: 'auto', + calcHeight: 50, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + grid: true, + selection: true, + labelWidth: 120, + searchLabelWidth: 100, + menuWidth: 320, + dialogClickModal: false, + column: [ + { + label: '配置名称', + labelTip: '用于定义本配置的代表名称,实际不参与代码生成', + prop: 'name', + gridRow: true, + search: true, + rules: [ + { + required: true, + message: '请输入配置名称', + trigger: 'blur', + }, + ], + }, + { + label: '配置编号', + labelTip: '用于定义本配置的代表编号,实际不参与代码生成', + prop: 'code', + gridRow: true, + search: true, + rules: [ + { + required: true, + message: '请输入配置编号', + trigger: 'blur', + }, + ], + }, + { + label: '上级菜单', + prop: 'menuId', + type: 'tree', + dicData: [], + span: 24, + hide: true, + addDisabled: false, + props: { + label: 'title', + }, + rules: [ + { + required: true, + message: '请选择上级菜单', + trigger: 'click', + }, + ], + }, + { + label: '是否启用', + prop: 'status', + span: 24, + width: 85, + align: 'center', + slot: true, + gridRow: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '配置参数', + prop: 'settings', + display: false, + gridRow: true, + overHidden: true, + rules: [ + { + required: true, + message: '请输入服务名', + trigger: 'blur', + }, + ], + }, + { + label: '服务名', + prop: 'serviceName', + hide: true, + rules: [ + { + required: true, + message: '请输入服务名', + trigger: 'blur', + }, + ], + }, + { + label: '包名', + prop: 'packageName', + hide: true, + rules: [ + { + required: true, + message: '请输入包名', + trigger: 'blur', + }, + ], + }, + { + label: '基础业务', + labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能', + prop: 'baseMode', + type: 'radio', + dicUrl: '/blade-system/dict/dictionary?code=yes_no', + props: { + label: 'dictValue', + value: 'dictKey', + }, + value: 2, + dataType: 'number', + hide: true, + rules: [ + { + required: true, + message: '请选择基础业务', + trigger: 'blur', + }, + ], + }, + { + label: '包装器', + labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段', + prop: 'wrapMode', + type: 'radio', + dicUrl: '/blade-system/dict/dictionary?code=yes_no', + props: { + label: 'dictValue', + value: 'dictKey', + }, + value: 2, + dataType: 'number', + hide: true, + rules: [ + { + required: true, + message: '请选择包装器', + trigger: 'blur', + }, + ], + }, + { + label: '远程调用', + labelTip: '配置是否使用Feign远程调用', + prop: 'feignMode', + type: 'radio', + dicUrl: '/blade-system/dict/dictionary?code=yes_no', + props: { + label: 'dictValue', + value: 'dictKey', + }, + value: 1, + dataType: 'number', + hide: true, + rules: [ + { + required: true, + message: '请选择基础业务', + trigger: 'blur', + }, + ], + }, + { + label: '代码风格', + labelTip: '选择不同底层实现的代码模版', + prop: 'codeStyle', + type: 'radio', + dicData: [ + { + label: 'saber3', + value: 'saber3', + }, + { + label: 'element-plus', + value: 'element-plus', + }, + ], + value: 'saber3', + hide: true, + rules: [ + { + required: true, + message: '请选择代码风格', + trigger: 'blur', + }, + ], + }, + { + label: '后端生成路径', + prop: 'apiPath', + span: 24, + hide: true, + rules: [ + { + required: true, + message: '请输入后端生成路径', + trigger: 'blur', + }, + ], + }, + { + label: '前端生成路径', + prop: 'webPath', + span: 24, + hide: true, + rules: [ + { + required: true, + message: '请输入前端生成路径', + trigger: 'blur', + }, + ], + }, + ], +}; diff --git a/src/option/tool/formsetting.js b/src/option/tool/formsetting.js new file mode 100644 index 0000000..9fb0b62 --- /dev/null +++ b/src/option/tool/formsetting.js @@ -0,0 +1,95 @@ +export default { + height: 'auto', + calcHeight: 50, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + grid: true, + selection: true, + labelWidth: 120, + searchLabelWidth: 100, + menuWidth: 320, + dialogWidth: 500, + dialogClickModal: false, + column: [ + { + label: '数据源', + labelTip: '数据源管理配置的数据源列表', + prop: 'datasourceId', + hide: true, + editDisplay: false, + viewDisplay: false, + span: 24, + type: 'select', + dicUrl: '/blade-develop/datasource/select', + props: { + label: 'name', + value: 'id', + }, + rules: [ + { + required: true, + message: '请选择数据源', + trigger: 'blur', + }, + ], + }, + { + label: '物理表名', + labelTip: '从数据源列表选择的物理表名', + filterable: true, + prop: 'modelTable', + type: 'tree', + span: 24, + hide: true, + editDisplay: false, + viewDisplay: false, + dicData: [], + props: { + label: 'comment', + value: 'name', + }, + rules: [ + { + required: true, + message: '请输入数据库表名', + trigger: 'blur', + }, + ], + }, + { + label: '表单名称', + labelTip: '用于定义本配置的代表名称,默认为数据库表说明', + prop: 'name', + gridRow: true, + search: true, + span: 24, + rules: [ + { + required: true, + message: '请输入表单名称', + trigger: 'blur', + }, + ], + }, + { + label: '关联表名', + labelTip: '用于定义本配置的代表编号,默认为数据库表名,在代码快速生成时会关联匹配', + prop: 'code', + gridRow: true, + search: true, + disabled: true, + span: 24, + rules: [ + { + required: true, + message: '请输入表单编号', + trigger: 'blur', + }, + ], + }, + ], +}; diff --git a/src/page/index/index.vue b/src/page/index/index.vue new file mode 100644 index 0000000..9814250 --- /dev/null +++ b/src/page/index/index.vue @@ -0,0 +1,111 @@ + + + diff --git a/src/page/index/layout.vue b/src/page/index/layout.vue new file mode 100644 index 0000000..0439730 --- /dev/null +++ b/src/page/index/layout.vue @@ -0,0 +1,7 @@ + diff --git a/src/page/index/logo.vue b/src/page/index/logo.vue new file mode 100644 index 0000000..8963ecc --- /dev/null +++ b/src/page/index/logo.vue @@ -0,0 +1,44 @@ + + + + diff --git a/src/page/index/search.vue b/src/page/index/search.vue new file mode 100644 index 0000000..0efc90e --- /dev/null +++ b/src/page/index/search.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/src/page/index/setting.vue b/src/page/index/setting.vue new file mode 100644 index 0000000..e490500 --- /dev/null +++ b/src/page/index/setting.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/src/page/index/sidebar/index.vue b/src/page/index/sidebar/index.vue new file mode 100644 index 0000000..e98ce1f --- /dev/null +++ b/src/page/index/sidebar/index.vue @@ -0,0 +1,63 @@ + + + + diff --git a/src/page/index/sidebar/sidebarItem.vue b/src/page/index/sidebar/sidebarItem.vue new file mode 100644 index 0000000..2ca8e46 --- /dev/null +++ b/src/page/index/sidebar/sidebarItem.vue @@ -0,0 +1,105 @@ + + diff --git a/src/page/index/tags.vue b/src/page/index/tags.vue new file mode 100644 index 0000000..e975be3 --- /dev/null +++ b/src/page/index/tags.vue @@ -0,0 +1,192 @@ + + diff --git a/src/page/index/top/index.vue b/src/page/index/top/index.vue new file mode 100644 index 0000000..8ca0c4f --- /dev/null +++ b/src/page/index/top/index.vue @@ -0,0 +1,364 @@ + + + + diff --git a/src/page/index/top/top-color.vue b/src/page/index/top/top-color.vue new file mode 100644 index 0000000..429ff13 --- /dev/null +++ b/src/page/index/top/top-color.vue @@ -0,0 +1,75 @@ + + + diff --git a/src/page/index/top/top-full.vue b/src/page/index/top/top-full.vue new file mode 100644 index 0000000..099d698 --- /dev/null +++ b/src/page/index/top/top-full.vue @@ -0,0 +1,24 @@ + + diff --git a/src/page/index/top/top-lang.vue b/src/page/index/top/top-lang.vue new file mode 100644 index 0000000..b623ade --- /dev/null +++ b/src/page/index/top/top-lang.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/page/index/top/top-lock.vue b/src/page/index/top/top-lock.vue new file mode 100644 index 0000000..cd70b5c --- /dev/null +++ b/src/page/index/top/top-lock.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/page/index/top/top-logs.vue b/src/page/index/top/top-logs.vue new file mode 100644 index 0000000..1c22381 --- /dev/null +++ b/src/page/index/top/top-logs.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/src/page/index/top/top-menu.vue b/src/page/index/top/top-menu.vue new file mode 100644 index 0000000..4f077ff --- /dev/null +++ b/src/page/index/top/top-menu.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/page/index/top/top-search.vue b/src/page/index/top/top-search.vue new file mode 100644 index 0000000..a3da15d --- /dev/null +++ b/src/page/index/top/top-search.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/page/index/top/top-theme.vue b/src/page/index/top/top-theme.vue new file mode 100644 index 0000000..1e2b93d --- /dev/null +++ b/src/page/index/top/top-theme.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/page/index/wechat.vue b/src/page/index/wechat.vue new file mode 100644 index 0000000..6a1a08d --- /dev/null +++ b/src/page/index/wechat.vue @@ -0,0 +1,59 @@ + + diff --git a/src/page/lock/index.vue b/src/page/lock/index.vue new file mode 100644 index 0000000..7bd3a9e --- /dev/null +++ b/src/page/lock/index.vue @@ -0,0 +1,108 @@ + + + + diff --git a/src/page/login/authredirect.vue b/src/page/login/authredirect.vue new file mode 100644 index 0000000..67a8588 --- /dev/null +++ b/src/page/login/authredirect.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/page/login/codelogin.vue b/src/page/login/codelogin.vue new file mode 100644 index 0000000..ba7cf60 --- /dev/null +++ b/src/page/login/codelogin.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/src/page/login/facelogin.vue b/src/page/login/facelogin.vue new file mode 100644 index 0000000..e1da201 --- /dev/null +++ b/src/page/login/facelogin.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/page/login/index.vue b/src/page/login/index.vue new file mode 100644 index 0000000..abbb8ee --- /dev/null +++ b/src/page/login/index.vue @@ -0,0 +1,160 @@ + + diff --git a/src/page/login/registerlogin.vue b/src/page/login/registerlogin.vue new file mode 100644 index 0000000..7e5c6b4 --- /dev/null +++ b/src/page/login/registerlogin.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/src/page/login/thirdlogin.vue b/src/page/login/thirdlogin.vue new file mode 100644 index 0000000..53360bb --- /dev/null +++ b/src/page/login/thirdlogin.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/page/login/userlogin.vue b/src/page/login/userlogin.vue new file mode 100644 index 0000000..5e3a1d1 --- /dev/null +++ b/src/page/login/userlogin.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/src/permission.js b/src/permission.js new file mode 100644 index 0000000..387889a --- /dev/null +++ b/src/permission.js @@ -0,0 +1,59 @@ +import router from './router/'; +import store from './store'; +import { tabKeyOf } from '@/router/tab'; +import { getToken } from '@/utils/auth'; +import NProgress from 'nprogress'; // progress bar +import 'nprogress/nprogress.css'; // progress bar style +NProgress.configure({ showSpinner: false }); +const lockPage = '/lock'; //锁屏页 +router.beforeEach((to, from, next) => { + const meta = to.meta || {}; + const isMenu = meta.menu === undefined ? to.query.menu : meta.menu; + store.commit('SET_IS_MENU', isMenu === undefined); + if (getToken()) { + if (store.getters.isLock && to.path !== lockPage) { + //如果系统激活锁屏,全部跳转到锁屏页 + next({ path: lockPage }); + } else if (to.path === '/login') { + //如果登录成功访问登录页跳转到主页 + next({ path: '/' }); + } else { + if (store.getters.token.length === 0) { + store.dispatch('FedLogOut').then(() => { + next({ path: '/login' }); + }); + } else { + const meta = to.meta || {}; + const query = to.query || {}; + if (meta.target) { + window.open(query.url.replace(/#/g, '&')); + return; + } else if (meta.isTab !== false) { + store.commit('ADD_TAG', { + name: query.name || to.name, + path: to.path, + fullPath: tabKeyOf(to), + params: to.params, + query: to.query, + meta: meta, + }); + } + next(); + } + } + } else { + //判断是否需要认证,没有登录访问去登录页 + if (meta.isAuth === false) { + next(); + } else { + next('/login'); + } + } +}); + +router.afterEach(to => { + NProgress.done(); + let title = router.$avueRouter.generateTitle(to, { label: 'name' }); + router.$avueRouter.setTitle(title); + store.commit('SET_IS_SEARCH', false); +}); diff --git a/src/router/avue-router.js b/src/router/avue-router.js new file mode 100644 index 0000000..cd348a7 --- /dev/null +++ b/src/router/avue-router.js @@ -0,0 +1,232 @@ +import website from '@/config/website'; +import { getToken } from '@/utils/auth'; +import store from '@/store'; +import { generateIframePath, processUrlForQuery, isURL } from './router'; +const modules = import.meta.glob('../**/**/*.vue'); + +// 将多级路由扁平化为二级路由,支持 keep-alive 跨层级缓存 +function flattenRouteChildren(children) { + const result = []; + for (const child of children) { + if (child.children && child.children.length > 0) { + result.push(...flattenRouteChildren(child.children)); + } else { + result.push(child); + } + } + return result; +} + +let RouterPlugin = function () { + this.$router = null; + this.$store = null; +}; +RouterPlugin.install = function (option = {}) { + this.$router = option.router; + this.$store = option.store; + let i18n = option.i18n.global; + this.$router.$avueRouter = { + safe: this, + // 设置标题 + setTitle: title => { + const defaultTitle = i18n.t('title'); + title = title ? `${title} | ${defaultTitle}` : defaultTitle; + document.title = title; + }, + closeTag: value => { + let tag = value || this.$store.getters.tag; + if (typeof value === 'string') { + tag = this.$store.getters.tagList.find(ele => ele.fullPath === value); + } + this.$store.commit('DEL_TAG', tag); + }, + generateTitle: (item, props = {}) => { + let query = item[props.query || 'query'] || {}; + let title = query.name || item[props.label || 'label']; + let meta = item[props.meta || 'meta'] || {}; + let key = meta.i18n; + if (key) { + const hasKey = i18n.te('route.' + key); + if (hasKey) return i18n.t('route.' + key); + } + return title ? title.split(',')[0] : title; + }, + //动态路由 + formatRoutes: function (aMenu = [], first) { + const aRouter = []; + const propsDefault = website.menu; + + if (aMenu && aMenu.length === 0) return; + for (let i = 0; i < aMenu.length; i++) { + const oMenu = aMenu[i]; + let path = oMenu[propsDefault.path], + isComponent = true, + component = oMenu.component, + name = oMenu[propsDefault.label] + ',' + oMenu.id, + icon = oMenu[propsDefault.icon], + children = oMenu[propsDefault.children], + query = oMenu[propsDefault.query], + meta = oMenu[propsDefault.meta]; + + // 处理iframe场景,如果path是URL且是一级路由,需要生成一个内部路径 + const isUrlPath = isURL(path); + if (isUrlPath && first && !children?.length) { + // 保存原始URL到query中(如果formatPath还没处理) + if (!query || !query.url) { + query = { url: processUrlForQuery(path) }; + } + // 生成一个内部路径用于路由 + const generatedPath = generateIframePath(oMenu, propsDefault.path); + if (generatedPath !== path) { + path = generatedPath; + oMenu[propsDefault.path] = path; + } + // 确保使用iframe组件 + if (!component || component.indexOf('iframe') === -1) { + component = 'components/iframe/main'; + oMenu.component = component; + } + } + if (option.keepAlive) { + meta.keepAlive = option.keepAlive; + } + const isChild = !!(children && children.length !== 0); + const oRouter = { + path: path, + component: (() => { + // 判断是否为首路由 + if (first) { + return modules[ + option.store.getters.isMacOs || !website.setting.menu + ? '../page/index/layout.vue' + : '../page/index/index.vue' + ]; + // 判断是否为多层路由 + } else if (isChild && !first) { + return modules['../page/index/layout.vue']; + // 判断是否为最终的页面视图 + } else { + let result = modules[`../${component}.vue`]; + if (!result) { + isComponent = false; + } + return result; + } + })(), + name, + icon, + meta, + query, + redirect: (() => { + if (!isChild && first) return `${path}`; + else return ''; + })(), + // 处理是否为一级路由 + children: !isChild + ? (() => { + if (first) { + oMenu[propsDefault.path] = `${path}`; + let componentPath = oMenu.component || component; + let result = modules[`../${componentPath}.vue`]; + if (!result) { + isComponent = false; + } + let childName = name + '_index'; + let childQuery = oMenu[propsDefault.query] || query; + return [ + { + component: result, + icon: icon, + name: childName, + meta: meta, + query: childQuery, + path: '', + }, + ]; + } + return []; + })() + : (() => { + return this.formatRoutes(children, false); + })(), + }; + const isIframeRoute = + component === 'components/iframe/main' || oMenu.component === 'components/iframe/main'; + if ((!isURL(path) || isIframeRoute) && isComponent) aRouter.push(oRouter); + } + if (first) { + aRouter.forEach(ele => { + // 将三级及更深路由扁平化为二级,确保所有叶子组件都由 index.vue 的 keep-alive 统一管理 + if (ele.children && ele.children.length > 0) { + ele.children = flattenRouteChildren(ele.children); + } + this.safe.$router.addRoute(ele); + }); + } else { + return aRouter; + } + }, + }; +}; +export const formatPath = (ele, first) => { + const propsDefault = website.menu; + const icon = ele[propsDefault.icon]; + ele[propsDefault.icon] = !icon ? propsDefault.iconDefault : icon; + ele.meta = { + keepAlive: ele.isOpen === 2, + }; + const iframeComponent = 'components/iframe/main'; + const iframeSrc = href => { + // 替换&为# + let processedHref = href.replace(/&/g, '#'); + + // 获取用户信息 + const userInfo = store.getters.userInfo || {}; + const userToken = getToken() || ''; + + // 定义替换参数映射 + const replacements = { + token: userToken, + userId: userInfo.userId || '', + userName: userInfo.userName || '', + roleName: userInfo.roleName || '', + }; + + // 统一替换所有参数 + Object.entries(replacements).forEach(([key, value]) => { + const pattern = new RegExp(`\\$\\{${key}\\}`, 'g'); + processedHref = processedHref.replace(pattern, value); + }); + + return processedHref; + }; + const isChild = !!(ele[propsDefault.children] && ele[propsDefault.children].length !== 0); + if (!isChild && first) { + ele.component = 'views' + ele[propsDefault.path]; + if (isURL(ele[propsDefault.href])) { + let href = ele[propsDefault.href]; + ele.component = iframeComponent; + ele[propsDefault.query] = { + url: iframeSrc(href), + }; + } + } else { + ele[propsDefault.children] && + ele[propsDefault.children].forEach(child => { + child.component = 'views' + child[propsDefault.path]; + child.meta = { + keepAlive: child.isOpen === 2, + }; + if (isURL(child[propsDefault.href])) { + let href = child[propsDefault.href]; + child[propsDefault.path] = ele[propsDefault.path] + '/' + child.code; + child.component = iframeComponent; + child[propsDefault.query] = { + url: iframeSrc(href), + }; + } + formatPath(child); + }); + } +}; +export default RouterPlugin; diff --git a/src/router/ext/index.js b/src/router/ext/index.js new file mode 100644 index 0000000..d6d1738 --- /dev/null +++ b/src/router/ext/index.js @@ -0,0 +1 @@ +export default []; diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..f67b788 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,33 @@ +import { createRouter, createWebHistory } from 'vue-router'; +import ExtRouter from './ext/'; +import PageRouter from './page/'; +import ViewsRouter from './views/'; +import AvueRouter from './avue-router'; +import i18n from '@/lang'; +import Store from '@/store/'; +//创建路由 +const Router = createRouter({ + base: import.meta.env.VITE_APP_BASE, + history: createWebHistory(import.meta.env.VITE_APP_BASE), + routes: [...ExtRouter, ...PageRouter, ...ViewsRouter], +}); +AvueRouter.install({ + store: Store, + router: Router, + i18n: i18n, +}); + +Router.$avueRouter.formatRoutes(Store.getters.menuAll, true); + +export function resetRouter() { + // 重置路由 比如用于身份验证失败,需要重新登录时 先清空当前的路有权限 + const newRouter = createRouter(); + Router.matcher = newRouter.matcher; // reset router + AvueRouter.install(Vue, { + router: Router, + store: Store, + i18n: i18n, + }); +} + +export default Router; diff --git a/src/router/page/index.js b/src/router/page/index.js new file mode 100644 index 0000000..3a148f7 --- /dev/null +++ b/src/router/page/index.js @@ -0,0 +1,72 @@ +import Store from '@/store/'; + +export default [ + { + path: '/login', + name: '登录页', + component: () => + Store.getters.isMacOs ? import('@/mac/login.vue') : import('@/page/login/index.vue'), + meta: { + keepAlive: true, + isTab: false, + isAuth: false, + }, + }, + { + path: '/oauth/redirect/:source', + name: '第三方登录', + component: () => + Store.getters.isMacOs ? import('@/mac/login.vue') : import('@/page/login/index.vue'), + meta: { + keepAlive: true, + isTab: false, + isAuth: false, + }, + }, + { + path: '/lock', + name: '锁屏页', + component: () => + Store.getters.isMacOs ? import('@/mac/lock.vue') : import('@/page/lock/index.vue'), + meta: { + keepAlive: true, + isTab: false, + isAuth: false, + }, + }, + { + path: '/404', + component: () => import(/* webpackChunkName: "page" */ '@/components/error-page/404.vue'), + name: '404', + meta: { + keepAlive: true, + isTab: false, + isAuth: false, + }, + }, + { + path: '/403', + component: () => import(/* webpackChunkName: "page" */ '@/components/error-page/403.vue'), + name: '403', + meta: { + keepAlive: true, + isTab: false, + isAuth: false, + }, + }, + { + path: '/500', + component: () => import(/* webpackChunkName: "page" */ '@/components/error-page/500.vue'), + name: '500', + meta: { + keepAlive: true, + isTab: false, + isAuth: false, + }, + }, + { + path: '/', + name: '主页', + redirect: '/wel', + }, +]; diff --git a/src/router/router.js b/src/router/router.js new file mode 100644 index 0000000..4863fcc --- /dev/null +++ b/src/router/router.js @@ -0,0 +1,78 @@ +/** + * 路由工具函数 + */ + +// 统一的URL正则表达式 +export const URL_REGEX = /^https?:\/\//; + +/** + * 生成iframe路径 + * @param {Object} item - 菜单项 + * @param {String} pathKey - 路径字段名 + * @returns {String} 生成的路径 + */ +export function generateIframePath(item, pathKey = 'path') { + const path = item[pathKey]; + if (!path) return path; + + // 如果是URL且有ID,生成iframe路径 + if (URL_REGEX.test(path) && item.id) { + return `/iframe/${item.id}`; + } + return path; +} + +/** + * 处理URL参数,将&替换为#以避免路由参数问题 + * @param {String} url - 原始URL + * @returns {String} 处理后的URL + */ +export function processUrlForQuery(url) { + if (!url) return url; + return url.replace(/&/g, '#'); +} + +/** + * 生成iframe的query参数 + * @param {Object} item - 菜单项 + * @param {String} pathKey - 路径字段名 + * @param {String} queryKey - query字段名 + * @returns {Object} query参数 + */ +export function generateIframeQuery(item, pathKey = 'path', queryKey = 'query') { + const originalPath = item[pathKey]; + const existingQuery = item[queryKey] || {}; + + // 如果是URL且没有url参数,添加处理后的URL + if (URL_REGEX.test(originalPath)) { + // 保留现有query,只在没有url时添加 + if (!existingQuery.url) { + return { + ...existingQuery, + url: processUrlForQuery(originalPath) + }; + } + } + + return existingQuery; +} + +/** + * 判断是否为iframe路由 + * @param {String} path - 当前路径 + * @param {String} originalPath - 原始路径 + * @returns {Boolean} 是否为iframe路由 + */ +export function isIframeRoute(path, originalPath) { + // 路径以/iframe/开头且原始路径是URL + return path && path.startsWith('/iframe/') && URL_REGEX.test(originalPath); +} + +/** + * 判断路径是否为URL + * @param {String} path - 路径 + * @returns {Boolean} 是否为URL + */ +export function isURL(path) { + return URL_REGEX.test(path); +} \ No newline at end of file diff --git a/src/router/tab.js b/src/router/tab.js new file mode 100644 index 0000000..f715c00 --- /dev/null +++ b/src/router/tab.js @@ -0,0 +1,132 @@ +import { h } from 'vue'; +import store from '@/store'; +import website from '@/config/website'; +import { isURL } from './router'; +import { formatPath } from './avue-router'; + +/** + * 标签页键控体系 + * + * 三档键控语义: + * 1. 默认:以含参数的完整地址为键,地址不同(含参数不同)即独立标签、独立缓存 + * 2. meta.tabKey = 'path':以纯路径为键,同路径不同参数复用同一标签,参数原位刷新, + * 页面通过监听 $route.query 感知变化;菜单地址追加保留参数 _single=1 即启用 + * 3. meta.isTab = false:不纳入标签体系,视图原样透传,由容器页自行管理 + */ + +/** + * 单标签模式的保留参数,仅作配置开关,不进入业务 query + */ +const SINGLE_TAB_PARAM = '_single'; + +/** + * 拆分地址中的参数部分 + */ +export function parsePathQuery(fullPath) { + const splitIndex = fullPath.indexOf('?'); + if (splitIndex === -1) return { path: fullPath, query: {} }; + const query = {}; + new URLSearchParams(fullPath.slice(splitIndex + 1)).forEach((value, key) => { + query[key] = value; + }); + return { path: fullPath.slice(0, splitIndex), query }; +} + +/** + * 菜单树归一化:把配置在地址中的参数拆入 query 字段 + * 组件解析与路由注册都依赖纯路径,须在 formatPath 之前执行 + */ +export function normalizeMenu(menuList = []) { + const props = website.menu; + menuList.forEach(item => { + const rawPath = item[props.path]; + if (rawPath && !isURL(rawPath) && rawPath.includes('?')) { + const { path, query } = parsePathQuery(rawPath); + item[props.path] = path; + item[props.query] = { ...query, ...(item[props.query] || {}) }; + } + if (item[props.children] && item[props.children].length) { + normalizeMenu(item[props.children]); + } + }); +} + +/** + * 标签键控元数据落位:识别保留参数并写入 meta + * formatPath 会重建菜单的 meta 对象,须在其之后执行 + */ +export function applyTabMeta(menuList = []) { + const props = website.menu; + menuList.forEach(item => { + const query = item[props.query]; + if (query && query[SINGLE_TAB_PARAM] !== undefined) { + delete query[SINGLE_TAB_PARAM]; + item.meta = item.meta || {}; + item.meta.tabKey = 'path'; + } + if (item[props.children] && item[props.children].length) { + applyTabMeta(item[props.children]); + } + }); +} + +/** + * 菜单格式化入口:归一化 → 框架格式化 → 键控元数据落位 + */ +export function formatMenu(menuList = []) { + normalizeMenu(menuList); + menuList.forEach(ele => formatPath(ele, true)); + applyTabMeta(menuList); +} + +/** + * 路由的标签键:决定标签归属与缓存粒度,不纳入标签体系时返回 null + */ +export function tabKeyOf(route) { + const meta = route.meta || {}; + if (meta.isTab === false) return null; + return meta.tabKey === 'path' ? route.path : route.fullPath; +} + +/** + * 视图代理组件池:以标签键命名代理组件,使 keep-alive 的缓存实例与 + * include 白名单都按标签粒度精确控制,同一页面组件开多个标签互不共享实例 + */ +const wrapperMap = new Map(); + +let cleanupWatched = false; + +/** + * 标签关闭后回收对应代理组件,避免长期驻留 + */ +function watchTagCleanup() { + if (cleanupWatched) return; + cleanupWatched = true; + store.subscribe(mutation => { + if (['DEL_TAG', 'DEL_ALL_TAG', 'DEL_TAG_OTHER'].includes(mutation.type)) { + const alive = new Set(store.getters.tagList.map(tag => tag.fullPath)); + wrapperMap.forEach((wrapper, key) => { + if (!alive.has(key)) wrapperMap.delete(key); + }); + } + }); +} + +/** + * 主布局 router-view 的渲染入口 + */ +export function tabView(route, Component) { + if (!Component) return Component; + const tabKey = tabKeyOf(route); + if (!tabKey) return Component; + watchTagCleanup(); + let wrapper = wrapperMap.get(tabKey); + if (!wrapper) { + wrapper = { + name: tabKey, + render: () => h(Component), + }; + wrapperMap.set(tabKey, wrapper); + } + return h(wrapper); +} diff --git a/src/router/views/index.js b/src/router/views/index.js new file mode 100644 index 0000000..a1c8c7d --- /dev/null +++ b/src/router/views/index.js @@ -0,0 +1,126 @@ +import Layout from '@/page/index/index.vue'; +import Store from '@/store/'; + +export default [ + { + path: '/wel', + component: () => + Store.getters.isMacOs ? import('@/mac/index.vue') : import('@/page/index/index.vue'), + redirect: '/wel/index', + children: [ + { + path: 'index', + name: '首页', + meta: { + i18n: 'dashboard', + }, + component: () => import(/* webpackChunkName: "views" */ '@/views/wel/index.vue'), + }, + { + path: 'dashboard', + name: '控制台', + meta: { + i18n: 'dashboard', + menu: false, + }, + component: () => import(/* webpackChunkName: "views" */ '@/views/wel/dashboard.vue'), + }, + ], + }, + { + path: '/test', + component: Layout, + redirect: '/test/index', + children: [ + { + path: 'index', + name: '测试页', + meta: { + i18n: 'test', + }, + component: () => import(/* webpackChunkName: "views" */ '@/views/util/test.vue'), + }, + ], + }, + { + path: '/dict-horizontal', + component: Layout, + redirect: '/dict-horizontal/index', + children: [ + { + path: 'index', + name: '字典管理', + meta: { + i18n: 'dict', + }, + component: () => + import(/* webpackChunkName: "views" */ '@/views/util/demo/dict-horizontal.vue'), + }, + ], + }, + { + path: '/dict-vertical', + component: Layout, + redirect: '/dict-vertical/index', + children: [ + { + path: 'index', + name: '字典管理', + meta: { + i18n: 'dict', + }, + component: () => + import(/* webpackChunkName: "views" */ '@/views/util/demo/dict-vertical.vue'), + }, + ], + }, + { + path: '/info', + component: Layout, + redirect: '/info/index', + children: [ + { + path: 'index', + name: '个人信息', + meta: { + i18n: 'info', + }, + component: () => import(/* webpackChunkName: "views" */ '@/views/system/userinfo.vue'), + }, + ], + }, + { + path: '/work/process/leave', + component: Layout, + redirect: '/work/process/leave/form', + children: [ + { + path: 'form/:processDefinitionId', + name: '请假流程', + meta: { + i18n: 'work', + }, + component: () => + import(/* webpackChunkName: "views" */ '@/views/work/process/leave/form.vue'), + }, + { + path: 'handle/:taskId/:processInstanceId/:businessId', + name: '处理请假流程', + meta: { + i18n: 'work', + }, + component: () => + import(/* webpackChunkName: "views" */ '@/views/work/process/leave/handle.vue'), + }, + { + path: 'detail/:processInstanceId/:businessId', + name: '请假流程详情', + meta: { + i18n: 'work', + }, + component: () => + import(/* webpackChunkName: "views" */ '@/views/work/process/leave/detail.vue'), + }, + ], + }, +]; diff --git a/src/store/getters.js b/src/store/getters.js new file mode 100644 index 0000000..3edda43 --- /dev/null +++ b/src/store/getters.js @@ -0,0 +1,37 @@ +const getters = { + tag: state => state.tags.tag, + language: state => state.common.language, + setting: state => state.common.setting, + userInfo: state => state.user.userInfo, + colorName: state => state.common.colorName, + themeName: state => state.common.themeName, + isMacOs: (state, getters) => getters.themeName === 'mac-os', + isRefresh: state => state.common.isRefresh, + isSearch: state => state.common.isSearch, + isHorizontal: state => state.common.setting.sidebar === 'horizontal', + isCollapse: state => state.common.isCollapse, + isLock: state => state.common.isLock, + isFullScren: state => state.common.isFullScren, + isMenu: state => state.common.isMenu, + lockPasswd: state => state.common.lockPasswd, + tagList: state => state.tags.tagList, + tagsKeep: (state, getters) => { + return getters.tagList + .filter(ele => { + return (ele.meta || {}).keepAlive; + }) + .map(ele => ele.fullPath); + }, + tagWel: state => state.tags.tagWel, + token: state => state.user.token, + roles: state => state.user.roles, + permission: state => state.user.permission, + menuId: state => state.user.menuId, + menu: state => state.user.menu, + menuAll: state => state.user.menuAll, + logsList: state => state.logs.logsList, + logsLen: state => state.logs.logsList.length || 0, + logsFlag: (state, getters) => getters.logsLen === 0, + flowRoutes: state => state.dict.flowRoutes, +}; +export default getters; diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..a764d4b --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,20 @@ +import { createStore } from 'vuex'; +import user from './modules/user'; +import common from './modules/common'; +import tags from './modules/tags'; +import logs from './modules/logs'; +import dict from './modules/dict'; +import getters from './getters'; + +const store = createStore({ + modules: { + user, + common, + logs, + tags, + dict, + }, + getters, +}); + +export default store; diff --git a/src/store/modules/common.js b/src/store/modules/common.js new file mode 100644 index 0000000..507143b --- /dev/null +++ b/src/store/modules/common.js @@ -0,0 +1,86 @@ +import { setStore, getStore, removeStore } from 'utils/store'; +import website from '@/config/website'; + +const common = { + state: { + language: getStore({ name: 'language' }) || 'zh-cn', + isCollapse: false, + isFullScren: false, + isMenu: true, + isSearch: false, + isRefresh: true, + isLock: getStore({ name: 'isLock' }), + colorName: getStore({ name: 'colorName' }) || '#2C77F1', + themeName: getStore({ name: 'themeName' }) || 'theme-go', + lockPasswd: getStore({ name: 'lockPasswd' }) || '', + website: website, + setting: website.setting, + }, + mutations: { + SET_LANGUAGE: (state, language) => { + state.language = language; + setStore({ + name: 'language', + content: state.language, + }); + }, + SET_COLLAPSE: state => { + state.isCollapse = !state.isCollapse; + }, + SET_IS_MENU: (state, menu) => { + state.isMenu = menu; + }, + SET_IS_REFRESH: (state, refresh) => { + state.isRefresh = refresh; + }, + SET_IS_SEARCH: (state, search) => { + state.isSearch = search; + }, + SET_FULLSCREN: state => { + state.isFullScren = !state.isFullScren; + }, + SET_LOCK: state => { + state.isLock = true; + setStore({ + name: 'isLock', + content: state.isLock, + type: 'session', + }); + }, + SET_COLOR_NAME: (state, colorName) => { + state.colorName = colorName; + setStore({ + name: 'colorName', + content: state.colorName, + }); + }, + SET_THEME_NAME: (state, themeName) => { + state.themeName = themeName; + setStore({ + name: 'themeName', + content: state.themeName, + }); + }, + SET_LOCK_PASSWD: (state, lockPasswd) => { + state.lockPasswd = lockPasswd; + setStore({ + name: 'lockPasswd', + content: state.lockPasswd, + type: 'session', + }); + }, + CLEAR_LOCK: state => { + state.isLock = false; + state.lockPasswd = ''; + removeStore({ + name: 'lockPasswd', + type: 'session', + }); + removeStore({ + name: 'isLock', + type: 'session', + }); + }, + }, +}; +export default common; diff --git a/src/store/modules/dict.js b/src/store/modules/dict.js new file mode 100644 index 0000000..69894ed --- /dev/null +++ b/src/store/modules/dict.js @@ -0,0 +1,36 @@ +import { getStore, setStore } from '@/utils/store'; + +import { getDictionary } from '@/api/system/dict'; + +const dict = { + state: { + flowRoutes: getStore({ name: 'flowRoutes' }) || {}, + }, + actions: { + FlowRoutes({ commit }) { + return new Promise((resolve, reject) => { + getDictionary({ code: 'flow' }) + .then(res => { + commit('SET_FLOW_ROUTES', res.data.data); + resolve(); + }) + .catch(error => { + reject(error); + }); + }); + }, + }, + mutations: { + SET_FLOW_ROUTES: (state, data) => { + state.flowRoutes = data.map(item => { + return { + routeKey: `${item.code}_${item.dictKey}`, + routeValue: item.remark, + }; + }); + setStore({ name: 'flowRoutes', content: state.flowRoutes }); + }, + }, +}; + +export default dict; diff --git a/src/store/modules/logs.js b/src/store/modules/logs.js new file mode 100644 index 0000000..b9d7d86 --- /dev/null +++ b/src/store/modules/logs.js @@ -0,0 +1,49 @@ +import { setStore, getStore } from 'utils/store'; +import dayjs from 'dayjs'; +import { sendLogs } from '@/api/user'; + +const logs = { + state: { + logsList: getStore({ name: 'logsList' }) || [], + }, + actions: { + //发送错误日志 + SendLogs({ state, commit }) { + return new Promise((resolve, reject) => { + sendLogs(state.logsList) + .then(() => { + commit('CLEAR_LOGS'); + resolve(); + }) + .catch(error => { + reject(error); + }); + }); + }, + }, + mutations: { + ADD_LOGS: (state, { type, message, stack, info }) => { + state.logsList.push( + Object.assign( + { + url: window.location.href, + time: dayjs().format('YYYY-MM-DD HH:mm:ss'), + }, + { + type, + message, + stack, + info: info.toString(), + } + ) + ); + setStore({ name: 'logsList', content: state.logsList }); + }, + CLEAR_LOGS: state => { + state.logsList = []; + setStore({ name: 'logsList', content: state.logsList }); + }, + }, +}; + +export default logs; diff --git a/src/store/modules/tags.js b/src/store/modules/tags.js new file mode 100644 index 0000000..46e7d43 --- /dev/null +++ b/src/store/modules/tags.js @@ -0,0 +1,57 @@ +import { setStore, getStore } from 'utils/store'; +import website from '@/config/website'; + +const tagWel = website.fistPage; +const navs = { + state: { + tagList: getStore({ name: 'tagList' }) || [], + tag: getStore({ name: 'tag' }) || {}, + tagWel: tagWel, + }, + mutations: { + ADD_TAG: (state, action) => { + if (typeof action.name == 'function') action.name = action.name(action.query); + state.tag = action; + setStore({ name: 'tag', content: state.tag }); + const tagItem = state.tagList.find(ele => ele.fullPath == action.fullPath); + if (tagItem) { + // 同键标签允许以新参数再次进入,原位刷新避免参数固化在首次值 + tagItem.query = action.query; + tagItem.params = action.params; + tagItem.meta = action.meta; + setStore({ name: 'tagList', content: state.tagList }); + return; + } + state.tagList.push(action); + setStore({ name: 'tagList', content: state.tagList }); + }, + SET_TAG: (state, action) => { + const idx = state.tagList.findIndex(item => item.fullPath === action.fullPath); + if (idx === -1) return; + const updated = { ...state.tagList[idx], ...action }; + state.tagList.splice(idx, 1, updated); + if (state.tag?.fullPath === action.fullPath) { + state.tag = updated; + setStore({ name: 'tag', content: state.tag }); + } + setStore({ name: 'tagList', content: state.tagList }); + }, + DEL_TAG: (state, action) => { + state.tagList = state.tagList.filter(item => { + return item.fullPath !== action.fullPath; + }); + setStore({ name: 'tagList', content: state.tagList }); + }, + DEL_ALL_TAG: (state, tagList = []) => { + state.tagList = tagList; + setStore({ name: 'tagList', content: state.tagList }); + }, + DEL_TAG_OTHER: state => { + state.tagList = state.tagList.filter(item => { + return [state.tag.fullPath, website.fistPage.path].includes(item.fullPath); + }); + setStore({ name: 'tagList', content: state.tagList }); + }, + }, +}; +export default navs; diff --git a/src/store/modules/user.js b/src/store/modules/user.js new file mode 100644 index 0000000..ae8648a --- /dev/null +++ b/src/store/modules/user.js @@ -0,0 +1,388 @@ +import { + setToken, + setRefreshToken, + removeToken, + removeRefreshToken, + getRefreshToken, +} from '@/utils/auth'; +import { setStore, getStore } from '@/utils/store'; +import { validatenull } from '@/utils/validate'; +import { deepClone } from '@/utils/util'; +import { + loginByUsername, + loginBySocial, + loginBySso, + loginByPhone, + getUserInfo, + logout, + refreshToken, + getButtons, + registerUser, +} from '@/api/user'; +import { getRoutes, getTopMenu } from '@/api/system/menu'; +import { formatMenu } from '@/router/tab'; +import { ElMessage } from 'element-plus'; +import { encrypt } from '@/utils/sm2'; + +const user = { + state: { + tenantId: getStore({ name: 'tenantId' }) || '', + userInfo: getStore({ name: 'userInfo' }) || [], + permission: getStore({ name: 'permission' }) || {}, + roles: [], + menuId: {}, + menu: getStore({ name: 'menu' }) || [], + menuAll: getStore({ name: 'menuAll' }) || [], + token: getStore({ name: 'token' }) || '', + refreshToken: getStore({ name: 'refreshToken' }) || '', + }, + actions: { + //根据用户名登录 + LoginByUsername({ commit }, userInfo = {}) { + return new Promise((resolve, reject) => { + loginByUsername( + userInfo.tenantId, + userInfo.deptId, + userInfo.roleId, + userInfo.username, + encrypt(userInfo.password), + userInfo.type, + userInfo.key, + userInfo.code + ) + .then(res => { + const data = res.data; + if (data.error_description) { + ElMessage({ + message: data.error_description, + type: 'error', + }); + } else { + commit('SET_TOKEN', data.access_token); + commit('SET_REFRESH_TOKEN', data.refresh_token); + commit('SET_TENANT_ID', data.tenant_id); + commit('SET_USER_INFO', data); + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + } + resolve(); + }) + .catch(err => { + reject(err); + }); + }); + }, + //根据第三方信息登录 + LoginBySocial({ commit }, userInfo) { + return new Promise((resolve, reject) => { + loginBySocial(userInfo.tenantId, userInfo.source, userInfo.code, userInfo.state) + .then(res => { + const data = res.data; + if (data.error_description) { + ElMessage({ + message: data.error_description, + type: 'error', + }); + } else { + commit('SET_TOKEN', data.access_token); + commit('SET_REFRESH_TOKEN', data.refresh_token); + commit('SET_USER_INFO', data); + commit('SET_TENANT_ID', data.tenant_id); + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + } + resolve(); + }) + .catch(err => { + reject(err); + }); + }); + }, + //根据单点信息登录 + LoginBySso({ commit }, userInfo) { + return new Promise((resolve, reject) => { + loginBySso(userInfo.state, userInfo.code) + .then(res => { + const data = res.data; + if (data.error_description) { + ElMessage({ + message: data.error_description, + type: 'error', + }); + } else { + commit('SET_TOKEN', data.access_token); + commit('SET_REFRESH_TOKEN', data.refresh_token); + commit('SET_USER_INFO', data); + commit('SET_TENANT_ID', data.tenant_id); + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + } + resolve(); + }) + .catch(err => { + reject(err); + }); + }); + }, + //根据手机信息登录 + LoginByPhone({ commit }, userInfo) { + return new Promise((resolve, reject) => { + loginByPhone( + userInfo.tenantId, + encrypt(userInfo.phone), + userInfo.codeId, + userInfo.codeValue + ) + .then(res => { + const data = res.data; + if (data.error_description) { + ElMessage({ + message: data.error_description, + type: 'error', + }); + } else { + commit('SET_TOKEN', data.access_token); + commit('SET_REFRESH_TOKEN', data.refresh_token); + commit('SET_USER_INFO', data); + commit('SET_TENANT_ID', data.tenant_id); + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + } + resolve(); + }) + .catch(err => { + reject(err); + }); + }); + }, + //用户注册 + RegisterUser({ commit }, userInfo = {}) { + return new Promise((resolve, reject) => { + registerUser( + userInfo.tenantId, + userInfo.name, + userInfo.account, + encrypt(userInfo.password), + userInfo.phone, + userInfo.email + ).then(res => { + const data = res.data; + if (data.error_description) { + ElMessage({ + message: data.error_description, + type: 'error', + }); + reject(data.error_description); + } else { + commit('SET_TOKEN', data.access_token); + commit('SET_REFRESH_TOKEN', data.refresh_token); + commit('SET_USER_INFO', data); + commit('SET_TENANT_ID', data.tenant_id); + commit('DEL_ALL_TAG'); + commit('CLEAR_LOCK'); + } + resolve(); + }); + }); + }, + GetUserInfo({ commit }) { + return new Promise((resolve, reject) => { + getUserInfo() + .then(res => { + const data = res.data.data; + commit('SET_ROLES', data.roles); + resolve(data); + }) + .catch(err => { + reject(err); + }); + }); + }, + //刷新token + RefreshToken({ state, commit }, userInfo) { + return new Promise((resolve, reject) => { + refreshToken( + getRefreshToken(), + state.tenantId, + !validatenull(userInfo) ? userInfo.deptId : state.userInfo.dept_id, + !validatenull(userInfo) ? userInfo.roleId : state.userInfo.role_id + ) + .then(res => { + const data = res.data; + commit('SET_TOKEN', data.access_token); + commit('SET_REFRESH_TOKEN', data.refresh_token); + commit('SET_USER_INFO', data); + resolve(); + }) + .catch(error => { + reject(error); + }); + }); + }, + // 登出 + LogOut({ commit }) { + return new Promise((resolve, reject) => { + logout() + .then(() => { + commit('SET_TOKEN', ''); + commit('SET_MENU_ALL_NULL', []); + commit('SET_MENU', []); + commit('SET_ROLES', []); + commit('CLEAR_LOCK'); + removeToken(); + removeRefreshToken(); + removeToken(); + resolve(); + }) + .catch(error => { + reject(error); + }); + }); + }, + //注销session + FedLogOut({ commit }) { + return new Promise(resolve => { + commit('SET_TOKEN', ''); + commit('SET_MENU_ALL_NULL', []); + commit('SET_MENU', []); + commit('SET_ROLES', []); + commit('CLEAR_LOCK'); + removeToken(); + removeRefreshToken(); + removeToken(); + resolve(); + }); + }, + GetTopMenu() { + return new Promise(resolve => { + getTopMenu().then(res => { + const data = res.data.data || []; + resolve(data); + }); + }); + }, + GetMenu({ commit, dispatch }, topMenuId) { + return new Promise(resolve => { + getRoutes(topMenuId).then(res => { + const data = res.data.data; + let menu = deepClone(data); + formatMenu(menu); + commit('SET_MENU', menu); + commit('SET_MENU_ALL', menu); + dispatch('GetButtons'); + resolve(menu); + }); + }); + }, + GetButtons({ commit }) { + return new Promise(resolve => { + getButtons().then(res => { + const data = res.data.data; + commit('SET_PERMISSION', data); + resolve(); + }); + }); + }, + }, + mutations: { + SET_TOKEN: (state, token) => { + setToken(token); + state.token = token; + setStore({ name: 'token', content: state.token }); + }, + SET_REFRESH_TOKEN: (state, refreshToken) => { + setRefreshToken(refreshToken); + state.refreshToken = refreshToken; + setStore({ name: 'refreshToken', content: state.refreshToken }); + }, + SET_MENU_ID(state, menuId) { + state.menuId = menuId; + }, + SET_TENANT_ID: (state, tenantId) => { + state.tenantId = tenantId; + setStore({ name: 'tenantId', content: state.tenantId }); + }, + SET_USER_INFO: (state, userInfo) => { + if (validatenull(userInfo.user_id) && validatenull(userInfo.account)) { + state.userInfo = { user_name: 'unauth', role_name: 'unauth', authority: 'unauth' }; + } else { + if (validatenull(userInfo.avatar)) { + userInfo.avatar = '/img/bg/img-logo.png'; + } + if (!validatenull(userInfo.role_name)) { + userInfo.roleName = userInfo.role_name; + userInfo.authority = userInfo.role_name; + } + if (!validatenull(userInfo.user_id)) { + userInfo.userId = userInfo.user_id; + } + if (!validatenull(userInfo.user_name)) { + userInfo.userName = userInfo.user_name; + } + if (!validatenull(userInfo.tenant_id)) { + userInfo.tenantId = userInfo.tenant_id; + } + if (!validatenull(userInfo.dept_id)) { + userInfo.deptId = userInfo.dept_id; + } + if (!validatenull(userInfo.role_id)) { + userInfo.roleId = userInfo.role_id; + } + if (!validatenull(userInfo.oauth_id)) { + userInfo.oauthId = userInfo.oauth_id; + } + state.userInfo = userInfo; + } + setStore({ name: 'userInfo', content: state.userInfo }); + }, + SET_MENU_ALL: (state, menuAll) => { + let menu = state.menuAll; + menuAll.forEach(ele => { + let index = menu.findIndex(item => item.path === ele.path); + if (index === -1) { + menu.push(ele); + } else { + menu[index] = ele; + } + }); + state.menuAll = menu; + setStore({ name: 'menuAll', content: state.menuAll }); + }, + SET_MENU_ALL_NULL: state => { + state.menuAll = []; + setStore({ name: 'menuAll', content: state.menuAll }); + }, + SET_MENU: (state, menu) => { + state.menu = menu; + setStore({ name: 'menu', content: state.menu }); + }, + SET_ROLES: (state, roles) => { + state.roles = roles; + }, + SET_PERMISSION: (state, permission) => { + let result = []; + + function getCode(list) { + list.forEach(ele => { + if (typeof ele === 'object') { + const children = ele.children; + const code = ele.code; + if (children && children.length > 0) { + getCode(children); + } else { + result.push(code); + } + } + }); + } + + getCode(permission); + state.permission = {}; + result.forEach(ele => { + state.permission[ele] = true; + }); + setStore({ name: 'permission', content: state.permission, type: 'session' }); + }, + }, +}; +export default user; diff --git a/src/styles/common.scss b/src/styles/common.scss new file mode 100644 index 0000000..11cce9c --- /dev/null +++ b/src/styles/common.scss @@ -0,0 +1,133 @@ +// 全局变量 +@use './variables.scss' as variables; +@use './mixin.scss' as *; + +// ele样式覆盖 +@use './element-ui.scss'; +// 顶部右侧显示 +@use './top.scss'; +// 导航标签 +@use './tags.scss'; +// 工具类函数 +@use './mixin.scss'; +// 侧面导航栏 +@use './sidebar.scss'; +//主题 +@use './theme/index.scss'; +//通用配置 +@use './normalize.scss'; +//图标配置 +@use './iconfont.scss'; +//登录样式 +@use "./login.scss"; +//适配 +@use './media.scss'; +//滚动条样式 +@include scrollBar; + +a { + text-decoration: none; + color: #333; +} + +* { + outline: none; +} + +.avue-sidebar, +.avue-top, +.avue-logo, +.avue-layout, +.login-logo, +.avue-main { + transition: all .3s; +} + +.avue-layout { + display: flex; + height: 100%; + overflow: hidden; + + &--horizontal { + flex-direction: column; + + .avue-sidebar { + width: 100%; + height: variables.$top_height; + display: flex; + + .avue-menu, .el-menu-item, .el-sub-menu__title { + height: variables.$top_height; + line-height: variables.$top_height; + } + + .is-active:before { + display: none; + } + } + + .avue-logo { + width: variables.$sidebar_width + } + } +} + +.avue-contail { + width: 100%; + height: 100%; + background: #f0f2f5; + background-size: 100%; + background-repeat: no-repeat; +} + +.avue--collapse { + .avue-sidebar, + .avue-logo { + width: variables.$sidebar_collapse; + } +} + +.avue-main { + position: relative; + display: flex; + flex-direction: column; + height: 100%; + flex: 1; + box-sizing: border-box; + overflow: hidden; + background: #f0f2f5; +} + +#avue-view { + flex: 1; + overflow-y: auto; + overflow-x: hidden; + margin-bottom: 10px; +} + +.avue-view { + width: 100%; + box-sizing: border-box; +} + +.avue-footer { + width: 100%; + position: absolute; + bottom: 0; + text-align: center; + + .copyright { + color: #666; + font-size: 12px; + } +} + +.mac_bg { + background-image: url("/img/bg.jpg"); + background-color: #000; + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; +} diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss new file mode 100644 index 0000000..194e680 --- /dev/null +++ b/src/styles/element-ui.scss @@ -0,0 +1,82 @@ +.el-card.is-always-shadow { + box-shadow: none; + border: none !important; +} + +.el-menu { + border-right: none; +} + +.el-message__icon, +.el-message__content { + display: inline-block; +} + +.el-date-editor .el-range-input, +.el-date-editor .el-range-separator { + height: auto; + overflow: hidden; +} + +.el-dialog__wrapper { + z-index: 2048; +} + + +.el-col { + margin-bottom: 8px; +} + +.el-main { + padding: 0 !important; +} + +.el-dropdown-menu__item--divided:before, .el-menu, .el-menu--horizontal > .el-menu-item:not(.is-disabled):focus, .el-menu--horizontal > .el-menu-item:not(.is-disabled):hover, .el-menu--horizontal > .el-sub-menu .el-sub-menu__title:hover { + background-color: transparent; +} + + +.el-dropdown-menu__item--divided:before, .el-menu, .el-menu--horizontal > .el-menu-item:not(.is-disabled):focus, .el-menu--horizontal > .el-menu-item:not(.is-disabled):hover, .el-menu--horizontal > .el-sub-menu .el-sub-menu__title:hover { + background-color: transparent !important; +} + +.el-collapse-item__header { + height: auto; + overflow: hidden; +} + +.el-button.is-text:not(.is-disabled):active { + background-color: transparent; +} + +.el-button.is-text:not(.is-disabled):focus, .el-button.is-text:not(.is-disabled):hover { + background-color: transparent; +} +.el-dropdown{ + display: inline-block; + line-height: inherit; + .el-button.is-text:not(.is-disabled):focus-visible{ + outline: none; + } +} + +.avue-icon i, .avue-icon svg { + line-height: 20px; +} + +.avue--detail .el-form-item { + background-color: #fafafa; +} + +// 统一 avue-crud 表头背景色 +.avue-crud .el-table th.el-table__cell, +.avue-crud .el-table__header-wrapper tr th.el-table-fixed-column--left, +.avue-crud .el-table__header-wrapper tr th.el-table-fixed-column--right { + background-color: #fafafa; +} + +// 统一 avue-crud 行 hover 背景色 +.avue-crud .el-table__body-wrapper tr.hover-row td.el-table-fixed-column--left, +.avue-crud .el-table__body-wrapper tr.hover-row td.el-table-fixed-column--right { + background-color: var(--el-table-row-hover-bg-color); +} diff --git a/src/styles/iconfont.scss b/src/styles/iconfont.scss new file mode 100644 index 0000000..b05181d --- /dev/null +++ b/src/styles/iconfont.scss @@ -0,0 +1,24 @@ + +[class^="icon-"] { + font-family: "iconfont" !important; + font-size: 18px !important; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.el-menu-item [class^=icon-] { + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; + vertical-align: middle; +} + +.el-sub-menu [class^=icon-] { + vertical-align: middle; + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; +} diff --git a/src/styles/login.scss b/src/styles/login.scss new file mode 100644 index 0000000..4421443 --- /dev/null +++ b/src/styles/login.scss @@ -0,0 +1,177 @@ +.login-container { + position: relative; + display: flex; + align-items: center; + width: 100%; + height: 100%; + // background-color: #fff; + background: linear-gradient(110deg, rgb(2, 40, 85) 0%, rgb(44, 119, 241) 50%, rgb(255,255,255) 50%, rgb(240,240,240) 100%); + overflow: hidden; + &::before{ + // content:' '; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + margin-left: -48%; + background-image: url(/img/login-bg.svg); + background-position: 100%; + background-repeat: no-repeat; + background-size: auto 100%; + } +} +.login-weaper { + margin: 0 auto; + width:100%; +} + +.login-left, +.login-border { + position: relative; + min-height: 500px; + align-items: center; + display: flex; +} +.login-left { + padding-top: 100px; + justify-content: center; + flex-direction: column; + color: #fff; + float: left; + width: 50%; + position: relative; + box-sizing: border-box; +} +.login-left .img { + width: 200px; +} +.login-time { + position: absolute; + left: 25px; + top: 25px; + width: 100%; + color: #fff; + font-weight: 200; + opacity: 0.9; + font-size: 18px; + overflow: hidden; + font-weight: bold; +} +.login-left .title { + margin-top: 60px; + text-align: center; + color: #fff; + font-weight: 300; + letter-spacing: 2px; + font-size: 28px; + font-weight: bold; +} + +.login-border { + border-left: none; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + color: #fff; + width: 50%; + float: left; + box-sizing: border-box; +} +.login-main { + margin: 0 auto; + padding: 30px 50px; + width: 70%; + //box-shadow: -4px 5px 10px rgba(255, 255, 255, 0.4); + box-sizing: border-box; +} +.login-main > h3 { + margin-bottom: 20px; +} +.login-title { + color: #000; + margin-bottom: 50px; + font-weight: bold; + font-size: 28px; + text-align: center; + letter-spacing: 4px; +} +.login-menu { + margin-top: 40px; + width: 100%; + text-align: center; + a { + color: #999; + font-size: 12px; + margin: 0px 8px; + } +} +.login-submit { + width: 100%; + height: 45px; + font-size: 18px; + letter-spacing: 2px; + font-weight: 300; + cursor: pointer; + margin-top: 30px; + transition: 0.25s; + background-color: #2C77F1; +} +.register-submit { + width: 100%; + height: 45px; + font-size: 18px; + letter-spacing: 2px; + font-weight: 300; + cursor: pointer; + margin-top: 30px; + margin-left: 0!important; + transition: 0.25s; +} +.login-form { + margin: 10px 0; + i { + color: #333; + } + .el-input { + input { + text-indent: 5px; + } + .el-input__wrapper{ + padding:5px 10px; + border-radius: 0; + } + .el-input__suffix,.el-input__prefix{ + display: flex; + align-items: center; + text-align: center; + } + .el-input__prefix{ + margin-left: 8px; + } + } +} +.login-code { + width: 100%; + height: 100%; + .el-input-group__append{ + background-color: #fff; + } +} +.login-code-box{ + display: flex; + align-items: center; +} +.login-code-img { + cursor: pointer; + min-width: 100px; + padding: 0 5px; + height: 30px; + color: #333; + font-size: 20px; + font-weight: bold; + letter-spacing: 3px; + line-height: 38px; + text-indent: 5px; + text-align: center; + box-sizing: border-box; +} diff --git a/src/styles/media.scss b/src/styles/media.scss new file mode 100644 index 0000000..0330337 --- /dev/null +++ b/src/styles/media.scss @@ -0,0 +1,68 @@ +@use './variables.scss' as variables; + +@media screen and (max-width: 992px) { + .avue-sidebar { + position: fixed; + top: 0; + left: -265px; + z-index: 1024; + } + .avue--collapse { + .avue-sidebar { + left: 0; + width: variables.$sidebar_width; + } + + .avue-logo { + width: variables.$sidebar_width; + } + + .avue-main { + margin-left: variables.$sidebar_width; + } + } + // ele的自适应 + .el-dialog, + .el-message-box { + width: 98%; + } + //登录页面 + .login-left { + width: 100%; + min-height: auto; + + .title { + margin-top: 20px; + font-size: 20px; + text-shadow: #000 1px 0 0, #000 0 1px 0, #000 -1px 0 0, #000 0 -1px 0; + } + + .img { + width: 50px; + } + } + .login-logo { + padding-top: 30px; + margin-left: -30px; + } + .login-border { + border-radius: 5px; + padding: 20px; + margin: 0 auto; + width: 100%; + } + .login-main { + width: 100%; + background-color: #fff; + padding: 10px 20px; + box-shadow: none + } + .login-container { + &::before { + margin-left: 0 + } + } + .top-bar__item { + display: none; + } +} diff --git a/src/styles/mixin.scss b/src/styles/mixin.scss new file mode 100644 index 0000000..4b750fd --- /dev/null +++ b/src/styles/mixin.scss @@ -0,0 +1,70 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + ::-webkit-scrollbar-track-piece { + background-color: transparent; + } + ::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: transparent; + } + ::-webkit-scrollbar-thumb { + border-radius: 5px; + background-color: hsla(220, 4%, 58%, .3); + } +} + +@mixin radius($width, $size, $color) { + width: $width; + height: $width; + line-height: $width; + border-radius: $width; + text-align: center; + border-width: $size; + border-style: solid; + border-color: $color; +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} + +@mixin pct($pct) { + width: #{$pct}; + position: relative; + margin: 0 auto; +} + +@mixin triangle($width, $height, $color, $direction) { + $width: $width/2; + $color-border-style: $height solid $color; + $transparent-border-style: $width solid transparent; + height: 0; + width: 0; + @if $direction==up { + border-bottom: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } @else if $direction==right { + border-left: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } @else if $direction==down { + border-top: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } @else if $direction==left { + border-right: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } +} diff --git a/src/styles/normalize.scss b/src/styles/normalize.scss new file mode 100644 index 0000000..50c4f3a --- /dev/null +++ b/src/styles/normalize.scss @@ -0,0 +1,501 @@ +/*! normalize.css v2.1.2 | MIT License | git.io/normalize */ +/* +/*! 我就是自己看看,然后翻译下下,让大家看看 */ + +/* ========================================================================== + HTML5 display definitions + + HTML5 新增元素定义 + + ========================================================================== */ + +/** + * Correct `block` display not defined in IE 8/9. + * + * 修正IE 8/9 中未定义的块级元素。 + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +/** + * Correct `inline-block` display not defined in IE 8/9. + * + * 修正在 IE 8/9 中未定义的 'inline-block' 元素。 + */ + +audio, +canvas, +video { + display: inline-block; +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + * + * 阻止现在浏览器显示未定义 control 播放控件的 'audio' 声音元素。 + * 删除 IOS 5 设备中显示的多余的高度。 + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address styling not present in IE 8/9. + * + * 处理 IE 8/9 中不存在的样式。 + */ + +[hidden] { + display: none; +} + +/* ========================================================================== + Base + + 基本设置 + ========================================================================== */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + * + * 1. 设置默认字体类型为 sans-serif. + * 2. 当用户放大或缩小页面时不改变字体大小。 + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + * + * 删除默认边距。 + */ + +body { + margin: 0; +} + +/* ========================================================================== + Links + + 链接 + ========================================================================== */ + +/** + * Address `outline` inconsistency between Chrome and other browsers. + * + * 处理 Chrome 与其它浏览器中关于 'outline' 的不一致性。 + */ + +a:focus { + outline: thin dotted; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + * + * 为所有浏览器改善当激活或悬停在元素上时元素内容的可读性。 + */ + +a:active, +a:hover { + outline: 0; +} + +/* ========================================================================== + Typography + + 排版 + ========================================================================== */ + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari 5, and Chrome. + * + * 处理多变的 'h1' 字体大小及其在 Firefox 4+, Safari 5, 及 Chrome时浏览器中的 + * 'section' 与 'article' 元素中的边距。 + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9, Safari 5, and Chrome. + * + * 处理在 IE 8/9, Safari 5, 及 Chrome 没有的样式。 + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. + * + * 处理 Firefox 4+, Safari 5, 及 Chrome 中默认的 'bolder' 样式为 'bold'. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari 5 and Chrome. + * + * 处理在 Safari 5 和 Chrome 没有的样式。 + */ + +dfn { + font-style: italic; +} + +/** + * Address differences between Firefox and other browsers. + * + * 处理 Firefox 与其它浏览器的差异。 + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Address styling not present in IE 8/9. + * + * 处理在 IE 8/9 中没有的样式。 + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Correct font family set oddly in Safari 5 and Chrome. + * + * 修正确 Safari 5 和 Chrome 中古怪的默认字体。 + */ + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +/** + * Improve readability of pre-formatted text in all browsers. + * + * 为所有浏览器改善预格式化文本的可读性。 + */ + +pre { + white-space: pre-wrap; +} + +/** + * Set consistent quote types. + * + * 设置一致的引用格式。 + */ + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +/** + * Address inconsistent and variable font size in all browsers. + * + * 处理所有浏览器中字体大小的不一致性[译者注:原文直译为:处理所有 + * 浏览器中的不一致和多变的字体大小]。 + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + * + * 阻止所有浏览器中 'sub' 和 'sup' 元素影响 'line-height'. + * [译者注:就是不让上标与下标影响行高。] + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + Embedded content + + 嵌入的内容 + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9. + * + * 删除 IE 8/9 中当内容位于 'a' 中出现的边框。 + */ + +img { + border: 0; +} + +/** + * Correct overflow displayed oddly in IE 9. + * + * 修正 IE 9 中显示古怪的溢出内容。 + */ + +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + Figures + + Figure 图像/图表/代码等 + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari 5. + * + * 处理在 IE 8/9 和 Safari 5 没有的边距。 + */ + +figure { + margin: 0; +} + +/* ========================================================================== + Forms + ========================================================================== */ + +/** + * Define consistent border, margin, and padding. + * + * 定义一致的边框、外边距及内边距。 + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + * 1. 修正在 IE 8/9 中没有继承的 'color'. + * + * [译者注:说是修正颜色嘛,可下面没有关于颜色的呀,这也行?求大神解释!] + * 2. 去掉内边距,避免当用户清空表单组时认为出错了。 + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * 1. Correct font family not being inherited in all browsers. + * 2. Correct font size not being inherited in all browsers. + * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. + * + * 1. 修正所有浏览器中未被继承的字体类型。 + * 2. 修正所有浏览器中未被继承的字体大小。 + * 3. 处理 Firefox 4+, Safari 5, 及 Chrome 中默认设置不同的外边距。 + */ + +button, +input, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + * + * 处理 Firefox 4+ 中的客户端样式表里使用 '!important' 设置的 'line-height'. + */ + +button, +input { + line-height: normal; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + * + * 处理 'button' 和 'select' 的 'text-transform' 继承的不一致性。 + * 所有其它表单控件元素不继承 'text-transform' 的值。 + * 修正 Chrome, Safari 5+, 及 IE 8+ 中 'button' 的继承样式。 + * 修正 Firefox 4+ 和 Opera 中 'select' 的继承样式。 + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + * + * 1. 避免 Android 4.0.* 中 WebKit 的一个bug, 防止 'audio' 与 'video' 的播放控件失效。 + * 2. 修正 iOS 中不可点击的 'input' 样式。 + * 3. 改善图片类型的 'input' 等光标样式的可用性与一致性。 + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + * + * 重置不可用元素的默认光标样式。 + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * 1. Address box sizing set to `content-box` in IE 8/9. + * 2. Remove excess padding in IE 8/9. + * + * 1. 处理 IE 8/9 中设置为 'content-box' 的盒子模型。 + * 2. 删除 IE 8/9 中多余的内边距。 + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + * + * 1. 处理 Safari 5 和 Chrome 中默认设置为 'appearance' 的 'searchfield'. + * 2. 处理 Safari 5 和 Chrome 中默认设置为 'box-sizing' 的 'border-box' + * (包括不会过时的 '-moz'). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + * + * 删除 Safari 5 和 OS X 上的 Chrome 中的输入框上的内边距和搜索取消按钮。 + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Remove inner padding and border in Firefox 4+. + * + * 删除 Firefox 4+ button 与 input 上的内边距。 + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * 1. Remove default vertical scrollbar in IE 8/9. + * 2. Improve readability and alignment in all browsers. + * + * 1. 删除 IE8/9 中默认的垂直滚动条。 + * 2. 改善所有浏览器中的可读性并使文本垂直对齐。 + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== + Tables + + 表格 + ========================================================================== */ + +/** + * Remove most spacing between table cells. + * + * 删除表格里单元格间的间距。 + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss new file mode 100644 index 0000000..831e787 --- /dev/null +++ b/src/styles/sidebar.scss @@ -0,0 +1,74 @@ +@use './variables.scss' as variables; + +.avue-sidebar { + width: variables.$sidebar_width; + height: 100%; + user-select: none; + position: relative; + background-color: #031527; + transition: width .2s; + box-sizing: border-box; + box-shadow: 2px 0 6px rgba(0, 21, 41, .35); + + .el-scrollbar__wrap { + overflow-x: hidden; + } + + .avue-menu { + height: calc(100% - #{variables.$top_height}); + } + + &--tip { + width: 90%; + height: 140px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 5px; + position: absolute; + top: 5px; + left: 5%; + color: #ccc; + z-index: 2; + text-align: center; + font-size: 14px; + background-color: rgba(0, 0, 0, .4); + } + + .el-menu-item, .el-sub-menu__title { + i { + margin-right: 5px; + } + + i, span { + color: hsla(0, 0%, 100%, .7); + } + + &:hover { + background: transparent; + + i, span { + color: #fff; + } + } + + &.is-active { + &:before { + content: ''; + top: 0; + left: 0; + bottom: 0; + width: 4px; + background: var(--el-color-primary); + position: absolute; + } + + background-color: rgba(0, 0, 0, .8); + + i, span { + color: #fff; + } + } + } + +} diff --git a/src/styles/tags.scss b/src/styles/tags.scss new file mode 100644 index 0000000..8a77af3 --- /dev/null +++ b/src/styles/tags.scss @@ -0,0 +1,101 @@ + +.avue-tags { + user-select: none; + position: relative; + padding: 0 10px; + margin-bottom: 10px; + box-sizing: border-box; + border-top: 1px solid #f6f6f6; + background-color: #fff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .05); + + .el-tabs--card > .el-tabs__header { + margin: 0; + } + + .el-tabs--card > .el-tabs__header .el-tabs__nav, + .el-tabs--card > .el-tabs__header .el-tabs__item, + .el-tabs--card > .el-tabs__header { + border: none; + } + + .el-tabs--card > .el-tabs__header .el-tabs__item:first-child { + border-left-width: 1px + } + + .el-tabs--card > .el-tabs__header .el-tabs__item { + margin: 0 3px; + height: 40px; + line-height: 40px; + font-size: 13px; + font-weight: normal; + color: #ccc; + + &.is-active { + color: var(--el-color-primary); + border-bottom: 3px solid var(--el-color-primary); + } + } + + .el-tabs__nav-prev, + .el-tabs__nav-next { + width: 20px; + line-height: 40px; + font-size: 18px; + text-align: center; + } + + &__box { + position: relative; + box-sizing: border-box; + padding-right: 106px; + width: 100%; + + .el-tabs__item { + &:first-child { + .is-icon-close { + display: none; + } + } + } + } + + &__contentmenu { + position: fixed; + width: 120px; + background-color: #fff; + z-index: 1024; + border-radius: 5px; + box-shadow: 1px 2px 10px #ccc; + + .item { + cursor: pointer; + font-size: 14px; + padding: 8px 20px 8px 15px; + color: #606266; + + &:first-child { + border-top-left-radius: 5px; + border-top-right-radius: 5px; + } + + &:last-child { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + } + + &:hover { + background-color: var(--el-color-primary); + color: #fff; + } + } + } + + &__menu { + position: absolute !important; + top: 3px; + right: 0; + padding: 1px 0 0 15px; + box-sizing: border-box; + } +} diff --git a/src/styles/theme/beautiful.scss b/src/styles/theme/beautiful.scss new file mode 100644 index 0000000..bf96a2f --- /dev/null +++ b/src/styles/theme/beautiful.scss @@ -0,0 +1,55 @@ +.theme-beautiful { + .avue-sidebar { + background: linear-gradient(90deg, #006cff, #399efd) !important; + + .el-menu-item, .el-sub-menu__title { + background: linear-gradient(90deg, #006cff, #399efd) !important; + } + + .el-menu-item, .el-sub-menu__title { + i, span { + color: #fff + } + + .is-active { + background: #399efd !important; + } + + &:hover, &.is-active { + background: #399efd !important; + + i, span { + background: #399efd !important; + } + } + } + } + + .avue-logo { + background: linear-gradient(90deg, #006cff, #399efd) !important; + } + + .avue-tags { + .el-tabs__item { + font-size: 14px !important; + color: #303133 !important; + font-weight: 500 !important; + border: 1px solid #dcdfe6 !important; + border-radius: 3px; + height: 35px !important; + line-height: 35px !important; + margin: 5px 3px 8px 3px !important; + + &:hover { + color: var(--el-color-primary) !important; + border-color: var(--el-color-primary) !important; + } + } + + .is-active { + color: var(--el-color-primary) !important; + border-color: var(--el-color-primary) !important; + } + } + +} diff --git a/src/styles/theme/bule.scss b/src/styles/theme/bule.scss new file mode 100644 index 0000000..0c59765 --- /dev/null +++ b/src/styles/theme/bule.scss @@ -0,0 +1,53 @@ +.theme-bule { + + .avue-top, .avue-logo { + background: #004ca7; + } + + .avue-sidebar { + background: #004ca7; + + .el-menu-item.is-active, .el-sub-menu__title.is-active { + background-color: rgba(0, 0, 0, 0.2); + } + } + + .el-dropdown { + color: #fff; + } + + .avue-logo { + .avue-logo_title { + color: #fff; + } + } + + .avue-breadcrumb { + i { + color: #fff; + } + } + + .top-bar__item { + i { + color: #fff; + } + } + + .avue-top { + + .el-menu-item { + i, + span { + color: #fff; + } + + &:hover { + i, + span { + color: #fff; + } + } + } + } +} diff --git a/src/styles/theme/cool.scss b/src/styles/theme/cool.scss new file mode 100644 index 0000000..82e7e75 --- /dev/null +++ b/src/styles/theme/cool.scss @@ -0,0 +1,175 @@ +.theme-cool { + .el-menu--popup { + .el-menu-item { + background-color: #fff; + + i, span { + color: #666; + } + + &:hover { + i, span { + color: #333; + } + } + + &.is-active { + background-color: var(--el-color-primary); + + &:before { + content: ''; + top: 0; + left: 0; + bottom: 0; + width: 4px; + background: var(--el-color-primary); + position: absolute; + } + + i, span { + color: #fff; + } + } + } + } + + .avue-top { + background: linear-gradient(120deg, #25aff3, #008ad3); + } + + .avue-tags { + padding: 0 3px; + margin: 8px 0; + box-shadow: none; + background-color: transparent; + + .el-tabs__header .el-tabs__item { + padding: 0 10px !important; + background-color: #fff; + margin-right: 5px; + color: #909399; + border-radius: 3px; + height: 30px; + font-size: 12px; + line-height: 30px; + + &.is-active { + border: none; + color: #008ad3; + } + } + } + + .avue-logo { + background: #fff; + box-shadow: none; + } + + .avue-sidebar--tip { + background-color: transparent; + color: #333; + } + + .el-dropdown { + color: #fff; + } + + .avue-logo_title { + font-weight: 400; + color: #008ad3; + } + + .logo_title, + .avue-breadcrumb { + color: #fff; + + i { + color: #fff; + } + } + + .avue-top { + .el-menu-item { + i, + span { + color: #fff; + } + + &:hover { + i, + span { + color: #fff; + } + } + } + } + + .avue-sidebar { + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.15); + background-color: #fff; + + .el-menu-item, .el-sub-menu__title { + font-size: 13px; + + i, span { + color: #000; + } + + &:hover { + background: transparent; + + i, span { + color: #000; + } + } + + &.is-active { + background-color: #e5f1fb; + + &::before { + width: 0; + } + + i, span { + color: #25aff3; + } + } + } + } + + .top-search { + .el-input__inner { + color: #333; + } + + input::-webkit-input-placeholder, + textarea::-webkit-input-placeholder { + /* WebKit browsers */ + color: #fff; + } + + input:-moz-placeholder, + textarea:-moz-placeholder { + /* Mozilla Firefox 4 to 18 */ + color: #fff; + } + + input::-moz-placeholder, + textarea::-moz-placeholder { + /* Mozilla Firefox 19+ */ + color: #fff; + } + + input:-ms-input-placeholder, + textarea:-ms-input-placeholder { + /* Internet Explorer 10+ */ + color: #fff; + } + } + + .top-bar__item { + i { + color: #fff; + } + } +} diff --git a/src/styles/theme/d2.scss b/src/styles/theme/d2.scss new file mode 100644 index 0000000..e5c61f4 --- /dev/null +++ b/src/styles/theme/d2.scss @@ -0,0 +1,68 @@ +.theme-d2 { + .avue-logo { + color: var(--el-color-primary); + background-color: #ebf1f6; + box-shadow: none; + + .avue-logo_title { + font-size: 20px; + font-weight: 400; + } + } + + .avue-top { + background-color: #ebf1f6; + box-shadow: none; + } + + .avue-main { + padding: 0 5px; + } + + .avue-tags { + margin-left: 6px; + padding: 0; + border: 1px solid #e4e7ed; + border-radius: 3px; + background-color: #ebf1f6; + box-shadow: none; + + .el-tabs__item { + border-left: 1px solid #cfd7e5 !important; + margin: 0 !important; + background-color: rgba(0, 0, 0, .03) !important; + color: #606266 !important; + font-size: 14px !important; + font-weight: 500 !important; + + &:first-child { + border-left: none !important; + } + } + + .is-active { + border-bottom: 1px solid #fff !important; + background-color: #fff !important; + color: var(--el-color-primary) !important; + } + } + + .avue-sidebar { + background-color: #ebf1f6; + box-shadow: none; + + .el-menu-item, .el-sub-menu__title { + i, span { + color: #606266 + } + + &:hover, &.is-active { + background: hsla(0, 0%, 100%, .5); + + i, span { + color: var(--el-color-primary); + } + } + } + } +} diff --git a/src/styles/theme/dark.scss b/src/styles/theme/dark.scss new file mode 100644 index 0000000..53d64f9 --- /dev/null +++ b/src/styles/theme/dark.scss @@ -0,0 +1,70 @@ +.theme-dark { + .avue-logo { + color: #fff; + background-color: #2c3643; + box-shadow: none; + + .avue-logo_title { + font-size: 20px; + font-weight: 400; + } + } + + .avue-top { + background-color: #2c3643; + box-shadow: none; + color: #ccc; + + i, span { + color: #ccc; + } + } + + .avue-main { + padding: 0 5px; + } + + .avue-tags { + padding-left: 0; + background-color: #2c3643; + border-color: transparent; + + .el-tabs__item { + margin: 0 !important; + background-color: #262d37; + + &.is-active { + color: #262d37 !important; + background-color: #fff !important; + border-color: #262d37 !important; + } + } + } + + .avue-main { + background-color: #2c3643; + } + + .avue-sidebar { + background-color: #2c3643; + box-shadow: none; + + .el-menu-item, .el-sub-menu__title { + i, span { + color: #ccc; + } + + &:hover, &.is-active { + background: #262d37; + + i, span { + color: #fff; + } + + &:before { + background-color: #000; + } + } + } + } +} diff --git a/src/styles/theme/go.scss b/src/styles/theme/go.scss new file mode 100644 index 0000000..4617f00 --- /dev/null +++ b/src/styles/theme/go.scss @@ -0,0 +1,128 @@ +.theme-go { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1) !important; + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color) !important; + .el-table .el-table__row td .cell { + line-height: 32px; + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); + } + .el-table tr th .cell { + line-height: 25px; + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); + } + + + .avue-sidebar { + background:#fff !important; + + .el-menu-item, .el-sub-menu__title { + i, span { + color: #333; + } + + &:hover { + background: transparent; + + i, span { + color: var(--el-color-primary); + } + } + + &.is-active { + &:before { + left: auto; + right: 0; + } + + background-color: #f0f6ff; + + i, span { + color: var(--el-color-primary); + } + } + } + } + + .avue-logo { + width:100%; + height:50px; + line-height: 50px; + background:#fff; + color:#333; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) !important; + } + + .avue-top{ + height:50px; + line-height: 50px; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) !important; + .top-bar__left i, .top-bar__right i{ + line-height: 50px; + } + .el-menu--horizontal.el-menu{ + border:none + } + .el-menu-item{ + i,span{ + font-size: 15px; + } + } + + .top-bar__title{ + padding-left: 50px; + } + } + .avue-main{ + background-color: rgb(249,250,251); + } + .avue-tags { + margin: 5px 6px 8px 6px; + padding-bottom: 2px; + + .el-tabs__nav-prev, + .el-tabs__nav-next { + width: 20px; + line-height: 50px; + font-size: 18px; + text-align: center; + } + + &__box { + position: relative; + box-sizing: border-box; + padding-right: 70px; + width: 100%; + + .el-tabs__item { + &:first-child { + .is-icon-close { + display: none; + } + } + } + } + + .el-tabs__item { + font-size: 14px !important; + color: rgb(75,85,99) !important; + font-weight: 500 !important; + border: 1px solid rgb(205,218,214) !important; + border-radius: 3px; + height: 30px !important; + line-height: 35px !important; + margin: 8px 3px 8px 3px !important; + + &:hover { + color: var(--el-color-primary) !important; + border-color: var(--el-color-primary) !important; + } + } + + .is-active { + color: var(--el-color-primary) !important; + border-color: var(--el-color-primary) !important; + } + } + +} diff --git a/src/styles/theme/hey.scss b/src/styles/theme/hey.scss new file mode 100644 index 0000000..96468a0 --- /dev/null +++ b/src/styles/theme/hey.scss @@ -0,0 +1,71 @@ +.theme-hey { + .avue-sidebar { + background-color: #fff; + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); + + .el-menu-item, .el-sub-menu__title { + i, span { + color: rgba(49, 58, 70, .8); + } + + &:hover { + background: transparent; + + i, span { + color: var(--el-color-primary); + } + } + + &.is-active { + &:before { + left: auto; + right: 0; + } + + background-color: #f0f6ff; + + i, span { + color: var(--el-color-primary); + } + } + } + } + + .avue-logo { + background-color: #fff; + box-shadow: none; + + .avue-logo_title { + color: var(--el-color-primary); + font-size: 20px; + } + } + + .avue-tags { + background: #f3f6f8; + + &__box { + position: relative; + box-sizing: border-box; + padding-right: 70px; + width: 100%; + + .el-tabs__item { + &:first-child { + .is-icon-close { + display: none; + } + } + } + } + + .el-tabs__item { + color: rgba(0, 0, 0, .65) !important; + } + + .is-active { + background-color: #fff; + border-bottom: none !important; + } + } +} diff --git a/src/styles/theme/index.scss b/src/styles/theme/index.scss new file mode 100644 index 0000000..ba9e4c8 --- /dev/null +++ b/src/styles/theme/index.scss @@ -0,0 +1,35 @@ +// white +@use './white.scss'; + +// star +@use './star.scss'; + +// vip +@use './vip.scss'; + +// d2 +@use './d2.scss'; + +// bule +@use './bule.scss'; + +//iview +@use './iview.scss'; + +//go +@use 'go'; + +//heyui +@use './hey.scss'; + +//dark +@use './dark.scss'; + +//lte +@use 'lte'; + +//cool +@use './cool.scss'; + +//beautiful +@use './beautiful.scss'; diff --git a/src/styles/theme/iview.scss b/src/styles/theme/iview.scss new file mode 100644 index 0000000..4ecfdca --- /dev/null +++ b/src/styles/theme/iview.scss @@ -0,0 +1,87 @@ +.theme-iview { + .avue-logo { + background: #001529; + box-shadow: none; + text-align: center; + + .avue-logo_title { + padding: 5px 8px 8px 8px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + font-size: 20px; + color: #fff; + font-weight: 500; + display: inline; + background-color: var(--el-color-primary); + } + } + + .avue-tags { + padding: 3px 5px 5px 0; + background: #f0f0f0; + box-shadow: inset 0 0 3px 2px hsla(0, 0%, 39.2%, .1); + + .is-active { + &:before { + background: var(--el-color-primary) !important; + } + } + + .el-tabs__item { + padding: 0 15px !important; + position: relative; + height: 32px !important; + line-height: 32px !important; + border: 1px solid #e8eaec !important; + color: #515a6e !important; + background: #fff !important; + border-radius: 3px; + + &:before { + content: ''; + display: inline-block; + width: 12px; + height: 12px; + margin-right: 10px; + border-radius: 50%; + background: #e8eaec; + } + } + } + + .avue-sidebar { + background: #001529; + + .el-menu-item { + &.is-active { + background-color: #000c17; + + &:before { + display: none; + } + + i, span { + color: var(--el-color-primary); + } + } + } + + .el-sub-menu { + .el-menu-item { + &.is-active { + background-color: var(--el-color-primary); + + &:before { + display: none; + } + + i, span { + color: #fff; + } + } + } + } + } +} diff --git a/src/styles/theme/lte.scss b/src/styles/theme/lte.scss new file mode 100644 index 0000000..ef2baea --- /dev/null +++ b/src/styles/theme/lte.scss @@ -0,0 +1,44 @@ +.theme-lte { + .avue-logo { + background-color: var(--el-color-primary); + + .avue-logo_title { + font-weight: 500; + font-size: 20px; + color: #fff; + } + } + + .avue-tags { + .el-tabs__item { + font-size: 12px !important; + font-weight: 500 !important; + } + } + + .avue-sidebar { + background-color: #263238; + + .el-menu-item, .el-sub-menu__title { + i, span { + color: #8a979e; + } + + &:hover { + background-color: #2b373d; + } + + &.is-active { + &:before { + display: none; + } + + background-color: #2b373d; + + i, span { + color: #fff; + } + } + } + } +} diff --git a/src/styles/theme/star.scss b/src/styles/theme/star.scss new file mode 100644 index 0000000..7a8055a --- /dev/null +++ b/src/styles/theme/star.scss @@ -0,0 +1,116 @@ +.theme-star { + .avue-main { + background: transparent; + } + + .avue-contail { + background-image: url("/img/star-squashed.jpg"); + background-size: 100% 100%; + } + + .avue-logo { + color: #fff; + } + + .avue-top, + .avue-logo, + .tags-container { + background-color: transparent; + } + + .el-card, .error-page { + opacity: .9; + } + + .avue-tabs { + padding: 0 20px; + } + + .avue-tags { + background-color: transparent; + border-top: none; + } + + .avue-top { + .avue-breadcrumb { + color: #fff; + } + + .el-menu-item { + i, span { + color: #fff; + } + + &.is-active { + background-color: rgba(0, 0, 0, .4) + } + } + + .el-dropdown { + color: #fff; + } + } + + .avue-sidebar { + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.15); + background-color: transparent; + + .el-menu-item, .el-sub-menu__title { + i, span { + color: #fff + } + + &:hover { + background: transparent; + + i, span { + color: var(--el-color-primary); + } + } + + &.is-active { + background-color: rgba(0, 0, 0, .4); + + i, span { + color: #fff; + } + } + } + } + + .top-search { + .el-input__inner { + color: #333; + } + + input::-webkit-input-placeholder, + textarea::-webkit-input-placeholder { + /* WebKit browsers */ + color: #fff; + } + + input:-moz-placeholder, + textarea:-moz-placeholder { + /* Mozilla Firefox 4 to 18 */ + color: #fff; + } + + input::-moz-placeholder, + textarea::-moz-placeholder { + /* Mozilla Firefox 19+ */ + color: #fff; + } + + input:-ms-input-placeholder, + textarea:-ms-input-placeholder { + /* Internet Explorer 10+ */ + color: #fff; + } + } + + .top-bar__item { + i { + color: #fff; + } + } +} diff --git a/src/styles/theme/vip.scss b/src/styles/theme/vip.scss new file mode 100644 index 0000000..a395ef5 --- /dev/null +++ b/src/styles/theme/vip.scss @@ -0,0 +1,109 @@ +.theme-vip { + $color: rgba(246, 202, 157, .7); + $is_active_color: #f6ca9d; + + .avue-top { + background-color: #20222a; + } + + .el-dropdown { + color: $color; + } + + .avue-logo { + .avue-logo_title { + background-image: -webkit-gradient(linear, left top, left bottom, from($color), to($is_active_color)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + font-weight: 400; + } + } + + .avue-breadcrumb { + i { + color: $color; + } + } + + .avue-sidebar { + .el-menu-item { + &.is-active { + &:before { + background: $color; + } + + i, span { + color: $is_active_color; + } + } + } + } + + .avue-tags { + .el-tabs__item { + color: rgba(0, 0, 0, 0.4) !important; + + &.is-active { + color: $is_active_color !important; + border-color: $is_active_color !important; + } + + &:before { + background: $is_active_color; + } + } + } + + .top-search { + .el-input__inner { + color: $color; + } + + input::-webkit-input-placeholder, + textarea::-webkit-input-placeholder { + /* WebKit browsers */ + color: $color; + } + + input:-moz-placeholder, + textarea:-moz-placeholder { + /* Mozilla Firefox 4 to 18 */ + color: $color; + } + + input::-moz-placeholder, + textarea::-moz-placeholder { + /* Mozilla Firefox 19+ */ + color: $color; + } + + input:-ms-input-placeholder, + textarea:-ms-input-placeholder { + /* Internet Explorer 10+ */ + color: $color; + } + } + + .top-bar__item { + i { + color: $color; + } + } + + .avue-top { + + .el-menu-item { + i, + span { + color: $color; + } + + &:hover { + i, + span { + color: $is_active_color; + } + } + } + } +} diff --git a/src/styles/theme/white.scss b/src/styles/theme/white.scss new file mode 100644 index 0000000..338dba1 --- /dev/null +++ b/src/styles/theme/white.scss @@ -0,0 +1,143 @@ +.theme-white { + .el-menu--popup { + .el-menu-item { + background-color: #fff; + + i, span { + color: #666; + } + + &:hover { + i, span { + color: #333; + } + } + + &.is-active { + background-color: var(--el-color-primary); + + &:before { + content: ''; + top: 0; + left: 0; + bottom: 0; + width: 4px; + background: var(--el-color-primary); + position: absolute; + } + + i, span { + color: #fff; + } + } + } + } + + .avue-top, + .avue-logo, + .tags-container { + background-color: var(--el-color-primary); + } + + .avue-sidebar--tip { + background-color: transparent; + color: #333; + } + + .el-dropdown { + color: #fff; + } + + .avue-logo_title { + font-weight: 400; + color: #fff; + } + + .logo_title, + .avue-breadcrumb { + color: #fff; + + i { + color: #fff; + } + } + + .avue-top { + .el-menu-item { + i, + span { + color: #fff; + } + + &:hover { + i, + span { + color: #fff; + } + } + } + } + + .avue-sidebar { + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.15); + background-color: #fff; + + .el-menu-item, .el-sub-menu__title { + i, span { + color: #666 + } + + &:hover { + background: transparent; + + i, span { + color: #333; + } + } + + &.is-active { + background-color: var(--el-color-primary); + + i, span { + color: #fff; + } + } + } + } + + .top-search { + .el-input__inner { + color: #333; + } + + input::-webkit-input-placeholder, + textarea::-webkit-input-placeholder { + /* WebKit browsers */ + color: #fff; + } + + input:-moz-placeholder, + textarea:-moz-placeholder { + /* Mozilla Firefox 4 to 18 */ + color: #fff; + } + + input::-moz-placeholder, + textarea::-moz-placeholder { + /* Mozilla Firefox 19+ */ + color: #fff; + } + + input:-ms-input-placeholder, + textarea:-ms-input-placeholder { + /* Internet Explorer 10+ */ + color: #fff; + } + } + + .top-bar__item { + i { + color: #fff; + } + } +} diff --git a/src/styles/top.scss b/src/styles/top.scss new file mode 100644 index 0000000..ddb4cbb --- /dev/null +++ b/src/styles/top.scss @@ -0,0 +1,143 @@ +@use './variables.scss' as variables; + +.avue-top { + position: relative; + background-color: #fff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15); + color: rgba(0, 0, 0, .65); + font-size: 28px; + height: variables.$top_height; + line-height: variables.$top_height; + box-sizing: border-box; + white-space: nowrap; + + .el-menu-item { + i, span { + font-size: 13px; + } + } +} + +.avue-breadcrumb { + height: 100%; + + i { + font-size: 30px !important; + } + + &--active { + transform: rotate(90deg); + } +} + +.top-user { + margin-left: 20px; + display: flex; + align-items: center; + cursor: pointer; +} + +.top-menu { + .el-menu-item { + padding: 0 10px; + border: none; + } +} + +.top-search { + line-height: variables.$top_height; + position: absolute !important; + right: 200px; + top: 0; + width: 300px; + + .el-input__wrapper { + font-size: 13px; + border: none; + box-shadow: none; + background-color: transparent; + } +} + +.top-bar__img { + margin: 0 5px; + padding: 2px; + width: 30px; + height: 30px; + border-radius: 100%; + box-sizing: border-box; + border: 1px solid #eee; + vertical-align: middle; +} + +.top-bar__left, +.top-bar__right { + height: variables.$top_height; + position: absolute; + margin-top: 2px; + top: 0; + + i { + line-height: variables.$top_height; + } +} + +.top-bar__left { + left: 10px; +} + +.top-bar__right { + right: 10px; + display: flex; + align-items: center; +} + +.top-bar__item { + position: relative; + display: inline-block; + height: variables.$top_height; + margin: 0 7px; + font-size: 16px; + + .el-badge__content.is-fixed { + top: 12px; + right: 5px; + } +} + +.top-bar__title { + height: 100%; + padding-left: 50px; + box-sizing: border-box; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: inherit; + font-weight: 400; +} + +.avue-logo { + height: variables.$top_height; + line-height: variables.$top_height; + background-color: #031527; + font-size: 20px; + overflow: hidden; + box-sizing: border-box; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15); + color: #fff; + + &_title { + display: block; + text-align: center; + font-weight: bold; + font-size: 20px; + } + + &_subtitle { + display: block; + text-align: center; + font-size: 18px; + font-weight: bold; + color: #fff; + } +} diff --git a/src/styles/variables.scss b/src/styles/variables.scss new file mode 100644 index 0000000..ef29df7 --- /dev/null +++ b/src/styles/variables.scss @@ -0,0 +1,3 @@ +$sidebar_width: 230px; +$sidebar_collapse: 60px; +$top_height: 50px; diff --git a/src/utils/auth.js b/src/utils/auth.js new file mode 100644 index 0000000..0c4cdd8 --- /dev/null +++ b/src/utils/auth.js @@ -0,0 +1,33 @@ +import Cookies from 'js-cookie'; +import website from '@/config/website'; + +const TokenKey = website.tokenKey; +const RefreshTokenKey = website.refreshTokenKey; +const SessionId = 'JSESSIONID'; +const UserId = 'b-user-id'; + +export function getToken() { + return Cookies.get(TokenKey); +} + +export function setToken(token) { + return Cookies.set(TokenKey, token); +} + +export function getRefreshToken() { + return Cookies.get(RefreshTokenKey); +} + +export function setRefreshToken(token) { + return Cookies.set(RefreshTokenKey, token); +} + +export function removeToken() { + Cookies.remove(SessionId); + Cookies.remove(UserId); + return Cookies.remove(TokenKey); +} + +export function removeRefreshToken() { + return Cookies.remove(RefreshTokenKey); +} diff --git a/src/utils/crypto.js b/src/utils/crypto.js new file mode 100644 index 0000000..4bbd03a --- /dev/null +++ b/src/utils/crypto.js @@ -0,0 +1,94 @@ +import CryptoJS from 'crypto-js'; + +export default class crypto { + /** + * token加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致 + * @type {string} + */ + static cryptoKey = '请配置cryptoKey'; + /** + * 报文加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致 + * @type {string} + */ + static aesKey = '请配置aesKey'; + /** + * 报文加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致 + * @type {string} + */ + static desKey = '请配置desKey'; + + /** + * aes 加密方法 + * @param data + * @returns {*} + */ + static encrypt(data) { + return this.encryptAES(data, this.aesKey); + } + + /** + * aes 解密方法 + * @param data + * @returns {*} + */ + static decrypt(data) { + return this.decryptAES(data, this.aesKey); + } + + /** + * aes 加密方法,同java:AesUtil.encryptToBase64(text, aesKey); + */ + static encryptAES(data, key) { + const dataBytes = CryptoJS.enc.Utf8.parse(data); + const keyBytes = CryptoJS.enc.Utf8.parse(key); + const encrypted = CryptoJS.AES.encrypt(dataBytes, keyBytes, { + iv: keyBytes, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + return CryptoJS.enc.Base64.stringify(encrypted.ciphertext); + } + + /** + * aes 解密方法,同java:AesUtil.decryptFormBase64ToString(encrypt, aesKey); + */ + static decryptAES(data, key) { + const keyBytes = CryptoJS.enc.Utf8.parse(key); + const decrypted = CryptoJS.AES.decrypt(data, keyBytes, { + iv: keyBytes, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + return CryptoJS.enc.Utf8.stringify(decrypted); + } + + /** + * des 加密方法,同java:DesUtil.encryptToBase64(text, desKey) + */ + static encryptDES(data, key) { + const keyHex = CryptoJS.enc.Utf8.parse(key); + const encrypted = CryptoJS.DES.encrypt(data, keyHex, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + }); + return encrypted.toString(); + } + + /** + * des 解密方法,同java:DesUtil.decryptFormBase64(encryptBase64, desKey); + */ + static decryptDES(data, key) { + const keyHex = CryptoJS.enc.Utf8.parse(key); + const decrypted = CryptoJS.DES.decrypt( + { + ciphertext: CryptoJS.enc.Base64.parse(data), + }, + keyHex, + { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + } + ); + return decrypted.toString(CryptoJS.enc.Utf8); + } +} diff --git a/src/utils/date.js b/src/utils/date.js new file mode 100644 index 0000000..35d9eb7 --- /dev/null +++ b/src/utils/date.js @@ -0,0 +1,58 @@ +export const calcDate = (date1, date2) => { + let date3 = date2 - date1; + + let days = Math.floor(date3 / (24 * 3600 * 1000)); + + let leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数 + let hours = Math.floor(leave1 / (3600 * 1000)); + + let leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数 + let minutes = Math.floor(leave2 / (60 * 1000)); + + let leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数 + let seconds = Math.round(date3 / 1000); + return { + leave1, + leave2, + leave3, + days: days, + hours: hours, + minutes: minutes, + seconds: seconds, + }; +}; + +/** + * 日期格式化 + */ +export function dateFormat(date, format) { + format = format || 'yyyy-MM-dd hh:mm:ss'; + if (date !== 'Invalid Date') { + let o = { + 'M+': date.getMonth() + 1, //month + 'd+': date.getDate(), //day + 'h+': date.getHours(), //hour + 'm+': date.getMinutes(), //minute + 's+': date.getSeconds(), //second + 'q+': Math.floor((date.getMonth() + 3) / 3), //quarter + S: date.getMilliseconds(), //millisecond + }; + if (/(y+)/.test(format)) + format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); + for (let k in o) + if (new RegExp('(' + k + ')').test(format)) + format = format.replace( + RegExp.$1, + RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length) + ); + return format; + } + return ''; +} + +/** + * 当前时间戳 + */ +export function dateNow() { + return dateFormat(new Date(), 'yyyyMMddhhmmss'); +} diff --git a/src/utils/flow.js b/src/utils/flow.js new file mode 100644 index 0000000..7c9e918 --- /dev/null +++ b/src/utils/flow.js @@ -0,0 +1,20 @@ +/** + * 工作流统一分类格式 + * @param category 分类字典号 + * @returns {string} + */ +export function flowCategory(category) { + return `flow_${category}`; +} + +/** + * 根据key获取流程路由 + * @param routes + * @param key + */ +export function flowRoute(routes, key) { + const data = routes.filter(d => { + return d.routeKey === key; + }); + return data.length === 0 ? [] : data[0].routeValue; +} diff --git a/src/utils/formatter.js b/src/utils/formatter.js new file mode 100644 index 0000000..2c8e925 --- /dev/null +++ b/src/utils/formatter.js @@ -0,0 +1,46 @@ +import {validatenull} from "@/utils/validate"; + +/** + * 格式化工具类 + */ +export default class formatter { + static prettyCode(str) { + try { + // 为空则返回空 + if (validatenull(str)) { + return ''; + } + // 解析并格式化JSON字符串 + str = JSON.stringify(JSON.parse(str), null, 2); + + // 先处理 < 符号,然后特殊处理 > 符号 + // 处理所有 < 符号(因为 <- 中的 < 转换不影响显示) + str = str.replace(/ 符号 + // 将所有 > 替换,但排除 -> 的情况 + str = str.replace(/([^-])>/g, '$1>'); + // 处理行首的 > 符号 + str = str.replace(/^>/gm, '>'); + + // 返回格式化的字符串,并添加样式类 + return str.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { + let cls = 'number'; + if (/^"/.test(match)) { + if (/:$/.test(match)) { + cls = 'key'; + } else { + cls = 'string'; + } + } else if (/true|false/.test(match)) { + cls = 'boolean'; + } else if (/null/.test(match)) { + cls = 'null'; + } + return match; + }); + } catch (e) { + return str; + } + } +} diff --git a/src/utils/func.js b/src/utils/func.js new file mode 100644 index 0000000..ac6fe0e --- /dev/null +++ b/src/utils/func.js @@ -0,0 +1,310 @@ +/** + * 通用工具类 + */ +export default class func { + /** + * 不为空 + * @param val + * @returns {boolean} + */ + static notEmpty(val) { + return !this.isEmpty(val); + } + + /** + * 是否为定义 + * @param val + * @returns {boolean} + */ + static isUndefined(val) { + return val === null || typeof val === 'undefined'; + } + + /** + * 为空 + * @param val + * @returns {boolean} + */ + static isEmpty(val) { + if ( + val === null || + typeof val === 'undefined' || + (typeof val === 'string' && val === '' && val !== 'undefined') + ) { + return true; + } + return false; + } + + /** + * 强转int型 + * @param val + * @param defaultValue + * @returns {number} + */ + static toInt(val, defaultValue) { + if (this.isEmpty(val)) { + return defaultValue === undefined ? -1 : defaultValue; + } + const num = parseInt(val, 0); + return Number.isNaN(num) ? (defaultValue === undefined ? -1 : defaultValue) : num; + } + + /** + * 转为数字型(转换失败则返回原值) + * @param val + */ + static toNumber(val) { + if (this.isEmpty(val)) { + return ''; + } + const num = parseFloat(val); + return Number.isNaN(num) ? val : num; + } + + /** + * Json强转为Form类型 + * @param obj + * @returns {FormData} + */ + static toFormData(obj) { + const data = new FormData(); + Object.keys(obj).forEach(key => { + data.append(key, Array.isArray(obj[key]) ? obj[key].join(',') : obj[key]); + }); + return data; + } + + /** + * date类转为字符串格式 + * @param date + * @param format + * @returns {null} + */ + static format(date, format = 'YYYY-MM-DD HH:mm:ss') { + return date ? date.format(format) : null; + } + + /** + * data类格式化 + * @param timestamp + * @returns {string} + */ + static formatDateTime(timestamp) { + return this.formatDate(new Date(timestamp)); + } + + /** + * data类格式化 + * @param date + * @returns {string} + */ + static formatDate(date) { + const pad = num => (num < 10 ? '0' + num : num); + + const year = date.getFullYear(); + const month = pad(date.getMonth() + 1); // 月份从0开始,所以+1 + const day = pad(date.getDate()); + const hour = pad(date.getHours()); + const minute = pad(date.getMinutes()); + const second = pad(date.getSeconds()); + + return `${year}-${month}-${day} ${hour}:${minute}:${second}`; + } + + /** + * 格式化时区解决时间差问题 + * @param datetime + * @returns {string} + */ + static toLocalISOString(datetime) { + let timezoneOffset = datetime.getTimezoneOffset() * 60000; // 获取当前时区与UTC的时间差(以毫秒为单位) + let localDatetime = new Date(datetime - timezoneOffset); // 调整时间,得到当前时区时间 + return localDatetime.toISOString(); + } + + /** + * 根据逗号联合 + * @param arr + * @returns {string} + */ + static join(arr) { + return Array.isArray(arr) ? arr.join(',') : arr; + } + + /** + * 根据逗号分隔 + * @param str + * @returns {string} + */ + static split(str) { + return str ? String(str).split(',') : ''; + } + + /** + * 转换空字符串 + * @param str + * @returns {string|*} + */ + static toStr(str) { + if (typeof str === 'undefined' || str === null) { + return ''; + } + return str; + } + + /** + * 判断是否为数组 + * @param param + * @returns {boolean} + */ + static isArrayAndNotEmpty(param) { + return Array.isArray(param) && param.length > 0; + } + + /** + * 格式化URL + * @param url + * @returns {*|string} + */ + static formatUrl(url) { + if (!url) return url; + if (url.startsWith('http://') || url.startsWith('https://')) { + return url; + } else { + return `http://${url}`; + } + } + + /** + * bytes转换为kb单位 + * @param bytes + * @returns {string} + */ + static bytesToKB(bytes) { + const kb = bytes / 1024; + return kb.toFixed(2); + } + + /** + * json数组转换成key value字符串 + * @param jsonArray "[{enumKey: 'key', enumValue: 'value'}]" + * @returns {*} + */ + static jsonArrayToKeyValue(jsonArray) { + if (this.isEmpty(jsonArray)) { + return ''; + } + return jsonArray.map(item => `${item.enumKey}:${item.enumValue}`).join(';'); + } + + /** + * key value字符串转换成json数组 + * @param keyValue key:value;key:value + * @returns {*[]} + */ + static keyValueToJsonArray(keyValue) { + if (this.isEmpty(keyValue)) { + return []; + } + return keyValue.split(';').map((kv, index) => { + const [key, value] = kv.split(':'); + return { + id: index, + enumKey: key, + enumValue: value, + }; + }); + } + + /** + * 检查字符串str中是否包含子字符串val + * @param {string} str 要检查的字符串 + * @param {string} val 要查找的子字符串 + * @return {boolean} 如果str包含val则返回true,否则返回false + */ + static contains(str, val) { + // 检查str是否为字符串且不为空 + if (typeof str === 'string' && str.length > 0) { + return str.includes(val); + } + return false; + } + + /** + * 截取字符串 + * @param str 字符串 + * @param len 截取长度 + * @returns {*|string} + */ + static truncateString(str, len = 20) { + if (str.length > len) { + return str.slice(0, len) + '...'; + } + return str; + } + + /** + * 驼峰转下划线 + * @param str + * @returns {*} + */ + static camelCaseString(str) { + return str.replace(/_([a-z])/g, g => g[1].toUpperCase()); + } + + /** + * 生成随机字符串 + * @param length 长度 + * @returns {string} + */ + static strGenerate(length) { + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const maxLength = 256; + if (length > maxLength) { + throw new Error(`长度最大值不能超过 ${maxLength}`); + } + + return Array.from({ length }, () => + characters.charAt(Math.floor(Math.random() * characters.length)) + ).join(''); + } + + /** + * 生成UUID + * @returns {string} + */ + static generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + const r = (Math.random() * 16) | 0, + v = c === 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); + } + + /** + * 过滤空对象 + * @param obj + * @returns {Object} + */ + static filterEmptyObject(obj) { + return Object.fromEntries( + Object.entries(obj).filter( + ([, value]) => value !== '' && value !== null && value !== undefined + ) + ); + } + + /** + * 获取用户租户ID + * @param userInfo + * @returns {string} + */ + static getUserTenantId(userInfo) { + if (userInfo && userInfo.tenant_id) { + return userInfo.tenant_id; + } else if (userInfo && userInfo.tenantId) { + return userInfo.tenantId; + } + } +} diff --git a/src/utils/module.js b/src/utils/module.js new file mode 100644 index 0000000..6b34053 --- /dev/null +++ b/src/utils/module.js @@ -0,0 +1,39 @@ +let flowInstance = null; +let formInstance = null; +let formDesignInstance = null; + +export function loadFlowModule(app) { + if (!flowInstance) { + flowInstance = import('@saber/nf-design-base-elp') + .then(module => { + app.use(module.default); + return module; + }) + .catch(error => console.error('failed to load module:', error)); + } + return flowInstance; +} + +export function loadFormModule(app) { + if (!formInstance) { + formInstance = import('@saber/nf-form-elp') + .then(module => { + app.use(module.default); + return module; + }) + .catch(error => console.error('failed to load module:', error)); + } + return formInstance; +} + +export function loadFormDesignModule(app) { + if (!formDesignInstance) { + formDesignInstance = import('@saber/nf-form-design-elp') + .then(module => { + app.use(module.default); + return module; + }) + .catch(error => console.error('failed to load module:', error)); + } + return formDesignInstance; +} diff --git a/src/utils/sensitive.js b/src/utils/sensitive.js new file mode 100644 index 0000000..91c4226 --- /dev/null +++ b/src/utils/sensitive.js @@ -0,0 +1,81 @@ +export const sensitive = { + /** + * 初始化敏感数据管理器 + * @param {Object} config 配置项 + * @param {Array} config.fields 需要脱敏的字段列表 + * @returns {Object} 敏感数据管理器实例 + */ + create(config = {}) { + const sensitiveFields = config.fields || []; + let initialMaskedData = {}; + + return { + /** + * 保存初始的脱敏数据 + * @param {Object} data 包含脱敏数据的对象 + */ + saveInitialData(data) { + initialMaskedData = {}; + sensitiveFields.forEach(field => { + if (data[field]) { + initialMaskedData[field] = data[field]; + } + }); + }, + + /** + * 获取要提交的数据,过滤掉未修改的敏感字段 + * @param {Object} formData 表单数据 + * @returns {Object} 过滤后的提交数据 + */ + getSubmitData(formData) { + const submitData = { ...formData }; + + sensitiveFields.forEach(field => { + // 如果敏感字段的值与初始值相同,删除该字段 + if (submitData[field] === initialMaskedData[field]) { + delete submitData[field]; + } + }); + + return submitData; + }, + + /** + * 更新脱敏数据 + * @param {Object} newMaskedData 新的脱敏数据 + */ + updateMaskedData(newMaskedData) { + Object.assign(initialMaskedData, newMaskedData); + }, + + /** + * 判断敏感数据是否被修改 + * @returns {boolean} + */ + isModified(formData) { + return sensitiveFields.some(field => formData[field] !== initialMaskedData[field]); + }, + + /** + * 获取已修改的敏感字段列表 + * @returns {Array} + */ + getModifiedFields(formData) { + return sensitiveFields.filter(field => formData[field] !== initialMaskedData[field]); + }, + + /** + * 重置为初始状态 + * @param {Object} formData 表单数据对象 + */ + reset(formData) { + sensitiveFields.forEach(field => { + if (initialMaskedData[field]) { + formData[field] = initialMaskedData[field]; + } + }); + }, + }; + }, +}; diff --git a/src/utils/sm2.js b/src/utils/sm2.js new file mode 100644 index 0000000..9df9880 --- /dev/null +++ b/src/utils/sm2.js @@ -0,0 +1,15 @@ +import website from '@/config/website'; +import smCrypto from 'sm-crypto'; + +/** + * sm2 加密方法 + * @param data + * @returns {*} + */ +export function encrypt(data) { + try { + return smCrypto.sm2.doEncrypt(data, website.oauth2.publicKey, 0); + } catch { + return ''; + } +} diff --git a/src/utils/store.js b/src/utils/store.js new file mode 100644 index 0000000..d007dc9 --- /dev/null +++ b/src/utils/store.js @@ -0,0 +1,103 @@ +import { validatenull } from 'utils/validate'; +import website from '@/config/website'; + +const keyName = website.key + '-'; +/** + * 存储localStorage + */ +export const setStore = (params = {}) => { + let { name, content, type } = params; + name = keyName + name; + let obj = { + dataType: typeof content, + content: content, + type: type, + datetime: new Date().getTime(), + }; + if (type) window.sessionStorage.setItem(name, JSON.stringify(obj)); + else window.localStorage.setItem(name, JSON.stringify(obj)); +}; +/** + * 获取localStorage + */ + +export const getStore = (params = {}) => { + let { name, debug } = params; + name = keyName + name; + let obj = {}, + content; + obj = window.sessionStorage.getItem(name); + if (validatenull(obj)) obj = window.localStorage.getItem(name); + if (validatenull(obj)) return; + try { + obj = JSON.parse(obj); + } catch { + return obj; + } + if (debug) { + return obj; + } + if (obj.dataType == 'string') { + content = obj.content; + } else if (obj.dataType == 'number') { + content = Number(obj.content); + } else if (obj.dataType == 'boolean') { + content = eval(obj.content); + } else if (obj.dataType == 'object') { + content = obj.content; + } + return content; +}; +/** + * 删除localStorage + */ +export const removeStore = (params = {}) => { + let { name, type } = params; + name = keyName + name; + if (type) { + window.sessionStorage.removeItem(name); + } else { + window.localStorage.removeItem(name); + } +}; + +/** + * 获取全部localStorage + */ +export const getAllStore = (params = {}) => { + let list = []; + let { type } = params; + if (type) { + for (let i = 0; i <= window.sessionStorage.length; i++) { + list.push({ + name: window.sessionStorage.key(i), + content: getStore({ + name: window.sessionStorage.key(i), + type: 'session', + }), + }); + } + } else { + for (let i = 0; i <= window.localStorage.length; i++) { + list.push({ + name: window.localStorage.key(i), + content: getStore({ + name: window.localStorage.key(i), + }), + }); + } + } + return list; +}; + +/** + * 清空全部localStorage + */ +export const clearStore = (params = {}) => { + let { type } = params; + if (type) { + window.sessionStorage.clear(); + } else { + window.localStorage.clear(); + } +}; diff --git a/src/utils/util.js b/src/utils/util.js new file mode 100644 index 0000000..79c5529 --- /dev/null +++ b/src/utils/util.js @@ -0,0 +1,468 @@ +import { validatenull } from './validate'; +import sha256 from 'crypto-js/sha256'; +import Base64 from 'crypto-js/enc-base64'; +//表单序列化 +export const serialize = data => { + let list = []; + Object.keys(data).forEach(ele => { + list.push(`${ele}=${data[ele]}`); + }); + return list.join('&'); +}; +export const getObjType = obj => { + var toString = Object.prototype.toString; + var map = { + '[object Boolean]': 'boolean', + '[object Number]': 'number', + '[object String]': 'string', + '[object Function]': 'function', + '[object Array]': 'array', + '[object Date]': 'date', + '[object RegExp]': 'regExp', + '[object Undefined]': 'undefined', + '[object Null]': 'null', + '[object Object]': 'object', + }; + if (obj instanceof Element) { + return 'element'; + } + return map[toString.call(obj)]; +}; +/** + * 对象深拷贝 + */ +export const deepClone = data => { + var type = getObjType(data); + var obj; + if (type === 'array') { + obj = []; + } else if (type === 'object') { + obj = {}; + } else { + //不再具有下一层次 + return data; + } + if (type === 'array') { + for (var i = 0, len = data.length; i < len; i++) { + obj.push(deepClone(data[i])); + } + } else if (type === 'object') { + for (var key in data) { + obj[key] = deepClone(data[key]); + } + } + return obj; +}; +/** + * 设置灰度模式 + */ +export const toggleGrayMode = status => { + if (status) { + document.body.className = document.body.className + ' grayMode'; + } else { + document.body.className = document.body.className.replace(' grayMode', ''); + } +}; +/** + * 设置主题 + */ +export const setTheme = name => { + document.body.className = name; +}; + +/** + * 加密处理 + */ +export const encryption = params => { + let { data = {}, type, param, key } = params; + let result = JSON.parse(JSON.stringify(data)); + if (type == 'Base64') { + param.forEach(ele => { + result[ele] = Base64.stringify(result[ele]); + }); + } else if (type == 'Aes') { + param.forEach(ele => { + result[ele] = sha256(result[ele], key); + }); + } + return result; +}; + +/** + * 浏览器判断是否全屏 + */ +export const fullscreenToggel = () => { + if (fullscreenEnable()) { + exitFullScreen(); + } else { + reqFullScreen(); + } +}; +/** + * esc监听全屏 + */ +export const listenfullscreen = callback => { + function listen() { + callback(); + } + + document.addEventListener('fullscreenchange', function () { + listen(); + }); + document.addEventListener('mozfullscreenchange', function () { + listen(); + }); + document.addEventListener('webkitfullscreenchange', function () { + listen(); + }); + document.addEventListener('msfullscreenchange', function () { + listen(); + }); +}; +/** + * 浏览器判断是否全屏 + */ +export const fullscreenEnable = () => { + var isFullscreen = + document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen; + return isFullscreen; +}; + +/** + * 浏览器全屏 + */ +export const reqFullScreen = () => { + if (document.documentElement.requestFullScreen) { + document.documentElement.requestFullScreen(); + } else if (document.documentElement.webkitRequestFullScreen) { + document.documentElement.webkitRequestFullScreen(); + } else if (document.documentElement.mozRequestFullScreen) { + document.documentElement.mozRequestFullScreen(); + } +}; +/** + * 浏览器退出全屏 + */ +export const exitFullScreen = () => { + if (document.documentElement.requestFullScreen) { + document.exitFullScreen(); + } else if (document.documentElement.webkitRequestFullScreen) { + document.webkitCancelFullScreen(); + } else if (document.documentElement.mozRequestFullScreen) { + document.mozCancelFullScreen(); + } +}; +/** + * 递归寻找子类的父类 + */ + +export const findParent = (menu, id) => { + for (let i = 0; i < menu.length; i++) { + if (menu[i].children.length != 0) { + for (let j = 0; j < menu[i].children.length; j++) { + if (menu[i].children[j].id == id) { + return menu[i]; + } else { + if (menu[i].children[j].children.length != 0) { + return findParent(menu[i].children[j].children, id); + } + } + } + } + } +}; +/** + * 判断2个对象属性和值是否相等 + */ + +/** + * 动态插入css + */ + +export const loadStyle = url => { + const link = document.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + const head = document.getElementsByTagName('head')[0]; + head.appendChild(link); +}; +/** + * 判断路由是否相等 + */ +export const diff = (obj1, obj2) => { + delete obj1.close; + var o1 = obj1 instanceof Object; + var o2 = obj2 instanceof Object; + if (!o1 || !o2) { + /* 判断不是对象 */ + return obj1 === obj2; + } + + if (Object.keys(obj1).length !== Object.keys(obj2).length) { + return false; + //Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2; + } + + for (var attr in obj1) { + var t1 = obj1[attr] instanceof Object; + var t2 = obj2[attr] instanceof Object; + if (t1 && t2) { + return diff(obj1[attr], obj2[attr]); + } else if (obj1[attr] !== obj2[attr]) { + return false; + } + } + return true; +}; +/** + * 根据字典的value显示label + */ +export const findByvalue = (dic, value) => { + let result = ''; + if (validatenull(dic)) return value; + if (typeof value == 'string' || typeof value == 'number' || typeof value == 'boolean') { + let index = 0; + index = findArray(dic, value); + if (index != -1) { + result = dic[index].label; + } else { + result = value; + } + } else if (value instanceof Array) { + result = []; + let index = 0; + value.forEach(ele => { + index = findArray(dic, ele); + if (index != -1) { + result.push(dic[index].label); + } else { + result.push(value); + } + }); + result = result.toString(); + } + return result; +}; +/** + * 根据字典的value查找对应的index + */ +export const findArray = (dic, value) => { + for (let i = 0; i < dic.length; i++) { + if (dic[i].value == value) { + return i; + } + } + return -1; +}; +/** + * 生成随机len位数字 + */ +export const randomLenNum = (len, date) => { + let random = ''; + random = Math.ceil(Math.random() * 100000000000000) + .toString() + .substr(0, len ? len : 4); + if (date) random = random + Date.now(); + return random; +}; +/** + * 打开小窗口 + */ +export const openWindow = (url, title, w, h) => { + // Fixes dual-screen position Most browsers Firefox + const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left; + const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top; + + const width = window.innerWidth + ? window.innerWidth + : document.documentElement.clientWidth + ? document.documentElement.clientWidth + : screen.width; + const height = window.innerHeight + ? window.innerHeight + : document.documentElement.clientHeight + ? document.documentElement.clientHeight + : screen.height; + + const left = width / 2 - w / 2 + dualScreenLeft; + const top = height / 2 - h / 2 + dualScreenTop; + const newWindow = window.open( + url, + title, + 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + + w + + ', height=' + + h + + ', top=' + + top + + ', left=' + + left + ); + + // Puts focus on the newWindow + if (window.focus) { + newWindow.focus(); + } +}; + +export const getScreen = isCollapse => { + if (document.body.clientWidth <= 768) { + return !isCollapse; + } else { + return isCollapse; + } +}; + +/** + * 获取顶部地址栏地址 + */ +export const getTopUrl = () => { + return window.location.href.split('/#/')[0]; +}; + +/** + * 获取url参数 + * @param name 参数名 + */ +export const getQueryString = name => { + let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); + let r = window.location.search.substr(1).match(reg); + if (r != null) return unescape(decodeURI(r[2])); + return null; +}; + +/** + * 下载文件 + * @param {String} path - 文件地址 + * @param {String} name - 文件名,eg: test.png + */ +export const downloadFileBlob = (path, name) => { + const xhr = new XMLHttpRequest(); + xhr.open('get', path); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function () { + if (this.status === 200 || this.status === 304) { + // 如果是IE10及以上,不支持download属性,采用msSaveOrOpenBlob方法,但是IE10以下也不支持msSaveOrOpenBlob + if ('msSaveOrOpenBlob' in navigator) { + navigator.msSaveOrOpenBlob(this.response, name); + return; + } + const url = URL.createObjectURL(this.response); + const a = document.createElement('a'); + a.style.display = 'none'; + a.href = url; + a.download = name; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + } + }; +}; + +/** + * 下载文件 + * @param {String} path - 文件地址 + * @param {String} name - 文件名,eg: test.png + */ +export const downloadFileBase64 = (path, name) => { + const xhr = new XMLHttpRequest(); + xhr.open('get', path); + xhr.responseType = 'blob'; + xhr.send(); + xhr.onload = function () { + if (this.status === 200 || this.status === 304) { + const fileReader = new FileReader(); + fileReader.readAsDataURL(this.response); + fileReader.onload = function () { + const a = document.createElement('a'); + a.style.display = 'none'; + a.href = this.result; + a.download = name; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + }; + } + }; +}; + +/** + * 下载excel + * @param {blob} fileArrayBuffer 文件流 + * @param {String} filename 文件名称 + */ +export const downloadXls = (fileArrayBuffer, filename) => { + downloadFile(fileArrayBuffer, filename, 'application/vnd.ms-excel,charset=utf-8'); +}; + +/** + * 下载json + * @param {blob} fileArrayBuffer 文件流 + * @param {String} filename 文件名称 + */ +export const downloadJson = (fileArrayBuffer, filename) => { + downloadFile(fileArrayBuffer, filename, 'application/json,charset=utf-8'); +}; + +/** + * 下载文件 + * @param fileArrayBuffer 文件流 + * @param filename 文件名 + * @param mimeType 文件类型 + */ +export const downloadFile = (fileArrayBuffer, filename, mimeType = 'application/octet-stream') => { + let data = new Blob([fileArrayBuffer], { type: mimeType }); + if (typeof window.chrome !== 'undefined') { + // Chrome + let link = document.createElement('a'); + link.href = window.URL.createObjectURL(data); + link.download = filename; + link.click(); + } else if (typeof window.navigator.msSaveBlob !== 'undefined') { + // IE + let blob = new Blob([data], { type: 'application/force-download' }); + window.navigator.msSaveBlob(blob, filename); + } else { + // Firefox + let file = new File([data], filename, { type: 'application/force-download' }); + window.open(URL.createObjectURL(file)); + } +}; + +/** + * 通过URL下载文件 + * @param {String} url 文件URL + * @param {String} filename 文件名 + */ +export const downloadFileByUrl = (url, filename) => { + const link = document.createElement('a'); + link.href = url; + link.download = filename || '下载文件'; + link.style.display = 'none'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); +}; + +/** + * 在 option 配置中查找指定 prop 的 column 对象 + * 支持两种格式: + * 1. column 数组格式:[{ prop: 'xxx', ... }, ...] + * 2. group 数组格式:[{ column: [...] }, ...] - group 中包含 column 数组 + * @param {Array} arr - column 数组或 group 数组 + * @param {string} prop - 要查找的 column 的 prop 值 + * @returns {Object|null} 返回找到的 column 对象引用,未找到返回 null + */ +export const findColumn = (arr, prop) => { + if (!Array.isArray(arr) || arr.length === 0) { + return null; + } + + // 使用 flatMap 统一处理两种格式: + // - group 格式:item.column 存在,展开为 column 数组 + // - column 格式:item.column 不存在,返回 item 本身 + return arr.flatMap(item => item.column || item).find(col => col.prop === prop) || null; +}; diff --git a/src/utils/validate.js b/src/utils/validate.js new file mode 100644 index 0000000..cc55c08 --- /dev/null +++ b/src/utils/validate.js @@ -0,0 +1,285 @@ +/** + * Created by jiachenpan on 16/11/18. + */ + +export function isvalidUsername(str) { + const valid_map = ['admin', 'editor']; + return valid_map.indexOf(str.trim()) >= 0; +} + +/* 合法uri*/ +export function validateURL(textval) { + const urlregex = + /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/; + return urlregex.test(textval); +} + +/** + * 邮箱 + * @param {*} s + */ +export function isEmail(s) { + return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s); +} + +/** + * 手机号码 + * @param {*} s + */ +export function isMobile(s) { + return /^1[0-9]{10}$/.test(s); +} + +/** + * 电话号码 + * @param {*} s + */ +export function isPhone(s) { + return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s); +} + +/** + * URL地址 + * @param {*} s + */ +export function isURL(s) { + return /^http[s]?:\/\/.*/.test(s); +} + +/* 小写字母*/ +export function validateLowerCase(str) { + const reg = /^[a-z]+$/; + return reg.test(str); +} + +/* 大写字母*/ +export function validateUpperCase(str) { + const reg = /^[A-Z]+$/; + return reg.test(str); +} + +/* 大小写字母*/ +export function validatAlphabets(str) { + const reg = /^[A-Za-z]+$/; + return reg.test(str); +} + +/*验证pad还是pc*/ +export const vaildatePc = function () { + const userAgentInfo = navigator.userAgent; + const Agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod']; + let flag = true; + for (var v = 0; v < Agents.length; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +}; + +/** + * validate email + * @param email + * @returns {boolean} + */ +export function validateEmail(email) { + const re = + /^(([^<>()\\[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(email); +} + +/** + * 判断身份证号码 + */ +export function cardid(code) { + let list = []; + let result = true; + let msg = ''; + var city = { + 11: '北京', + 12: '天津', + 13: '河北', + 14: '山西', + 15: '内蒙古', + 21: '辽宁', + 22: '吉林', + 23: '黑龙江 ', + 31: '上海', + 32: '江苏', + 33: '浙江', + 34: '安徽', + 35: '福建', + 36: '江西', + 37: '山东', + 41: '河南', + 42: '湖北 ', + 43: '湖南', + 44: '广东', + 45: '广西', + 46: '海南', + 50: '重庆', + 51: '四川', + 52: '贵州', + 53: '云南', + 54: '西藏 ', + 61: '陕西', + 62: '甘肃', + 63: '青海', + 64: '宁夏', + 65: '新疆', + 71: '台湾', + 81: '香港', + 82: '澳门', + 91: '国外 ', + }; + if (!validatenull(code)) { + if (code.length === 18) { + if (!code || !/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(code)) { + msg = '证件号码格式错误'; + } else if (!city[code.substr(0, 2)]) { + msg = '地址编码错误'; + } else { + //18位身份证需要验证最后一位校验位 + code = code.split(''); + //∑(ai×Wi)(mod 11) + //加权因子 + var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; + //校验位 + var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, 'x']; + var sum = 0; + var ai = 0; + var wi = 0; + for (var i = 0; i < 17; i++) { + ai = code[i]; + wi = factor[i]; + sum += ai * wi; + } + if (parity[sum % 11] !== code[17]) { + msg = '证件号码校验位错误'; + } else { + result = false; + } + } + } else { + msg = '证件号码长度不为18位'; + } + } else { + msg = '证件号码不能为空'; + } + list.push(result); + list.push(msg); + return list; +} + +/** + * 判断手机号码是否正确 + */ +export function isvalidatemobile(phone) { + let list = []; + let result = true; + let msg = ''; + var isPhone = /^0\d{2,3}-?\d{7,8}$/; + //增加134 减少|1349[0-9]{7},增加181,增加145,增加17[678] + if (!validatenull(phone)) { + if (phone.length === 11) { + if (isPhone.test(phone)) { + msg = '手机号码格式不正确'; + } else { + result = false; + } + } else { + msg = '手机号码长度不为11位'; + } + } else { + msg = '手机号码不能为空'; + } + list.push(result); + list.push(msg); + return list; +} + +/** + * 判断姓名是否正确 + */ +export function validatename(name) { + var regName = /^[\u4e00-\u9fa5]{2,4}$/; + if (!regName.test(name)) return false; + return true; +} + +/** + * 判断是否为整数 + */ +export function validatenum(num, type) { + let regName = /[^\d.]/g; + if (type === 1) { + if (!regName.test(num)) return false; + } else if (type === 2) { + regName = /[^\d]/g; + if (!regName.test(num)) return false; + } + return true; +} + +/** + * 判断是否为小数 + */ +export function validatenumord(num, type) { + let regName = /[^\d.]/g; + if (type === 1) { + if (!regName.test(num)) return false; + } else if (type === 2) { + regName = /[^\d.]/g; + if (!regName.test(num)) return false; + } + return true; +} + +/** + * 判断是否为空 + */ +export function validatenull(val) { + if (typeof val == 'boolean') { + return false; + } + if (typeof val == 'number') { + return false; + } + if (val instanceof Array) { + if (val.length === 0) return true; + } else if (val instanceof Object) { + if (JSON.stringify(val) === '{}') return true; + } else { + if (val === 'null' || val == null || val === 'undefined' || val === undefined || val === '') + return true; + return false; + } + return false; +} + +/** + * 判断输入是否为有效的 JSON 或者 JSON 字符串 + * @param {any} val - 待判断的值 + * @returns {boolean} - 如果是对象或可解析的 JSON 字符串,返回 true;否则返回 false + */ +export function validatejson(val) { + // 直接判断是否为对象(排除 null 和数组) + if (val !== null && typeof val === 'object') { + return true; + } + + // 尝试解析字符串为 JSON + if (typeof val === 'string') { + try { + const obj = JSON.parse(val); + // 解析后还需判断是否为对象或数组 + return obj !== null && typeof obj === 'object'; + } catch (e) { + return false; + } + } + + // 非对象、非数组、非字符串,或者字符串不是 JSON + return false; +} diff --git a/src/views/authority/apikey.vue b/src/views/authority/apikey.vue new file mode 100644 index 0000000..4c18096 --- /dev/null +++ b/src/views/authority/apikey.vue @@ -0,0 +1,831 @@ + + + diff --git a/src/views/authority/apiscope.vue b/src/views/authority/apiscope.vue new file mode 100644 index 0000000..b42fbee --- /dev/null +++ b/src/views/authority/apiscope.vue @@ -0,0 +1,733 @@ + + + diff --git a/src/views/authority/datascope.vue b/src/views/authority/datascope.vue new file mode 100644 index 0000000..547c442 --- /dev/null +++ b/src/views/authority/datascope.vue @@ -0,0 +1,868 @@ + + + diff --git a/src/views/authority/ratelimit.vue b/src/views/authority/ratelimit.vue new file mode 100644 index 0000000..53907c4 --- /dev/null +++ b/src/views/authority/ratelimit.vue @@ -0,0 +1,639 @@ + + + diff --git a/src/views/authority/role.vue b/src/views/authority/role.vue new file mode 100644 index 0000000..4d62967 --- /dev/null +++ b/src/views/authority/role.vue @@ -0,0 +1,655 @@ + + + diff --git a/src/views/base/region.vue b/src/views/base/region.vue new file mode 100644 index 0000000..332d4cc --- /dev/null +++ b/src/views/base/region.vue @@ -0,0 +1,472 @@ + + + + + diff --git a/src/views/data/record.vue b/src/views/data/record.vue new file mode 100644 index 0000000..f7f312b --- /dev/null +++ b/src/views/data/record.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/src/views/desk/notice-composition.vue b/src/views/desk/notice-composition.vue new file mode 100644 index 0000000..6c7a7f2 --- /dev/null +++ b/src/views/desk/notice-composition.vue @@ -0,0 +1,309 @@ + + + + + diff --git a/src/views/desk/notice.vue b/src/views/desk/notice.vue new file mode 100644 index 0000000..6787829 --- /dev/null +++ b/src/views/desk/notice.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/src/views/flow/deploy.vue b/src/views/flow/deploy.vue new file mode 100644 index 0000000..9fac645 --- /dev/null +++ b/src/views/flow/deploy.vue @@ -0,0 +1,160 @@ + + + diff --git a/src/views/flow/follow.vue b/src/views/flow/follow.vue new file mode 100644 index 0000000..3c9938b --- /dev/null +++ b/src/views/flow/follow.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/src/views/flow/manager.vue b/src/views/flow/manager.vue new file mode 100644 index 0000000..6658cef --- /dev/null +++ b/src/views/flow/manager.vue @@ -0,0 +1,371 @@ + + + diff --git a/src/views/flow/model.vue b/src/views/flow/model.vue new file mode 100644 index 0000000..33b3518 --- /dev/null +++ b/src/views/flow/model.vue @@ -0,0 +1,432 @@ + + + + + diff --git a/src/views/job/jobinfo.vue b/src/views/job/jobinfo.vue new file mode 100644 index 0000000..ed3a7ca --- /dev/null +++ b/src/views/job/jobinfo.vue @@ -0,0 +1,295 @@ + + + + + diff --git a/src/views/job/jobserver.vue b/src/views/job/jobserver.vue new file mode 100644 index 0000000..f156c46 --- /dev/null +++ b/src/views/job/jobserver.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/src/views/monitor/log/api.vue b/src/views/monitor/log/api.vue new file mode 100644 index 0000000..be4fbb8 --- /dev/null +++ b/src/views/monitor/log/api.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/views/monitor/log/error.vue b/src/views/monitor/log/error.vue new file mode 100644 index 0000000..a94c6ca --- /dev/null +++ b/src/views/monitor/log/error.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/src/views/monitor/log/usual.vue b/src/views/monitor/log/usual.vue new file mode 100644 index 0000000..2b6d1fa --- /dev/null +++ b/src/views/monitor/log/usual.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/src/views/report/reportlist.vue b/src/views/report/reportlist.vue new file mode 100644 index 0000000..c3b7ffb --- /dev/null +++ b/src/views/report/reportlist.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/views/resource/attach.vue b/src/views/resource/attach.vue new file mode 100644 index 0000000..dc6bcca --- /dev/null +++ b/src/views/resource/attach.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/src/views/resource/oss.vue b/src/views/resource/oss.vue new file mode 100644 index 0000000..cb1770c --- /dev/null +++ b/src/views/resource/oss.vue @@ -0,0 +1,469 @@ + + + diff --git a/src/views/resource/sms.vue b/src/views/resource/sms.vue new file mode 100644 index 0000000..1d36573 --- /dev/null +++ b/src/views/resource/sms.vue @@ -0,0 +1,501 @@ + + + diff --git a/src/views/system/authlock.vue b/src/views/system/authlock.vue new file mode 100644 index 0000000..e34d947 --- /dev/null +++ b/src/views/system/authlock.vue @@ -0,0 +1,303 @@ + + + diff --git a/src/views/system/authlog.vue b/src/views/system/authlog.vue new file mode 100644 index 0000000..5a44537 --- /dev/null +++ b/src/views/system/authlog.vue @@ -0,0 +1,155 @@ + + + diff --git a/src/views/system/client.vue b/src/views/system/client.vue new file mode 100644 index 0000000..9269c6a --- /dev/null +++ b/src/views/system/client.vue @@ -0,0 +1,385 @@ + + + + + diff --git a/src/views/system/dept.vue b/src/views/system/dept.vue new file mode 100644 index 0000000..9c93eb8 --- /dev/null +++ b/src/views/system/dept.vue @@ -0,0 +1,404 @@ + + + + + diff --git a/src/views/system/dict.vue b/src/views/system/dict.vue new file mode 100644 index 0000000..2520451 --- /dev/null +++ b/src/views/system/dict.vue @@ -0,0 +1,450 @@ + + + diff --git a/src/views/system/dictbiz.vue b/src/views/system/dictbiz.vue new file mode 100644 index 0000000..b4f89c3 --- /dev/null +++ b/src/views/system/dictbiz.vue @@ -0,0 +1,450 @@ + + + diff --git a/src/views/system/menu.vue b/src/views/system/menu.vue new file mode 100644 index 0000000..ce41c7e --- /dev/null +++ b/src/views/system/menu.vue @@ -0,0 +1,438 @@ + + + + + diff --git a/src/views/system/param.vue b/src/views/system/param.vue new file mode 100644 index 0000000..caa6aca --- /dev/null +++ b/src/views/system/param.vue @@ -0,0 +1,404 @@ + + + diff --git a/src/views/system/post.vue b/src/views/system/post.vue new file mode 100644 index 0000000..4ab72a5 --- /dev/null +++ b/src/views/system/post.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/src/views/system/tenant.vue b/src/views/system/tenant.vue new file mode 100644 index 0000000..74bc02b --- /dev/null +++ b/src/views/system/tenant.vue @@ -0,0 +1,811 @@ + + + + + diff --git a/src/views/system/tenantdatasource.vue b/src/views/system/tenantdatasource.vue new file mode 100644 index 0000000..75c56aa --- /dev/null +++ b/src/views/system/tenantdatasource.vue @@ -0,0 +1,408 @@ + + + + + diff --git a/src/views/system/tenantpackage.vue b/src/views/system/tenantpackage.vue new file mode 100644 index 0000000..11c2819 --- /dev/null +++ b/src/views/system/tenantpackage.vue @@ -0,0 +1,368 @@ + + + + + diff --git a/src/views/system/topmenu.vue b/src/views/system/topmenu.vue new file mode 100644 index 0000000..e014097 --- /dev/null +++ b/src/views/system/topmenu.vue @@ -0,0 +1,531 @@ + + + + + diff --git a/src/views/system/user.vue b/src/views/system/user.vue new file mode 100644 index 0000000..efbeaeb --- /dev/null +++ b/src/views/system/user.vue @@ -0,0 +1,863 @@ + + + + + diff --git a/src/views/system/userinfo.vue b/src/views/system/userinfo.vue new file mode 100644 index 0000000..4370e2c --- /dev/null +++ b/src/views/system/userinfo.vue @@ -0,0 +1,485 @@ + + + + + diff --git a/src/views/test.vue b/src/views/test.vue new file mode 100644 index 0000000..f9864ea --- /dev/null +++ b/src/views/test.vue @@ -0,0 +1,9 @@ + + + + + diff --git a/src/views/tool/code.vue b/src/views/tool/code.vue new file mode 100644 index 0000000..9364d0d --- /dev/null +++ b/src/views/tool/code.vue @@ -0,0 +1,588 @@ + + + diff --git a/src/views/tool/codesetting.vue b/src/views/tool/codesetting.vue new file mode 100644 index 0000000..1fed6c4 --- /dev/null +++ b/src/views/tool/codesetting.vue @@ -0,0 +1,281 @@ + + + + + diff --git a/src/views/tool/datasource.vue b/src/views/tool/datasource.vue new file mode 100644 index 0000000..db6d340 --- /dev/null +++ b/src/views/tool/datasource.vue @@ -0,0 +1,409 @@ + + + + + diff --git a/src/views/tool/formsetting.vue b/src/views/tool/formsetting.vue new file mode 100644 index 0000000..d8ebf67 --- /dev/null +++ b/src/views/tool/formsetting.vue @@ -0,0 +1,419 @@ + + + + + diff --git a/src/views/tool/model.vue b/src/views/tool/model.vue new file mode 100644 index 0000000..5f8033d --- /dev/null +++ b/src/views/tool/model.vue @@ -0,0 +1,393 @@ + + + + diff --git a/src/views/util/affix.vue b/src/views/util/affix.vue new file mode 100644 index 0000000..fbde082 --- /dev/null +++ b/src/views/util/affix.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/views/util/cache.vue b/src/views/util/cache.vue new file mode 100644 index 0000000..0298ad9 --- /dev/null +++ b/src/views/util/cache.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/views/util/crud-form.vue b/src/views/util/crud-form.vue new file mode 100644 index 0000000..b875e93 --- /dev/null +++ b/src/views/util/crud-form.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/views/util/data.vue b/src/views/util/data.vue new file mode 100644 index 0000000..4580457 --- /dev/null +++ b/src/views/util/data.vue @@ -0,0 +1,198 @@ + + + + diff --git a/src/views/util/demo/dict-classic.vue b/src/views/util/demo/dict-classic.vue new file mode 100644 index 0000000..0d8820e --- /dev/null +++ b/src/views/util/demo/dict-classic.vue @@ -0,0 +1,352 @@ + + + + + diff --git a/src/views/util/demo/dict-horizontal.vue b/src/views/util/demo/dict-horizontal.vue new file mode 100644 index 0000000..1bbcc00 --- /dev/null +++ b/src/views/util/demo/dict-horizontal.vue @@ -0,0 +1,469 @@ + + + + + diff --git a/src/views/util/demo/dict-vertical.vue b/src/views/util/demo/dict-vertical.vue new file mode 100644 index 0000000..fc635bd --- /dev/null +++ b/src/views/util/demo/dict-vertical.vue @@ -0,0 +1,474 @@ + + + + + diff --git a/src/views/util/demo/dict.vue b/src/views/util/demo/dict.vue new file mode 100644 index 0000000..8a1899a --- /dev/null +++ b/src/views/util/demo/dict.vue @@ -0,0 +1,465 @@ + + + diff --git a/src/views/util/demo/dictbiz.vue b/src/views/util/demo/dictbiz.vue new file mode 100644 index 0000000..ed28b39 --- /dev/null +++ b/src/views/util/demo/dictbiz.vue @@ -0,0 +1,459 @@ + + + diff --git a/src/views/util/form-detail.vue b/src/views/util/form-detail.vue new file mode 100644 index 0000000..d595503 --- /dev/null +++ b/src/views/util/form-detail.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/views/util/form.vue b/src/views/util/form.vue new file mode 100644 index 0000000..0a5ed14 --- /dev/null +++ b/src/views/util/form.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/views/util/logs.vue b/src/views/util/logs.vue new file mode 100644 index 0000000..f792cf1 --- /dev/null +++ b/src/views/util/logs.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/views/util/permission.vue b/src/views/util/permission.vue new file mode 100644 index 0000000..6e5cfeb --- /dev/null +++ b/src/views/util/permission.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/src/views/util/store.vue b/src/views/util/store.vue new file mode 100644 index 0000000..0ab131b --- /dev/null +++ b/src/views/util/store.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/views/util/table.vue b/src/views/util/table.vue new file mode 100644 index 0000000..62de4fa --- /dev/null +++ b/src/views/util/table.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/views/util/tags.vue b/src/views/util/tags.vue new file mode 100644 index 0000000..e333fe2 --- /dev/null +++ b/src/views/util/tags.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/views/util/test.vue b/src/views/util/test.vue new file mode 100644 index 0000000..71f1e1a --- /dev/null +++ b/src/views/util/test.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/src/views/util/top.vue b/src/views/util/top.vue new file mode 100644 index 0000000..2827371 --- /dev/null +++ b/src/views/util/top.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/wel/dashboard.vue b/src/views/wel/dashboard.vue new file mode 100644 index 0000000..62f5612 --- /dev/null +++ b/src/views/wel/dashboard.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/src/views/wel/index.vue b/src/views/wel/index.vue new file mode 100644 index 0000000..41af1ec --- /dev/null +++ b/src/views/wel/index.vue @@ -0,0 +1,1524 @@ + + + + + diff --git a/src/views/work/claim.vue b/src/views/work/claim.vue new file mode 100644 index 0000000..d2d34ae --- /dev/null +++ b/src/views/work/claim.vue @@ -0,0 +1,242 @@ + + + diff --git a/src/views/work/done.vue b/src/views/work/done.vue new file mode 100644 index 0000000..d9f9dbb --- /dev/null +++ b/src/views/work/done.vue @@ -0,0 +1,217 @@ + + + diff --git a/src/views/work/process/leave/detail.vue b/src/views/work/process/leave/detail.vue new file mode 100644 index 0000000..e7ccdd5 --- /dev/null +++ b/src/views/work/process/leave/detail.vue @@ -0,0 +1,144 @@ + + + diff --git a/src/views/work/process/leave/form.vue b/src/views/work/process/leave/form.vue new file mode 100644 index 0000000..86aab59 --- /dev/null +++ b/src/views/work/process/leave/form.vue @@ -0,0 +1,114 @@ + + + diff --git a/src/views/work/process/leave/handle.vue b/src/views/work/process/leave/handle.vue new file mode 100644 index 0000000..9ec237b --- /dev/null +++ b/src/views/work/process/leave/handle.vue @@ -0,0 +1,203 @@ + + + diff --git a/src/views/work/send.vue b/src/views/work/send.vue new file mode 100644 index 0000000..0465939 --- /dev/null +++ b/src/views/work/send.vue @@ -0,0 +1,226 @@ + + + diff --git a/src/views/work/start.vue b/src/views/work/start.vue new file mode 100644 index 0000000..2b1eeec --- /dev/null +++ b/src/views/work/start.vue @@ -0,0 +1,248 @@ + + + diff --git a/src/views/work/todo.vue b/src/views/work/todo.vue new file mode 100644 index 0000000..ae17336 --- /dev/null +++ b/src/views/work/todo.vue @@ -0,0 +1,232 @@ + + + diff --git a/vite.config.mjs b/vite.config.mjs new file mode 100644 index 0000000..3cbb3d4 --- /dev/null +++ b/vite.config.mjs @@ -0,0 +1,89 @@ +import { + defineConfig, + loadEnv +} from 'vite'; +import { resolve } from 'path' +import createVitePlugins from './vite/plugins'; +// https://vitejs.dev/config/ +export default ({ + mode, + command +}) => { + const env = loadEnv(mode, process.cwd()) + const { + VITE_APP_ENV, + VITE_APP_BASE + } = env + // 判断是打生产环境包 + const isProd = VITE_APP_ENV === 'production' + + // 根据是否生产环境,动态设置压缩配置 + const buildConfig = { + target: 'esnext', + minify: isProd ? 'terser' : 'esbuild', // 根据环境选择压缩工具 + }; + + // 如果是生产环境,添加Terser的配置 + if (isProd) { + buildConfig.terserOptions = { + compress: { + drop_console: true, // 删除 console + drop_debugger: true, // 删除 debugger + }, + format: { + comments: false // 删除所有注释 + } + }; + buildConfig.rollupOptions = { + output: { + manualChunks: { + 'element-plus': ['element-plus'], + '@smallwei/avue': ['@smallwei/avue'] + }, + } + } + } + return defineConfig({ + base: VITE_APP_BASE, + define: { + __VUE_I18N_FULL_INSTALL__: true, + __VUE_I18N_LEGACY_API__: true, + __INTLIFY_PROD_DEVTOOLS__: false + }, + server: { + port: 2888, + proxy: { + '/api': { + target: 'http://localhost', + //target: 'https://saber3.bladex.cn/api', + changeOrigin: true, + rewrite: path => path.replace(/^\/api/, ''), + }, + }, + }, + resolve: { + alias: { + '~': resolve(__dirname, './'), + '@': resolve(__dirname, './src'), + components: resolve(__dirname, './src/components'), + styles: resolve(__dirname, './src/styles'), + utils: resolve(__dirname, './src/utils'), + }, + }, + css: { + preprocessorOptions: { + scss: { + api: 'modern-compiler', + additionalData: `@use "@/styles/variables.scss" as *;`, + }, + }, + }, + plugins: createVitePlugins(env, command === 'build'), + build: buildConfig, + optimizeDeps: { + esbuildOptions: { + target: 'esnext', + }, + }, + }); +}; diff --git a/vite/plugins/auto-import.js b/vite/plugins/auto-import.js new file mode 100644 index 0000000..bf701bb --- /dev/null +++ b/vite/plugins/auto-import.js @@ -0,0 +1,8 @@ +import autoImport from 'unplugin-auto-import/vite'; + +export default function createAutoImport() { + return autoImport({ + imports: ['vue', 'vue-router', 'vuex'], + dts: false, + }); +} diff --git a/vite/plugins/compression.js b/vite/plugins/compression.js new file mode 100644 index 0000000..21383c5 --- /dev/null +++ b/vite/plugins/compression.js @@ -0,0 +1,27 @@ +import compression from 'vite-plugin-compression'; + +export default function createCompression(env) { + const { VITE_BUILD_COMPRESS } = env; + const plugin = []; + if (VITE_BUILD_COMPRESS) { + const compressList = VITE_BUILD_COMPRESS.split(','); + if (compressList.includes('gzip')) { + plugin.push( + compression({ + ext: '.gz', + deleteOriginFile: false, + }) + ); + } + if (compressList.includes('brotli')) { + plugin.push( + compression({ + ext: '.br', + algorithm: 'brotliCompress', + deleteOriginFile: false, + }) + ); + } + } + return plugin; +} diff --git a/vite/plugins/index.js b/vite/plugins/index.js new file mode 100644 index 0000000..d3a6369 --- /dev/null +++ b/vite/plugins/index.js @@ -0,0 +1,13 @@ +import vue from '@vitejs/plugin-vue'; + +import createAutoImport from './auto-import'; +import createCompression from './compression'; +import createSetupExtend from './setup-extend'; + +export default function createVitePlugins(viteEnv, isBuild = false) { + const vitePlugins = [vue()]; + vitePlugins.push(createAutoImport()); + vitePlugins.push(createSetupExtend()); + isBuild && vitePlugins.push(...createCompression(viteEnv)); + return vitePlugins; +} \ No newline at end of file diff --git a/vite/plugins/setup-extend.js b/vite/plugins/setup-extend.js new file mode 100644 index 0000000..1622ea6 --- /dev/null +++ b/vite/plugins/setup-extend.js @@ -0,0 +1,5 @@ +import setupExtend from 'vite-plugin-vue-setup-extend'; + +export default function createSetupExtend() { + return setupExtend(); +}