Переглянути джерело

build: 增加教材征订

全蛋 9 місяців тому
коміт
04dd4230a9
100 змінених файлів з 1625 додано та 0 видалено
  1. 155 0
      .drone.yml
  2. 19 0
      .editorconfig
  3. 17 0
      .env
  4. 33 0
      .env.development
  5. 37 0
      .env.production
  6. 36 0
      .env.test
  7. 16 0
      .eslintignore
  8. 76 0
      .eslintrc.js
  9. 36 0
      .gitignore
  10. 6 0
      .gitpod.yml
  11. 6 0
      .husky/commit-msg
  12. 9 0
      .husky/common.sh
  13. 8 0
      .husky/pre-commit
  14. 20 0
      .pnpm-debug.log
  15. 9 0
      .prettierignore
  16. 3 0
      .stylelintignore
  17. 32 0
      Dockerfile
  18. 21 0
      LICENSE
  19. 103 0
      README.md
  20. 79 0
      build/config/themeConfig.ts
  21. 6 0
      build/constant.ts
  22. 39 0
      build/generate/generateModifyVars.ts
  23. 72 0
      build/generate/icon/index.ts
  24. 9 0
      build/getConfigFileName.ts
  25. 47 0
      build/script/buildConf.ts
  26. 23 0
      build/script/postBuild.ts
  27. 92 0
      build/utils.ts
  28. 35 0
      build/vite/optimize.ts
  29. 35 0
      build/vite/plugin/compress.ts
  30. 40 0
      build/vite/plugin/html.ts
  31. 34 0
      build/vite/plugin/imagemin.ts
  32. 76 0
      build/vite/plugin/index.ts
  33. 19 0
      build/vite/plugin/mock.ts
  34. 33 0
      build/vite/plugin/pwa.ts
  35. 82 0
      build/vite/plugin/styleImport.ts
  36. 17 0
      build/vite/plugin/svgSprite.ts
  37. 89 0
      build/vite/plugin/theme.ts
  38. 17 0
      build/vite/plugin/visualizer.ts
  39. 34 0
      build/vite/proxy.ts
  40. 33 0
      commitlint.config.js
  41. 48 0
      default.conf
  42. 1 0
      dist/6DXE6h6XT3.txt
  43. 1 0
      dist/MP_verify_F6MMjresID5EXyd0.txt
  44. 1 0
      dist/_app.config.js
  45. 1 0
      dist/assets/AccountBind-28d853bd.js
  46. BIN
      dist/assets/AccountBind-28d853bd.js.gz
  47. 1 0
      dist/assets/AccountBind-6029102b.css
  48. 1 0
      dist/assets/AccountBind-87fcd75a.css
  49. 1 0
      dist/assets/AccountBind-c3d75919.js
  50. BIN
      dist/assets/AccountBind-c3d75919.js.gz
  51. 0 0
      dist/assets/AccountDetail-db1d0360.js
  52. BIN
      dist/assets/AccountDetail-db1d0360.js.gz
  53. 0 0
      dist/assets/AccountModal-d97cbe5a.js
  54. BIN
      dist/assets/AccountModal-d97cbe5a.js.gz
  55. 0 0
      dist/assets/Action-1e6f730e.js
  56. BIN
      dist/assets/Action-1e6f730e.js.gz
  57. 1 0
      dist/assets/Action-f3490e07.css
  58. 0 0
      dist/assets/ActionTree-57f1937b.js
  59. BIN
      dist/assets/ActionTree-57f1937b.js.gz
  60. 1 0
      dist/assets/AddOrSubtract-155cfa42.css
  61. 0 0
      dist/assets/AddOrSubtract-d244e87b.js
  62. BIN
      dist/assets/AddOrSubtract-d244e87b.js.gz
  63. 0 0
      dist/assets/AdvancedForm-c69f7520.js
  64. BIN
      dist/assets/AdvancedForm-c69f7520.js.gz
  65. 0 0
      dist/assets/Alarm-4c80924f.js
  66. BIN
      dist/assets/Alarm-4c80924f.js.gz
  67. 0 0
      dist/assets/AlarmInfomation-58ecf2f4.js
  68. BIN
      dist/assets/AlarmInfomation-58ecf2f4.js.gz
  69. 1 0
      dist/assets/AlarmInfomation-92ab2bed.css
  70. 0 0
      dist/assets/AlarmModal-d686ef95.js
  71. BIN
      dist/assets/AlarmModal-d686ef95.js.gz
  72. 0 0
      dist/assets/AlarmModal.vue_vue_type_script_setup_true_lang-d4b4e0dd.js
  73. BIN
      dist/assets/AlarmModal.vue_vue_type_script_setup_true_lang-d4b4e0dd.js.gz
  74. 1 0
      dist/assets/AntdFormConfig-72b8cc1a.css
  75. 1 0
      dist/assets/AntdFormConfig-bc49e4aa.js
  76. BIN
      dist/assets/AntdFormConfig-bc49e4aa.js.gz
  77. 0 0
      dist/assets/AntdWidgetForm-c21d7bb4.js
  78. BIN
      dist/assets/AntdWidgetForm-c21d7bb4.js.gz
  79. 1 0
      dist/assets/AntdWidgetForm-e48211a8.css
  80. 0 0
      dist/assets/AntdWidgetFormItem-02ee87ad.js
  81. BIN
      dist/assets/AntdWidgetFormItem-02ee87ad.js.gz
  82. 1 0
      dist/assets/AntdWidgetFormItem-8664a7c9.css
  83. BIN
      dist/assets/AntdWidgetFormItem-8664a7c9.css.gz
  84. 0 0
      dist/assets/ApiConfigSelect-7ba9c91e.js
  85. BIN
      dist/assets/ApiConfigSelect-7ba9c91e.js.gz
  86. 1 0
      dist/assets/ApiConfigSelect-90cde5a2.css
  87. 0 0
      dist/assets/ApiSelect-2fc61a7c.js
  88. BIN
      dist/assets/ApiSelect-2fc61a7c.js.gz
  89. 0 0
      dist/assets/ApiSelect-948bf38a.js
  90. BIN
      dist/assets/ApiSelect-948bf38a.js.gz
  91. 1 0
      dist/assets/ApiSelect-dcd2e00c.css
  92. 5 0
      dist/assets/ApiSelect.vue_vue_type_script_setup_true_lang-dbf214a7.js
  93. BIN
      dist/assets/ApiSelect.vue_vue_type_script_setup_true_lang-dbf214a7.js.gz
  94. 0 0
      dist/assets/AppendForm-36b647eb.js
  95. BIN
      dist/assets/AppendForm-36b647eb.js.gz
  96. 1 0
      dist/assets/Application-443980a9.css
  97. 1 0
      dist/assets/Application-bce0257e.css
  98. 0 0
      dist/assets/Application-e9444192.js
  99. BIN
      dist/assets/Application-e9444192.js.gz
  100. 1 0
      dist/assets/Application-f85e3abf.js

+ 155 - 0
.drone.yml

@@ -0,0 +1,155 @@
+kind: pipeline
+type: docker
+name: dev
+
+node:
+  mode: local_test
+
+steps:
+  #  - name: yarn-install
+  #   image: node:18.16.1
+  #   volumes:
+  #     - name: modules-cache
+  #       path: /drone/src/node_modules # 下载依赖的目录挂载出来,防止重复下载
+  #   commands:
+  #     - yarn config set registry http://registry.npmjs.org
+  #     # - yarn install
+  #     - yarn run build
+
+  - name: build
+    image: docker:20.10.7
+    # depends_on: [yarn-install]
+    volumes:
+      - name: docker
+        path: /var/run/docker.sock
+    environment:
+      IMAGE: registry.yingcaibx.com/tl/admin_web:latest
+    commands:
+      # 清理 docker 服务中不再使用的镜像、挂载、网络等资源
+      - docker system prune --force --volumes || true
+      - docker build -f ./Dockerfile -t $IMAGE ./
+
+  - name: run
+    image: docker/compose
+    depends_on: [build]
+    volumes:
+      - name: docker
+        path: /var/run/docker.sock
+    commands:
+      - docker-compose -f docker-compose-dev.yml up -d
+
+trigger:
+  branch:
+    - dev
+  event:
+    - push
+
+volumes:
+  - name: docker
+    host:
+      path: /var/run/docker.sock
+  - name: modules-cache
+    host:
+      path: /data/cache/tl/web
+
+---
+kind: pipeline
+type: docker
+name: pre
+
+node:
+  mode: local_pre
+
+steps:
+  # - name: yarn-install
+  #   image: node:18.16.1
+  #   volumes:
+  #     - name: modules-cache
+  #       path: /drone/src/node_modules # 下载依赖的目录挂载出来,防止重复下载
+  #   commands:
+  #     - yarn config set registry http://registry.npmjs.org
+  #     #- yarn install
+  #     - yarn run build
+
+  - name: build
+    image: docker:20.10.7
+    # depends_on: [yarn-install]
+    volumes:
+      - name: docker
+        path: /var/run/docker.sock
+    environment:
+      IMAGE: registry.yingcaibx.com/tl/admin_web:latest
+    commands:
+      # 清理 docker 服务中不再使用的镜像、挂载、网络等资源
+      - docker system prune --force --volumes || true
+      - docker build -f ./Dockerfile -t $IMAGE ./
+
+  - name: run
+    image: docker/compose
+    depends_on: [build]
+    volumes:
+      - name: docker
+        path: /var/run/docker.sock
+    commands:
+      - docker-compose -f docker-compose-pre.yml up -d
+
+trigger:
+  branch:
+    - pre
+  event:
+    - push
+
+volumes:
+  - name: docker
+    host:
+      path: /var/run/docker.sock
+  - name: modules-cache
+    host:
+      path: /data/cache/tl/web_new
+
+---
+kind: pipeline
+type: docker
+name: release
+
+node:
+  mode: local_test
+
+steps:
+  # - name: yarn-install
+  #   depends_on: [clone]
+  #   image: node:18.16.1
+  #   volumes:
+  #     - name: modules-cache
+  #       path: /drone/src/node_modules # 下载依赖的目录挂载出来,防止重复下载
+  #   commands:
+  #     - yarn run build
+
+  # - yarn install && yarn run build
+  - name: push
+    image: docker:20.10.7
+    # depends_on: [yarn-install]
+    volumes:
+      - name: docker
+        path: /var/run/docker.sock
+    environment:
+      IMAGE: registry.yingcaibx.com/tl/admin_web
+
+    commands:
+      - docker login -u yxt -p qwe123QWE registry.yingcaibx.com
+      - echo $DRONE_TAG
+      - docker build -f ./Dockerfile -t $IMAGE:$DRONE_TAG ./
+      - docker push $IMAGE:$DRONE_TAG
+      - docker rmi $IMAGE:$DRONE_TAG
+
+trigger:
+  event:
+    - tag
+
+volumes:
+  - name: docker
+    host:
+      path: /var/run/docker.sock
+  - name: modules-cache
+    host:
+      path: /data/cache/tl/web

+ 19 - 0
.editorconfig

@@ -0,0 +1,19 @@
+root = true
+
+[*]
+charset=utf-8
+end_of_line=lf
+insert_final_newline=true
+indent_style=space
+indent_size=2
+max_line_length = 100
+
+[*.{yml,yaml,json}]
+indent_style = space
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
+
+[Makefile]
+indent_style = tab

+ 17 - 0
.env

@@ -0,0 +1,17 @@
+# port
+VITE_PORT = 3100
+
+# spa-title
+VITE_GLOB_APP_TITLE = 铜梁职业教育中心
+
+# spa shortname
+VITE_GLOB_APP_SHORT_NAME = 铜梁职业教育中心
+
+# LOGO-TITLE
+VITE_GLOB_APP_LOGO_TITLE = 数智铜职
+
+#  配置公文工作流的模版ID
+
+VITE_GLOB_APP_PD_SCHEMA = 1718834843548979201
+
+VITE_GLOB_ENABLE_FORMAT_API = true

+ 33 - 0
.env.development

@@ -0,0 +1,33 @@
+# 是否开启mock数据,关闭时需要自行对接后台接口
+VITE_USE_MOCK = false
+
+# 资源公共路径,需要以 /开头和结尾
+VITE_PUBLIC_PATH = /
+
+# 本地开发代理,可以解决跨域及多地址代理
+# 如果接口地址匹配到,则会转发到http://localhost:3000,防止本地出现跨域问题
+# 可以有多个,注意多个不能换行,否则代理将会失效
+# VITE_PROXY = [["/basic-api","http://10.150.10.139:8001"],["/upload","http://10.150.10.139:8001/upload"]]
+# VITE_PROXY=[["/api","https://vvbin.cn/test"]]
+
+# 是否删除Console.log
+VITE_DROP_CONSOLE = false
+
+# 接口地址
+# 如果没有跨域问题,直接在这里配置即可
+# VITE_GLOB_API_URL=http://10.150.10.139:8888/api
+ VITE_GLOB_API_URL=http://10.150.10.139:8888/api
+
+#VITE_GLOB_API_URL=http://172.21.92.28:8080
+# 文件上传接口  可选
+VITE_GLOB_UPLOAD_URL =/system/oss/upload
+VITE_GLOB_APP_LOGO_TITLE = 数智铜职
+# 文件上传接口 富文本等
+VITE_GLOB_UPLOAD_OTHER_URL = http://10.150.10.139:8888/api/system/file
+
+# 接口地址前缀,有些系统所有接口地址都有前缀,可以在这里统一加,方便切换
+VITE_GLOB_API_URL_PREFIX =
+
+# KKFileView地址,用于在线预览文件,如果不需要可以不配置
+VITE_GLOB_FFFILEVIEW_URL = http://10.150.10.139:8012/onlinePreview?url=
+VITE_GLOB_ENABLE_FORMAT_API = true

+ 37 - 0
.env.production

@@ -0,0 +1,37 @@
+# 是否开启mock
+VITE_USE_MOCK = true
+
+# 资源公共路径,需要以 / 开头和结尾
+VITE_PUBLIC_PATH = /
+
+# 是否删除Console.log
+VITE_DROP_CONSOLE = true
+
+# 打包是否输出gz|br文件
+# 可选: gzip | brotli | none
+# 也可以有多个, 例如 ‘gzip’|'brotli',这样会同时生成 .gz和.br文件
+VITE_BUILD_COMPRESS = 'gzip'
+
+# 使用compress时是否删除源文件,默认false
+VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
+
+# 接口地址 可以由nginx做转发或者直接写实际地址
+VITE_GLOB_API_URL=http://10.150.10.139:8888/api
+
+
+# 文件上传地址 可以由nginx做转发或者直接写实际地址
+  VITE_GLOB_UPLOAD_URL =/system/oss/upload
+
+# 接口地址前缀,有些系统所有接口地址都有前缀,可以在这里统一加,方便切换
+VITE_GLOB_API_URL_PREFIX =
+
+
+# 文件上传接口 富文本等
+VITE_GLOB_UPLOAD_OTHER_URL = http://10.150.10.139:8001/system/file
+
+
+# 打包是否开启pwa功能
+VITE_USE_PWA = false
+# KKFileView地址,用于在线预览文件,如果不需要可以不配置
+VITE_GLOB_FFFILEVIEW_URL = http://10.150.10.139:8012/onlinePreview?url=
+VITE_GLOB_ENABLE_FORMAT_API = true

+ 36 - 0
.env.test

@@ -0,0 +1,36 @@
+NODE_ENV=production
+# Whether to open mock
+VITE_USE_MOCK = true
+
+# public path
+VITE_PUBLIC_PATH = /
+
+# Delete console
+VITE_DROP_CONSOLE = true
+
+# Whether to enable gzip or brotli compression
+# Optional: gzip | brotli | none
+# If you need multiple forms, you can use `,` to separate
+VITE_BUILD_COMPRESS = 'none'
+
+# Whether to delete origin files when using compress, default false
+VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
+
+# Basic interface address SPA
+VITE_GLOB_API_URL=/basic-api
+
+# File upload address, optional
+# It can be forwarded by nginx or write the actual address directly
+VITE_GLOB_UPLOAD_URL=/upload
+
+# Interface prefix
+VITE_GLOB_API_URL_PREFIX=
+
+# Whether to enable image compression
+VITE_USE_IMAGEMIN= true
+
+# use pwa
+VITE_USE_PWA = false
+
+# Is it compatible with older browsers
+VITE_LEGACY = false

+ 16 - 0
.eslintignore

@@ -0,0 +1,16 @@
+
+*.sh
+node_modules
+*.md
+*.woff
+*.ttf
+.vscode
+.idea
+dist
+/public
+/docs
+.husky
+.local
+/bin
+Dockerfile
+/src/components/Designer

+ 76 - 0
.eslintrc.js

@@ -0,0 +1,76 @@
+module.exports = {
+  root: true,
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  parser: 'vue-eslint-parser',
+  parserOptions: {
+    parser: '@typescript-eslint/parser',
+    ecmaVersion: 2020,
+    sourceType: 'module',
+    jsxPragma: 'React',
+    ecmaFeatures: {
+      jsx: true,
+    },
+  },
+  extends: [
+    'plugin:vue/vue3-recommended',
+    'plugin:@typescript-eslint/recommended',
+    'plugin:prettier/recommended',
+  ],
+  rules: {
+    'vue/script-setup-uses-vars': 'error',
+    '@typescript-eslint/ban-ts-ignore': 'off',
+    '@typescript-eslint/explicit-function-return-type': 'off',
+    '@typescript-eslint/no-explicit-any': 'off',
+    '@typescript-eslint/no-var-requires': 'off',
+    '@typescript-eslint/no-empty-function': 'off',
+    'vue/custom-event-name-casing': 'off',
+    'no-use-before-define': 'off',
+    '@typescript-eslint/no-use-before-define': 'off',
+    '@typescript-eslint/ban-ts-comment': 'off',
+    '@typescript-eslint/ban-types': 'off',
+    '@typescript-eslint/no-non-null-assertion': 'off',
+    '@typescript-eslint/explicit-module-boundary-types': 'off',
+    '@typescript-eslint/no-unused-vars': [
+      'error',
+      {
+        argsIgnorePattern: '^_',
+        varsIgnorePattern: '^_',
+      },
+    ],
+    'no-unused-vars': [
+      'error',
+      {
+        argsIgnorePattern: '^_',
+        varsIgnorePattern: '^_',
+      },
+    ],
+    'space-before-function-paren': 'off',
+
+    'vue/attributes-order': 'off',
+    'vue/one-component-per-file': 'off',
+    'vue/html-closing-bracket-newline': 'off',
+    'vue/max-attributes-per-line': 'off',
+    'vue/multiline-html-element-content-newline': 'off',
+    'vue/singleline-html-element-content-newline': 'off',
+    'vue/attribute-hyphenation': 'off',
+    'vue/require-default-prop': 'off',
+    'vue/require-explicit-emits': 'off',
+    'vue/html-self-closing': [
+      'error',
+      {
+        html: {
+          void: 'always',
+          normal: 'never',
+          component: 'always',
+        },
+        svg: 'always',
+        math: 'always',
+      },
+    ],
+    'vue/multi-word-component-names': 'off',
+  },
+};

+ 36 - 0
.gitignore

@@ -0,0 +1,36 @@
+node_modules
+.DS_Store
+.npmrc
+.cache
+.ide
+.vscode
+
+tests/server/static
+tests/server/static/upload
+
+.local
+# local env files
+.env.local
+.env.*.local
+.eslintcache
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+# .vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+/package-lock.json
+
+/pnpm-lock.yaml
+pnpm-lock.yaml
+/yarn.lock
+# /dist/

+ 6 - 0
.gitpod.yml

@@ -0,0 +1,6 @@
+ports:
+  - port: 3344
+    onOpen: open-preview
+tasks:
+  - init: pnpm install
+    command: pnpm run dev

+ 6 - 0
.husky/commit-msg

@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# shellcheck source=./_/husky.sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx --no-install commitlint --edit "$1"

+ 9 - 0
.husky/common.sh

@@ -0,0 +1,9 @@
+#!/bin/sh
+command_exists () {
+  command -v "$1" >/dev/null 2>&1
+}
+
+# Workaround for Windows 10, Git Bash and Yarn
+if command_exists winpty && test -t 1; then
+  exec < /dev/tty
+fi

+ 8 - 0
.husky/pre-commit

@@ -0,0 +1,8 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+. "$(dirname "$0")/common.sh"
+
+[ -n "$CI" ] && exit 0
+
+# Format and submit code according to lintstagedrc.js configuration
+npm run lint:lint-staged

+ 20 - 0
.pnpm-debug.log

@@ -0,0 +1,20 @@
+{
+  "0 debug pnpm:scope": {
+    "selected": 1
+  },
+  "1 error pnpm": {
+    "errno": 1,
+    "code": "ELIFECYCLE",
+    "pkgid": "vben-admin@2.8.0",
+    "stage": "dev",
+    "script": "vite",
+    "pkgname": "vben-admin",
+    "err": {
+      "name": "pnpm",
+      "message": "vben-admin@2.8.0 dev: `vite`\nExit status 1",
+      "code": "ELIFECYCLE",
+      "stack": "pnpm: vben-admin@2.8.0 dev: `vite`\nExit status 1\n    at EventEmitter.<anonymous> (C:\\Users\\Zexy\\AppData\\Roaming\\npm\\node_modules\\pnpm\\dist\\pnpm.cjs:103336:20)\n    at EventEmitter.emit (events.js:400:28)\n    at ChildProcess.<anonymous> (C:\\Users\\Zexy\\AppData\\Roaming\\npm\\node_modules\\pnpm\\dist\\pnpm.cjs:91276:18)\n    at ChildProcess.emit (events.js:400:28)\n    at maybeClose (internal/child_process.js:1058:16)\n    at Process.ChildProcess._handle.onexit (internal/child_process.js:293:5)"
+    }
+  },
+  "2 warn pnpm:global": " Local package.json exists, but node_modules missing, did you mean to install?"
+}

+ 9 - 0
.prettierignore

@@ -0,0 +1,9 @@
+/dist/*
+.local
+.output.js
+/node_modules/**
+
+**/*.svg
+**/*.sh
+
+/public/*

+ 3 - 0
.stylelintignore

@@ -0,0 +1,3 @@
+/dist/*
+/public/*
+public/*

+ 32 - 0
Dockerfile

@@ -0,0 +1,32 @@
+#制定镜像
+# FROM node:18
+#声明作者
+# MAINTAINER fanxp
+#编译程序
+# WORKDIR /app
+# COPY . /app
+
+# RUN yarn install
+
+#配置环境变量
+# ENV HOST 0.0.0.0
+# ENV PORT 8080
+#对外暴露的端口
+# EXPOSE 8080
+
+#程序启动脚本
+# CMD [ "npm","rum","serve" ]
+
+# RUN yarn run build
+
+#制定空镜像
+FROM nginx:1.17.0
+#声明作者
+MAINTAINER fanxp
+
+#移动当前目录下面的文件到code目录下
+COPY dist/ /usr/share/nginx/html
+COPY default.conf /etc/nginx/conf.d/default.conf
+
+#对外暴露的端口
+EXPOSE 80

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020-present, Vben
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 103 - 0
README.md

@@ -0,0 +1,103 @@
+## 技术选型
+
+- 开发框架采用 [Vue3](https://v3.cn.vuejs.org/) 版本:3.3.4+
+- 构建工具采用 [Vite](https://vitejs.cn/) 版本: 4.3.8+
+- 包管理采用 [pnpm](https://www.pnpm.cn/)版本 6.20+
+- 多语言框架采用 [i18n](https://vue-i18n.intlify.dev/) 版本 9.2.2
+- ui 框架采用 [Ant-Design-Vue](https://2x.antdv.com/docs/vue/introduce-cn/) 版本:3.0+
+- http 请求库 采用 [axios](https://www.axios-http.cn/) 版本 1.4.0+
+- 代码计算库 采用 [jsbi-calculator](https://www.npmjs.com/package/jsbi-calculator) 版本 0.3.6+
+- 框架开发语言采用 [TypeScript](https://www.typescriptlang.org/) 版本 5.0.4+
+- 工作流组件采用 [bpmn.js](https://bpmn.io/toolkit/bpmn-js/) 版本 8.7+
+- 时间工具库采用 [day.js](https://bpmn.io/toolkit/bpmn-js/) 版本 1.11.0+
+- 状态管理库采用 [pinia ](https://https://pinia.vuejs.org/)版本 2.0.12 +
+- 图表库采用 [echarts](https://echarts.apache.org/zh/index.html)版本 5.3.1+
+- excel 操作库采用 [exceljs](https://github.com/exceljs/) 版本 4.3.0+
+- 工具类采用 [lodash-es](https://www.lodashjs.com/) 版本 4.17.21+
+- 工具类采用 [vueuse](https://vueuse.org/) 版本 10.1.2+
+- 打印工具类库 采用 [printjs](https://printjs.crabbly.com/) 版本 1.6.0+
+- 二维码类库 采用 [qrcode](https://www.qrcode.com/zh/) 版本 1.5.0+
+- 拖拽组件 采用 [vuedraggable](https://www.npmjs.com/package/vue-draggable) 版本 4.1.0+
+- 富文本编辑器 采用 [wangeditor](https://www.wangeditor.com/) 版本 4.6.13+
+- 项目 git 提交管理库 采用 [husky](https://github.com/githusky) 版本 8.0.3+
+- 项目框架结构采用 [Vben](https://vvbin.cn/doc-next/guide/introduction.html) 作为基础,搭建而成。
+- 其他技术及版本 以 Vben 文档 以及 package.json 做参考
+
+## 特性
+
+- **最新技术栈**:使用 Vue3/vite3 等前端前沿技术开发
+- **TypeScript**: 应用程序级 JavaScript 的语言
+- **主题**:可配置的主题
+- **国际化**:内置完善的国际化方案
+- **Mock 数据** 内置 Mock 数据方案
+- **权限** 内置完善的动态路由权限生成方案
+- **组件** 二次封装了多个常用的组件
+
+## 准备
+
+- [node](http://nodejs.org/) 和 [git](https://git-scm.com/) -项目开发环境
+- [Vite](https://vitejs.dev/) - 熟悉 vite 特性
+- [Vue3](https://v3.vuejs.org/) - 熟悉 Vue 基础语法
+- [TypeScript](https://www.typescriptlang.org/) - 熟悉`TypeScript`基本语法
+- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 es6 基本语法
+- [Vue-Router-Next](https://next.router.vuejs.org/) - 熟悉 vue-router 基本使用
+- [Ant-Design-Vue](https://2x.antdv.com/docs/vue/introduce-cn/) - ui 基本使用
+- [Mock.js](https://github.com/nuysoft/Mock) - mockjs 基本语法
+
+## 安装使用
+
+<!-- - 获取项目代码
+
+```sh
+git clone https://gitee.com/zexy/xjrsoft-vue3.git
+``` -->
+
+- 安装依赖
+
+```sh
+cd xjrsoft-vue3
+
+pnpm install
+
+```
+
+- 运行
+
+```sh
+pnpm dev
+```
+
+- 打包
+
+```sh
+pnpm build
+```
+
+<br/>
+
+## Git 贡献提交规范
+
+- 参考 [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) 规范 [Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular))
+  - `feat` 增加新功能
+  - `fix` 修复问题/BUG
+  - `style` 代码风格相关无影响运行结果的
+  - `perf` 优化/性能提升
+  - `refactor` 重构
+  - `revert` 撤销修改
+  - `test` 测试相关
+  - `docs` 文档/注释
+  - `chore` 依赖更新/脚手架配置修改等
+  - `workflow` 工作流改进
+  - `ci` 持续集成
+  - `types` 类型定义文件更改
+  - `wip` 开发中
+
+## 相关仓库
+
+- [vite-plugin-mock](https://github.com/anncwb/vite-plugin-mock) - 用于本地及开发环境数据 mock
+- [vite-plugin-html](https://github.com/anncwb/vite-plugin-html) - 用于 html 模版转换及压缩
+- [vite-plugin-style-import](https://github.com/anncwb/vite-plugin-style-import) - 用于组件库样式按需引入
+- [vite-plugin-theme](https://github.com/anncwb/vite-plugin-theme) - 用于在线切换主题色等颜色相关配置
+- [vite-plugin-imagemin](https://github.com/anncwb/vite-plugin-imagemin) - 用于打包压缩图片资源
+- [vite-plugin-compression](https://github.com/anncwb/vite-plugin-compression) - 用于打包输出.gz|.brotil 文件
+- [vite-plugin-svg-icons](https://github.com/anncwb/vite-plugin-svg-icons) - 用于快速生成 svg 雪碧图

+ 79 - 0
build/config/themeConfig.ts

@@ -0,0 +1,79 @@
+import { generate } from '@ant-design/colors';
+
+export const primaryColor = '#5e95ff';
+
+export const darkMode = 'light';
+
+type Fn = (...arg: any) => any;
+
+type GenerateTheme = 'default' | 'dark';
+
+export interface GenerateColorsParams {
+  mixLighten: Fn;
+  mixDarken: Fn;
+  tinycolor: any;
+  color?: string;
+}
+
+export function generateAntColors(color: string, theme: GenerateTheme = 'default') {
+  return generate(color, {
+    theme,
+  });
+}
+
+export function getThemeColors(color?: string) {
+  const tc = color || primaryColor;
+  const lightColors = generateAntColors(tc);
+  const primary = lightColors[5];
+  const modeColors = generateAntColors(primary, 'dark');
+
+  return [...lightColors, ...modeColors];
+}
+
+export function generateColors({
+  color = primaryColor,
+  mixLighten,
+  mixDarken,
+  tinycolor,
+}: GenerateColorsParams) {
+  const arr = new Array(19).fill(0);
+  const lightens = arr.map((_t, i) => {
+    return mixLighten(color, i / 5);
+  });
+
+  const darkens = arr.map((_t, i) => {
+    return mixDarken(color, i / 5);
+  });
+
+  const alphaColors = arr.map((_t, i) => {
+    return tinycolor(color)
+      .setAlpha(i / 20)
+      .toRgbString();
+  });
+
+  const shortAlphaColors = alphaColors.map((item) => item.replace(/\s/g, '').replace(/0\./g, '.'));
+
+  const tinycolorLightens = arr
+    .map((_t, i) => {
+      return tinycolor(color)
+        .lighten(i * 5)
+        .toHexString();
+    })
+    .filter((item) => item !== '#ffffff');
+
+  const tinycolorDarkens = arr
+    .map((_t, i) => {
+      return tinycolor(color)
+        .darken(i * 5)
+        .toHexString();
+    })
+    .filter((item) => item !== '#000000');
+  return [
+    ...lightens,
+    ...darkens,
+    ...alphaColors,
+    ...shortAlphaColors,
+    ...tinycolorDarkens,
+    ...tinycolorLightens,
+  ].filter((item) => !item.includes('-'));
+}

+ 6 - 0
build/constant.ts

@@ -0,0 +1,6 @@
+/**
+ * The name of the configuration file entered in the production environment
+ */
+export const GLOB_CONFIG_FILE_NAME = '_app.config.js';
+
+export const OUTPUT_DIR = 'dist';

+ 39 - 0
build/generate/generateModifyVars.ts

@@ -0,0 +1,39 @@
+import { generateAntColors, primaryColor } from '../config/themeConfig';
+import { getThemeVariables } from 'ant-design-vue/dist/theme';
+import { resolve } from 'path';
+
+/**
+ * less global variable
+ */
+export function generateModifyVars(dark = false) {
+  const palettes = generateAntColors(primaryColor);
+  const primary = palettes[5];
+
+  const primaryColorObj: Record<string, string> = {};
+
+  for (let index = 0; index < 10; index++) {
+    primaryColorObj[`primary-${index + 1}`] = palettes[index];
+  }
+
+  const modifyVars = getThemeVariables({ dark });
+  return {
+    ...modifyVars,
+    // Used for global import to avoid the need to import each style file separately
+    // reference:  Avoid repeated references
+    hack: `${modifyVars.hack} @import (reference) "${resolve('src/design/config.less')}";`,
+    'primary-color': primary,
+    ...primaryColorObj,
+    'info-color': primary,
+    'processing-color': primary,
+    'success-color': '#55D187', //  Success color
+    'error-color': '#ED6F6F', //  False color
+    'warning-color': '#EFBD47', //   Warning color
+
+    'clear-color': '#ff8989', //清空以及删除 颜色
+    //'border-color-base': '#EEEEEE',
+    'font-size-base': '14px', //  Main font size
+    'border-radius-base': '2px', //  Component/float fillet
+    'link-color': primary, //   Link color
+    'app-content-background': '#fafafa', //   Link color
+  };
+}

+ 72 - 0
build/generate/icon/index.ts

@@ -0,0 +1,72 @@
+import path from 'path';
+import fs from 'fs-extra';
+import inquirer from 'inquirer';
+import colors from 'picocolors';
+import pkg from '../../../package.json';
+
+async function generateIcon() {
+  const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json');
+
+  const raw = await fs.readJSON(path.join(dir, 'collections.json'));
+
+  const collections = Object.entries(raw).map(([id, v]) => ({
+    ...(v as any),
+    id,
+  }));
+
+  const choices = collections.map((item) => ({ key: item.id, value: item.id, name: item.name }));
+
+  inquirer
+    .prompt([
+      {
+        type: 'list',
+        name: 'useType',
+        choices: [
+          { key: 'local', value: 'local', name: 'Local' },
+          { key: 'onLine', value: 'onLine', name: 'OnLine' },
+        ],
+        message: 'How to use icons?',
+      },
+      {
+        type: 'list',
+        name: 'iconSet',
+        choices: choices,
+        message: 'Select the icon set that needs to be generated?',
+      },
+      {
+        type: 'input',
+        name: 'output',
+        message: 'Select the icon set that needs to be generated?',
+        default: 'src/components/Icon/data',
+      },
+    ])
+    .then(async (answers) => {
+      const { iconSet, output, useType } = answers;
+      const outputDir = path.resolve(process.cwd(), output);
+      await fs.ensureDir(outputDir);
+      const genCollections = collections.filter((item) => [iconSet].includes(item.id));
+      const prefixSet: string[] = [];
+      for (const info of genCollections) {
+        const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`));
+        if (data) {
+          const { prefix } = data;
+          const isLocal = useType === 'local';
+          const icons = Object.keys(data.icons).map(
+            (item) => `${isLocal ? prefix + ':' : ''}${item}`,
+          );
+
+          await fs.writeFileSync(
+            path.join(output, `icons.data.ts`),
+            `export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}`,
+          );
+          prefixSet.push(prefix);
+        }
+      }
+      await fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite'));
+      console.log(
+        `✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`,
+      );
+    });
+}
+
+generateIcon();

+ 9 - 0
build/getConfigFileName.ts

@@ -0,0 +1,9 @@
+/**
+ * Get the configuration file variable name
+ * @param env
+ */
+export const getConfigFileName = (env: Record<string, any>) => {
+  return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__`
+    .toUpperCase()
+    .replace(/\s/g, '');
+};

+ 47 - 0
build/script/buildConf.ts

@@ -0,0 +1,47 @@
+/**
+ * Generate additional configuration files when used for packaging. The file can be configured with some global variables, so that it can be changed directly externally without repackaging
+ */
+import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant';
+import fs, { writeFileSync } from 'fs-extra';
+import colors from 'picocolors';
+
+import { getEnvConfig, getRootPath } from '../utils';
+import { getConfigFileName } from '../getConfigFileName';
+
+import pkg from '../../package.json';
+
+interface CreateConfigParams {
+  configName: string;
+  config: any;
+  configFileName?: string;
+}
+
+function createConfig(params: CreateConfigParams) {
+  const { configName, config, configFileName } = params;
+  try {
+    const windowConf = `window.${configName}`;
+    // Ensure that the variable will not be modified
+    let configStr = `${windowConf}=${JSON.stringify(config)};`;
+    configStr += `
+      Object.freeze(${windowConf});
+      Object.defineProperty(window, "${configName}", {
+        configurable: false,
+        writable: false,
+      });
+    `.replace(/\s/g, '');
+
+    fs.mkdirp(getRootPath(OUTPUT_DIR));
+    writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr);
+
+    console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`);
+    console.log(colors.gray(OUTPUT_DIR + '/' + colors.green(configFileName)) + '\n');
+  } catch (error) {
+    console.log(colors.red('configuration file configuration file failed to package:\n' + error));
+  }
+}
+
+export function runBuildConfig() {
+  const config = getEnvConfig();
+  const configFileName = getConfigFileName(config);
+  createConfig({ config, configName: configFileName, configFileName: GLOB_CONFIG_FILE_NAME });
+}

+ 23 - 0
build/script/postBuild.ts

@@ -0,0 +1,23 @@
+// #!/usr/bin/env node
+
+import { runBuildConfig } from './buildConf';
+import colors from 'picocolors';
+
+import pkg from '../../package.json';
+
+export const runBuild = async () => {
+  try {
+    const argvList = process.argv.splice(2);
+
+    // Generate configuration file
+    if (!argvList.includes('disabled-config')) {
+      runBuildConfig();
+    }
+
+    console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - build successfully!');
+  } catch (error) {
+    console.log(colors.red('vite build error:\n' + error));
+    process.exit(1);
+  }
+};
+runBuild();

+ 92 - 0
build/utils.ts

@@ -0,0 +1,92 @@
+import fs from 'fs';
+import path from 'path';
+import dotenv from 'dotenv';
+
+export function isDevFn(mode: string): boolean {
+  return mode === 'development';
+}
+
+export function isProdFn(mode: string): boolean {
+  return mode === 'production';
+}
+
+/**
+ * Whether to generate package preview
+ */
+export function isReportMode(): boolean {
+  return process.env.REPORT === 'true';
+}
+
+// Read all environment variable configuration files to process.env
+export function wrapperEnv(envConf: Recordable): ViteEnv {
+  const ret: any = {};
+
+  for (const envName of Object.keys(envConf)) {
+    let realName = envConf[envName].replace(/\\n/g, '\n');
+    realName = realName === 'true' ? true : realName === 'false' ? false : realName;
+
+    if (envName === 'VITE_PORT') {
+      realName = Number(realName);
+    }
+    if (envName === 'VITE_PROXY' && realName) {
+      try {
+        realName = JSON.parse(realName.replace(/'/g, '"'));
+      } catch (error) {
+        realName = '';
+      }
+    }
+    ret[envName] = realName;
+    // if (typeof realName === 'string') {
+    //   process.env[envName] = realName;
+    // } else if (typeof realName === 'object') {
+    //   process.env[envName] = JSON.stringify(realName);
+    // }
+  }
+  return ret;
+}
+
+/**
+ * 获取当前环境下生效的配置文件名
+ */
+function getConfFiles() {
+  const script = process.env.npm_lifecycle_script;
+  const reg = new RegExp('--mode ([a-z_\\d]+)');
+  const result = reg.exec(script as string) as any;
+  if (result) {
+    const mode = result[1] as string;
+    return ['.env', `.env.${mode}`];
+  }
+  return ['.env', '.env.production'];
+}
+
+/**
+ * Get the environment variables starting with the specified prefix
+ * @param match prefix
+ * @param confFiles ext
+ */
+export function getEnvConfig(match = 'VITE_GLOB_', confFiles = getConfFiles()) {
+  let envConfig = {};
+  confFiles.forEach((item) => {
+    try {
+      const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item)));
+      envConfig = { ...envConfig, ...env };
+    } catch (e) {
+      console.error(`Error in parsing ${item}`, e);
+    }
+  });
+  const reg = new RegExp(`^(${match})`);
+  Object.keys(envConfig).forEach((key) => {
+    if (!reg.test(key)) {
+      Reflect.deleteProperty(envConfig, key);
+    }
+  });
+  return envConfig;
+}
+
+/**
+ * Get user root directory
+ * @param dir file path
+ */
+export function getRootPath(...dir: string[]) {
+  return path.resolve(process.cwd(), ...dir);
+}

+ 35 - 0
build/vite/optimize.ts

@@ -0,0 +1,35 @@
+const include = [
+  'qs',
+  'vue',
+  'less',
+  'axios',
+  'pinia',
+  'dayjs',
+  'qrcode',
+  'echarts',
+  'intro.js',
+  'cropperjs',
+  'crypto-js',
+  'lodash-es',
+  'nprogress',
+  'vue-i18n',
+  'vue-types',
+  'vue-router',
+  'sortablejs',
+  'echarts/core',
+  'echarts/charts',
+  'echarts/components',
+  'echarts/renderers',
+  '@vueuse/core',
+  '@zxcvbn-ts/core',
+  '@iconify/iconify',
+  'ant-design-vue',
+  'ant-design-vue/es/style',
+  'ant-design-vue/es/locale/zh_CN',
+  'ant-design-vue/es/locale/en_US',
+  'vite-plugin-windicss',
+];
+
+const exclude = ['@iconify/json'];
+
+export { include, exclude };

+ 35 - 0
build/vite/plugin/compress.ts

@@ -0,0 +1,35 @@
+/**
+ * Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated
+ * https://github.com/anncwb/vite-plugin-compression
+ */
+import type { PluginOption } from 'vite';
+import compressPlugin from 'vite-plugin-compression';
+
+export function configCompressPlugin(
+  compress: 'gzip' | 'brotli' | 'none',
+  deleteOriginFile = false,
+): PluginOption | PluginOption[] {
+  const compressList = compress.split(',');
+
+  const plugins: PluginOption[] = [];
+
+  if (compressList.includes('gzip')) {
+    plugins.push(
+      compressPlugin({
+        ext: '.gz',
+        deleteOriginFile,
+      }),
+    );
+  }
+
+  if (compressList.includes('brotli')) {
+    plugins.push(
+      compressPlugin({
+        ext: '.br',
+        algorithm: 'brotliCompress',
+        deleteOriginFile,
+      }),
+    );
+  }
+  return plugins;
+}

+ 40 - 0
build/vite/plugin/html.ts

@@ -0,0 +1,40 @@
+/**
+ * Plugin to minimize and use ejs template syntax in index.html.
+ * https://github.com/xingyuv/vite-vue-plugin-html
+ */
+import type { PluginOption } from 'vite';
+import { createHtmlPlugin } from 'vite-vue-plugin-html';
+import pkg from '../../../package.json';
+import { GLOB_CONFIG_FILE_NAME } from '../../constant';
+
+export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) {
+  const { VITE_GLOB_APP_TITLE, VITE_PUBLIC_PATH } = env;
+
+  const path = VITE_PUBLIC_PATH.endsWith('/') ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`;
+
+  const getAppConfigSrc = () => {
+    return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`;
+  };
+
+  const htmlPlugin: PluginOption[] = createHtmlPlugin({
+    minify: isBuild,
+    inject: {
+      // Inject data into ejs template
+      data: {
+        title: VITE_GLOB_APP_TITLE,
+      },
+      // Embed the generated app.config.js file
+      tags: isBuild
+        ? [
+            {
+              tag: 'script',
+              attrs: {
+                src: getAppConfigSrc(),
+              },
+            },
+          ]
+        : [],
+    },
+  });
+  return htmlPlugin;
+}

+ 34 - 0
build/vite/plugin/imagemin.ts

@@ -0,0 +1,34 @@
+// // Image resource files used to compress the output of the production environment
+// // https://github.com/anncwb/vite-plugin-imagemin
+// import viteImagemin from 'vite-plugin-imagemin';
+
+// export function configImageminPlugin() {
+//   const plugin = viteImagemin({
+//     gifsicle: {
+//       optimizationLevel: 7,
+//       interlaced: false,
+//     },
+//     optipng: {
+//       optimizationLevel: 7,
+//     },
+//     mozjpeg: {
+//       quality: 20,
+//     },
+//     pngquant: {
+//       quality: [0.8, 0.9],
+//       speed: 4,
+//     },
+//     svgo: {
+//       plugins: [
+//         {
+//           name: 'removeViewBox',
+//         },
+//         {
+//           name: 'removeEmptyAttrs',
+//           active: false,
+//         },
+//       ],
+//     },
+//   });
+//   return plugin;
+// }

+ 76 - 0
build/vite/plugin/index.ts

@@ -0,0 +1,76 @@
+import { PluginOption } from 'vite';
+import vue from '@vitejs/plugin-vue';
+import vueJsx from '@vitejs/plugin-vue-jsx';
+import progress from 'vite-plugin-progress';
+import windiCSS from 'vite-plugin-windicss';
+import purgeIcons from 'vite-plugin-purge-icons';
+import VitePluginCertificate from 'vite-plugin-mkcert';
+import vueSetupExtend from 'unplugin-vue-setup-extend-plus/vite';
+import { configPwaConfig } from './pwa';
+import { configMockPlugin } from './mock';
+import { configHtmlPlugin } from './html';
+import { configCompressPlugin } from './compress';
+import { configStyleImportPlugin } from './styleImport';
+import { configVisualizerConfig } from './visualizer';
+import { configThemePlugin } from './theme';
+import { configSvgIconsPlugin } from './svgSprite';
+import topLevelAwait from 'vite-plugin-top-level-await';
+
+export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
+  const { VITE_USE_MOCK, VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv;
+
+  const vitePlugins: (PluginOption | PluginOption[])[] = [
+    // have to
+    vue(),
+    // have to
+    vueJsx(),
+    // 打包进度条
+    progress(),
+    // support name
+    vueSetupExtend({}),
+    VitePluginCertificate({
+      source: 'coding',
+    }),
+  ];
+  vitePlugins.push(
+    topLevelAwait({
+      promiseExportName: '__tla',
+      promiseImportName: (i) => `__tla_${i}`,
+    }),
+  );
+  // windiCSS
+  vitePlugins.push(windiCSS());
+
+  // vite-plugin-html
+  vitePlugins.push(configHtmlPlugin(viteEnv, isBuild));
+
+  // vite-plugin-svg-icons
+  vitePlugins.push(configSvgIconsPlugin(isBuild));
+
+  // vite-plugin-mock
+  VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild));
+
+  // vite-plugin-purge-icons
+  vitePlugins.push(purgeIcons());
+
+  // rollup-plugin-visualizer
+  vitePlugins.push(configVisualizerConfig());
+
+  // vite-plugin-vben-theme
+  vitePlugins.push(configThemePlugin(isBuild));
+
+  // The following plugins only work in the production environment
+  if (isBuild) {
+    // vite-vue-plugin-style-import
+    vitePlugins.push(configStyleImportPlugin(isBuild));
+    // rollup-plugin-gzip
+    vitePlugins.push(
+      configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE),
+    );
+
+    // vite-plugin-pwa
+    vitePlugins.push(configPwaConfig(viteEnv));
+  }
+
+  return vitePlugins;
+}

+ 19 - 0
build/vite/plugin/mock.ts

@@ -0,0 +1,19 @@
+/**
+ * Mock plugin for development and production.
+ * https://github.com/anncwb/vite-plugin-mock
+ */
+import { viteMockServe } from 'vite-plugin-mock';
+
+export function configMockPlugin(isBuild: boolean) {
+  return viteMockServe({
+    ignore: /^\_/,
+    mockPath: 'mock',
+    localEnabled: !isBuild,
+    prodEnabled: isBuild,
+    injectCode: `
+      import { setupProdMockServer } from '../mock/_createProductionServer';
+
+      setupProdMockServer();
+      `,
+  });
+}

+ 33 - 0
build/vite/plugin/pwa.ts

@@ -0,0 +1,33 @@
+/**
+ * Zero-config PWA for Vite
+ * https://github.com/antfu/vite-plugin-pwa
+ */
+import { VitePWA } from 'vite-plugin-pwa';
+
+export function configPwaConfig(env: ViteEnv) {
+  const { VITE_USE_PWA, VITE_GLOB_APP_TITLE, VITE_GLOB_APP_SHORT_NAME } = env;
+
+  if (VITE_USE_PWA) {
+    // vite-plugin-pwa
+    const pwaPlugin = VitePWA({
+      manifest: {
+        name: VITE_GLOB_APP_TITLE,
+        short_name: VITE_GLOB_APP_SHORT_NAME,
+        icons: [
+          {
+            src: './resource/img/pwa-192x192.png',
+            sizes: '192x192',
+            type: 'image/png',
+          },
+          {
+            src: './resource/img/pwa-512x512.png',
+            sizes: '512x512',
+            type: 'image/png',
+          },
+        ],
+      },
+    });
+    return pwaPlugin;
+  }
+  return [];
+}

+ 82 - 0
build/vite/plugin/styleImport.ts

@@ -0,0 +1,82 @@
+/**
+ *  Introduces component library styles on demand.
+ * https://github.com/xingyuv/vite-vue-plugin-style-import
+ */
+import { createStyleImportPlugin } from 'vite-plugin-style-import';
+
+export function configStyleImportPlugin(_isBuild: boolean) {
+  if (!_isBuild) {
+    return [];
+  }
+  const styleImportPlugin = createStyleImportPlugin({
+    libs: [
+      {
+        libraryName: 'ant-design-vue',
+        esModule: true,
+        resolveStyle: (name) => {
+          // 这里是无需额外引入样式文件的“子组件”列表
+          const ignoreList = [
+            'anchor-link',
+            'sub-menu',
+            'menu-item',
+            'menu-divider',
+            'menu-item-group',
+            'breadcrumb-item',
+            'breadcrumb-separator',
+            'form-item',
+            'step',
+            'select-option',
+            'select-opt-group',
+            'card-grid',
+            'card-meta',
+            'collapse-panel',
+            'descriptions-item',
+            'list-item',
+            'list-item-meta',
+            'table-column',
+            'table-column-group',
+            'tab-pane',
+            'tab-content',
+            'timeline-item',
+            'tree-node',
+            'skeleton-input',
+            'skeleton-avatar',
+            'skeleton-title',
+            'skeleton-paragraph',
+            'skeleton-image',
+            'skeleton-button',
+          ];
+          // 这里是需要额外引入样式的子组件列表
+          // 单独引入子组件时需引入组件样式,否则会在打包后导致子组件样式丢失
+          const replaceList = {
+            textarea: 'input',
+            'typography-text': 'typography',
+            'typography-title': 'typography',
+            'typography-paragraph': 'typography',
+            'typography-link': 'typography',
+            'dropdown-button': 'dropdown',
+            'input-password': 'input',
+            'input-search': 'input',
+            'input-group': 'input',
+            'radio-group': 'radio',
+            'checkbox-group': 'checkbox',
+            'layout-sider': 'layout',
+            'layout-content': 'layout',
+            'layout-footer': 'layout',
+            'layout-header': 'layout',
+            'month-picker': 'date-picker',
+            'range-picker': 'date-picker',
+            'image-preview-group': 'image',
+          };
+
+          return ignoreList.includes(name)
+            ? ''
+            : replaceList.hasOwnProperty(name)
+            ? `ant-design-vue/es/${replaceList[name]}/style/index`
+            : `ant-design-vue/es/${name}/style/index`;
+        },
+      },
+    ],
+  });
+  return styleImportPlugin;
+}

+ 17 - 0
build/vite/plugin/svgSprite.ts

@@ -0,0 +1,17 @@
+/**
+ *  Vite Plugin for fast creating SVG sprites.
+ * https://github.com/anncwb/vite-plugin-svg-icons
+ */
+
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
+import path from 'path';
+
+export function configSvgIconsPlugin(isBuild: boolean) {
+  const svgIconsPlugin = createSvgIconsPlugin({
+    iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
+    svgoOptions: isBuild,
+    // default
+    symbolId: 'icon-[dir]-[name]',
+  });
+  return svgIconsPlugin;
+}

+ 89 - 0
build/vite/plugin/theme.ts

@@ -0,0 +1,89 @@
+/**
+ * Vite plugin for website theme color switching
+ * https://github.com/xingyuv/vite-plugin-theme
+ */
+import type { PluginOption } from 'vite';
+import path from 'path';
+import {
+  viteThemePlugin,
+  antdDarkThemePlugin,
+  mixLighten,
+  mixDarken,
+  tinycolor,
+} from 'vite-vue-plugin-theme';
+import { getThemeColors, generateColors } from '../../config/themeConfig';
+import { generateModifyVars } from '../../generate/generateModifyVars';
+
+export function configThemePlugin(isBuild: boolean): PluginOption[] {
+  const colors = generateColors({
+    mixDarken,
+    mixLighten,
+    tinycolor,
+  });
+  const plugin = [
+    viteThemePlugin({
+      resolveSelector: (s) => {
+        s = s.trim();
+        switch (s) {
+          case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon':
+            return '.ant-steps-item-icon > .ant-steps-icon';
+          case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)':
+          case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover':
+          case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active':
+            return s;
+          case '.ant-steps-item-icon > .ant-steps-icon':
+            return s;
+          case '.ant-select-item-option-selected:not(.ant-select-item-option-disabled)':
+            return s;
+          default:
+            if (s.indexOf('.ant-btn') >= -1) {
+              // 按钮被重新定制过,需要过滤掉class防止覆盖
+              return s;
+            }
+        }
+        return s.startsWith('[data-theme') ? s : `[data-theme] ${s}`;
+      },
+      colorVariables: [...getThemeColors(), ...colors],
+    }),
+    antdDarkThemePlugin({
+      preloadFiles: [
+        path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.less'),
+        //path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'),
+        path.resolve(process.cwd(), 'src/design/index.less'),
+      ],
+      filter: (id) => (isBuild ? !id.endsWith('antd.less') : true),
+      // extractCss: false,
+      darkModifyVars: {
+        ...generateModifyVars(true),
+        'text-color': '#c9d1d9',
+        'primary-1': 'rgb(255 255 255 / 8%)',
+        'text-color-base': '#c9d1d9',
+        'component-background': '#151515',
+        'heading-color': 'rgb(255 255 255 / 65%)',
+        // black: '#0e1117',
+        // #8b949e
+        'text-color-secondary': '#8b949e',
+        'border-color-base': '#303030',
+        // 'border-color-split': '#30363d',
+        'item-active-bg': '#111b26',
+        'app-content-background': '#1e1e1e',
+        'tree-node-selected-bg': '#11263c',
+
+        'alert-success-border-color': '#274916',
+        'alert-success-bg-color': '#162312',
+        'alert-success-icon-color': '#49aa19',
+        'alert-info-border-color': '#153450',
+        'alert-info-bg-color': '#111b26',
+        'alert-info-icon-color': '#177ddc',
+        'alert-warning-border-color': '#594214',
+        'alert-warning-bg-color': '#2b2111',
+        'alert-warning-icon-color': '#d89614',
+        'alert-error-border-color': '#58181c',
+        'alert-error-bg-color': '#2a1215',
+        'alert-error-icon-color': '#a61d24',
+      },
+    }),
+  ];
+
+  return plugin as unknown as PluginOption[];
+}

+ 17 - 0
build/vite/plugin/visualizer.ts

@@ -0,0 +1,17 @@
+/**
+ * Package file volume analysis
+ */
+import visualizer from 'rollup-plugin-visualizer';
+import { isReportMode } from '../../utils';
+
+export function configVisualizerConfig() {
+  if (isReportMode()) {
+    return visualizer({
+      filename: './node_modules/.cache/visualizer/stats.html',
+      open: true,
+      gzipSize: true,
+      brotliSize: true,
+    }) as Plugin;
+  }
+  return [];
+}

+ 34 - 0
build/vite/proxy.ts

@@ -0,0 +1,34 @@
+/**
+ * Used to parse the .env.development proxy configuration
+ */
+import type { ProxyOptions } from 'vite';
+
+type ProxyItem = [string, string];
+
+type ProxyList = ProxyItem[];
+
+type ProxyTargetList = Record<string, ProxyOptions>;
+
+const httpsRE = /^https:\/\//;
+
+/**
+ * Generate proxy
+ * @param list
+ */
+export function createProxy(list: ProxyList = []) {
+  const ret: ProxyTargetList = {};
+  for (const [prefix, target] of list) {
+    const isHttps = httpsRE.test(target);
+
+    // https://github.com/http-party/node-http-proxy#options
+    ret[prefix] = {
+      target: target,
+      changeOrigin: true,
+      ws: true,
+      rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),
+      // https is require secure=false
+      ...(isHttps ? { secure: false } : {}),
+    };
+  }
+  return ret;
+}

+ 33 - 0
commitlint.config.js

@@ -0,0 +1,33 @@
+module.exports = {
+  ignores: [(commit) => commit.includes('init')],
+  extends: ['@commitlint/config-conventional'],
+  rules: {
+    'body-leading-blank': [2, 'always'],
+    'footer-leading-blank': [1, 'always'],
+    'header-max-length': [2, 'always', 108],
+    'subject-empty': [2, 'never'],
+    'type-empty': [2, 'never'],
+    'subject-case': [0],
+    'type-enum': [
+      2,
+      'always',
+      [
+        'feat',
+        'fix',
+        'perf',
+        'style',
+        'docs',
+        'test',
+        'refactor',
+        'build',
+        'ci',
+        'chore',
+        'revert',
+        'wip',
+        'workflow',
+        'types',
+        'release',
+      ],
+    ],
+  },
+};

+ 48 - 0
default.conf

@@ -0,0 +1,48 @@
+server {
+    listen       80;
+    server_name  localhost;
+
+    #charset koi8-r;
+    #access_log  /var/log/nginx/host.access.log  main;
+
+    location / {
+        root   /usr/share/nginx/html;
+        try_files $uri $uri/ /index.html;
+        index  index.html index.htm;
+        error_page  404 404.html;
+        add_header Cache-Control "no-store";
+        expires -1;
+    }
+
+    # error_page  404   /usr/share/nginx/html/404.html;
+
+    # redirect server error pages to the static page /50x.html
+    #
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   /usr/share/nginx/html;
+    }
+
+    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
+    #
+    #location ~ \.php$ {
+    #    proxy_pass   http://127.0.0.1;
+    #}
+
+    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
+    #
+    #location ~ \.php$ {
+    #    root           html;
+    #    fastcgi_pass   127.0.0.1:9000;
+    #    fastcgi_index  index.php;
+    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
+    #    include        fastcgi_params;
+    #}
+
+    # deny access to .htaccess files, if Apache's document root
+    # concurs with nginx's one
+    #
+    #location ~ /\.ht {
+    #    deny  all;
+    #}
+}

+ 1 - 0
dist/6DXE6h6XT3.txt

@@ -0,0 +1 @@
+383f2914537153cb4f8c9f5ac7f2d12d

+ 1 - 0
dist/MP_verify_F6MMjresID5EXyd0.txt

@@ -0,0 +1 @@
+F6MMjresID5EXyd0

+ 1 - 0
dist/_app.config.js

@@ -0,0 +1 @@
+window.__PRODUCTION__铜梁职业教育中心__CONF__={"VITE_GLOB_APP_TITLE":"铜梁职业教育中心","VITE_GLOB_APP_SHORT_NAME":"铜梁职业教育中心","VITE_GLOB_APP_LOGO_TITLE":"数智铜职","VITE_GLOB_APP_PD_SCHEMA":"1718834843548979201","VITE_GLOB_ENABLE_FORMAT_API":"true","VITE_GLOB_API_URL":"http://10.150.10.139:8888/api","VITE_GLOB_UPLOAD_URL":"/system/oss/upload","VITE_GLOB_API_URL_PREFIX":"","VITE_GLOB_UPLOAD_OTHER_URL":"http://10.150.10.139:8001/system/file","VITE_GLOB_FFFILEVIEW_URL":"http://10.150.10.139:8012/onlinePreview?url="};Object.freeze(window.__PRODUCTION__铜梁职业教育中心__CONF__);Object.defineProperty(window,"__PRODUCTION__铜梁职业教育中心__CONF__",{configurable:false,writable:false,});

+ 1 - 0
dist/assets/AccountBind-28d853bd.js

@@ -0,0 +1 @@
+var f=(n,_,s)=>new Promise((p,u)=>{var y=a=>{try{i(s.next(a))}catch(r){u(r)}},I=a=>{try{i(s.throw(a))}catch(r){u(r)}},i=a=>a.done?p(a.value):Promise.resolve(a.value).then(y,I);i((s=s.apply(n,_)).next())});import{d as z,z as E,d6 as d,aL as H,_ as N,y as l,o,c,w as e,e as L,l as g,O as w,N as A,H as v,b as k,t as m,a as B,__tla as D}from"./index-b5895273.js";import{c as O,__tla as P}from"./data-4352b1fa.js";let x,V=Promise.all([(()=>{try{return D}catch(n){}})(),(()=>{try{return P}catch(n){}})()]).then(()=>f(void 0,null,function*(){const n=z({components:{CollapseContainer:E,List:d,ListItem:d.Item,ListItemMeta:d.Item.Meta,Icon:H},setup(){return{list:O}}});function _(s,p,u,y,I,i){const a=l("Icon"),r=l("a-button"),C=l("ListItemMeta"),b=l("ListItem"),M=l("List"),h=l("CollapseContainer");return o(),c(h,{title:"\u8D26\u53F7\u7ED1\u5B9A",canExpan:!1},{default:e(()=>[L(M,null,{default:e(()=>[(o(!0),g(A,null,w(s.list,t=>(o(),c(b,{key:t.key},{default:e(()=>[L(C,null,{avatar:e(()=>[t.avatar?(o(),c(a,{key:0,class:"avatar",icon:t.avatar,color:t.color},null,8,["icon","color"])):v("",!0)]),title:e(()=>[k(m(t.title)+" ",1),t.extra?(o(),c(r,{key:0,type:"link",size:"small",class:"extra"},{default:e(()=>[k(m(t.extra),1)]),_:2},1024)):v("",!0)]),description:e(()=>[B("div",null,m(t.description),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})}x=N(n,[["render",_],["__scopeId","data-v-51b5e651"]])}));export{V as __tla,x as default};

BIN
dist/assets/AccountBind-28d853bd.js.gz


+ 1 - 0
dist/assets/AccountBind-6029102b.css

@@ -0,0 +1 @@
+.avatar[data-v-a48f7450]{font-size:40px!important}.extra[data-v-a48f7450]{float:right;margin-top:10px;margin-right:30px;cursor:pointer}

+ 1 - 0
dist/assets/AccountBind-87fcd75a.css

@@ -0,0 +1 @@
+.avatar[data-v-51b5e651]{font-size:40px!important}.extra[data-v-51b5e651]{float:right;margin-top:10px;margin-right:30px;cursor:pointer}

+ 1 - 0
dist/assets/AccountBind-c3d75919.js

@@ -0,0 +1 @@
+var y=(r,u,s)=>new Promise((p,_)=>{var f=a=>{try{i(s.next(a))}catch(n){_(n)}},I=a=>{try{i(s.throw(a))}catch(n){_(n)}},i=a=>a.done?p(a.value):Promise.resolve(a.value).then(f,I);i((s=s.apply(r,u)).next())});import{d as z,z as E,d6 as d,aL as H,_ as N,y as l,o,c,w as e,e as L,l as g,O as w,N as A,H as v,b as k,t as m,a as B,__tla as D}from"./index-b5895273.js";import{c as O}from"./data-15304551.js";let x,P=Promise.all([(()=>{try{return D}catch(r){}})()]).then(()=>y(void 0,null,function*(){const r=z({components:{CollapseContainer:E,List:d,ListItem:d.Item,ListItemMeta:d.Item.Meta,Icon:H},setup(){return{list:O}}});function u(s,p,_,f,I,i){const a=l("Icon"),n=l("a-button"),C=l("ListItemMeta"),M=l("ListItem"),b=l("List"),h=l("CollapseContainer");return o(),c(h,{title:"\u8D26\u53F7\u7ED1\u5B9A",canExpan:!1},{default:e(()=>[L(b,null,{default:e(()=>[(o(!0),g(A,null,w(s.list,t=>(o(),c(M,{key:t.key},{default:e(()=>[L(C,null,{avatar:e(()=>[t.avatar?(o(),c(a,{key:0,class:"avatar",icon:t.avatar,color:t.color},null,8,["icon","color"])):v("",!0)]),title:e(()=>[k(m(t.title)+" ",1),t.extra?(o(),c(n,{key:0,type:"link",size:"small",class:"extra"},{default:e(()=>[k(m(t.extra),1)]),_:2},1024)):v("",!0)]),description:e(()=>[B("div",null,m(t.description),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})}x=N(r,[["render",u],["__scopeId","data-v-a48f7450"]])}));export{P as __tla,x as default};

BIN
dist/assets/AccountBind-c3d75919.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AccountDetail-db1d0360.js


BIN
dist/assets/AccountDetail-db1d0360.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AccountModal-d97cbe5a.js


BIN
dist/assets/AccountModal-d97cbe5a.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/Action-1e6f730e.js


BIN
dist/assets/Action-1e6f730e.js.gz


+ 1 - 0
dist/assets/Action-f3490e07.css

@@ -0,0 +1 @@
+.scroll-wrap[data-v-981521f7]{width:50%;height:300px;background-color:#fff}

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/ActionTree-57f1937b.js


BIN
dist/assets/ActionTree-57f1937b.js.gz


+ 1 - 0
dist/assets/AddOrSubtract-155cfa42.css

@@ -0,0 +1 @@
+.box[data-v-7ed0b5d0]{height:500px}.list-page-box[data-v-7ed0b5d0]{display:flex;flex-wrap:wrap;overflow-y:auto;padding:10px 0}

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AddOrSubtract-d244e87b.js


BIN
dist/assets/AddOrSubtract-d244e87b.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AdvancedForm-c69f7520.js


BIN
dist/assets/AdvancedForm-c69f7520.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/Alarm-4c80924f.js


BIN
dist/assets/Alarm-4c80924f.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AlarmInfomation-58ecf2f4.js


BIN
dist/assets/AlarmInfomation-58ecf2f4.js.gz


+ 1 - 0
dist/assets/AlarmInfomation-92ab2bed.css

@@ -0,0 +1 @@
+.ant-col[data-v-62dc74de]{margin-bottom:15px}.img-title[data-v-62dc74de]{position:absolute;top:10px;right:30px;width:100px}.img-box[data-v-62dc74de]{display:flex;align-items:center;margin-bottom:10px}[data-v-62dc74de] .ant-image{width:100px;height:75px;padding:5px;border:1px solid silver;border-radius:4px;margin-right:10px}[data-v-62dc74de] .ant-image-img{height:100%}

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AlarmModal-d686ef95.js


BIN
dist/assets/AlarmModal-d686ef95.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AlarmModal.vue_vue_type_script_setup_true_lang-d4b4e0dd.js


BIN
dist/assets/AlarmModal.vue_vue_type_script_setup_true_lang-d4b4e0dd.js.gz


+ 1 - 0
dist/assets/AntdFormConfig-72b8cc1a.css

@@ -0,0 +1 @@
+.form-config-container[data-v-01312c22]{padding:10px}

+ 1 - 0
dist/assets/AntdFormConfig-bc49e4aa.js

@@ -0,0 +1 @@
+var g=(u,f,e)=>new Promise((c,a)=>{var l=t=>{try{o(e.next(t))}catch(d){a(d)}},s=t=>{try{o(e.throw(t))}catch(d){a(d)}},o=t=>t.done?c(t.value):Promise.resolve(t.value).then(l,s);o((e=e.apply(u,f)).next())});import{d as h,r as w,j,a4 as q,_ as A,y as i,o as F,l as k,e as r,w as n,b as p,t as m,aq as x,ar as B,__tla as E}from"./index-b5895273.js";let v,I=Promise.all([(()=>{try{return E}catch(u){}})()]).then(()=>g(void 0,null,function*(){const{t:u}=q(),f=h({name:"AntdFormConfig",props:{config:{type:Object,required:!0}},emits:["update:config"],setup(a,l){const s=w(a.config),o={labelCol:{span:6},wrapperCol:{span:18}};return j(s,()=>l.emit("update:config",s)),{data:s,layout:o,t:u}}}),e={class:"form-config-container"};function c(a,l,s,o,t,d){const _=i("a-radio-button"),b=i("a-radio-group"),y=i("a-form-item"),z=i("a-form");return F(),k("div",e,[r(z,x(B(a.layout)),{default:n(()=>[r(y,{label:a.t("\u7EC4\u4EF6\u5C3A\u5BF8")},{default:n(()=>[r(b,{value:a.data.size,"onUpdate:value":l[0]||(l[0]=C=>a.data.size=C),"button-style":"solid",size:"small"},{default:n(()=>[r(_,{value:"default"},{default:n(()=>[p(m(a.t("\u9ED8\u8BA4")),1)]),_:1}),r(_,{value:"large"},{default:n(()=>[p(m(a.t("\u5927")),1)]),_:1}),r(_,{value:"small"},{default:n(()=>[p(m(a.t("\u5C0F")),1)]),_:1})]),_:1},8,["value"])]),_:1},8,["label"])]),_:1},16)])}v=A(f,[["render",c],["__scopeId","data-v-01312c22"]])}));export{I as __tla,v as default};

BIN
dist/assets/AntdFormConfig-bc49e4aa.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AntdWidgetForm-c21d7bb4.js


BIN
dist/assets/AntdWidgetForm-c21d7bb4.js.gz


+ 1 - 0
dist/assets/AntdWidgetForm-e48211a8.css

@@ -0,0 +1 @@
+.awf-container-center[data-v-746bc0dc]{width:100%;height:100%;box-sizing:border-box;border-bottom-left-radius:26px;border-bottom-right-radius:26px}.widget-form-container[data-v-746bc0dc]{width:100%;height:100%;background-color:#fff;box-sizing:border-box}.widget-form-list[data-v-746bc0dc]{height:100%}.fc-style .widget-form-container .widget-form-list[data-v-746bc0dc]{background:#fff;min-height:calc(100vh - 305px)}

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AntdWidgetFormItem-02ee87ad.js


BIN
dist/assets/AntdWidgetFormItem-02ee87ad.js.gz


+ 1 - 0
dist/assets/AntdWidgetFormItem-8664a7c9.css

@@ -0,0 +1 @@
+[data-v-aed490d2] .ant-tabs{overflow:visible}.ant-form-item.active>.vben-collapse-container[data-v-aed490d2]{background:#eef4ff}.widget-item-container .widget-view[data-v-aed490d2]{padding:10px;cursor:pointer;margin-bottom:0}.widget-item-container>div.active[data-v-aed490d2]{background:#eef4ff}.widget-item-container[data-v-aed490d2]{position:relative}.widget-view-action[data-v-aed490d2]{position:absolute;top:0}.widget-view-drag[data-v-aed490d2]{position:absolute;top:30px}.svgicon[data-v-aed490d2]{color:#0960bd;border:1px solid #0960bd;border-radius:50%;width:24px;height:24px;line-height:20px;display:inline-block;text-align:center;cursor:pointer;margin-left:10px}.svgicon svg[data-v-aed490d2]{width:12px!important;height:12px!important}.icon-delete[data-v-aed490d2]{border:1px solid #f64c4c;color:#f64c4c}.icon-move[data-v-aed490d2]{border:1px solid #90b665;color:#90b665}.radio-default[data-v-aed490d2]{display:inline-block!important}.radio-button[data-v-aed490d2]{flex-wrap:wrap}[data-v-aed490d2] .ant-form-item-control-input-content .ant-radio-group .ant-radio-button-wrapper{padding:3px 7px!important;flex:auto}[data-v-aed490d2] .ant-form-item-label>label{white-space:normal;display:inline;line-height:28px;cursor:pointer}.fc-style .widget-form-container .widget-form-list .widget-col.active[data-v-aed490d2]{border:1px dashed #e6a23c!important}.fc-style .widget-form-container .widget-form-list .widget-col[data-v-aed490d2]:hover{background:#fdf6ec;outline:1px dashed #e6a23c;outline-offset:0}.fc-style .widget-form-container .widget-form-list .widget-col-list[data-v-aed490d2]{min-height:100px;border:1px dashed #ccc;background:#fff}

BIN
dist/assets/AntdWidgetFormItem-8664a7c9.css.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/ApiConfigSelect-7ba9c91e.js


BIN
dist/assets/ApiConfigSelect-7ba9c91e.js.gz


+ 1 - 0
dist/assets/ApiConfigSelect-90cde5a2.css

@@ -0,0 +1 @@
+.box-left[data-v-dcb46f92]{flex:1}.box-right[data-v-dcb46f92]{flex:2}.title[data-v-dcb46f92]{font-size:16px;line-height:18px;margin-bottom:15px;padding-left:6px;border-left:6px solid #5e95ff}[data-v-dcb46f92] .ant-tree{padding:10px 15px 0 0;border-top:1px solid #f0f0f0}[data-v-dcb46f92] .ant-tree-treenode,[data-v-dcb46f92] .ant-tree-node-content-wrapper{width:100%;height:35px;line-height:35px}[data-v-dcb46f92] .ant-table-body{height:200px}

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/ApiSelect-2fc61a7c.js


BIN
dist/assets/ApiSelect-2fc61a7c.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/ApiSelect-948bf38a.js


BIN
dist/assets/ApiSelect-948bf38a.js.gz


+ 1 - 0
dist/assets/ApiSelect-dcd2e00c.css

@@ -0,0 +1 @@
+.title[data-v-809559a8]{border-bottom:1px solid #f0f0f0;margin-bottom:10px}.padding[data-v-809559a8]{padding:10px 20px}.btn-item[data-v-809559a8]{position:absolute;bottom:10px}.editor-box[data-v-809559a8]{width:300px;position:absolute;height:350px;left:140px;bottom:13px;border:1px solid #ccc;box-shadow:0 0 6px 3px #ccc}.editor-box .editor-close[data-v-809559a8]{position:absolute;top:-3px;right:13px;font-size:16px;cursor:pointer}.editor-box .editor-copy[data-v-809559a8]{position:absolute;bottom:5px;right:15px;cursor:pointer;z-index:999;color:#5e95ff}

+ 5 - 0
dist/assets/ApiSelect.vue_vue_type_script_setup_true_lang-dbf214a7.js

@@ -0,0 +1,5 @@
+var m=(r,u,e)=>new Promise((n,t)=>{var d=a=>{try{o(e.next(a))}catch(i){t(i)}},l=a=>{try{o(e.throw(a))}catch(i){t(i)}},o=a=>a.done?n(a.value):Promise.resolve(a.value).then(d,l);o((e=e.apply(r,u)).next())});import{I as f,S as p,__tla as _}from"./index-18fd250e.js";import{d as g,a4 as v,f as h,j as x,n as C,o as S,c as q,w as y,e as w,u as s,__tla as P}from"./index-b5895273.js";let c,V=Promise.all([(()=>{try{return _}catch(r){}})(),(()=>{try{return P}catch(r){}})()]).then(()=>m(void 0,null,function*(){c=g({__name:"ApiSelect",props:{value:{default:()=>({id:"",name:"",method:"",requestParamsConfigs:[],requestHeaderConfigs:[],requestBodyConfigs:[]})},exampleStr:{default:`{
+    code: 0,
+    msg: 'success',
+    data: 'value',
+  }`}},emits:["save","update:value"],setup(r,{emit:u}){const e=r,{t:n}=v();let t=h({config:{id:"",name:"",method:"",requestParamsConfigs:[],requestHeaderConfigs:[],requestBodyConfigs:[]}});x(()=>e.value,l=>{l&&(t.config=e.value)},{deep:!0}),C(()=>{t.config=e.value});function d(l){u("save",l),u("update:value",l)}return(l,o)=>(S(),q(s(p),{modelValue:s(t).config,"onUpdate:modelValue":[o[0]||(o[0]=a=>s(t).config=a),d],exampleStr:s(e).exampleStr},{default:y(()=>[w(s(f),{value:s(t).config.name,placeholder:s(n)("\u70B9\u51FB\u7ED1\u5B9AAPI"),style:{width:"100%","min-width":"100px"}},null,8,["value","placeholder"])]),_:1},8,["modelValue","exampleStr"]))}})}));export{c as _,V as __tla};

BIN
dist/assets/ApiSelect.vue_vue_type_script_setup_true_lang-dbf214a7.js.gz


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/AppendForm-36b647eb.js


BIN
dist/assets/AppendForm-36b647eb.js.gz


+ 1 - 0
dist/assets/Application-443980a9.css

@@ -0,0 +1 @@
+.account-center-application__card{width:100%;margin-bottom:-12px}.account-center-application__card .ant-card-body{padding:16px}.account-center-application__card-title{margin-bottom:5px;font-size:16px;font-weight:500}.account-center-application__card-title .icon{margin-top:-5px;font-size:22px}.account-center-application__card-num{margin-left:24px;line-height:36px;color:#00000073}.account-center-application__card-num span{margin-left:5px;font-size:18px}.account-center-application__card-download{float:right;font-size:20px!important;color:#5e95ff}

+ 1 - 0
dist/assets/Application-bce0257e.css

@@ -0,0 +1 @@
+.info-box[data-v-91a3a55c]{background-color:#fff;width:100%;height:100%;padding:16px;margin-right:8px}.info-box .content-box[data-v-91a3a55c]{overflow:auto;height:calc(100% - 80px)}.info-box .content-box .report-box[data-v-91a3a55c]{border:1px solid #ddd;padding:15px;margin-bottom:18px}.info-box .content-box .report-box .content-title[data-v-91a3a55c]{font-size:24px;font-weight:700;color:#444;padding-bottom:15px;text-align:center}.info-box .content-box .report-box .assess-info[data-v-91a3a55c]{color:#999;text-align:center;margin:20px 0}.info-box .content-box .sub-title[data-v-91a3a55c]{color:#333;font-weight:700;margin:18px}.info-box .content-box .submit-btn[data-v-91a3a55c] .ant-form-item-control-input-content{text-align:center;margin-top:20px}[data-v-91a3a55c] .ant-divider{height:1px;background-color:#dcdfe6}[data-v-91a3a55c] .ant-card-body{background-color:#f8f8f8}

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/assets/Application-e9444192.js


BIN
dist/assets/Application-e9444192.js.gz


+ 1 - 0
dist/assets/Application-f85e3abf.js

@@ -0,0 +1 @@
+var L=(n,p,a)=>new Promise((x,f)=>{var y=s=>{try{_(a.next(s))}catch(r){f(r)}},w=s=>{try{_(a.throw(s))}catch(r){f(r)}},_=s=>s.done?x(s.value):Promise.resolve(s.value).then(y,w);_((a=a.apply(n,p)).next())});import{d as A,d6 as v,C as B,aL as D,R as I,x as $,_ as E,y as t,o as e,c as d,w as i,X as c,e as m,l as F,O as H,N,a as o,H as h,b as u,t as C,__tla as O}from"./index-b5895273.js";import{__tla as P}from"./index-42fa3364.js";import{applicationList as V}from"./data-199c263c.js";let k,X=Promise.all([(()=>{try{return O}catch(n){}})(),(()=>{try{return P}catch(n){}})()]).then(()=>L(void 0,null,function*(){const n=A({components:{List:v,ListItem:v.Item,Card:B,Icon:D,[I.name]:I,[$.name]:$},setup(){return{prefixCls:"account-center-application",list:V}}});function p(a,x,f,y,w,_){const s=t("Icon"),r=t("Card"),b=t("ListItem"),g=t("a-col"),R=t("a-row"),j=t("List");return e(),d(j,{class:c(a.prefixCls)},{default:i(()=>[m(R,{gutter:16},{default:i(()=>[(e(!0),F(N,null,H(a.list,l=>(e(),d(g,{key:l.title,span:6},{default:i(()=>[m(b,null,{default:i(()=>[m(r,{hoverable:!0,class:c(`${a.prefixCls}__card`)},{default:i(()=>[o("div",{class:c(`${a.prefixCls}__card-title`)},[l.icon?(e(),d(s,{key:0,class:"icon",icon:l.icon,color:l.color},null,8,["icon","color"])):h("",!0),u(" "+C(l.title),1)],2),o("div",{class:c(`${a.prefixCls}__card-num`)},[u(" \u6D3B\u8DC3\u7528\u6237\uFF1A"),o("span",null,C(l.active),1),u(" \u4E07 ")],2),o("div",{class:c(`${a.prefixCls}__card-num`)},[u(" \u65B0\u589E\u7528\u6237\uFF1A"),o("span",null,C(l.new),1)],2),l.download?(e(),d(s,{key:0,class:c(`${a.prefixCls}__card-download`),icon:l.download},null,8,["class","icon"])):h("",!0)]),_:2},1032,["class"])]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1},8,["class"])}k=E(n,[["render",p]])}));export{X as __tla,k as default};

Деякі файли не було показано, через те що забагато файлів було змінено