Browse Source

初始化项目,自 v1.7.1 版本开始

YunaiV 2 years ago
parent
commit
56f3017baa
100 changed files with 4763 additions and 61 deletions
  1. 12 0
      .editorconfig
  2. 15 0
      .env
  3. 19 0
      .env.base
  4. 31 0
      .env.dev
  5. 31 0
      .env.pro
  6. 31 0
      .env.test
  7. 8 0
      .eslintignore
  8. 259 0
      .eslintrc-auto-import.json
  9. 69 0
      .eslintrc.js
  10. 8 0
      .gitignore
  11. 9 0
      .prettierignore
  12. 6 0
      .stylelintignore
  13. 15 0
      .vscode/extensions.json
  14. 44 0
      .vscode/settings.json
  15. 21 0
      LICENSE
  16. 0 36
      README.en.md
  17. 219 25
      README.md
  18. 98 0
      build/vite/index.ts
  19. 68 0
      build/vite/optimize.ts
  20. 151 0
      index.html
  21. 137 0
      package.json
  22. 5 0
      postcss.config.js
  23. 22 0
      prettier.config.js
  24. BIN
      public/favicon.ico
  25. BIN
      public/logo.gif
  26. 49 0
      src/App.vue
  27. 8 0
      src/api/bpm/activity/index.ts
  28. 21 0
      src/api/bpm/definition/index.ts
  29. 56 0
      src/api/bpm/form/index.ts
  30. 27 0
      src/api/bpm/leave/index.ts
  31. 59 0
      src/api/bpm/model/index.ts
  32. 40 0
      src/api/bpm/processInstance/index.ts
  33. 34 0
      src/api/bpm/task/index.ts
  34. 29 0
      src/api/bpm/taskAssignRule/index.ts
  35. 47 0
      src/api/bpm/userGroup/index.ts
  36. 50 0
      src/api/infra/apiAccessLog/index.ts
  37. 66 0
      src/api/infra/apiErrorLog/index.ts
  38. 57 0
      src/api/infra/codegen/index.ts
  39. 61 0
      src/api/infra/codegen/types.ts
  40. 62 0
      src/api/infra/config/index.ts
  41. 35 0
      src/api/infra/dataSourceConfig/index.ts
  42. 16 0
      src/api/infra/dbDoc/index.ts
  43. 66 0
      src/api/infra/fileConfig/index.ts
  44. 28 0
      src/api/infra/fileList/index.ts
  45. 75 0
      src/api/infra/job/index.ts
  46. 49 0
      src/api/infra/jobLog/index.ts
  47. 41 0
      src/api/infra/redis/index.ts
  48. 185 0
      src/api/infra/redis/types.ts
  49. 73 0
      src/api/login/index.ts
  50. 42 0
      src/api/login/types.ts
  51. 41 0
      src/api/mp/account/index.ts
  52. 39 0
      src/api/mp/autoReply/index.ts
  53. 35 0
      src/api/mp/draft/index.ts
  54. 23 0
      src/api/mp/freePublish/index.ts
  55. 16 0
      src/api/mp/material/index.ts
  56. 26 0
      src/api/mp/menu/index.ts
  57. 17 0
      src/api/mp/message/index.ts
  58. 31 0
      src/api/mp/mpuser/index.ts
  59. 33 0
      src/api/mp/statistics/index.ts
  60. 53 0
      src/api/mp/tag/index.ts
  61. 78 0
      src/api/pay/app/index.ts
  62. 70 0
      src/api/pay/channel/index.ts
  63. 77 0
      src/api/pay/merchant/index.ts
  64. 109 0
      src/api/pay/order/index.ts
  65. 116 0
      src/api/pay/refund/index.ts
  66. 48 0
      src/api/system/dept/index.ts
  67. 36 0
      src/api/system/dict/dict.data.ts
  68. 36 0
      src/api/system/dict/dict.type.ts
  69. 46 0
      src/api/system/dict/types.ts
  70. 48 0
      src/api/system/errorCode/index.ts
  71. 30 0
      src/api/system/loginLog/index.ts
  72. 46 0
      src/api/system/mail/account/index.ts
  73. 40 0
      src/api/system/mail/log/index.ts
  74. 58 0
      src/api/system/mail/template/index.ts
  75. 54 0
      src/api/system/menu/index.ts
  76. 42 0
      src/api/system/notice/index.ts
  77. 66 0
      src/api/system/notify/message/index.ts
  78. 55 0
      src/api/system/notify/template/index.ts
  79. 51 0
      src/api/system/oauth2/client.ts
  80. 28 0
      src/api/system/oauth2/token.ts
  81. 41 0
      src/api/system/operatelog/index.ts
  82. 42 0
      src/api/system/permission/index.ts
  83. 58 0
      src/api/system/post/index.ts
  84. 58 0
      src/api/system/role/index.ts
  85. 64 0
      src/api/system/sensitiveWord/index.ts
  86. 50 0
      src/api/system/sms/smsChannel/index.ts
  87. 57 0
      src/api/system/sms/smsLog/index.ts
  88. 80 0
      src/api/system/sms/smsTemplate/index.ts
  89. 62 0
      src/api/system/tenant/index.ts
  90. 49 0
      src/api/system/tenantPackage/index.ts
  91. 91 0
      src/api/system/user/index.ts
  92. 77 0
      src/api/system/user/profile.ts
  93. 31 0
      src/api/system/user/socialUser.ts
  94. BIN
      src/assets/imgs/avatar.gif
  95. BIN
      src/assets/imgs/avatar.jpg
  96. BIN
      src/assets/imgs/logo.png
  97. 0 0
      src/assets/svgs/403.svg
  98. 0 0
      src/assets/svgs/404.svg
  99. 0 0
      src/assets/svgs/500.svg
  100. 1 0
      src/assets/svgs/icon.svg

+ 12 - 0
.editorconfig

@@ -0,0 +1,12 @@
+root = true
+[*.{js,ts,vue}]
+charset = utf-8 # 设置文件字符集为 utf-8
+end_of_line = lf # 控制换行类型(lf | cr | crlf)
+insert_final_newline = true # 始终在文件末尾插入一个新行
+indent_style = space # 缩进风格(tab | space)
+indent_size = 2 # 缩进大小
+max_line_length = 100 # 最大行长度
+
+[*.md] # 仅 md 文件适用以下规则
+max_line_length = off # 关闭最大行长度限制
+trim_trailing_whitespace = false # 关闭末尾空格修剪

+ 15 - 0
.env

@@ -0,0 +1,15 @@
+# 标题
+VITE_APP_TITLE=芋道管理系统
+
+# 项目本地运行端口号
+VITE_PORT=80
+
+# open 运行 npm run dev 时自动打开浏览器
+VITE_OPEN=true
+
+# 租户开关
+VITE_APP_TENANT_ENABLE=true
+
+# 验证码的开关
+VITE_APP_CAPTCHA_ENABLE=true
+

+ 19 - 0
.env.base

@@ -0,0 +1,19 @@
+# 本地开发环境
+NODE_ENV=development
+
+VITE_DEV=true
+
+# 请求路径
+VITE_BASE_URL='http://localhost:48080'
+
+# 上传路径
+VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
+
+# 接口前缀
+VITE_API_BASEPATH=/dev-api
+
+# 接口地址
+VITE_API_URL=/admin-api
+
+# 打包路径
+VITE_BASE_PATH=/

+ 31 - 0
.env.dev

@@ -0,0 +1,31 @@
+# 开发环境
+NODE_ENV=production
+
+VITE_DEV=false
+
+# 请求路径
+VITE_BASE_URL='http://localhost:48080'
+
+# 上传路径
+VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
+
+# 接口前缀
+VITE_API_BASEPATH=/dev-api
+
+# 接口地址
+VITE_API_URL=/admin-api
+
+# 打包路径
+VITE_BASE_PATH=/dist-dev/
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=false
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=false
+
+# 是否sourcemap
+VITE_SOURCEMAP=true
+
+# 输出路径
+VITE_OUT_DIR=dist-dev

+ 31 - 0
.env.pro

@@ -0,0 +1,31 @@
+# 生产环境
+NODE_ENV=production
+
+VITE_DEV=false
+
+# 请求路径
+VITE_BASE_URL='http://localhost:48080'
+
+# 上传路径
+VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
+
+# 接口前缀
+VITE_API_BASEPATH=
+
+# 接口地址
+VITE_API_URL=/admin-api
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=true
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=true
+
+# 是否sourcemap
+VITE_SOURCEMAP=false
+
+# 打包路径
+VITE_BASE_PATH=/
+
+# 输出路径
+VITE_OUT_DIR=dist-pro

+ 31 - 0
.env.test

@@ -0,0 +1,31 @@
+# 测试环境
+NODE_ENV=production
+
+VITE_DEV=false
+
+# 请求路径
+VITE_BASE_URL='http://localhost:48080'
+
+# 上传路径
+VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
+
+# 接口前缀
+VITE_API_BASEPATH=
+
+# 接口地址
+VITE_API_URL=/admin-api
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=false
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=false
+
+# 是否sourcemap
+VITE_SOURCEMAP=true
+
+# 打包路径
+VITE_BASE_PATH=/dist-test/
+
+# 输出路径
+VITE_OUT_DIR=dist-test

+ 8 - 0
.eslintignore

@@ -0,0 +1,8 @@
+/build/
+/config/
+/dist/
+/*.js
+/test/unit/coverage/
+/node_modules/*
+/dist*
+/src/main.ts

+ 259 - 0
.eslintrc-auto-import.json

@@ -0,0 +1,259 @@
+{
+  "globals": {
+    "EffectScope": true,
+    "ElMessage": true,
+    "ElMessageBox": true,
+    "ElTag": true,
+    "asyncComputed": true,
+    "autoResetRef": true,
+    "computed": true,
+    "computedAsync": true,
+    "computedEager": true,
+    "computedInject": true,
+    "computedWithControl": true,
+    "controlledComputed": true,
+    "controlledRef": true,
+    "createApp": true,
+    "createEventHook": true,
+    "createGlobalState": true,
+    "createInjectionState": true,
+    "createReactiveFn": true,
+    "createSharedComposable": true,
+    "createUnrefFn": true,
+    "customRef": true,
+    "debouncedRef": true,
+    "debouncedWatch": true,
+    "defineAsyncComponent": true,
+    "defineComponent": true,
+    "eagerComputed": true,
+    "effectScope": true,
+    "extendRef": true,
+    "getCurrentInstance": true,
+    "getCurrentScope": true,
+    "h": true,
+    "ignorableWatch": true,
+    "inject": true,
+    "isDefined": true,
+    "isProxy": true,
+    "isReactive": true,
+    "isReadonly": true,
+    "isRef": true,
+    "makeDestructurable": true,
+    "markRaw": true,
+    "nextTick": true,
+    "onActivated": true,
+    "onBeforeMount": true,
+    "onBeforeUnmount": true,
+    "onBeforeUpdate": true,
+    "onClickOutside": true,
+    "onDeactivated": true,
+    "onErrorCaptured": true,
+    "onKeyStroke": true,
+    "onLongPress": true,
+    "onMounted": true,
+    "onRenderTracked": true,
+    "onRenderTriggered": true,
+    "onScopeDispose": true,
+    "onServerPrefetch": true,
+    "onStartTyping": true,
+    "onUnmounted": true,
+    "onUpdated": true,
+    "pausableWatch": true,
+    "provide": true,
+    "reactify": true,
+    "reactifyObject": true,
+    "reactive": true,
+    "reactiveComputed": true,
+    "reactiveOmit": true,
+    "reactivePick": true,
+    "readonly": true,
+    "ref": true,
+    "refAutoReset": true,
+    "refDebounced": true,
+    "refDefault": true,
+    "refThrottled": true,
+    "refWithControl": true,
+    "resolveComponent": true,
+    "resolveRef": true,
+    "resolveUnref": true,
+    "shallowReactive": true,
+    "shallowReadonly": true,
+    "shallowRef": true,
+    "syncRef": true,
+    "syncRefs": true,
+    "templateRef": true,
+    "throttledRef": true,
+    "throttledWatch": true,
+    "toRaw": true,
+    "toReactive": true,
+    "toRef": true,
+    "toRefs": true,
+    "triggerRef": true,
+    "tryOnBeforeMount": true,
+    "tryOnBeforeUnmount": true,
+    "tryOnMounted": true,
+    "tryOnScopeDispose": true,
+    "tryOnUnmounted": true,
+    "unref": true,
+    "unrefElement": true,
+    "until": true,
+    "useActiveElement": true,
+    "useArrayEvery": true,
+    "useArrayFilter": true,
+    "useArrayFind": true,
+    "useArrayFindIndex": true,
+    "useArrayJoin": true,
+    "useArrayMap": true,
+    "useArrayReduce": true,
+    "useArraySome": true,
+    "useAsyncQueue": true,
+    "useAsyncState": true,
+    "useAttrs": true,
+    "useBase64": true,
+    "useBattery": true,
+    "useBluetooth": true,
+    "useBreakpoints": true,
+    "useBroadcastChannel": true,
+    "useBrowserLocation": true,
+    "useCached": true,
+    "useClipboard": true,
+    "useColorMode": true,
+    "useConfirmDialog": true,
+    "useCounter": true,
+    "useCssModule": true,
+    "useCssVar": true,
+    "useCssVars": true,
+    "useCurrentElement": true,
+    "useCycleList": true,
+    "useDark": true,
+    "useDateFormat": true,
+    "useDebounce": true,
+    "useDebounceFn": true,
+    "useDebouncedRefHistory": true,
+    "useDeviceMotion": true,
+    "useDeviceOrientation": true,
+    "useDevicePixelRatio": true,
+    "useDevicesList": true,
+    "useDisplayMedia": true,
+    "useDocumentVisibility": true,
+    "useDraggable": true,
+    "useDropZone": true,
+    "useElementBounding": true,
+    "useElementByPoint": true,
+    "useElementHover": true,
+    "useElementSize": true,
+    "useElementVisibility": true,
+    "useEventBus": true,
+    "useEventListener": true,
+    "useEventSource": true,
+    "useEyeDropper": true,
+    "useFavicon": true,
+    "useFetch": true,
+    "useFileDialog": true,
+    "useFileSystemAccess": true,
+    "useFocus": true,
+    "useFocusWithin": true,
+    "useFps": true,
+    "useFullscreen": true,
+    "useGamepad": true,
+    "useGeolocation": true,
+    "useIdle": true,
+    "useImage": true,
+    "useInfiniteScroll": true,
+    "useIntersectionObserver": true,
+    "useInterval": true,
+    "useIntervalFn": true,
+    "useKeyModifier": true,
+    "useLastChanged": true,
+    "useLocalStorage": true,
+    "useMagicKeys": true,
+    "useManualRefHistory": true,
+    "useMediaControls": true,
+    "useMediaQuery": true,
+    "useMemoize": true,
+    "useMemory": true,
+    "useMounted": true,
+    "useMouse": true,
+    "useMouseInElement": true,
+    "useMousePressed": true,
+    "useMutationObserver": true,
+    "useNavigatorLanguage": true,
+    "useNetwork": true,
+    "useNow": true,
+    "useObjectUrl": true,
+    "useOffsetPagination": true,
+    "useOnline": true,
+    "usePageLeave": true,
+    "useParallax": true,
+    "usePermission": true,
+    "usePointer": true,
+    "usePointerSwipe": true,
+    "usePreferredColorScheme": true,
+    "usePreferredDark": true,
+    "usePreferredLanguages": true,
+    "useRafFn": true,
+    "useRefHistory": true,
+    "useResizeObserver": true,
+    "useRoute": true,
+    "useRouter": true,
+    "useScreenOrientation": true,
+    "useScreenSafeArea": true,
+    "useScriptTag": true,
+    "useScroll": true,
+    "useScrollLock": true,
+    "useSessionStorage": true,
+    "useShare": true,
+    "useSlots": true,
+    "useSpeechRecognition": true,
+    "useSpeechSynthesis": true,
+    "useStepper": true,
+    "useStorage": true,
+    "useStorageAsync": true,
+    "useStyleTag": true,
+    "useSupported": true,
+    "useSwipe": true,
+    "useTemplateRefsList": true,
+    "useTextDirection": true,
+    "useTextSelection": true,
+    "useTextareaAutosize": true,
+    "useThrottle": true,
+    "useThrottleFn": true,
+    "useThrottledRefHistory": true,
+    "useTimeAgo": true,
+    "useTimeout": true,
+    "useTimeoutFn": true,
+    "useTimeoutPoll": true,
+    "useTimestamp": true,
+    "useTitle": true,
+    "useToggle": true,
+    "useTransition": true,
+    "useUrlSearchParams": true,
+    "useUserMedia": true,
+    "useVModel": true,
+    "useVModels": true,
+    "useVibrate": true,
+    "useVirtualList": true,
+    "useWakeLock": true,
+    "useWebNotification": true,
+    "useWebSocket": true,
+    "useWebWorker": true,
+    "useWebWorkerFn": true,
+    "useWindowFocus": true,
+    "useWindowScroll": true,
+    "useWindowSize": true,
+    "watch": true,
+    "watchArray": true,
+    "watchAtMost": true,
+    "watchDebounced": true,
+    "watchEffect": true,
+    "watchIgnorable": true,
+    "watchOnce": true,
+    "watchPausable": true,
+    "watchPostEffect": true,
+    "watchSyncEffect": true,
+    "watchThrottled": true,
+    "watchTriggerable": true,
+    "watchWithFilter": true,
+    "whenever": true
+  }
+}

+ 69 - 0
.eslintrc.js

@@ -0,0 +1,69 @@
+// @ts-check
+const { defineConfig } = require('eslint-define-config')
+module.exports = defineConfig({
+  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',
+    'prettier',
+    'plugin:prettier/recommended',
+    './.eslintrc-auto-import.json'
+  ],
+  rules: {
+    'vue/script-setup-uses-vars': 'error',
+    'vue/no-reserved-component-names': 'off',
+    '@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',
+    'no-unused-vars': 'error',
+    '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'
+  }
+})

+ 8 - 0
.gitignore

@@ -0,0 +1,8 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+/dist*
+*-lock.*
+pnpm-debug

+ 9 - 0
.prettierignore

@@ -0,0 +1,9 @@
+/node_modules/**
+/dist/
+/dist*
+/public/*
+/docs/*
+/vite.config.ts
+/src/types/env.d.ts
+/docs/**/*
+CHANGELOG

+ 6 - 0
.stylelintignore

@@ -0,0 +1,6 @@
+/dist/*
+/public/*
+public/*
+/dist*
+/src/types/env.d.ts
+/docs/**/*

+ 15 - 0
.vscode/extensions.json

@@ -0,0 +1,15 @@
+{
+  "recommendations": [
+    "voorjaar.windicss-intellisense",
+    "vscode-icons-team.vscode-icons",
+    "davidanson.vscode-markdownlint",
+    "stylelint.vscode-stylelint",
+    "dbaeumer.vscode-eslint",
+    "esbenp.prettier-vscode",
+    "vue.volar",
+    "lokalise.i18n-ally",
+    "mikestead.dotenv",
+    "eamodio.gitlens",
+    "antfu.iconify"
+  ]
+}

+ 44 - 0
.vscode/settings.json

@@ -0,0 +1,44 @@
+{
+  "typescript.tsdk": "node_modules/typescript/lib",
+  "prettier.enable": true,
+  "editor.formatOnType": true,
+  "editor.formatOnSave": true,
+  "editor.formatOnPaste": true,
+  "editor.codeActionsOnSave": {
+    "source.fixAll.eslint": true
+  },
+  "[vue]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[javascript]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[typescript]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[json]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[jsonc]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[html]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[css]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[scss]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "i18n-ally.localesPaths": ["src/locales"],
+  "i18n-ally.keystyle": "nested",
+  "i18n-ally.sortKeys": true,
+  "i18n-ally.namespace": true,
+  "i18n-ally.enabledParsers": ["ts"],
+  "i18n-ally.sourceLanguage": "en",
+  "i18n-ally.displayLanguage": "zh-CN",
+  "i18n-ally.enabledFrameworks": ["vue", "react"],
+  "god.tsconfig": "./tsconfig.json",
+  "vue-i18n.i18nPaths": "src/locales"
+}

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021-present Archer
+
+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.

+ 0 - 36
README.en.md

@@ -1,36 +0,0 @@
-# yudao-ui-admin-vue3
-
-#### Description
-芋道管理后台,基于 Vue3 + Element Plus 实现,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城等功能。
-
-#### Software Architecture
-Software architecture description
-
-#### Installation
-
-1.  xxxx
-2.  xxxx
-3.  xxxx
-
-#### Instructions
-
-1.  xxxx
-2.  xxxx
-3.  xxxx
-
-#### Contribution
-
-1.  Fork the repository
-2.  Create Feat_xxx branch
-3.  Commit your code
-4.  Create Pull Request
-
-
-#### Gitee Feature
-
-1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
-2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
-3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
-4.  The most valuable open source project [GVP](https://gitee.com/gvp)
-5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
-6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 219 - 25
README.md

@@ -1,37 +1,231 @@
-# yudao-ui-admin-vue3
+**严肃声明:现在、未来都不会有商业版本,所有代码全部开源!!**
 
-#### 介绍
-芋道管理后台,基于 Vue3 + Element Plus 实现,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城等功能。
+**「我喜欢写代码,乐此不疲」**  
+**「我喜欢做开源,以此为乐」**
 
-#### 软件架构
-软件架构说明
+我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献。
 
+如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
 
-#### 安装教程
+## 🐶 新手必读
 
-1.  xxxx
-2.  xxxx
-3.  xxxx
+* 演示地址:<http://dashboard.yudao.iocoder.cn>
+* 启动文档:<https://doc.iocoder.cn/quick-start/>
+* 视频教程:<https://doc.iocoder.cn/video/>
 
-#### 使用说明
+## 🐯 平台简介
 
-1.  xxxx
-2.  xxxx
-3.  xxxx
+**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。
 
-#### 参与贡献
+基于 [vue-element-plus-admin](https://gitee.com/kailong110120130/vue-element-plus-admin) 实现,使用 Element Plus 免费开源的中后台模版,具备如下特性:
 
-1.  Fork 本仓库
-2.  新建 Feat_xxx 分支
-3.  提交代码
-4.  新建 Pull Request
+TODO
 
+* 最新技术栈:使用 Vue3、Vite4 等前端前沿技术开发
+* TypeScript: 应用程序级 JavaScript 的语言
+* 主题: 可配置的主题
+* 国际化:内置完善的国际化方案
+* 权限:内置完善的动态路由权限生成方案
+* 组件:二次封装了多个常用的组件
+* 示例:内置丰富的示例
 
-#### 特技
+## 技术栈
 
-1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
-2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
-3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
-4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
-5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
-6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
+| 框架                                                                   | 说明               | 版本     |
+|----------------------------------------------------------------------|------------------|--------|
+| [Vue](https://staging-cn.vuejs.org/)                                 | vue 框架           | 3.2.47 |
+| [Vite](https://cn.vitejs.dev//)                                      | 开发与构建工具          | 4.1.1  |
+| [Element Plus](https://element-plus.org/zh-CN/)                      | Element Plus     | 2.2.29 |
+| [TypeScript](https://www.typescriptlang.org/docs/)                   | JavaScript 的超集   | 4.9.5  |
+| [pinia](https://pinia.vuejs.org/)                                    | Vue 存储库 替代 vuex5 | 2.0.30 |
+| [vueuse](https://vueuse.org/)                                        | 常用工具集            | 9.12.0 |
+| [vxe-table](https://vxetable.cn/)                                    | vue 最强表单         | 4.3.9  |
+| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化              | 9.2.2  |
+| [vue-router](https://router.vuejs.org/)                              | vue 路由           | 4.1.6  |
+| [windicss](https://cn.windicss.org/)                                 | 下一代工具优先的 CSS 框架  | 3.5.6  |
+| [iconify](https://icon-sets.iconify.design/)                         | 在线图标库            | 3.0.1  |
+| [wangeditor](https://www.wangeditor.com/)                            | 富文本编辑器           | 5.1.23 |
+
+## 开发工具
+
+推荐 VS Code 开发,配合插件如下:
+
+| 插件名                           | 功能                       |
+|-------------------------------|--------------------------|
+| TypeScript Vue Plugin (Volar) | 用于 TypeScript 的 Vue 插件   |
+| Vue Language Features (Volar) | Vue3.0 语法支持              |
+| WindiCSS IntelliSense         | 自动完成、语法突出显示、代码折叠和构建等高级功能 |
+| Iconify IntelliSense          | Iconify 预览和搜索            |
+| i18n Ally                     | 国际化智能提示                  |
+| Stylelint                     | Css    格式化               |
+| Prettier                      | 代码格式化                    |
+| ESLint                        | 脚本代码检查                   |
+| DotENV                        | env 文件高亮                 |
+
+## 内置功能
+
+系统内置多种多种业务功能,可以用于快速你的业务系统:
+
+* 系统功能
+* 基础设施
+* 工作流程
+* 支付系统
+* 会员中心
+* 数据报表
+* 商城系统
+* 微信公众号
+
+### 系统功能
+
+|     | 功能    | 描述                              |
+|-----|-------|---------------------------------|
+|     | 用户管理  | 用户是系统操作者,该功能主要完成系统用户配置          |
+| ⭐️  | 在线用户  | 当前系统中活跃用户状态监控,支持手动踢下线           |
+|     | 角色管理  | 角色菜单权限分配、设置角色按机构进行数据范围权限划分      |
+|     | 菜单管理  | 配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能    |
+|     | 部门管理  | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限  |
+|     | 岗位管理  | 配置系统用户所属担任职务                    |
+| 🚀  | 租户管理  | 配置系统租户,支持 SaaS 场景下的多租户功能        |
+| 🚀  | 租户套餐  | 配置租户套餐,自定每个租户的菜单、操作、按钮的权限       |
+|     | 字典管理  | 对系统中经常使用的一些较为固定的数据进行维护          |
+| 🚀  | 短信管理  | 短信渠道、短息模板、短信日志,对接阿里云、腾讯云等主流短信平台 |
+| 🚀  | 邮件管理  | 邮箱账号、邮件模版、邮件发送日志,支持所有邮件平台       |
+| 🚀  | 站内信   | 系统内的消息通知,提供站内信模版、站内信消息          |
+| 🚀  | 操作日志  | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 |
+| ⭐️  | 登录日志  | 系统登录日志记录查询,包含登录异常               |
+| 🚀  | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务     |
+|     | 通知公告  | 系统通知公告信息发布维护                    |
+| 🚀  | 敏感词   | 配置系统敏感词,支持标签分组                  |
+| 🚀  | 应用管理  | 管理 SSO 单点登录的应用,支持多种 OAuth2 授权方式 |
+| 🚀  | 地区管理  | 展示省份、城市、区镇等城市信息,支持 IP 对应城市      |
+
+### 工作流程
+
+|     | 功能    | 描述                                     |
+|-----|-------|----------------------------------------|
+| 🚀  | 流程模型  | 配置工作流的流程模型,支持文件导入与在线设计流程图,提供 7 种任务分配规则 |
+| 🚀  | 流程表单  | 拖动表单元素生成相应的工作流表单,覆盖 Element UI 所有的表单组件 |
+| 🚀  | 用户分组  | 自定义用户分组,可用于工作流的审批分组                    |
+| 🚀  | 我的流程  | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线    |
+| 🚀  | 待办任务  | 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作    |
+| 🚀  | 已办任务  | 查看自己【已】审批的工作任务,未来会支持回退操作               |
+| 🚀  | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 |
+
+### 支付系统
+
+|     | 功能   | 描述                        |
+|-----|------|---------------------------|
+| 🚀  | 商户信息 | 管理商户信息,支持 Saas 场景下的多商户功能  |
+| 🚀  | 应用信息 | 配置商户的应用信息,对接支付宝、微信等多个支付渠道 |
+| 🚀  | 支付订单 | 查看用户发起的支付宝、微信等的【支付】订单     |
+| 🚀  | 退款订单 | 查看用户发起的支付宝、微信等的【退款】订单     |
+
+ps:核心功能已经实现,正在对接微信小程序中...
+
+### 基础设施
+
+|     | 功能       | 描述                                           |
+|-----|----------|----------------------------------------------|
+| 🚀  | 代码生成     | 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载       |
+| 🚀  | 系统接口     | 基于 Swagger 自动生成相关的 RESTful API 接口文档          |
+| 🚀  | 数据库文档    | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式      |
+|     | 表单构建     | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件         |
+| 🚀  | 配置管理     | 对系统动态配置常用参数,支持 SpringBoot 加载                 |
+| ⭐️  | 定时任务     | 在线(添加、修改、删除)任务调度包含执行结果日志                     |
+| 🚀  | 文件服务     | 支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等   | 
+| 🚀  | API 日志   | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题   |
+|     | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈              |
+|     | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理           |
+| 🚀  | 消息队列     | 基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费 |
+| 🚀  | Java 监控  | 基于 Spring Boot Admin 实现 Java 应用的监控           |
+| 🚀  | 链路追踪     | 接入 SkyWalking 组件,实现链路追踪                      |
+| 🚀  | 日志中心     | 接入 SkyWalking 组件,实现日志中心                      |
+| 🚀  | 分布式锁     | 基于 Redis 实现分布式锁,满足并发场景                       |
+| 🚀  | 幂等组件     | 基于 Redis 实现幂等组件,解决重复请求问题                     |
+| 🚀  | 服务保障     | 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能          |
+| 🚀  | 日志服务     | 轻量级日志中心,查看远程服务器的日志                           |
+| 🚀  | 单元测试     | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等    |
+
+### 数据报表
+
+|     | 功能    | 描述                 |
+|-----|-------|--------------------|
+| 🚀  | 报表设计器 | 支持数据报表、图形报表、打印设计等  |
+| 🚀  | 大屏设计器 | 拖拽生成数据大屏,内置几十种图表组件 |
+
+### 微信公众号
+
+|     | 功能     | 描述                            |
+|-----|--------|-------------------------------|
+| 🚀  | 账号管理   | 配置接入的微信公众号,可支持多个公众号           |
+| 🚀  | 数据统计   | 统计公众号的用户增减、累计用户、消息概况、接口分析等数据  |
+| 🚀  | 粉丝管理   | 查看已关注、取关的粉丝列表,可对粉丝进行同步、打标签等操作 |
+| 🚀  | 消息管理   | 查看粉丝发送的消息列表,可主动回复粉丝消息         |
+| 🚀  | 自动回复   | 自动回复粉丝发送的消息,支持关注回复、消息回复、关键字回复 |
+| 🚀  | 标签管理   | 对公众号的标签进行创建、查询、修改、删除等操作       |
+| 🚀  | 菜单管理   | 自定义公众号的菜单,也可以从公众号同步菜单         |
+| 🚀  | 素材管理   | 管理公众号的图片、语音、视频等素材,支持在线播放语音、视频 |
+| 🚀  | 图文草稿箱  | 新增常用的图文素材到草稿箱,可发布到公众号         |
+| 🚀  | 图文发表记录 | 查看已发布成功的图文素材,支持删除操作           |
+
+### 商城系统
+
+建设中...
+
+![功能图](http://static.iocoder.cn/mall%20%E5%8A%9F%E8%83%BD%E5%9B%BE-min.png)
+
+![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-admin-min.gif)
+
+![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-h5-min.gif)
+
+## 🐷 演示图
+
+### 系统功能
+
+| 模块       | biu                                                                | biu                                                              | biu                                                              |
+|------------|--------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------|
+| 登录 & 首页  | ![登录](https://static.iocoder.cn/images/ruoyi-vue-pro/登录.jpg?imageView2/2/format/webp/w/1280)       | ![首页](https://static.iocoder.cn/images/ruoyi-vue-pro/首页.jpg?imageView2/2/format/webp/w/1280)     | ![个人中心](https://static.iocoder.cn/images/ruoyi-vue-pro/个人中心.jpg?imageView2/2/format/webp/w/1280) |
+| 用户 & 应用  | ![用户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/用户管理.jpg?imageView2/2/format/webp/w/1280)   | ![令牌管理](https://static.iocoder.cn/images/ruoyi-vue-pro/令牌管理.jpg?imageView2/2/format/webp/w/1280) | ![应用管理](https://static.iocoder.cn/images/ruoyi-vue-pro/应用管理.jpg?imageView2/2/format/webp/w/1280)                                                                |
+| 租户 & 套餐  | ![租户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/租户管理.jpg?imageView2/2/format/webp/w/1280)   | ![租户套餐](https://static.iocoder.cn/images/ruoyi-vue-pro/租户套餐.png) | -                                                                |
+| 部门 & 岗位  | ![部门管理](https://static.iocoder.cn/images/ruoyi-vue-pro/部门管理.jpg?imageView2/2/format/webp/w/1280)   | ![岗位管理](https://static.iocoder.cn/images/ruoyi-vue-pro/岗位管理.jpg?imageView2/2/format/webp/w/1280) | -                                                                |
+| 菜单 & 角色  | ![菜单管理](https://static.iocoder.cn/images/ruoyi-vue-pro/菜单管理.jpg?imageView2/2/format/webp/w/1280)   | ![角色管理](https://static.iocoder.cn/images/ruoyi-vue-pro/角色管理.jpg?imageView2/2/format/webp/w/1280) | -                                                                |
+| 审计日志     | ![操作日志](https://static.iocoder.cn/images/ruoyi-vue-pro/操作日志.jpg?imageView2/2/format/webp/w/1280)   | ![登录日志](https://static.iocoder.cn/images/ruoyi-vue-pro/登录日志.jpg?imageView2/2/format/webp/w/1280) | -                                                                |
+| 短信       | ![短信渠道](https://static.iocoder.cn/images/ruoyi-vue-pro/短信渠道.jpg?imageView2/2/format/webp/w/1280)   | ![短信模板](https://static.iocoder.cn/images/ruoyi-vue-pro/短信模板.jpg?imageView2/2/format/webp/w/1280) | ![短信日志](https://static.iocoder.cn/images/ruoyi-vue-pro/短信日志.jpg?imageView2/2/format/webp/w/1280) |
+| 字典 & 敏感词 | ![字典类型](https://static.iocoder.cn/images/ruoyi-vue-pro/字典类型.jpg?imageView2/2/format/webp/w/1280)   | ![字典数据](https://static.iocoder.cn/images/ruoyi-vue-pro/字典数据.jpg?imageView2/2/format/webp/w/1280) | ![敏感词](https://static.iocoder.cn/images/ruoyi-vue-pro/敏感词.jpg?imageView2/2/format/webp/w/1280)                                                                |
+| 错误码 & 通知 | ![错误码管理](https://static.iocoder.cn/images/ruoyi-vue-pro/错误码管理.jpg?imageView2/2/format/webp/w/1280) | ![通知公告](https://static.iocoder.cn/images/ruoyi-vue-pro/通知公告.jpg?imageView2/2/format/webp/w/1280) | -                                                                |
+
+### 工作流程
+
+| 模块      | biu                                                                    | biu                                                                    | biu                                                                    |
+|---------|------------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|
+| 流程模型    | ![流程模型-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-列表.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-设计](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-设计.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-定义](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-定义.jpg?imageView2/2/format/webp/w/1280) |
+| 表单 & 分组 | ![流程表单](https://static.iocoder.cn/images/ruoyi-vue-pro/流程表单.jpg?imageView2/2/format/webp/w/1280)       | ![用户分组](https://static.iocoder.cn/images/ruoyi-vue-pro/用户分组.jpg?imageView2/2/format/webp/w/1280)       | -                                                                      |
+| 我的流程    | ![我的流程-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-列表.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-发起.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-详情.jpg?imageView2/2/format/webp/w/1280) |
+| 待办 & 已办 | ![任务列表-审批](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-审批.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-待办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-待办.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-已办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-已办.jpg?imageView2/2/format/webp/w/1280) |
+| OA 请假   | ![OA请假-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-列表.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-发起.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-详情.jpg?imageView2/2/format/webp/w/1280) |
+
+### 基础设施
+
+| 模块            | biu                                                                  | biu                                                                | biu                                                              |
+|---------------|----------------------------------------------------------------------|--------------------------------------------------------------------|------------------------------------------------------------------|
+| 代码生成          | ![代码生成](https://static.iocoder.cn/images/ruoyi-vue-pro/代码生成.jpg?imageView2/2/format/webp/w/1280)     | ![生成效果](https://static.iocoder.cn/images/ruoyi-vue-pro/生成效果.jpg?imageView2/2/format/webp/w/1280)   | -                                                                |
+| 文档            | ![系统接口](https://static.iocoder.cn/images/ruoyi-vue-pro/系统接口.jpg?imageView2/2/format/webp/w/1280)     | ![数据库文档](https://static.iocoder.cn/images/ruoyi-vue-pro/数据库文档.jpg?imageView2/2/format/webp/w/1280) | -                                                                |
+| 文件 & 配置       | ![文件配置](https://static.iocoder.cn/images/ruoyi-vue-pro/文件配置.jpg?imageView2/2/format/webp/w/1280) | ![文件管理](https://static.iocoder.cn/images/ruoyi-vue-pro/文件管理2.jpg?imageView2/2/format/webp/w/1280)     | ![配置管理](https://static.iocoder.cn/images/ruoyi-vue-pro/配置管理.jpg?imageView2/2/format/webp/w/1280)   |
+| 定时任务          | ![定时任务](https://static.iocoder.cn/images/ruoyi-vue-pro/定时任务.jpg?imageView2/2/format/webp/w/1280)     | ![任务日志](https://static.iocoder.cn/images/ruoyi-vue-pro/任务日志.jpg?imageView2/2/format/webp/w/1280)   | -                                                                |
+| API 日志        | ![访问日志](https://static.iocoder.cn/images/ruoyi-vue-pro/访问日志.jpg?imageView2/2/format/webp/w/1280)     | ![错误日志](https://static.iocoder.cn/images/ruoyi-vue-pro/错误日志.jpg?imageView2/2/format/webp/w/1280)   | -                                                                |
+| MySQL & Redis | ![MySQL](https://static.iocoder.cn/images/ruoyi-vue-pro/MySQL.jpg?imageView2/2/format/webp/w/1280)   | ![Redis](https://static.iocoder.cn/images/ruoyi-vue-pro/Redis.jpg?imageView2/2/format/webp/w/1280) | -                                                                |
+| 监控平台          | ![Java监控](https://static.iocoder.cn/images/ruoyi-vue-pro/Java监控.jpg?imageView2/2/format/webp/w/1280) | ![链路追踪](https://static.iocoder.cn/images/ruoyi-vue-pro/链路追踪.jpg?imageView2/2/format/webp/w/1280)   | ![日志中心](https://static.iocoder.cn/images/ruoyi-vue-pro/日志中心.jpg?imageView2/2/format/webp/w/1280) |
+
+### 支付系统
+
+| 模块      | biu                                                              | biu                                                                    | biu                                                                    |
+|---------|------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|
+| 商家 & 应用 | ![商户信息](https://static.iocoder.cn/images/ruoyi-vue-pro/商户信息.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-列表.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-编辑.jpg?imageView2/2/format/webp/w/1280) |
+| 支付 & 退款 | ![支付订单](https://static.iocoder.cn/images/ruoyi-vue-pro/支付订单.jpg?imageView2/2/format/webp/w/1280) | ![退款订单](https://static.iocoder.cn/images/ruoyi-vue-pro/退款订单.jpg?imageView2/2/format/webp/w/1280)       | ---                                                                    |
+
+### 数据报表
+
+| 模块    | biu                                                                                                    | biu                                                                                                    | biu                                                                                                          |
+|-------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
+| 报表设计器 | ![数据报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-数据报表.jpg?imageView2/2/format/webp/w/1280) | ![图形报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-图形报表.jpg?imageView2/2/format/webp/w/1280) | ![报表设计器-打印设计](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-打印设计.jpg?imageView2/2/format/webp/w/1280) |
+| 大屏设计器 | ![大屏列表](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-列表.jpg?imageView2/2/format/webp/w/1280)   | ![大屏预览](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-预览.jpg?imageView2/2/format/webp/w/1280)   | ![大屏编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-编辑.jpg?imageView2/2/format/webp/w/1280)         |

+ 98 - 0
build/vite/index.ts

@@ -0,0 +1,98 @@
+import { resolve } from 'path'
+import Vue from '@vitejs/plugin-vue'
+import VueJsx from '@vitejs/plugin-vue-jsx'
+import WindiCSS from 'vite-plugin-windicss'
+import progress from 'vite-plugin-progress'
+import EslintPlugin from 'vite-plugin-eslint'
+import PurgeIcons from 'vite-plugin-purge-icons'
+import { ViteEjsPlugin } from 'vite-plugin-ejs'
+import ElementPlus from 'unplugin-element-plus/vite'
+import AutoImport from 'unplugin-auto-import/vite'
+import Components from 'unplugin-vue-components/vite'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+import viteCompression from 'vite-plugin-compression'
+import vueSetupExtend from 'vite-plugin-vue-setup-extend'
+import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
+export function createVitePlugins(VITE_APP_TITLE: string) {
+  const root = process.cwd()
+  // 路径查找
+  function pathResolve(dir: string) {
+    return resolve(root, '.', dir)
+  }
+  return [
+    Vue(),
+    VueJsx(),
+    WindiCSS(),
+    progress(),
+    PurgeIcons(),
+    vueSetupExtend(),
+    ElementPlus(),
+    AutoImport({
+      include: [
+        /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx
+        /\.vue$/,
+        /\.vue\?vue/, // .vue
+        /\.md$/ // .md
+      ],
+      imports: [
+        'vue',
+        'vue-router',
+        {
+          '@/hooks/web/useI18n': ['useI18n'],
+          '@/hooks/web/useXTable': ['useXTable'],
+          '@/hooks/web/useMessage': ['useMessage'],
+          '@/hooks/web/useVxeCrudSchemas': ['useVxeCrudSchemas'],
+          '@/utils/formRules': ['required'],
+          '@/utils/dict': ['DICT_TYPE']
+        }
+      ],
+      dts: 'src/types/auto-imports.d.ts',
+      resolvers: [ElementPlusResolver()],
+      eslintrc: {
+        enabled: false, // Default `false`
+        filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json`
+        globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable')
+      }
+    }),
+    Components({
+      // 要搜索组件的目录的相对路径
+      dirs: ['src/components'],
+      // 组件的有效文件扩展名
+      extensions: ['vue', 'md'],
+      // 搜索子目录
+      deep: true,
+      include: [/\.vue$/, /\.vue\?vue/],
+      // 生成自定义 `auto-components.d.ts` 全局声明
+      dts: 'src/types/auto-components.d.ts',
+      // 自定义组件的解析器
+      resolvers: [ElementPlusResolver()],
+      exclude: [/[\\/]node_modules[\\/]/]
+    }),
+    EslintPlugin({
+      cache: false,
+      include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查的文件
+    }),
+    VueI18nPlugin({
+      runtimeOnly: true,
+      compositionOnly: true,
+      include: [resolve(__dirname, 'src/locales/**')]
+    }),
+    createSvgIconsPlugin({
+      iconDirs: [pathResolve('src/assets/svgs')],
+      symbolId: 'icon-[dir]-[name]',
+      svgoOptions: true
+    }),
+    viteCompression({
+      verbose: true, // 是否在控制台输出压缩结果
+      disable: false, // 是否禁用
+      threshold: 10240, // 体积大于 threshold 才会被压缩,单位 b
+      algorithm: 'gzip', // 压缩算法,可选 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
+      ext: '.gz', // 生成的压缩包后缀
+      deleteOriginFile: false //压缩后是否删除源文件
+    }),
+    ViteEjsPlugin({
+      title: VITE_APP_TITLE
+    })
+  ]
+}

+ 68 - 0
build/vite/optimize.ts

@@ -0,0 +1,68 @@
+const include = [
+  'qs',
+  'url',
+  'vue',
+  'sass',
+  'mitt',
+  'axios',
+  'pinia',
+  'dayjs',
+  'qrcode',
+  'windicss',
+  'vue-router',
+  'vue-types',
+  'vue-i18n',
+  'xe-utils',
+  'crypto-js',
+  'cropperjs',
+  'lodash-es',
+  'vxe-table',
+  'nprogress',
+  'animate.css',
+  'vxe-table/es/style',
+  'web-storage-cache',
+  '@iconify/iconify',
+  '@vueuse/core',
+  '@zxcvbn-ts/core',
+  'echarts/core',
+  'echarts/charts',
+  'echarts/components',
+  'echarts/renderers',
+  'echarts-wordcloud',
+  '@wangeditor/editor',
+  '@wangeditor/editor-for-vue',
+  'element-plus',
+  'element-plus/es',
+  'element-plus/es/locale/lang/zh-cn',
+  'element-plus/es/locale/lang/en',
+  'element-plus/es/components/form/style/index',
+  'element-plus/es/components/radio-group/style/index',
+  'element-plus/es/components/radio/style/index',
+  'element-plus/es/components/checkbox/style/index',
+  'element-plus/es/components/checkbox-group/style/index',
+  'element-plus/es/components/switch/style/index',
+  'element-plus/es/components/time-picker/style/index',
+  'element-plus/es/components/date-picker/style/index',
+  'element-plus/es/components/col/style/index',
+  'element-plus/es/components/form-item/style/index',
+  'element-plus/es/components/alert/style/index',
+  'element-plus/es/components/breadcrumb/style/index',
+  'element-plus/es/components/select/style/index',
+  'element-plus/es/components/input/style/index',
+  'element-plus/es/components/breadcrumb-item/style/index',
+  'element-plus/es/components/tag/style/index',
+  'element-plus/es/components/pagination/style/index',
+  'element-plus/es/components/table/style/index',
+  'element-plus/es/components/table-column/style/index',
+  'element-plus/es/components/card/style/index',
+  'element-plus/es/components/row/style/index',
+  'element-plus/es/components/button/style/index',
+  'element-plus/es/components/menu/style/index',
+  'element-plus/es/components/sub-menu/style/index',
+  'element-plus/es/components/menu-item/style/index',
+  'element-plus/es/components/option/style/index'
+]
+
+const exclude = ['@iconify/json']
+
+export { include, exclude }

+ 151 - 0
index.html

@@ -0,0 +1,151 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" href="/favicon.ico" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <meta
+      name="keywords"
+      content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
+    />
+    <meta
+      name="description"
+      content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
+    />
+    <title><%= title %></title>
+  </head>
+  <body>
+    <div id="app">
+      <style>
+        .app-loading {
+          display: flex;
+          width: 100%;
+          height: 100%;
+          justify-content: center;
+          align-items: center;
+          flex-direction: column;
+          background: #f0f2f5;
+        }
+
+        .app-loading .app-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;
+        }
+
+        .app-loading .app-loading-title {
+          margin-bottom: 30px;
+          font-size: 20px;
+          font-weight: bold;
+          text-align: center;
+        }
+
+        .app-loading .app-loading-logo {
+          width: 100px;
+          margin: 0 auto 15px auto;
+        }
+
+        .app-loading .app-loading-item {
+          position: relative;
+          display: inline-block;
+          width: 60px;
+          height: 60px;
+          vertical-align: middle;
+          border-radius: 50%;
+        }
+
+        .app-loading .app-loading-outter {
+          position: absolute;
+          width: 100%;
+          height: 100%;
+          border: 4px solid #2d8cf0;
+          border-bottom: 0;
+          border-left-color: transparent;
+          border-radius: 50%;
+          animation: loader-outter 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
+        }
+
+        .app-loading .app-loading-inner {
+          position: absolute;
+          top: calc(50% - 20px);
+          left: calc(50% - 20px);
+          width: 40px;
+          height: 40px;
+          border: 4px solid #87bdff;
+          border-right: 0;
+          border-top-color: transparent;
+          border-radius: 50%;
+          animation: loader-inner 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
+        }
+
+        @-webkit-keyframes loader-outter {
+          0% {
+            -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+          }
+        }
+
+        @keyframes loader-outter {
+          0% {
+            -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+          }
+        }
+
+        @-webkit-keyframes loader-inner {
+          0% {
+            -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            -webkit-transform: rotate(-360deg);
+            transform: rotate(-360deg);
+          }
+        }
+
+        @keyframes loader-inner {
+          0% {
+            -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            -webkit-transform: rotate(-360deg);
+            transform: rotate(-360deg);
+          }
+        }
+      </style>
+      <div class="app-loading">
+        <div class="app-loading-wrap">
+          <div class="app-loading-title">
+            <img src="/logo.gif" class="app-loading-logo" alt="Logo" />
+            <div class="app-loading-title"><%= title %></div>
+          </div>
+          <div class="app-loading-item">
+            <div class="app-loading-outter"></div>
+            <div class="app-loading-inner"></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

+ 137 - 0
package.json

@@ -0,0 +1,137 @@
+{
+  "name": "yudao-ui-admin-vue3",
+  "version": "1.7.0-snapshot.1922",
+  "description": "基于vue3、vite4、element-plus、typesScript",
+  "author": "xingyu",
+  "private": false,
+  "scripts": {
+    "i": "pnpm install",
+    "dev": "vite --mode base",
+    "ts:check": "vue-tsc --noEmit",
+    "build:pro": "vite build --mode pro",
+    "build:dev": "vite build --mode dev",
+    "build:test": "npm run ts:check && vite build --mode test",
+    "serve:pro": "vite preview --mode pro",
+    "serve:dev": "vite preview --mode dev",
+    "serve:test": "vite preview --mode test",
+    "npm:check": "npx npm-check-updates",
+    "clean": "npx rimraf node_modules",
+    "clean:cache": "npx rimraf node_modules/.cache",
+    "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src",
+    "lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"",
+    "lint:style": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
+    "lint:lint-staged": "lint-staged -c ",
+    "lint:pretty": "pretty-quick --staged"
+  },
+  "dependencies": {
+    "@form-create/designer": "^3.1.0",
+    "@form-create/element-ui": "^3.1.17",
+    "@iconify/iconify": "^3.1.0",
+    "@vueuse/core": "^9.12.0",
+    "@wangeditor/editor": "^5.1.23",
+    "@wangeditor/editor-for-vue": "^5.1.10",
+    "@zxcvbn-ts/core": "^2.2.1",
+    "animate.css": "^4.1.1",
+    "axios": "^1.3.2",
+    "bpmn-js-token-simulation": "^0.10.0",
+    "camunda-bpmn-moddle": "^7.0.1",
+    "cropperjs": "^1.5.13",
+    "crypto-js": "^4.1.1",
+    "dayjs": "^1.11.7",
+    "diagram-js": "^11.6.0",
+    "echarts": "^5.4.1",
+    "echarts-wordcloud": "^2.1.0",
+    "element-plus": "2.2.29",
+    "fast-xml-parser": "^4.0.13",
+    "highlight.js": "^11.7.0",
+    "intro.js": "^6.0.0",
+    "jsencrypt": "^3.3.1",
+    "lodash-es": "^4.17.21",
+    "min-dash": "^4.0.0",
+    "mitt": "^3.0.0",
+    "nprogress": "^0.2.0",
+    "pinia": "^2.0.30",
+    "qrcode": "^1.5.1",
+    "qs": "^6.11.0",
+    "steady-xml": "^0.1.0",
+    "url": "^0.11.0",
+    "vue": "3.2.47",
+    "vue-i18n": "9.2.2",
+    "vue-router": "^4.1.6",
+    "vue-types": "^5.0.2",
+    "vuedraggable": "^4.1.0",
+    "vxe-table": "^4.3.9",
+    "web-storage-cache": "^1.1.1",
+    "xe-utils": "^3.5.7",
+    "xml-js": "^1.6.11"
+  },
+  "devDependencies": {
+    "@commitlint/cli": "^17.4.2",
+    "@commitlint/config-conventional": "^17.4.2",
+    "@iconify/json": "^2.2.19",
+    "@intlify/unplugin-vue-i18n": "^0.8.2",
+    "@purge-icons/generated": "^0.9.0",
+    "@types/intro.js": "^5.1.0",
+    "@types/lodash-es": "^4.17.6",
+    "@types/node": "^18.13.0",
+    "@types/nprogress": "^0.2.0",
+    "@types/qrcode": "^1.5.0",
+    "@types/qs": "^6.9.7",
+    "@typescript-eslint/eslint-plugin": "^5.51.0",
+    "@typescript-eslint/parser": "^5.51.0",
+    "@vitejs/plugin-legacy": "^4.0.1",
+    "@vitejs/plugin-vue": "^4.0.0",
+    "@vitejs/plugin-vue-jsx": "^3.0.0",
+    "autoprefixer": "^10.4.13",
+    "bpmn-js": "^8.9.0",
+    "bpmn-js-properties-panel": "^0.46.0",
+    "consola": "^2.15.3",
+    "eslint": "^8.33.0",
+    "eslint-config-prettier": "^8.6.0",
+    "eslint-define-config": "^1.15.0",
+    "eslint-plugin-prettier": "^4.2.1",
+    "eslint-plugin-vue": "^9.9.0",
+    "lint-staged": "^13.1.1",
+    "postcss": "^8.4.21",
+    "postcss-html": "^1.5.0",
+    "postcss-scss": "^4.0.6",
+    "prettier": "^2.8.4",
+    "rimraf": "^4.1.2",
+    "rollup": "^3.14.0",
+    "sass": "^1.58.0",
+    "stylelint": "^14.16.1",
+    "stylelint-config-html": "^1.1.0",
+    "stylelint-config-prettier": "^9.0.4",
+    "stylelint-config-recommended": "^9.0.0",
+    "stylelint-config-standard": "^29.0.0",
+    "stylelint-order": "^6.0.1",
+    "terser": "^5.16.3",
+    "typescript": "4.9.5",
+    "unplugin-auto-import": "^0.14.2",
+    "unplugin-element-plus": "^0.6.0",
+    "unplugin-vue-components": "^0.23.0",
+    "vite": "4.1.1",
+    "vite-plugin-compression": "^0.5.1",
+    "vite-plugin-ejs": "^1.6.4",
+    "vite-plugin-eslint": "^1.8.1",
+    "vite-plugin-progress": "^0.0.6",
+    "vite-plugin-purge-icons": "^0.9.2",
+    "vite-plugin-svg-icons": "^2.0.1",
+    "vite-plugin-vue-setup-extend": "^0.4.0",
+    "vite-plugin-windicss": "^1.8.10",
+    "vue-tsc": "^1.0.24",
+    "windicss": "^3.5.6"
+  },
+  "engines": {
+    "node": ">=16.0.0"
+  },
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "git+https://gitee.com/zhijiantianya/ruoyi-vue-pro"
+  },
+  "bugs": {
+    "url": "https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues"
+  },
+  "homepage": "https://gitee.com/zhijiantianya/ruoyi-vue-pro"
+}

+ 5 - 0
postcss.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  plugins: {
+    autoprefixer: {}
+  }
+}

+ 22 - 0
prettier.config.js

@@ -0,0 +1,22 @@
+module.exports = {
+  printWidth: 100, // 每行代码长度(默认80)
+  tabWidth: 2, // 每个tab相当于多少个空格(默认2)ab进行缩进(默认false)
+  useTabs: false, // 是否使用tab
+  semi: false, // 声明结尾使用分号(默认true)
+  vueIndentScriptAndStyle: false,
+  singleQuote: true, // 使用单引号(默认false)
+  quoteProps: 'as-needed',
+  bracketSpacing: true, // 对象字面量的大括号间使用空格(默认true)
+  trailingComma: 'none', // 多行使用拖尾逗号(默认none)
+  jsxSingleQuote: false,
+  // 箭头函数参数括号 默认avoid 可选 avoid| always
+  // avoid 能省略括号的时候就省略 例如x => x
+  // always 总是有括号
+  arrowParens: 'always',
+  insertPragma: false,
+  requirePragma: false,
+  proseWrap: 'never',
+  htmlWhitespaceSensitivity: 'strict',
+  endOfLine: 'auto',
+  rangeStart: 0
+}

BIN
public/favicon.ico


BIN
public/logo.gif


+ 49 - 0
src/App.vue

@@ -0,0 +1,49 @@
+<script setup lang="ts">
+import { isDark } from '@/utils/is'
+import { useAppStore } from '@/store/modules/app'
+import { useDesign } from '@/hooks/web/useDesign'
+import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
+
+const { getPrefixCls } = useDesign()
+const prefixCls = getPrefixCls('app')
+const appStore = useAppStore()
+const currentSize = computed(() => appStore.getCurrentSize)
+const greyMode = computed(() => appStore.getGreyMode)
+const { wsCache } = useCache()
+
+// 根据浏览器当前主题设置系统主题色
+const setDefaultTheme = () => {
+  let isDarkTheme = wsCache.get(CACHE_KEY.IS_DARK)
+  if (isDarkTheme === null) {
+    isDarkTheme = isDark()
+  }
+  appStore.setIsDark(isDarkTheme)
+}
+setDefaultTheme()
+</script>
+<template>
+  <ConfigGlobal :size="currentSize">
+    <RouterView :class="greyMode ? `${prefixCls}-grey-mode` : ''" />
+  </ConfigGlobal>
+</template>
+<style lang="scss">
+$prefix-cls: #{$namespace}-app;
+.size {
+  width: 100%;
+  height: 100%;
+}
+html,
+body {
+  padding: 0 !important;
+  margin: 0;
+  overflow: hidden;
+  @extend .size;
+
+  #app {
+    @extend .size;
+  }
+}
+.#{$prefix-cls}-grey-mode {
+  filter: grayscale(100%);
+}
+</style>

+ 8 - 0
src/api/bpm/activity/index.ts

@@ -0,0 +1,8 @@
+import request from '@/config/axios'
+
+export const getActivityList = async (params) => {
+  return await request.get({
+    url: '/bpm/activity/list',
+    params
+  })
+}

+ 21 - 0
src/api/bpm/definition/index.ts

@@ -0,0 +1,21 @@
+import request from '@/config/axios'
+
+export const getProcessDefinitionBpmnXMLApi = async (id: number) => {
+  return await request.get({
+    url: '/bpm/process-definition/get-bpmn-xml?id=' + id
+  })
+}
+
+export const getProcessDefinitionPageApi = async (params) => {
+  return await request.get({
+    url: '/bpm/process-definition/page',
+    params
+  })
+}
+
+export const getProcessDefinitionListApi = async (params) => {
+  return await request.get({
+    url: '/bpm/process-definition/list',
+    params
+  })
+}

+ 56 - 0
src/api/bpm/form/index.ts

@@ -0,0 +1,56 @@
+import request from '@/config/axios'
+
+export type FormVO = {
+  id: number
+  name: string
+  conf: string
+  fields: string[]
+  status: number
+  remark: string
+  createTime: string
+}
+
+// 创建工作流的表单定义
+export const createFormApi = async (data: FormVO) => {
+  return await request.post({
+    url: '/bpm/form/create',
+    data: data
+  })
+}
+
+// 更新工作流的表单定义
+export const updateFormApi = async (data: FormVO) => {
+  return await request.put({
+    url: '/bpm/form/update',
+    data: data
+  })
+}
+
+// 删除工作流的表单定义
+export const deleteFormApi = async (id: number) => {
+  return await request.delete({
+    url: '/bpm/form/delete?id=' + id
+  })
+}
+
+// 获得工作流的表单定义
+export const getFormApi = async (id: number) => {
+  return await request.get({
+    url: '/bpm/form/get?id=' + id
+  })
+}
+
+// 获得工作流的表单定义分页
+export const getFormPageApi = async (params) => {
+  return await request.get({
+    url: '/bpm/form/page',
+    params
+  })
+}
+
+// 获得动态表单的精简列表
+export const getSimpleFormsApi = async () => {
+  return await request.get({
+    url: '/bpm/form/list-all-simple'
+  })
+}

+ 27 - 0
src/api/bpm/leave/index.ts

@@ -0,0 +1,27 @@
+import request from '@/config/axios'
+
+export type LeaveVO = {
+  id: number
+  result: number
+  type: number
+  reason: string
+  processInstanceId: string
+  startTime: string
+  endTime: string
+  createTime: string
+}
+
+// 创建请假申请
+export const createLeaveApi = async (data: LeaveVO) => {
+  return await request.post({ url: '/bpm/oa/leave/create', data: data })
+}
+
+// 获得请假申请
+export const getLeaveApi = async (id: number) => {
+  return await request.get({ url: '/bpm/oa/leave/get?id=' + id })
+}
+
+// 获得请假申请分页
+export const getLeavePageApi = async (params) => {
+  return await request.get({ url: '/bpm/oa/leave/page', params })
+}

+ 59 - 0
src/api/bpm/model/index.ts

@@ -0,0 +1,59 @@
+import request from '@/config/axios'
+
+export type ProcessDefinitionVO = {
+  id: string
+  version: number
+  deploymentTIme: string
+  suspensionState: number
+}
+
+export type ModelVO = {
+  id: number
+  formName: string
+  key: string
+  name: string
+  description: string
+  category: string
+  formType: number
+  formId: number
+  formCustomCreatePath: string
+  formCustomViewPath: string
+  processDefinition: ProcessDefinitionVO
+  status: number
+  remark: string
+  createTime: string
+  bpmnXml: string
+}
+
+export const getModelPageApi = async (params) => {
+  return await request.get({ url: '/bpm/model/page', params })
+}
+
+export const getModelApi = async (id: number) => {
+  return await request.get({ url: '/bpm/model/get?id=' + id })
+}
+
+export const updateModelApi = async (data: ModelVO) => {
+  return await request.put({ url: '/bpm/model/update', data: data })
+}
+
+// 任务状态修改
+export const updateModelStateApi = async (id: number, state: number) => {
+  const data = {
+    id: id,
+    state: state
+  }
+  return await request.put({ url: '/bpm/model/update-state', data: data })
+}
+
+export const createModelApi = async (data: ModelVO) => {
+  return await request.post({ url: '/bpm/model/create', data: data })
+}
+
+export const deleteModelApi = async (id: number) => {
+  return await request.delete({ url: '/bpm/model/delete?id=' + id })
+}
+
+export const deployModelApi = async (id: number) => {
+  return await request.post({ url: '/bpm/model/deploy?id=' + id })
+}

+ 40 - 0
src/api/bpm/processInstance/index.ts

@@ -0,0 +1,40 @@
+import request from '@/config/axios'
+
+export type Task = {
+  id: string
+  name: string
+}
+export type ProcessInstanceVO = {
+  id: number
+  name: string
+  processDefinitionId: string
+  category: string
+  result: number
+  tasks: Task[]
+  fields: string[]
+  status: number
+  remark: string
+  businessKey: string
+  createTime: string
+  endTime: string
+}
+
+export const getMyProcessInstancePageApi = async (params) => {
+  return await request.get({ url: '/bpm/process-instance/my-page', params })
+}
+
+export const createProcessInstanceApi = async (data) => {
+  return await request.post({ url: '/bpm/process-instance/create', data: data })
+}
+
+export const cancelProcessInstanceApi = async (id: number, reason: string) => {
+  const data = {
+    id: id,
+    reason: reason
+  }
+  return await request.delete({ url: '/bpm/process-instance/cancel', data: data })
+}
+
+export const getProcessInstanceApi = async (id: number) => {
+  return await request.get({ url: '/bpm/process-instance/get?id=' + id })
+}

+ 34 - 0
src/api/bpm/task/index.ts

@@ -0,0 +1,34 @@
+import request from '@/config/axios'
+
+export const getTodoTaskPage = async (params) => {
+  return await request.get({ url: '/bpm/task/todo-page', params })
+}
+
+export const getDoneTaskPage = async (params) => {
+  return await request.get({ url: '/bpm/task/done-page', params })
+}
+
+export const completeTask = async (data) => {
+  return await request.put({ url: '/bpm/task/complete', data })
+}
+
+export const approveTask = async (data) => {
+  return await request.put({ url: '/bpm/task/approve', data })
+}
+
+export const rejectTask = async (data) => {
+  return await request.put({ url: '/bpm/task/reject', data })
+}
+export const backTask = async (data) => {
+  return await request.put({ url: '/bpm/task/back', data })
+}
+
+export const updateTaskAssignee = async (data) => {
+  return await request.put({ url: '/bpm/task/update-assignee', data })
+}
+
+export const getTaskListByProcessInstanceId = async (processInstanceId) => {
+  return await request.get({
+    url: '/bpm/task/list-by-process-instance-id?processInstanceId=' + processInstanceId
+  })
+}

+ 29 - 0
src/api/bpm/taskAssignRule/index.ts

@@ -0,0 +1,29 @@
+import request from '@/config/axios'
+
+export type TaskAssignVO = {
+  id: number
+  modelId: string
+  processDefinitionId: string
+  taskDefinitionKey: string
+  taskDefinitionName: string
+  options: string[]
+  type: number
+}
+
+export const getTaskAssignRuleList = async (params) => {
+  return await request.get({ url: '/bpm/task-assign-rule/list', params })
+}
+
+export const createTaskAssignRule = async (data: TaskAssignVO) => {
+  return await request.post({
+    url: '/bpm/task-assign-rule/create',
+    data: data
+  })
+}
+
+export const updateTaskAssignRule = async (data: TaskAssignVO) => {
+  return await request.put({
+    url: '/bpm/task-assign-rule/update',
+    data: data
+  })
+}

+ 47 - 0
src/api/bpm/userGroup/index.ts

@@ -0,0 +1,47 @@
+import request from '@/config/axios'
+
+export type UserGroupVO = {
+  id: number
+  name: string
+  description: string
+  memberUserIds: number[]
+  status: number
+  remark: string
+  createTime: string
+}
+
+// 创建用户组
+export const createUserGroupApi = async (data: UserGroupVO) => {
+  return await request.post({
+    url: '/bpm/user-group/create',
+    data: data
+  })
+}
+
+// 更新用户组
+export const updateUserGroupApi = async (data: UserGroupVO) => {
+  return await request.put({
+    url: '/bpm/user-group/update',
+    data: data
+  })
+}
+
+// 删除用户组
+export const deleteUserGroupApi = async (id: number) => {
+  return await request.delete({ url: '/bpm/user-group/delete?id=' + id })
+}
+
+// 获得用户组
+export const getUserGroupApi = async (id: number) => {
+  return await request.get({ url: '/bpm/user-group/get?id=' + id })
+}
+
+// 获得用户组分页
+export const getUserGroupPageApi = async (params) => {
+  return await request.get({ url: '/bpm/user-group/page', params })
+}
+
+// 获取用户组精简信息列表
+export const listSimpleUserGroupsApi = async () => {
+  return await request.get({ url: '/bpm/user-group/list-all-simple' })
+}

+ 50 - 0
src/api/infra/apiAccessLog/index.ts

@@ -0,0 +1,50 @@
+import request from '@/config/axios'
+
+export interface ApiAccessLogVO {
+  id: number
+  traceId: string
+  userId: number
+  userType: number
+  applicationName: string
+  requestMethod: string
+  requestParams: string
+  requestUrl: string
+  userIp: string
+  userAgent: string
+  beginTime: Date
+  endTIme: Date
+  duration: number
+  resultCode: number
+  resultMsg: string
+  createTime: Date
+}
+
+export interface ApiAccessLogPageReqVO extends PageParam {
+  userId?: number
+  userType?: number
+  applicationName?: string
+  requestUrl?: string
+  beginTime?: Date[]
+  duration?: number
+  resultCode?: number
+}
+
+export interface ApiAccessLogExportReqVO {
+  userId?: number
+  userType?: number
+  applicationName?: string
+  requestUrl?: string
+  beginTime?: Date[]
+  duration?: number
+  resultCode?: number
+}
+
+// 查询列表API 访问日志
+export const getApiAccessLogPageApi = (params: ApiAccessLogPageReqVO) => {
+  return request.get({ url: '/infra/api-access-log/page', params })
+}
+
+// 导出API 访问日志
+export const exportApiAccessLogApi = (params: ApiAccessLogExportReqVO) => {
+  return request.download({ url: '/infra/api-access-log/export-excel', params })
+}

+ 66 - 0
src/api/infra/apiErrorLog/index.ts

@@ -0,0 +1,66 @@
+import request from '@/config/axios'
+
+export interface ApiErrorLogVO {
+  id: number
+  traceId: string
+  userId: number
+  userType: number
+  applicationName: string
+  requestMethod: string
+  requestParams: string
+  requestUrl: string
+  userIp: string
+  userAgent: string
+  exceptionTime: Date
+  exceptionName: string
+  exceptionMessage: string
+  exceptionRootCauseMessage: string
+  exceptionStackTrace: string
+  exceptionClassName: string
+  exceptionFileName: string
+  exceptionMethodName: string
+  exceptionLineNumber: number
+  processUserId: number
+  processStatus: number
+  processTime: Date
+  resultCode: number
+  createTime: Date
+}
+
+export interface ApiErrorLogPageReqVO extends PageParam {
+  userId?: number
+  userType?: number
+  applicationName?: string
+  requestUrl?: string
+  exceptionTime?: Date[]
+  processStatus: number
+}
+
+export interface ApiErrorLogExportReqVO {
+  userId?: number
+  userType?: number
+  applicationName?: string
+  requestUrl?: string
+  exceptionTime?: Date[]
+  processStatus: number
+}
+
+// 查询列表API 访问日志
+export const getApiErrorLogPageApi = (params: ApiErrorLogPageReqVO) => {
+  return request.get({ url: '/infra/api-error-log/page', params })
+}
+
+// 更新 API 错误日志的处理状态
+export const updateApiErrorLogPageApi = (id: number, processStatus: number) => {
+  return request.put({
+    url: '/infra/api-error-log/update-status?id=' + id + '&processStatus=' + processStatus
+  })
+}
+
+// 导出API 访问日志
+export const exportApiErrorLogApi = (params: ApiErrorLogExportReqVO) => {
+  return request.download({
+    url: '/infra/api-error-log/export-excel',
+    params
+  })
+}

+ 57 - 0
src/api/infra/codegen/index.ts

@@ -0,0 +1,57 @@
+import request from '@/config/axios'
+import type { CodegenUpdateReqVO, CodegenCreateListReqVO } from './types'
+
+// 查询列表代码生成表定义
+export const getCodegenTablePageApi = (params) => {
+  return request.get({ url: '/infra/codegen/table/page', params })
+}
+
+// 查询详情代码生成表定义
+export const getCodegenTableApi = (id: number) => {
+  return request.get({ url: '/infra/codegen/detail?tableId=' + id })
+}
+
+// 新增代码生成表定义
+export const createCodegenTableApi = (data: CodegenCreateListReqVO) => {
+  return request.post({ url: '/infra/codegen/create', data })
+}
+
+// 修改代码生成表定义
+export const updateCodegenTableApi = (data: CodegenUpdateReqVO) => {
+  return request.put({ url: '/infra/codegen/update', data })
+}
+
+// 基于数据库的表结构,同步数据库的表和字段定义
+export const syncCodegenFromDBApi = (id: number) => {
+  return request.put({ url: '/infra/codegen/sync-from-db?tableId=' + id })
+}
+
+// 基于 SQL 建表语句,同步数据库的表和字段定义
+export const syncCodegenFromSQLApi = (id: number, sql: string) => {
+  return request.put({ url: '/infra/codegen/sync-from-sql?tableId=' + id + '&sql=' + sql })
+}
+
+// 预览生成代码
+export const previewCodegenApi = (id: number) => {
+  return request.get({ url: '/infra/codegen/preview?tableId=' + id })
+}
+
+// 下载生成代码
+export const downloadCodegenApi = (id: number) => {
+  return request.download({ url: '/infra/codegen/download?tableId=' + id })
+}
+
+// 获得表定义
+export const getSchemaTableListApi = (params) => {
+  return request.get({ url: '/infra/codegen/db/table/list', params })
+}
+
+// 基于数据库的表结构,创建代码生成器的表定义
+export const createCodegenListApi = (data) => {
+  return request.post({ url: '/infra/codegen/create-list', data })
+}
+
+// 删除代码生成表定义
+export const deleteCodegenTableApi = (id: number) => {
+  return request.delete({ url: '/infra/codegen/delete?tableId=' + id })
+}

+ 61 - 0
src/api/infra/codegen/types.ts

@@ -0,0 +1,61 @@
+export type CodegenTableVO = {
+  id: number
+  tableId: number
+  isParentMenuIdValid: boolean
+  dataSourceConfigId: number
+  scene: number
+  tableName: string
+  tableComment: string
+  remark: string
+  moduleName: string
+  businessName: string
+  className: string
+  classComment: string
+  author: string
+  createTime: Date
+  updateTime: Date
+  templateType: number
+  parentMenuId: number
+}
+
+export type CodegenColumnVO = {
+  id: number
+  tableId: number
+  columnName: string
+  dataType: string
+  columnComment: string
+  nullable: number
+  primaryKey: number
+  autoIncrement: string
+  ordinalPosition: number
+  javaType: string
+  javaField: string
+  dictType: string
+  example: string
+  createOperation: number
+  updateOperation: number
+  listOperation: number
+  listOperationCondition: string
+  listOperationResult: number
+  htmlType: string
+}
+export type DatabaseTableVO = {
+  name: string
+  comment: string
+}
+export type CodegenDetailVO = {
+  table: CodegenTableVO
+  columns: CodegenColumnVO[]
+}
+export type CodegenPreviewVO = {
+  filePath: string
+  code: string
+}
+export type CodegenUpdateReqVO = {
+  table: CodegenTableVO
+  columns: CodegenColumnVO[]
+}
+export type CodegenCreateListReqVO = {
+  dataSourceConfigId: number
+  tableNames: string[]
+}

+ 62 - 0
src/api/infra/config/index.ts

@@ -0,0 +1,62 @@
+import request from '@/config/axios'
+
+export interface ConfigVO {
+  id: number
+  category: string
+  name: string
+  key: string
+  value: string
+  type: number
+  visible: boolean
+  remark: string
+  createTime: Date
+}
+
+export interface ConfigPageReqVO extends PageParam {
+  name?: string
+  key?: string
+  type?: number
+  createTime?: Date[]
+}
+
+export interface ConfigExportReqVO {
+  name?: string
+  key?: string
+  type?: number
+  createTime?: Date[]
+}
+
+// 查询参数列表
+export const getConfigPageApi = (params: ConfigPageReqVO) => {
+  return request.get({ url: '/infra/config/page', params })
+}
+
+// 查询参数详情
+export const getConfigApi = (id: number) => {
+  return request.get({ url: '/infra/config/get?id=' + id })
+}
+
+// 根据参数键名查询参数值
+export const getConfigKeyApi = (configKey: string) => {
+  return request.get({ url: '/infra/config/get-value-by-key?key=' + configKey })
+}
+
+// 新增参数
+export const createConfigApi = (data: ConfigVO) => {
+  return request.post({ url: '/infra/config/create', data })
+}
+
+// 修改参数
+export const updateConfigApi = (data: ConfigVO) => {
+  return request.put({ url: '/infra/config/update', data })
+}
+
+// 删除参数
+export const deleteConfigApi = (id: number) => {
+  return request.delete({ url: '/infra/config/delete?id=' + id })
+}
+
+// 导出参数
+export const exportConfigApi = (params: ConfigExportReqVO) => {
+  return request.download({ url: '/infra/config/export', params })
+}

+ 35 - 0
src/api/infra/dataSourceConfig/index.ts

@@ -0,0 +1,35 @@
+import request from '@/config/axios'
+
+export interface DataSourceConfigVO {
+  id: number
+  name: string
+  url: string
+  username: string
+  password: string
+  createTime: Date
+}
+
+// 查询数据源配置列表
+export const getDataSourceConfigListApi = () => {
+  return request.get({ url: '/infra/data-source-config/list' })
+}
+
+// 查询数据源配置详情
+export const getDataSourceConfigApi = (id: number) => {
+  return request.get({ url: '/infra/data-source-config/get?id=' + id })
+}
+
+// 新增数据源配置
+export const createDataSourceConfigApi = (data: DataSourceConfigVO) => {
+  return request.post({ url: '/infra/data-source-config/create', data })
+}
+
+// 修改数据源配置
+export const updateDataSourceConfigApi = (data: DataSourceConfigVO) => {
+  return request.put({ url: '/infra/data-source-config/update', data })
+}
+
+// 删除数据源配置
+export const deleteDataSourceConfigApi = (id: number) => {
+  return request.delete({ url: '/infra/data-source-config/delete?id=' + id })
+}

+ 16 - 0
src/api/infra/dbDoc/index.ts

@@ -0,0 +1,16 @@
+import request from '@/config/axios'
+
+// 导出Html
+export const exportHtmlApi = () => {
+  return request.download({ url: '/infra/db-doc/export-html' })
+}
+
+// 导出Word
+export const exportWordApi = () => {
+  return request.download({ url: '/infra/db-doc/export-word' })
+}
+
+// 导出Markdown
+export const exportMarkdownApi = () => {
+  return request.download({ url: '/infra/db-doc/export-markdown' })
+}

+ 66 - 0
src/api/infra/fileConfig/index.ts

@@ -0,0 +1,66 @@
+import request from '@/config/axios'
+
+export interface FileClientConfig {
+  basePath: string
+  host?: string
+  port?: number
+  username?: string
+  password?: string
+  mode?: string
+  endpoint?: string
+  bucket?: string
+  accessKey?: string
+  accessSecret?: string
+  domain: string
+}
+export interface FileConfigVO {
+  id: number
+  name: string
+  storage: number
+  master: boolean
+  visible: boolean
+  config: FileClientConfig
+  remark: string
+  createTime: Date
+}
+
+export interface FileConfigPageReqVO extends PageParam {
+  name?: string
+  storage?: number
+  createTime?: Date[]
+}
+
+// 查询文件配置列表
+export const getFileConfigPageApi = (params: FileConfigPageReqVO) => {
+  return request.get({ url: '/infra/file-config/page', params })
+}
+
+// 查询文件配置详情
+export const getFileConfigApi = (id: number) => {
+  return request.get({ url: '/infra/file-config/get?id=' + id })
+}
+
+// 更新文件配置为主配置
+export const updateFileConfigMasterApi = (id: number) => {
+  return request.put({ url: '/infra/file-config/update-master?id=' + id })
+}
+
+// 新增文件配置
+export const createFileConfigApi = (data: FileConfigVO) => {
+  return request.post({ url: '/infra/file-config/create', data })
+}
+
+// 修改文件配置
+export const updateFileConfigApi = (data: FileConfigVO) => {
+  return request.put({ url: '/infra/file-config/update', data })
+}
+
+// 删除文件配置
+export const deleteFileConfigApi = (id: number) => {
+  return request.delete({ url: '/infra/file-config/delete?id=' + id })
+}
+
+// 测试文件配置
+export const testFileConfigApi = (id: number) => {
+  return request.get({ url: '/infra/file-config/test?id=' + id })
+}

+ 28 - 0
src/api/infra/fileList/index.ts

@@ -0,0 +1,28 @@
+import request from '@/config/axios'
+
+export interface FileVO {
+  id: number
+  configId: number
+  path: string
+  name: string
+  url: string
+  size: string
+  type: string
+  createTime: Date
+}
+
+export interface FilePageReqVO extends PageParam {
+  path?: string
+  type?: string
+  createTime?: Date[]
+}
+
+// 查询文件列表
+export const getFilePageApi = (params: FilePageReqVO) => {
+  return request.get({ url: '/infra/file/page', params })
+}
+
+// 删除文件
+export const deleteFileApi = (id: number) => {
+  return request.delete({ url: '/infra/file/delete?id=' + id })
+}

+ 75 - 0
src/api/infra/job/index.ts

@@ -0,0 +1,75 @@
+import request from '@/config/axios'
+
+export interface JobVO {
+  id: number
+  name: string
+  status: number
+  handlerName: string
+  handlerParam: string
+  cronExpression: string
+  retryCount: number
+  retryInterval: number
+  monitorTimeout: number
+  createTime: Date
+}
+
+export interface JobPageReqVO extends PageParam {
+  name?: string
+  status?: number
+  handlerName?: string
+}
+
+export interface JobExportReqVO {
+  name?: string
+  status?: number
+  handlerName?: string
+}
+
+// 任务列表
+export const getJobPageApi = (params: JobPageReqVO) => {
+  return request.get({ url: '/infra/job/page', params })
+}
+
+// 任务详情
+export const getJobApi = (id: number) => {
+  return request.get({ url: '/infra/job/get?id=' + id })
+}
+
+// 新增任务
+export const createJobApi = (data: JobVO) => {
+  return request.post({ url: '/infra/job/create', data })
+}
+
+// 修改定时任务调度
+export const updateJobApi = (data: JobVO) => {
+  return request.put({ url: '/infra/job/update', data })
+}
+
+// 删除定时任务调度
+export const deleteJobApi = (id: number) => {
+  return request.delete({ url: '/infra/job/delete?id=' + id })
+}
+
+// 导出定时任务调度
+export const exportJobApi = (params: JobExportReqVO) => {
+  return request.download({ url: '/infra/job/export-excel', params })
+}
+
+// 任务状态修改
+export const updateJobStatusApi = (id: number, status: number) => {
+  const params = {
+    id,
+    status
+  }
+  return request.put({ url: '/infra/job/update-status', params })
+}
+
+// 定时任务立即执行一次
+export const runJobApi = (id: number) => {
+  return request.put({ url: '/infra/job/trigger?id=' + id })
+}
+
+// 获得定时任务的下 n 次执行时间
+export const getJobNextTimesApi = (id: number) => {
+  return request.get({ url: '/infra/job/get_next_times?id=' + id })
+}

+ 49 - 0
src/api/infra/jobLog/index.ts

@@ -0,0 +1,49 @@
+import request from '@/config/axios'
+
+export interface JobLogVO {
+  id: number
+  jobId: number
+  handlerName: string
+  handlerParam: string
+  cronExpression: string
+  executeIndex: string
+  beginTime: string
+  endTime: string
+  duration: string
+  status: number
+  createTime: string
+}
+
+export interface JobLogPageReqVO extends PageParam {
+  jobId?: number
+  handlerName?: string
+  beginTime?: string
+  endTime?: string
+  status?: number
+}
+
+export interface JobLogExportReqVO {
+  jobId?: number
+  handlerName?: string
+  beginTime?: string
+  endTime?: string
+  status?: number
+}
+
+// 任务日志列表
+export const getJobLogPageApi = (params: JobLogPageReqVO) => {
+  return request.get({ url: '/infra/job-log/page', params })
+}
+
+// 任务日志详情
+export const getJobLogApi = (id: number) => {
+  return request.get({ url: '/infra/job-log/get?id=' + id })
+}
+
+// 导出定时任务日志
+export const exportJobLogApi = (params: JobLogExportReqVO) => {
+  return request.download({
+    url: '/infra/job-log/export-excel',
+    params
+  })
+}

+ 41 - 0
src/api/infra/redis/index.ts

@@ -0,0 +1,41 @@
+import request from '@/config/axios'
+
+/**
+ * 获取redis 监控信息
+ */
+export const getCacheApi = () => {
+  return request.get({ url: '/infra/redis/get-monitor-info' })
+}
+// 获取模块
+export const getKeyDefineListApi = () => {
+  return request.get({ url: '/infra/redis/get-key-define-list' })
+}
+/**
+ * 获取redis key列表
+ */
+export const getKeyListApi = (keyTemplate: string) => {
+  return request.get({
+    url: '/infra/redis/get-key-list',
+    params: {
+      keyTemplate
+    }
+  })
+}
+// 获取缓存内容
+export const getKeyValueApi = (key: string) => {
+  return request.get({ url: '/infra/redis/get-key-value?key=' + key })
+}
+
+// 根据键名删除缓存
+export const deleteKeyApi = (key: string) => {
+  return request.delete({ url: '/infra/redis/delete-key?key=' + key })
+}
+
+export const deleteKeysApi = (keyTemplate: string) => {
+  return request.delete({
+    url: '/infra/redis/delete-keys?',
+    params: {
+      keyTemplate
+    }
+  })
+}

+ 185 - 0
src/api/infra/redis/types.ts

@@ -0,0 +1,185 @@
+export interface RedisMonitorInfoVO {
+  info: RedisInfoVO
+  dbSize: number
+  commandStats: RedisCommandStatsVO[]
+}
+
+export interface RedisInfoVO {
+  io_threaded_reads_processed: string
+  tracking_clients: string
+  uptime_in_seconds: string
+  cluster_connections: string
+  current_cow_size: string
+  maxmemory_human: string
+  aof_last_cow_size: string
+  master_replid2: string
+  mem_replication_backlog: string
+  aof_rewrite_scheduled: string
+  total_net_input_bytes: string
+  rss_overhead_ratio: string
+  hz: string
+  current_cow_size_age: string
+  redis_build_id: string
+  errorstat_BUSYGROUP: string
+  aof_last_bgrewrite_status: string
+  multiplexing_api: string
+  client_recent_max_output_buffer: string
+  allocator_resident: string
+  mem_fragmentation_bytes: string
+  aof_current_size: string
+  repl_backlog_first_byte_offset: string
+  tracking_total_prefixes: string
+  redis_mode: string
+  redis_git_dirty: string
+  aof_delayed_fsync: string
+  allocator_rss_bytes: string
+  repl_backlog_histlen: string
+  io_threads_active: string
+  rss_overhead_bytes: string
+  total_system_memory: string
+  loading: string
+  evicted_keys: string
+  maxclients: string
+  cluster_enabled: string
+  redis_version: string
+  repl_backlog_active: string
+  mem_aof_buffer: string
+  allocator_frag_bytes: string
+  io_threaded_writes_processed: string
+  instantaneous_ops_per_sec: string
+  used_memory_human: string
+  total_error_replies: string
+  role: string
+  maxmemory: string
+  used_memory_lua: string
+  rdb_current_bgsave_time_sec: string
+  used_memory_startup: string
+  used_cpu_sys_main_thread: string
+  lazyfree_pending_objects: string
+  aof_pending_bio_fsync: string
+  used_memory_dataset_perc: string
+  allocator_frag_ratio: string
+  arch_bits: string
+  used_cpu_user_main_thread: string
+  mem_clients_normal: string
+  expired_time_cap_reached_count: string
+  unexpected_error_replies: string
+  mem_fragmentation_ratio: string
+  aof_last_rewrite_time_sec: string
+  master_replid: string
+  aof_rewrite_in_progress: string
+  lru_clock: string
+  maxmemory_policy: string
+  run_id: string
+  latest_fork_usec: string
+  tracking_total_items: string
+  total_commands_processed: string
+  expired_keys: string
+  errorstat_ERR: string
+  used_memory: string
+  module_fork_in_progress: string
+  errorstat_WRONGPASS: string
+  aof_buffer_length: string
+  dump_payload_sanitizations: string
+  mem_clients_slaves: string
+  keyspace_misses: string
+  server_time_usec: string
+  executable: string
+  lazyfreed_objects: string
+  db0: string
+  used_memory_peak_human: string
+  keyspace_hits: string
+  rdb_last_cow_size: string
+  aof_pending_rewrite: string
+  used_memory_overhead: string
+  active_defrag_hits: string
+  tcp_port: string
+  uptime_in_days: string
+  used_memory_peak_perc: string
+  current_save_keys_processed: string
+  blocked_clients: string
+  total_reads_processed: string
+  expire_cycle_cpu_milliseconds: string
+  sync_partial_err: string
+  used_memory_scripts_human: string
+  aof_current_rewrite_time_sec: string
+  aof_enabled: string
+  process_supervised: string
+  master_repl_offset: string
+  used_memory_dataset: string
+  used_cpu_user: string
+  rdb_last_bgsave_status: string
+  tracking_total_keys: string
+  atomicvar_api: string
+  allocator_rss_ratio: string
+  client_recent_max_input_buffer: string
+  clients_in_timeout_table: string
+  aof_last_write_status: string
+  mem_allocator: string
+  used_memory_scripts: string
+  used_memory_peak: string
+  process_id: string
+  master_failover_state: string
+  errorstat_NOAUTH: string
+  used_cpu_sys: string
+  repl_backlog_size: string
+  connected_slaves: string
+  current_save_keys_total: string
+  gcc_version: string
+  total_system_memory_human: string
+  sync_full: string
+  connected_clients: string
+  module_fork_last_cow_size: string
+  total_writes_processed: string
+  allocator_active: string
+  total_net_output_bytes: string
+  pubsub_channels: string
+  current_fork_perc: string
+  active_defrag_key_hits: string
+  rdb_changes_since_last_save: string
+  instantaneous_input_kbps: string
+  used_memory_rss_human: string
+  configured_hz: string
+  expired_stale_perc: string
+  active_defrag_misses: string
+  used_cpu_sys_children: string
+  number_of_cached_scripts: string
+  sync_partial_ok: string
+  used_memory_lua_human: string
+  rdb_last_save_time: string
+  pubsub_patterns: string
+  slave_expires_tracked_keys: string
+  redis_git_sha1: string
+  used_memory_rss: string
+  rdb_last_bgsave_time_sec: string
+  os: string
+  mem_not_counted_for_evict: string
+  active_defrag_running: string
+  rejected_connections: string
+  aof_rewrite_buffer_length: string
+  total_forks: string
+  active_defrag_key_misses: string
+  allocator_allocated: string
+  aof_base_size: string
+  instantaneous_output_kbps: string
+  second_repl_offset: string
+  rdb_bgsave_in_progress: string
+  used_cpu_user_children: string
+  total_connections_received: string
+  migrate_cached_sockets: string
+}
+
+export interface RedisCommandStatsVO {
+  command: string
+  calls: number
+  usec: number
+}
+
+export interface RedisKeyInfo {
+  keyTemplate: string
+  keyType: string
+  valueType: string
+  timeoutType: number
+  timeout: number
+  memo: string
+}

+ 73 - 0
src/api/login/index.ts

@@ -0,0 +1,73 @@
+import request from '@/config/axios'
+import { getRefreshToken } from '@/utils/auth'
+import type { UserLoginVO } from './types'
+
+export interface CodeImgResult {
+  captchaOnOff: boolean
+  img: string
+  uuid: string
+}
+export interface SmsCodeVO {
+  mobile: string
+  scene: number
+}
+export interface SmsLoginVO {
+  mobile: string
+  code: string
+}
+
+// 登录
+export const loginApi = (data: UserLoginVO) => {
+  return request.post({ url: '/system/auth/login', data })
+}
+
+// 刷新访问令牌
+export const refreshToken = () => {
+  return request.post({ url: '/system/auth/refresh-token?refreshToken=' + getRefreshToken() })
+}
+
+// 使用租户名,获得租户编号
+export const getTenantIdByNameApi = (name: string) => {
+  return request.get({ url: '/system/tenant/get-id-by-name?name=' + name })
+}
+
+// 登出
+export const loginOutApi = () => {
+  return request.post({ url: '/system/auth/logout' })
+}
+
+// 获取用户权限信息
+export const getInfoApi = () => {
+  return request.get({ url: '/system/auth/get-permission-info' })
+}
+
+// 路由
+export const getAsyncRoutesApi = () => {
+  return request.get({ url: '/system/auth/list-menus' })
+}
+
+//获取登录验证码
+export const sendSmsCodeApi = (data: SmsCodeVO) => {
+  return request.post({ url: '/system/auth/send-sms-code', data })
+}
+
+// 短信验证码登录
+export const smsLoginApi = (data: SmsLoginVO) => {
+  return request.post({ url: '/system/auth/sms-login', data })
+}
+
+// 社交授权的跳转
+export const socialAuthRedirectApi = (type: number, redirectUri: string) => {
+  return request.get({
+    url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri
+  })
+}
+// 获取验证图片  以及token
+export const getCodeApi = (data) => {
+  return request.postOriginal({ url: 'system/captcha/get', data })
+}
+
+// 滑动或者点选验证
+export const reqCheckApi = (data) => {
+  return request.postOriginal({ url: 'system/captcha/check', data })
+}

+ 42 - 0
src/api/login/types.ts

@@ -0,0 +1,42 @@
+export type UserLoginVO = {
+  username: string
+  password: string
+  captchaVerification: string
+}
+
+export type TokenType = {
+  id: number // 编号
+  accessToken: string // 访问令牌
+  refreshToken: string // 刷新令牌
+  userId: number // 用户编号
+  userType: number //用户类型
+  clientId: string //客户端编号
+  expiresTime: number //过期时间
+}
+
+export type UserVO = {
+  id: number
+  username: string
+  nickname: string
+  deptId: number
+  email: string
+  mobile: string
+  sex: number
+  avatar: string
+  loginIp: string
+  loginDate: string
+}
+
+export type UserInfoVO = {
+  permissions: []
+  roles: []
+  user: {
+    avatar: string
+    id: number
+    nickname: string
+  }
+}
+
+export type TentantNameVO = {
+  name: string
+}

+ 41 - 0
src/api/mp/account/index.ts

@@ -0,0 +1,41 @@
+import request from '@/config/axios'
+
+// 创建公众号账号
+export const createAccount = async (data) => {
+  return await request.post({ url: '/mp/account/create', data })
+}
+
+// 更新公众号账号
+export const updateAccount = async (data) => {
+  return request.put({ url: '/mp/account/update', data: data })
+}
+
+// 删除公众号账号
+export const deleteAccount = async (id) => {
+  return request.delete({ url: '/mp/account/delete?id=' + id, method: 'delete' })
+}
+
+// 获得公众号账号
+export const getAccount = async (id) => {
+  return request.get({ url: '/mp/account/get?id=' + id })
+}
+
+// 获得公众号账号分页
+export const getAccountPage = async (query) => {
+  return request.get({ url: '/mp/account/page', params: query })
+}
+
+// 获取公众号账号精简信息列表
+export const getSimpleAccounts = async () => {
+  return request.get({ url: '/mp/account/list-all-simple' })
+}
+
+// 生成公众号二维码
+export const generateAccountQrCode = async (id) => {
+  return request.put({ url: '/mp/account/generate-qr-code?id=' + id })
+}
+
+// 清空公众号 API 配额
+export const clearAccountQuota = async (id) => {
+  return request.put({ url: '/mp/account/clear-quota?id=' + id })
+}

+ 39 - 0
src/api/mp/autoReply/index.ts

@@ -0,0 +1,39 @@
+import request from '@/config/axios'
+
+// 创建公众号的自动回复
+export const createAutoReply = (data) => {
+  return request.post({
+    url: '/mp/auto-reply/create',
+    data: data
+  })
+}
+
+// 更新公众号的自动回复
+export const updateAutoReply = (data) => {
+  return request.put({
+    url: '/mp/auto-reply/update',
+    data: data
+  })
+}
+
+// 删除公众号的自动回复
+export const deleteAutoReply = (id) => {
+  return request.delete({
+    url: '/mp/auto-reply/delete?id=' + id
+  })
+}
+
+// 获得公众号的自动回复
+export const getAutoReply = (id) => {
+  return request.get({
+    url: '/mp/auto-reply/get?id=' + id
+  })
+}
+
+// 获得公众号的自动回复分页
+export const getAutoReplyPage = (query) => {
+  return request.get({
+    url: '/mp/auto-reply/page',
+    params: query
+  })
+}

+ 35 - 0
src/api/mp/draft/index.ts

@@ -0,0 +1,35 @@
+import request from '@/config/axios'
+
+// 获得公众号草稿分页
+export const getDraftPage = (query) => {
+  return request.get({
+    url: '/mp/draft/page',
+    params: query
+  })
+}
+
+// 创建公众号草稿
+export const createDraft = (accountId, articles) => {
+  return request.post({
+    url: '/mp/draft/create?accountId=' + accountId,
+    data: {
+      articles
+    }
+  })
+}
+
+// 更新公众号草稿
+export const updateDraft = (accountId, mediaId, articles) => {
+  return request.put({
+    url: '/mp/draft/update?accountId=' + accountId + '&mediaId=' + mediaId,
+    method: 'put',
+    data: articles
+  })
+}
+
+// 删除公众号草稿
+export const deleteDraft = (accountId, mediaId) => {
+  return request.delete({
+    url: '/mp/draft/delete?accountId=' + accountId + '&mediaId=' + mediaId
+  })
+}

+ 23 - 0
src/api/mp/freePublish/index.ts

@@ -0,0 +1,23 @@
+import request from '@/config/axios'
+
+// 获得公众号素材分页
+export const getFreePublishPage = (query) => {
+  return request.get({
+    url: '/mp/free-publish/page',
+    params: query
+  })
+}
+
+// 删除公众号素材
+export const deleteFreePublish = (accountId, articleId) => {
+  return request.delete({
+    url: '/mp/free-publish/delete?accountId=' + accountId + '&articleId=' + articleId
+  })
+}
+
+// 发布公众号素材
+export const submitFreePublish = (accountId, mediaId) => {
+  return request.post({
+    url: '/mp/free-publish/submit?accountId=' + accountId + '&mediaId=' + mediaId
+  })
+}

+ 16 - 0
src/api/mp/material/index.ts

@@ -0,0 +1,16 @@
+import request from '@/config/axios'
+
+// 获得公众号素材分页
+export const getMaterialPage = (query) => {
+  return request.get({
+    url: '/mp/material/page',
+    params: query
+  })
+}
+
+// 删除公众号永久素材
+export const deletePermanentMaterial = (id) => {
+  return request.delete({
+    url: '/mp/material/delete-permanent?id=' + id
+  })
+}

+ 26 - 0
src/api/mp/menu/index.ts

@@ -0,0 +1,26 @@
+import request from '@/config/axios'
+
+// 获得公众号菜单列表
+export const getMenuList = (accountId) => {
+  return request.get({
+    url: '/mp/menu/list?accountId=' + accountId
+  })
+}
+
+// 保存公众号菜单
+export const saveMenu = (accountId, menus) => {
+  return request.post({
+    url: '/mp/menu/save',
+    data: {
+      accountId,
+      menus
+    }
+  })
+}
+
+// 删除公众号菜单
+export const deleteMenu = (accountId) => {
+  return request.delete({
+    url: '/mp/menu/delete?accountId=' + accountId
+  })
+}

+ 17 - 0
src/api/mp/message/index.ts

@@ -0,0 +1,17 @@
+import request from '@/config/axios'
+
+// 获得公众号消息分页
+export const getMessagePage = (query) => {
+  return request.get({
+    url: '/mp/message/page',
+    params: query
+  })
+}
+
+// 给粉丝发送消息
+export const sendMessage = (data) => {
+  return request.post({
+    url: '/mp/message/send',
+    data: data
+  })
+}

+ 31 - 0
src/api/mp/mpuser/index.ts

@@ -0,0 +1,31 @@
+import request from '@/config/axios'
+
+// 更新公众号粉丝
+export const updateUser = (data) => {
+  return request.put({
+    url: '/mp/user/update',
+    data: data
+  })
+}
+
+// 获得公众号粉丝
+export const getUser = (id) => {
+  return request.get({
+    url: '/mp/user/get?id=' + id
+  })
+}
+
+// 获得公众号粉丝分页
+export const getUserPage = (query) => {
+  return request.get({
+    url: '/mp/user/page',
+    params: query
+  })
+}
+
+// 同步公众号粉丝
+export const syncUser = (accountId) => {
+  return request.post({
+    url: '/mp/tag/sync?accountId=' + accountId
+  })
+}

+ 33 - 0
src/api/mp/statistics/index.ts

@@ -0,0 +1,33 @@
+import request from '@/config/axios'
+
+// 获取消息发送概况数据
+export const getUpstreamMessage = (query) => {
+  return request.get({
+    url: '/mp/statistics/upstream-message',
+    params: query
+  })
+}
+
+// 用户增减数据
+export const getUserSummary = (query) => {
+  return request.get({
+    url: '/mp/statistics/user-summary',
+    params: query
+  })
+}
+
+// 获得用户累计数据
+export const getUserCumulate = (query) => {
+  return request.get({
+    url: '/mp/statistics/user-cumulate',
+    params: query
+  })
+}
+
+// 获得接口分析数据
+export const getInterfaceSummary = (query) => {
+  return request.get({
+    url: '/mp/statistics/interface-summary',
+    params: query
+  })
+}

+ 53 - 0
src/api/mp/tag/index.ts

@@ -0,0 +1,53 @@
+import request from '@/config/axios'
+
+// 创建公众号标签
+export const createTag = (data) => {
+  return request.post({
+    url: '/mp/tag/create',
+    data: data
+  })
+}
+
+// 更新公众号标签
+export const updateTag = (data) => {
+  return request.put({
+    url: '/mp/tag/update',
+    data: data
+  })
+}
+
+// 删除公众号标签
+export const deleteTag = (id) => {
+  return request.delete({
+    url: '/mp/tag/delete?id=' + id
+  })
+}
+
+// 获得公众号标签
+export const getTag = (id) => {
+  return request.get({
+    url: '/mp/tag/get?id=' + id
+  })
+}
+
+// 获得公众号标签分页
+export const getTagPage = (query) => {
+  return request.get({
+    url: '/mp/tag/page',
+    params: query
+  })
+}
+
+// 获取公众号标签精简信息列表
+export const getSimpleTags = () => {
+  return request.get({
+    url: '/mp/tag/list-all-simple'
+  })
+}
+
+// 同步公众号标签
+export const syncTag = (accountId) => {
+  return request.post({
+    url: '/mp/tag/sync?accountId=' + accountId
+  })
+}

+ 78 - 0
src/api/pay/app/index.ts

@@ -0,0 +1,78 @@
+import request from '@/config/axios'
+
+export interface AppVO {
+  id: number
+  name: string
+  status: number
+  remark: string
+  payNotifyUrl: string
+  refundNotifyUrl: string
+  merchantId: number
+  merchantName: string
+  createTime: Date
+}
+
+export interface AppPageReqVO extends PageParam {
+  name?: string
+  status?: number
+  remark?: string
+  payNotifyUrl?: string
+  refundNotifyUrl?: string
+  merchantName?: string
+  createTime?: Date[]
+}
+
+export interface AppExportReqVO {
+  name?: string
+  status?: number
+  remark?: string
+  payNotifyUrl?: string
+  refundNotifyUrl?: string
+  merchantName?: string
+  createTime?: Date[]
+}
+
+export interface AppUpdateStatusReqVO {
+  id: number
+  status: number
+}
+
+// 查询列表支付应用
+export const getAppPageApi = (params: AppPageReqVO) => {
+  return request.get({ url: '/pay/app/page', params })
+}
+
+// 查询详情支付应用
+export const getAppApi = (id: number) => {
+  return request.get({ url: '/pay/app/get?id=' + id })
+}
+
+// 新增支付应用
+export const createAppApi = (data: AppVO) => {
+  return request.post({ url: '/pay/app/create', data })
+}
+
+// 修改支付应用
+export const updateAppApi = (data: AppVO) => {
+  return request.put({ url: '/pay/app/update', data })
+}
+
+// 支付应用信息状态修改
+export const changeAppStatusApi = (data: AppUpdateStatusReqVO) => {
+  return request.put({ url: '/pay/app/update-status', data: data })
+}
+
+// 删除支付应用
+export const deleteAppApi = (id: number) => {
+  return request.delete({ url: '/pay/app/delete?id=' + id })
+}
+
+// 导出支付应用
+export const exportAppApi = (params: AppExportReqVO) => {
+  return request.download({ url: '/pay/app/export-excel', params })
+}
+
+// 根据商ID称搜索应用列表
+export const getAppListByMerchantIdApi = (merchantId: number) => {
+  return request.get({ url: '/pay/app/list-merchant-id', params: { merchantId: merchantId } })
+}

+ 70 - 0
src/api/pay/channel/index.ts

@@ -0,0 +1,70 @@
+import request from '@/config/axios'
+
+export interface ChannelVO {
+  id: number
+  code: string
+  config: string
+  status: number
+  remark: string
+  feeRate: number
+  merchantId: number
+  appId: number
+  createTime: Date
+}
+
+export interface ChannelPageReqVO extends PageParam {
+  code?: string
+  status?: number
+  remark?: string
+  feeRate?: number
+  merchantId?: number
+  appId?: number
+  config?: string
+  createTime?: Date[]
+}
+
+export interface ChannelExportReqVO {
+  code?: string
+  status?: number
+  remark?: string
+  feeRate?: number
+  merchantId?: number
+  appId?: number
+  config?: string
+  createTime?: Date[]
+}
+
+// 查询列表支付渠道
+export const getChannelPageApi = (params: ChannelPageReqVO) => {
+  return request.get({ url: '/pay/channel/page', params })
+}
+
+// 查询详情支付渠道
+export const getChannelApi = (merchantId: number, appId: string, code: string) => {
+  const params = {
+    merchantId: merchantId,
+    appId: appId,
+    code: code
+  }
+  return request.get({ url: '/pay/channel/get-channel', params: params })
+}
+
+// 新增支付渠道
+export const createChannelApi = (data: ChannelVO) => {
+  return request.post({ url: '/pay/channel/create', data })
+}
+
+// 修改支付渠道
+export const updateChannelApi = (data: ChannelVO) => {
+  return request.put({ url: '/pay/channel/update', data })
+}
+
+// 删除支付渠道
+export const deleteChannelApi = (id: number) => {
+  return request.delete({ url: '/pay/channel/delete?id=' + id })
+}
+
+// 导出支付渠道
+export const exportChannelApi = (params: ChannelExportReqVO) => {
+  return request.download({ url: '/pay/channel/export-excel', params })
+}

+ 77 - 0
src/api/pay/merchant/index.ts

@@ -0,0 +1,77 @@
+import request from '@/config/axios'
+
+export interface MerchantVO {
+  id: number
+  no: string
+  name: string
+  shortName: string
+  status: number
+  remark: string
+  createTime: Date
+}
+
+export interface MerchantPageReqVO extends PageParam {
+  no?: string
+  name?: string
+  shortName?: string
+  status?: number
+  remark?: string
+  createTime?: Date[]
+}
+
+export interface MerchantExportReqVO {
+  no?: string
+  name?: string
+  shortName?: string
+  status?: number
+  remark?: string
+  createTime?: Date[]
+}
+
+// 查询列表支付商户
+export const getMerchantPageApi = (params: MerchantPageReqVO) => {
+  return request.get({ url: '/pay/merchant/page', params })
+}
+
+// 查询详情支付商户
+export const getMerchantApi = (id: number) => {
+  return request.get({ url: '/pay/merchant/get?id=' + id })
+}
+
+// 根据商户名称搜索商户列表
+export const getMerchantListByNameApi = (name: string) => {
+  return request.get({
+    url: '/pay/merchant/list-by-name?id=',
+    params: {
+      name: name
+    }
+  })
+}
+
+// 新增支付商户
+export const createMerchantApi = (data: MerchantVO) => {
+  return request.post({ url: '/pay/merchant/create', data })
+}
+
+// 修改支付商户
+export const updateMerchantApi = (data: MerchantVO) => {
+  return request.put({ url: '/pay/merchant/update', data })
+}
+
+// 删除支付商户
+export const deleteMerchantApi = (id: number) => {
+  return request.delete({ url: '/pay/merchant/delete?id=' + id })
+}
+
+// 导出支付商户
+export const exportMerchantApi = (params: MerchantExportReqVO) => {
+  return request.download({ url: '/pay/merchant/export-excel', params })
+}
+// 支付商户状态修改
+export const changeMerchantStatusApi = (id: number, status: number) => {
+  const data = {
+    id,
+    status
+  }
+  return request.put({ url: '/pay/merchant/update-status', data: data })
+}

+ 109 - 0
src/api/pay/order/index.ts

@@ -0,0 +1,109 @@
+import request from '@/config/axios'
+
+export interface OrderVO {
+  id: number
+  merchantId: number
+  appId: number
+  channelId: number
+  channelCode: string
+  merchantOrderId: string
+  subject: string
+  body: string
+  notifyUrl: string
+  notifyStatus: number
+  amount: number
+  channelFeeRate: number
+  channelFeeAmount: number
+  status: number
+  userIp: string
+  expireTime: Date
+  successTime: Date
+  notifyTime: Date
+  successExtensionId: number
+  refundStatus: number
+  refundTimes: number
+  refundAmount: number
+  channelUserId: string
+  channelOrderNo: string
+  createTime: Date
+}
+
+export interface OrderPageReqVO extends PageParam {
+  merchantId?: number
+  appId?: number
+  channelId?: number
+  channelCode?: string
+  merchantOrderId?: string
+  subject?: string
+  body?: string
+  notifyUrl?: string
+  notifyStatus?: number
+  amount?: number
+  channelFeeRate?: number
+  channelFeeAmount?: number
+  status?: number
+  expireTime?: Date[]
+  successTime?: Date[]
+  notifyTime?: Date[]
+  successExtensionId?: number
+  refundStatus?: number
+  refundTimes?: number
+  channelUserId?: string
+  channelOrderNo?: string
+  createTime?: Date[]
+}
+
+export interface OrderExportReqVO {
+  merchantId?: number
+  appId?: number
+  channelId?: number
+  channelCode?: string
+  merchantOrderId?: string
+  subject?: string
+  body?: string
+  notifyUrl?: string
+  notifyStatus?: number
+  amount?: number
+  channelFeeRate?: number
+  channelFeeAmount?: number
+  status?: number
+  expireTime?: Date[]
+  successTime?: Date[]
+  notifyTime?: Date[]
+  successExtensionId?: number
+  refundStatus?: number
+  refundTimes?: number
+  channelUserId?: string
+  channelOrderNo?: string
+  createTime?: Date[]
+}
+
+// 查询列表支付订单
+export const getOrderPageApi = async (params: OrderPageReqVO) => {
+  return await request.get({ url: '/pay/order/page', params })
+}
+
+// 查询详情支付订单
+export const getOrderApi = async (id: number) => {
+  return await request.get({ url: '/pay/order/get?id=' + id })
+}
+
+// 新增支付订单
+export const createOrderApi = async (data: OrderVO) => {
+  return await request.post({ url: '/pay/order/create', data })
+}
+
+// 修改支付订单
+export const updateOrderApi = async (data: OrderVO) => {
+  return await request.put({ url: '/pay/order/update', data })
+}
+
+// 删除支付订单
+export const deleteOrderApi = async (id: number) => {
+  return await request.delete({ url: '/pay/order/delete?id=' + id })
+}
+
+// 导出支付订单
+export const exportOrderApi = async (params: OrderExportReqVO) => {
+  return await request.download({ url: '/pay/order/export-excel', params })
+}

+ 116 - 0
src/api/pay/refund/index.ts

@@ -0,0 +1,116 @@
+import request from '@/config/axios'
+
+export interface RefundVO {
+  id: number
+  merchantId: number
+  appId: number
+  channelId: number
+  channelCode: string
+  orderId: string
+  tradeNo: string
+  merchantOrderId: string
+  merchantRefundNo: string
+  notifyUrl: string
+  notifyStatus: number
+  status: number
+  type: number
+  payAmount: number
+  refundAmount: number
+  reason: string
+  userIp: string
+  channelOrderNo: string
+  channelRefundNo: string
+  channelErrorCode: string
+  channelErrorMsg: string
+  channelExtras: string
+  expireTime: Date
+  successTime: Date
+  notifyTime: Date
+  createTime: Date
+}
+
+export interface RefundPageReqVO extends PageParam {
+  merchantId?: number
+  appId?: number
+  channelId?: number
+  channelCode?: string
+  orderId?: string
+  tradeNo?: string
+  merchantOrderId?: string
+  merchantRefundNo?: string
+  notifyUrl?: string
+  notifyStatus?: number
+  status?: number
+  type?: number
+  payAmount?: number
+  refundAmount?: number
+  reason?: string
+  userIp?: string
+  channelOrderNo?: string
+  channelRefundNo?: string
+  channelErrorCode?: string
+  channelErrorMsg?: string
+  channelExtras?: string
+  expireTime?: Date[]
+  successTime?: Date[]
+  notifyTime?: Date[]
+  createTime?: Date[]
+}
+
+export interface PayRefundExportReqVO {
+  merchantId?: number
+  appId?: number
+  channelId?: number
+  channelCode?: string
+  orderId?: string
+  tradeNo?: string
+  merchantOrderId?: string
+  merchantRefundNo?: string
+  notifyUrl?: string
+  notifyStatus?: number
+  status?: number
+  type?: number
+  payAmount?: number
+  refundAmount?: number
+  reason?: string
+  userIp?: string
+  channelOrderNo?: string
+  channelRefundNo?: string
+  channelErrorCode?: string
+  channelErrorMsg?: string
+  channelExtras?: string
+  expireTime?: Date[]
+  successTime?: Date[]
+  notifyTime?: Date[]
+  createTime?: Date[]
+}
+
+// 查询列表退款订单
+export const getRefundPageApi = (params: RefundPageReqVO) => {
+  return request.get({ url: '/pay/refund/page', params })
+}
+
+// 查询详情退款订单
+export const getRefundApi = (id: number) => {
+  return request.get({ url: '/pay/refund/get?id=' + id })
+}
+
+// 新增退款订单
+export const createRefundApi = (data: RefundVO) => {
+  return request.post({ url: '/pay/refund/create', data })
+}
+
+// 修改退款订单
+export const updateRefundApi = (data: RefundVO) => {
+  return request.put({ url: '/pay/refund/update', data })
+}
+
+// 删除退款订单
+export const deleteRefundApi = (id: number) => {
+  return request.delete({ url: '/pay/refund/delete?id=' + id })
+}
+
+// 导出退款订单
+export const exportRefundApi = (params: PayRefundExportReqVO) => {
+  return request.download({ url: '/pay/refund/export-excel', params })
+}

+ 48 - 0
src/api/system/dept/index.ts

@@ -0,0 +1,48 @@
+import request from '@/config/axios'
+
+export interface DeptVO {
+  id?: number
+  name: string
+  parentId: number
+  status: number
+  sort: number
+  leaderUserId: number
+  phone: string
+  email: string
+  createTime: Date
+}
+
+export interface DeptPageReqVO {
+  name?: string
+  status?: number
+}
+
+// 查询部门(精简)列表
+export const listSimpleDeptApi = async () => {
+  return await request.get({ url: '/system/dept/list-all-simple' })
+}
+
+// 查询部门列表
+export const getDeptPageApi = async (params: DeptPageReqVO) => {
+  return await request.get({ url: '/system/dept/list', params })
+}
+
+// 查询部门详情
+export const getDeptApi = async (id: number) => {
+  return await request.get({ url: '/system/dept/get?id=' + id })
+}
+
+// 新增部门
+export const createDeptApi = async (data: DeptVO) => {
+  return await request.post({ url: '/system/dept/create', data: data })
+}
+
+// 修改部门
+export const updateDeptApi = async (params: DeptVO) => {
+  return await request.put({ url: '/system/dept/update', data: params })
+}
+
+// 删除部门
+export const deleteDeptApi = async (id: number) => {
+  return await request.delete({ url: '/system/dept/delete?id=' + id })
+}

+ 36 - 0
src/api/system/dict/dict.data.ts

@@ -0,0 +1,36 @@
+import request from '@/config/axios'
+import type { DictDataVO, DictDataPageReqVO, DictDataExportReqVO } from './types'
+
+// 查询字典数据(精简)列表
+export const listSimpleDictDataApi = () => {
+  return request.get({ url: '/system/dict-data/list-all-simple' })
+}
+
+// 查询字典数据列表
+export const getDictDataPageApi = (params: DictDataPageReqVO) => {
+  return request.get({ url: '/system/dict-data/page', params })
+}
+
+// 查询字典数据详情
+export const getDictDataApi = (id: number) => {
+  return request.get({ url: '/system/dict-data/get?id=' + id })
+}
+
+// 新增字典数据
+export const createDictDataApi = (data: DictDataVO) => {
+  return request.post({ url: '/system/dict-data/create', data })
+}
+
+// 修改字典数据
+export const updateDictDataApi = (data: DictDataVO) => {
+  return request.put({ url: '/system/dict-data/update', data })
+}
+
+// 删除字典数据
+export const deleteDictDataApi = (id: number) => {
+  return request.delete({ url: '/system/dict-data/delete?id=' + id })
+}
+// 导出字典类型数据
+export const exportDictDataApi = (params: DictDataExportReqVO) => {
+  return request.get({ url: '/system/dict-data/export', params })
+}

+ 36 - 0
src/api/system/dict/dict.type.ts

@@ -0,0 +1,36 @@
+import request from '@/config/axios'
+import type { DictTypeVO, DictTypePageReqVO, DictTypeExportReqVO } from './types'
+
+// 查询字典(精简)列表
+export const listSimpleDictTypeApi = () => {
+  return request.get({ url: '/system/dict-type/list-all-simple' })
+}
+
+// 查询字典列表
+export const getDictTypePageApi = (params: DictTypePageReqVO) => {
+  return request.get({ url: '/system/dict-type/page', params })
+}
+
+// 查询字典详情
+export const getDictTypeApi = (id: number) => {
+  return request.get({ url: '/system/dict-type/get?id=' + id })
+}
+
+// 新增字典
+export const createDictTypeApi = (data: DictTypeVO) => {
+  return request.post({ url: '/system/dict-type/create', data })
+}
+
+// 修改字典
+export const updateDictTypeApi = (data: DictTypeVO) => {
+  return request.put({ url: '/system/dict-type/update', data })
+}
+
+// 删除字典
+export const deleteDictTypeApi = (id: number) => {
+  return request.delete({ url: '/system/dict-type/delete?id=' + id })
+}
+// 导出字典类型
+export const exportDictTypeApi = (params: DictTypeExportReqVO) => {
+  return request.get({ url: '/system/dict-type/export', params })
+}

+ 46 - 0
src/api/system/dict/types.ts

@@ -0,0 +1,46 @@
+export type DictTypeVO = {
+  id: number
+  name: string
+  type: string
+  status: number
+  remark: string
+  createTime: Date
+}
+
+export type DictTypePageReqVO = {
+  name: string
+  type: string
+  status: number
+  createTime: Date[]
+}
+
+export type DictTypeExportReqVO = {
+  name: string
+  type: string
+  status: number
+  createTime: Date[]
+}
+
+export type DictDataVO = {
+  id: number
+  sort: number
+  label: string
+  value: string
+  dictType: string
+  status: number
+  colorType: string
+  cssClass: string
+  remark: string
+  createTime: Date
+}
+export type DictDataPageReqVO = {
+  label: string
+  dictType: string
+  status: number
+}
+
+export type DictDataExportReqVO = {
+  label: string
+  dictType: string
+  status: number
+}

+ 48 - 0
src/api/system/errorCode/index.ts

@@ -0,0 +1,48 @@
+import request from '@/config/axios'
+
+export interface ErrorCodeVO {
+  id: number
+  type: number
+  applicationName: string
+  code: number
+  message: string
+  memo: string
+  createTime: Date
+}
+
+export interface ErrorCodePageReqVO extends PageParam {
+  type?: number
+  applicationName?: string
+  code?: number
+  message?: string
+  createTime?: Date[]
+}
+
+// 查询错误码列表
+export const getErrorCodePageApi = (params: ErrorCodePageReqVO) => {
+  return request.get({ url: '/system/error-code/page', params })
+}
+
+// 查询错误码详情
+export const getErrorCodeApi = (id: number) => {
+  return request.get({ url: '/system/error-code/get?id=' + id })
+}
+
+// 新增错误码
+export const createErrorCodeApi = (data: ErrorCodeVO) => {
+  return request.post({ url: '/system/error-code/create', data })
+}
+
+// 修改错误码
+export const updateErrorCodeApi = (data: ErrorCodeVO) => {
+  return request.put({ url: '/system/error-code/update', data })
+}
+
+// 删除错误码
+export const deleteErrorCodeApi = (id: number) => {
+  return request.delete({ url: '/system/error-code/delete?id=' + id })
+}
+// 导出错误码
+export const excelErrorCodeApi = (params: ErrorCodePageReqVO) => {
+  return request.download({ url: '/system/error-code/export-excel', params })
+}

+ 30 - 0
src/api/system/loginLog/index.ts

@@ -0,0 +1,30 @@
+import request from '@/config/axios'
+
+export interface LoginLogVO {
+  id: number
+  logType: number
+  traceId: number
+  userId: number
+  userType: number
+  username: string
+  status: number
+  userIp: string
+  userAgent: string
+  createTime: Date
+}
+
+export interface LoginLogReqVO extends PageParam {
+  userIp?: string
+  username?: string
+  status?: boolean
+  createTime?: Date[]
+}
+
+// 查询登录日志列表
+export const getLoginLogPageApi = (params: LoginLogReqVO) => {
+  return request.get({ url: '/system/login-log/page', params })
+}
+// 导出登录日志
+export const exportLoginLogApi = (params: LoginLogReqVO) => {
+  return request.download({ url: '/system/login-log/export', params })
+}

+ 46 - 0
src/api/system/mail/account/index.ts

@@ -0,0 +1,46 @@
+import request from '@/config/axios'
+
+export interface MailAccountVO {
+  id: number
+  mail: string
+  username: string
+  password: string
+  host: string
+  port: number
+  sslEnable: boolean
+}
+
+export interface MailAccountPageReqVO extends PageParam {
+  mail?: string
+  username?: string
+}
+
+// 查询邮箱账号列表
+export const getMailAccountPageApi = async (params: MailAccountPageReqVO) => {
+  return await request.get({ url: '/system/mail-account/page', params })
+}
+
+// 查询邮箱账号详情
+export const getMailAccountApi = async (id: number) => {
+  return await request.get({ url: '/system/mail-account/get?id=' + id })
+}
+
+// 新增邮箱账号
+export const createMailAccountApi = async (data: MailAccountVO) => {
+  return await request.post({ url: '/system/mail-account/create', data })
+}
+
+// 修改邮箱账号
+export const updateMailAccountApi = async (data: MailAccountVO) => {
+  return await request.put({ url: '/system/mail-account/update', data })
+}
+
+// 删除邮箱账号
+export const deleteMailAccountApi = async (id: number) => {
+  return await request.delete({ url: '/system/mail-account/delete?id=' + id })
+}
+
+// 获得邮箱账号精简列表
+export const getSimpleMailAccounts = async () => {
+  return request.get({ url: '/system/mail-account/list-all-simple' })
+}

+ 40 - 0
src/api/system/mail/log/index.ts

@@ -0,0 +1,40 @@
+import request from '@/config/axios'
+
+export interface MailLogVO {
+  id: number
+  userId: number
+  userType: number
+  toMail: string
+  accountId: number
+  fromMail: string
+  templateId: number
+  templateCode: string
+  templateNickname: string
+  templateTitle: string
+  templateContent: string
+  templateParams: string
+  sendStatus: number
+  sendTime: Date
+  sendMessageId: string
+  sendException: string
+}
+
+export interface MailLogPageReqVO extends PageParam {
+  userId?: number
+  userType?: number
+  toMail?: string
+  accountId?: number
+  templateId?: number
+  sendStatus?: number
+  sendTime?: Date[]
+}
+
+// 查询邮件日志列表
+export const getMailLogPageApi = async (params: MailLogPageReqVO) => {
+  return await request.get({ url: '/system/mail-log/page', params })
+}
+
+// 查询邮件日志详情
+export const getMailLogApi = async (id: number) => {
+  return await request.get({ url: '/system/mail-log/get?id=' + id })
+}

+ 58 - 0
src/api/system/mail/template/index.ts

@@ -0,0 +1,58 @@
+import request from '@/config/axios'
+
+export interface MailTemplateVO {
+  id: number
+  name: string
+  code: string
+  accountId: number
+  nickname: string
+  title: string
+  content: string
+  params: string
+  status: number
+  remark: string
+}
+
+export interface MailTemplatePageReqVO extends PageParam {
+  name?: string
+  code?: string
+  accountId?: number
+  status?: number
+  createTime?: Date[]
+}
+
+export interface MailSendReqVO {
+  mail: string
+  templateCode: string
+  templateParams: Map<String, Object>
+}
+
+// 查询邮件模版列表
+export const getMailTemplatePageApi = async (params: MailTemplatePageReqVO) => {
+  return await request.get({ url: '/system/mail-template/page', params })
+}
+
+// 查询邮件模版详情
+export const getMailTemplateApi = async (id: number) => {
+  return await request.get({ url: '/system/mail-template/get?id=' + id })
+}
+
+// 新增邮件模版
+export const createMailTemplateApi = async (data: MailTemplateVO) => {
+  return await request.post({ url: '/system/mail-template/create', data })
+}
+
+// 修改邮件模版
+export const updateMailTemplateApi = async (data: MailTemplateVO) => {
+  return await request.put({ url: '/system/mail-template/update', data })
+}
+
+// 删除邮件模版
+export const deleteMailTemplateApi = async (id: number) => {
+  return await request.delete({ url: '/system/mail-template/delete?id=' + id })
+}
+
+// 发送邮件
+export const sendMailApi = (data: MailSendReqVO) => {
+  return request.post({ url: '/system/mail-template/send-mail', data })
+}

+ 54 - 0
src/api/system/menu/index.ts

@@ -0,0 +1,54 @@
+import request from '@/config/axios'
+
+export interface MenuVO {
+  id: number
+  name: string
+  permission: string
+  type: number
+  sort: number
+  parentId: number
+  path: string
+  icon: string
+  component: string
+  componentName?: string
+  status: number
+  visible: boolean
+  keepAlive: boolean
+  alwaysShow?: boolean
+  createTime: Date
+}
+
+export interface MenuPageReqVO {
+  name?: string
+  status?: number
+}
+
+// 查询菜单(精简)列表
+export const listSimpleMenusApi = () => {
+  return request.get({ url: '/system/menu/list-all-simple' })
+}
+
+// 查询菜单列表
+export const getMenuListApi = (params: MenuPageReqVO) => {
+  return request.get({ url: '/system/menu/list', params })
+}
+
+// 获取菜单详情
+export const getMenuApi = (id: number) => {
+  return request.get({ url: '/system/menu/get?id=' + id })
+}
+
+// 新增菜单
+export const createMenuApi = (data: MenuVO) => {
+  return request.post({ url: '/system/menu/create', data })
+}
+
+// 修改菜单
+export const updateMenuApi = (data: MenuVO) => {
+  return request.put({ url: '/system/menu/update', data })
+}
+
+// 删除菜单
+export const deleteMenuApi = (id: number) => {
+  return request.delete({ url: '/system/menu/delete?id=' + id })
+}

+ 42 - 0
src/api/system/notice/index.ts

@@ -0,0 +1,42 @@
+import request from '@/config/axios'
+
+export interface NoticeVO {
+  id: number
+  title: string
+  type: number
+  content: string
+  status: number
+  remark: string
+  creator: string
+  createTime: Date
+}
+
+export interface NoticePageReqVO extends PageParam {
+  title?: string
+  status?: number
+}
+
+// 查询公告列表
+export const getNoticePageApi = (params: NoticePageReqVO) => {
+  return request.get({ url: '/system/notice/page', params })
+}
+
+// 查询公告详情
+export const getNoticeApi = (id: number) => {
+  return request.get({ url: '/system/notice/get?id=' + id })
+}
+
+// 新增公告
+export const createNoticeApi = (data: NoticeVO) => {
+  return request.post({ url: '/system/notice/create', data })
+}
+
+// 修改公告
+export const updateNoticeApi = (data: NoticeVO) => {
+  return request.put({ url: '/system/notice/update', data })
+}
+
+// 删除公告
+export const deleteNoticeApi = (id: number) => {
+  return request.delete({ url: '/system/notice/delete?id=' + id })
+}

+ 66 - 0
src/api/system/notify/message/index.ts

@@ -0,0 +1,66 @@
+import request from '@/config/axios'
+import qs from 'qs'
+
+export interface NotifyMessageVO {
+  id: number
+  userId: number
+  userType: number
+  templateId: number
+  templateCode: string
+  templateNickname: string
+  templateContent: string
+  templateType: number
+  templateParams: string
+  readStatus: boolean
+  readTime: Date
+}
+
+export interface NotifyMessagePageReqVO extends PageParam {
+  userId?: number
+  userType?: number
+  templateCode?: string
+  templateType?: number
+  createTime?: Date[]
+}
+
+export interface NotifyMessageMyPageReqVO extends PageParam {
+  readStatus?: boolean
+  createTime?: Date[]
+}
+
+// 查询站内信消息列表
+export const getNotifyMessagePageApi = async (params: NotifyMessagePageReqVO) => {
+  return await request.get({ url: '/system/notify-message/page', params })
+}
+
+// 查询站内信消息详情
+export const getNotifyMessageApi = async (id: number) => {
+  return await request.get({ url: '/system/notify-message/get?id=' + id })
+}
+
+// 获得我的站内信分页
+export const getMyNotifyMessagePage = async (params: NotifyMessageMyPageReqVO) => {
+  return await request.get({ url: '/system/notify-message/my-page', params })
+}
+
+// 批量标记已读
+export const updateNotifyMessageRead = async (ids) => {
+  return await request.put({
+    url: '/system/notify-message/update-read?' + qs.stringify({ ids: ids }, { indices: false })
+  })
+}
+
+// 标记所有站内信为已读
+export const updateAllNotifyMessageRead = async () => {
+  return await request.put({ url: '/system/notify-message/update-all-read' })
+}
+
+// 获取当前用户的最新站内信列表
+export const getUnreadNotifyMessageListApi = async () => {
+  return await request.get({ url: '/system/notify-message/get-unread-list' })
+}
+
+// 获得当前用户的未读站内信数量
+export const getUnreadNotifyMessageCountApi = async () => {
+  return await request.get({ url: '/system/notify-message/get-unread-count' })
+}

+ 55 - 0
src/api/system/notify/template/index.ts

@@ -0,0 +1,55 @@
+import request from '@/config/axios'
+
+export interface NotifyTemplateVO {
+  id: number
+  name: string
+  code: string
+  content: string
+  type: number
+  params: string
+  status: number
+  remark: string
+}
+
+export interface NotifyTemplatePageReqVO extends PageParam {
+  name?: string
+  code?: string
+  status?: number
+  createTime?: Date[]
+}
+
+export interface NotifySendReqVO {
+  userId: number
+  templateCode: string
+  templateParams: Map<String, Object>
+}
+
+// 查询站内信模板列表
+export const getNotifyTemplatePageApi = async (params: NotifyTemplatePageReqVO) => {
+  return await request.get({ url: '/system/notify-template/page', params })
+}
+
+// 查询站内信模板详情
+export const getNotifyTemplateApi = async (id: number) => {
+  return await request.get({ url: '/system/notify-template/get?id=' + id })
+}
+
+// 新增站内信模板
+export const createNotifyTemplateApi = async (data: NotifyTemplateVO) => {
+  return await request.post({ url: '/system/notify-template/create', data })
+}
+
+// 修改站内信模板
+export const updateNotifyTemplateApi = async (data: NotifyTemplateVO) => {
+  return await request.put({ url: '/system/notify-template/update', data })
+}
+
+// 删除站内信模板
+export const deleteNotifyTemplateApi = async (id: number) => {
+  return await request.delete({ url: '/system/notify-template/delete?id=' + id })
+}
+
+// 发送站内信
+export const sendNotifyApi = (data: NotifySendReqVO) => {
+  return request.post({ url: '/system/notify-template/send-notify', data })
+}

+ 51 - 0
src/api/system/oauth2/client.ts

@@ -0,0 +1,51 @@
+import request from '@/config/axios'
+
+export interface OAuth2ClientVO {
+  id: number
+  clientId: string
+  secret: string
+  name: string
+  logo: string
+  description: string
+  status: number
+  accessTokenValiditySeconds: number
+  refreshTokenValiditySeconds: number
+  redirectUris: string[]
+  autoApprove: boolean
+  authorizedGrantTypes: string[]
+  scopes: string[]
+  authorities: string[]
+  resourceIds: string[]
+  additionalInformation: string
+  isAdditionalInformationJson: boolean
+  createTime: Date
+}
+
+export interface OAuth2ClientPageReqVO extends PageParam {
+  name?: string
+  status?: number
+}
+// 查询 OAuth2列表
+export const getOAuth2ClientPageApi = (params: OAuth2ClientPageReqVO) => {
+  return request.get({ url: '/system/oauth2-client/page', params })
+}
+
+// 查询 OAuth2详情
+export const getOAuth2ClientApi = (id: number) => {
+  return request.get({ url: '/system/oauth2-client/get?id=' + id })
+}
+
+// 新增 OAuth2
+export const createOAuth2ClientApi = (data: OAuth2ClientVO) => {
+  return request.post({ url: '/system/oauth2-client/create', data })
+}
+
+// 修改 OAuth2
+export const updateOAuth2ClientApi = (data: OAuth2ClientVO) => {
+  return request.put({ url: '/system/oauth2-client/update', data })
+}
+
+// 删除 OAuth2
+export const deleteOAuth2ClientApi = (id: number) => {
+  return request.delete({ url: '/system/oauth2-client/delete?id=' + id })
+}

+ 28 - 0
src/api/system/oauth2/token.ts

@@ -0,0 +1,28 @@
+import request from '@/config/axios'
+
+export interface OAuth2TokenVO {
+  id: number
+  accessToken: string
+  refreshToken: string
+  userId: number
+  userType: number
+  clientId: string
+  createTime: Date
+  expiresTime: Date
+}
+
+export interface OAuth2TokenPageReqVO extends PageParam {
+  userId?: number
+  userType?: number
+  clientId?: string
+}
+
+// 查询 token列表
+export const getAccessTokenPageApi = (params: OAuth2TokenPageReqVO) => {
+  return request.get({ url: '/system/oauth2-token/page', params })
+}
+
+// 删除 token
+export const deleteAccessTokenApi = (accessToken: number) => {
+  return request.delete({ url: '/system/oauth2-token/delete?accessToken=' + accessToken })
+}

+ 41 - 0
src/api/system/operatelog/index.ts

@@ -0,0 +1,41 @@
+import request from '@/config/axios'
+
+export type OperateLogVO = {
+  id: number
+  userNickname: string
+  traceId: string
+  userId: number
+  module: string
+  name: string
+  type: number
+  content: string
+  exts: Map<String, Object>
+  requestMethod: string
+  requestUrl: string
+  userIp: string
+  userAgent: string
+  javaMethod: string
+  javaMethodArgs: string
+  startTime: Date
+  duration: number
+  resultCode: number
+  resultMsg: string
+  resultData: string
+}
+
+export interface OperateLogPageReqVO extends PageParam {
+  module?: string
+  userNickname?: string
+  type?: number
+  success?: boolean
+  startTime?: Date[]
+}
+
+// 查询操作日志列表
+export const getOperateLogPageApi = (params: OperateLogPageReqVO) => {
+  return request.get({ url: '/system/operate-log/page', params })
+}
+// 导出操作日志
+export const exportOperateLogApi = (params: OperateLogPageReqVO) => {
+  return request.download({ url: '/system/operate-log/export', params })
+}

+ 42 - 0
src/api/system/permission/index.ts

@@ -0,0 +1,42 @@
+import request from '@/config/axios'
+
+export interface PermissionAssignUserRoleReqVO {
+  userId: number
+  roleIds: number[]
+}
+
+export interface PermissionAssignRoleMenuReqVO {
+  roleId: number
+  menuIds: number[]
+}
+
+export interface PermissionAssignRoleDataScopeReqVO {
+  roleId: number
+  dataScope: number
+  dataScopeDeptIds: number[]
+}
+
+// 查询角色拥有的菜单权限
+export const listRoleMenusApi = async (roleId: number) => {
+  return await request.get({ url: '/system/permission/list-role-resources?roleId=' + roleId })
+}
+
+// 赋予角色菜单权限
+export const assignRoleMenuApi = async (data: PermissionAssignRoleMenuReqVO) => {
+  return await request.post({ url: '/system/permission/assign-role-menu', data })
+}
+
+// 赋予角色数据权限
+export const assignRoleDataScopeApi = async (data: PermissionAssignRoleDataScopeReqVO) => {
+  return await request.post({ url: '/system/permission/assign-role-data-scope', data })
+}
+
+// 查询用户拥有的角色数组
+export const listUserRolesApi = async (userId: number) => {
+  return await request.get({ url: '/system/permission/list-user-roles?userId=' + userId })
+}
+
+// 赋予用户角色
+export const aassignUserRoleApi = async (data: PermissionAssignUserRoleReqVO) => {
+  return await request.post({ url: '/system/permission/assign-user-role', data })
+}

+ 58 - 0
src/api/system/post/index.ts

@@ -0,0 +1,58 @@
+import request from '@/config/axios'
+
+export interface PostVO {
+  id?: number
+  name: string
+  code: string
+  sort: number
+  status: number
+  remark: string
+  createTime?: Date
+}
+
+export interface PostPageReqVO extends PageParam {
+  code?: string
+  name?: string
+  status?: number
+}
+
+export interface PostExportReqVO {
+  code?: string
+  name?: string
+  status?: number
+}
+
+// 查询岗位列表
+export const getPostPageApi = async (params: PostPageReqVO) => {
+  return await request.get({ url: '/system/post/page', params })
+}
+
+// 获取岗位精简信息列表
+export const listSimplePostsApi = async () => {
+  return await request.get({ url: '/system/post/list-all-simple' })
+}
+
+// 查询岗位详情
+export const getPostApi = async (id: number) => {
+  return await request.get({ url: '/system/post/get?id=' + id })
+}
+
+// 新增岗位
+export const createPostApi = async (data: PostVO) => {
+  return await request.post({ url: '/system/post/create', data })
+}
+
+// 修改岗位
+export const updatePostApi = async (data: PostVO) => {
+  return await request.put({ url: '/system/post/update', data })
+}
+
+// 删除岗位
+export const deletePostApi = async (id: number) => {
+  return await request.delete({ url: '/system/post/delete?id=' + id })
+}
+
+// 导出岗位
+export const exportPostApi = async (params: PostExportReqVO) => {
+  return await request.download({ url: '/system/post/export', params })
+}

+ 58 - 0
src/api/system/role/index.ts

@@ -0,0 +1,58 @@
+import request from '@/config/axios'
+
+export interface RoleVO {
+  id: number
+  name: string
+  code: string
+  sort: number
+  status: number
+  type: number
+  createTime: Date
+}
+
+export interface RolePageReqVO extends PageParam {
+  name?: string
+  code?: string
+  status?: number
+  createTime?: Date[]
+}
+
+export interface UpdateStatusReqVO {
+  id: number
+  status: number
+}
+
+// 查询角色列表
+export const getRolePageApi = async (params: RolePageReqVO) => {
+  return await request.get({ url: '/system/role/page', params })
+}
+
+// 查询角色(精简)列表
+export const listSimpleRolesApi = async () => {
+  return await request.get({ url: '/system/role/list-all-simple' })
+}
+
+// 查询角色详情
+export const getRoleApi = async (id: number) => {
+  return await request.get({ url: '/system/role/get?id=' + id })
+}
+
+// 新增角色
+export const createRoleApi = async (data: RoleVO) => {
+  return await request.post({ url: '/system/role/create', data })
+}
+
+// 修改角色
+export const updateRoleApi = async (data: RoleVO) => {
+  return await request.put({ url: '/system/role/update', data })
+}
+
+// 修改角色状态
+export const updateRoleStatusApi = async (data: UpdateStatusReqVO) => {
+  return await request.put({ url: '/system/role/update-status', data })
+}
+
+// 删除角色
+export const deleteRoleApi = async (id: number) => {
+  return await request.delete({ url: '/system/role/delete?id=' + id })
+}

+ 64 - 0
src/api/system/sensitiveWord/index.ts

@@ -0,0 +1,64 @@
+import request from '@/config/axios'
+
+export interface SensitiveWordVO {
+  id: number
+  name: string
+  status: number
+  description: string
+  tags: string[]
+  createTime: Date
+}
+
+export interface SensitiveWordPageReqVO extends PageParam {
+  name?: string
+  tag?: string
+  status?: number
+  createTime?: Date[]
+}
+
+export interface SensitiveWordExportReqVO {
+  name?: string
+  tag?: string
+  status?: number
+  createTime?: Date[]
+}
+
+// 查询敏感词列表
+export const getSensitiveWordPageApi = (params: SensitiveWordPageReqVO) => {
+  return request.get({ url: '/system/sensitive-word/page', params })
+}
+
+// 查询敏感词详情
+export const getSensitiveWordApi = (id: number) => {
+  return request.get({ url: '/system/sensitive-word/get?id=' + id })
+}
+
+// 新增敏感词
+export const createSensitiveWordApi = (data: SensitiveWordVO) => {
+  return request.post({ url: '/system/sensitive-word/create', data })
+}
+
+// 修改敏感词
+export const updateSensitiveWordApi = (data: SensitiveWordVO) => {
+  return request.put({ url: '/system/sensitive-word/update', data })
+}
+
+// 删除敏感词
+export const deleteSensitiveWordApi = (id: number) => {
+  return request.delete({ url: '/system/sensitive-word/delete?id=' + id })
+}
+
+// 导出敏感词
+export const exportSensitiveWordApi = (params: SensitiveWordExportReqVO) => {
+  return request.download({ url: '/system/sensitive-word/export-excel', params })
+}
+
+// 获取所有敏感词的标签数组
+export const getSensitiveWordTagsApi = () => {
+  return request.get({ url: '/system/sensitive-word/get-tags' })
+}
+
+// 获得文本所包含的不合法的敏感词数组
+export const validateTextApi = (id: number) => {
+  return request.get({ url: '/system/sensitive-word/validate-text?' + id })
+}

+ 50 - 0
src/api/system/sms/smsChannel/index.ts

@@ -0,0 +1,50 @@
+import request from '@/config/axios'
+
+export interface SmsChannelVO {
+  id: number
+  code: string
+  status: number
+  signature: string
+  remark: string
+  apiKey: string
+  apiSecret: string
+  callbackUrl: string
+  createTime: Date
+}
+
+export interface SmsChannelPageReqVO extends PageParam {
+  signature?: string
+  code?: string
+  status?: number
+  createTime?: Date[]
+}
+
+// 查询短信渠道列表
+export const getSmsChannelPageApi = (params: SmsChannelPageReqVO) => {
+  return request.get({ url: '/system/sms-channel/page', params })
+}
+
+// 获得短信渠道精简列表
+export function getSimpleSmsChannels() {
+  return request.get({ url: '/system/sms-channel/list-all-simple' })
+}
+
+// 查询短信渠道详情
+export const getSmsChannelApi = (id: number) => {
+  return request.get({ url: '/system/sms-channel/get?id=' + id })
+}
+
+// 新增短信渠道
+export const createSmsChannelApi = (data: SmsChannelVO) => {
+  return request.post({ url: '/system/sms-channel/create', data })
+}
+
+// 修改短信渠道
+export const updateSmsChannelApi = (data: SmsChannelVO) => {
+  return request.put({ url: '/system/sms-channel/update', data })
+}
+
+// 删除短信渠道
+export const deleteSmsChannelApi = (id: number) => {
+  return request.delete({ url: '/system/sms-channel/delete?id=' + id })
+}

+ 57 - 0
src/api/system/sms/smsLog/index.ts

@@ -0,0 +1,57 @@
+import request from '@/config/axios'
+
+export interface SmsLogVO {
+  id: number
+  channelId: number
+  channelCode: string
+  templateId: number
+  templateCode: string
+  templateType: number
+  templateContent: string
+  templateParams: Map<string, object>
+  mobile: string
+  userId: number
+  userType: number
+  sendStatus: number
+  sendTime: Date
+  sendCode: number
+  sendMsg: string
+  apiSendCode: string
+  apiSendMsg: string
+  apiRequestId: string
+  apiSerialNo: string
+  receiveStatus: number
+  receiveTime: Date
+  apiReceiveCode: string
+  apiReceiveMsg: string
+  createTime: Date
+}
+
+export interface SmsLogPageReqVO extends PageParam {
+  channelId?: number
+  templateId?: number
+  mobile?: string
+  sendStatus?: number
+  sendTime?: Date[]
+  receiveStatus?: number
+  receiveTime?: Date[]
+}
+export interface SmsLogExportReqVO {
+  channelId?: number
+  templateId?: number
+  mobile?: string
+  sendStatus?: number
+  sendTime?: Date[]
+  receiveStatus?: number
+  receiveTime?: Date[]
+}
+
+// 查询短信日志列表
+export const getSmsLogPageApi = (params: SmsLogPageReqVO) => {
+  return request.get({ url: '/system/sms-log/page', params })
+}
+
+// 导出短信日志
+export const exportSmsLogApi = (params: SmsLogExportReqVO) => {
+  return request.download({ url: '/system/sms-log/export', params })
+}

+ 80 - 0
src/api/system/sms/smsTemplate/index.ts

@@ -0,0 +1,80 @@
+import request from '@/config/axios'
+
+export interface SmsTemplateVO {
+  id: number
+  type: number
+  status: number
+  code: string
+  name: string
+  content: string
+  remark: string
+  apiTemplateId: string
+  channelId: number
+  channelCode: string
+  params: string[]
+  createTime: Date
+}
+
+export interface SendSmsReqVO {
+  mobile: string
+  templateCode: string
+  templateParams: Map<String, Object>
+}
+
+export interface SmsTemplatePageReqVO {
+  type?: number
+  status?: number
+  code?: string
+  content?: string
+  apiTemplateId?: string
+  channelId?: number
+  createTime?: Date[]
+}
+
+export interface SmsTemplateExportReqVO {
+  type?: number
+  status?: number
+  code?: string
+  content?: string
+  apiTemplateId?: string
+  channelId?: number
+  createTime?: Date[]
+}
+
+// 查询短信模板列表
+export const getSmsTemplatePageApi = (params: SmsTemplatePageReqVO) => {
+  return request.get({ url: '/system/sms-template/page', params })
+}
+
+// 查询短信模板详情
+export const getSmsTemplateApi = (id: number) => {
+  return request.get({ url: '/system/sms-template/get?id=' + id })
+}
+
+// 新增短信模板
+export const createSmsTemplateApi = (data: SmsTemplateVO) => {
+  return request.post({ url: '/system/sms-template/create', data })
+}
+
+// 修改短信模板
+export const updateSmsTemplateApi = (data: SmsTemplateVO) => {
+  return request.put({ url: '/system/sms-template/update', data })
+}
+
+// 删除短信模板
+export const deleteSmsTemplateApi = (id: number) => {
+  return request.delete({ url: '/system/sms-template/delete?id=' + id })
+}
+
+// 发送短信
+export const sendSmsApi = (data: SendSmsReqVO) => {
+  return request.post({ url: '/system/sms-template/send-sms', data })
+}
+
+// 导出短信模板
+export const exportPostApi = (params: SmsTemplateExportReqVO) => {
+  return request.download({
+    url: '/system/sms-template/export-excel',
+    params
+  })
+}

+ 62 - 0
src/api/system/tenant/index.ts

@@ -0,0 +1,62 @@
+import request from '@/config/axios'
+
+export interface TenantVO {
+  id: number
+  name: string
+  contactName: string
+  contactMobile: string
+  status: number
+  domain: string
+  packageId: number
+  username: string
+  password: string
+  expireTime: Date
+  accountCount: number
+  createTime: Date
+}
+
+export interface TenantPageReqVO extends PageParam {
+  name?: string
+  contactName?: string
+  contactMobile?: string
+  status?: number
+  createTime?: Date[]
+}
+
+export interface TenantExportReqVO {
+  name?: string
+  contactName?: string
+  contactMobile?: string
+  status?: number
+  createTime?: Date[]
+}
+
+// 查询租户列表
+export const getTenantPageApi = (params: TenantPageReqVO) => {
+  return request.get({ url: '/system/tenant/page', params })
+}
+
+// 查询租户详情
+export const getTenantApi = (id: number) => {
+  return request.get({ url: '/system/tenant/get?id=' + id })
+}
+
+// 新增租户
+export const createTenantApi = (data: TenantVO) => {
+  return request.post({ url: '/system/tenant/create', data })
+}
+
+// 修改租户
+export const updateTenantApi = (data: TenantVO) => {
+  return request.put({ url: '/system/tenant/update', data })
+}
+
+// 删除租户
+export const deleteTenantApi = (id: number) => {
+  return request.delete({ url: '/system/tenant/delete?id=' + id })
+}
+
+// 导出租户
+export const exportTenantApi = (params: TenantExportReqVO) => {
+  return request.download({ url: '/system/tenant/export-excel', params })
+}

+ 49 - 0
src/api/system/tenantPackage/index.ts

@@ -0,0 +1,49 @@
+import request from '@/config/axios'
+
+export interface TenantPackageVO {
+  id: number
+  name: string
+  status: number
+  remark: string
+  creator: string
+  updater: string
+  updateTime: string
+  menuIds: number[]
+  createTime: Date
+}
+
+export interface TenantPackagePageReqVO extends PageParam {
+  name?: string
+  status?: number
+  remark?: string
+  createTime?: Date[]
+}
+
+// 查询租户套餐列表
+export const getTenantPackageTypePageApi = (params: TenantPackagePageReqVO) => {
+  return request.get({ url: '/system/tenant-package/page', params })
+}
+
+// 获得租户
+export const getTenantPackageApi = (id: number) => {
+  return request.get({ url: '/system/tenant-package/get?id=' + id })
+}
+
+// 新增租户套餐
+export const createTenantPackageTypeApi = (data: TenantPackageVO) => {
+  return request.post({ url: '/system/tenant-package/create', data })
+}
+
+// 修改租户套餐
+export const updateTenantPackageTypeApi = (data: TenantPackageVO) => {
+  return request.put({ url: '/system/tenant-package/update', data })
+}
+
+// 删除租户套餐
+export const deleteTenantPackageTypeApi = (id: number) => {
+  return request.delete({ url: '/system/tenant-package/delete?id=' + id })
+}
+// 获取租户套餐精简信息列表
+export const getTenantPackageList = () => {
+  return request.get({ url: '/system/tenant-package/get-simple-list' })
+}

+ 91 - 0
src/api/system/user/index.ts

@@ -0,0 +1,91 @@
+import request from '@/config/axios'
+
+export interface UserVO {
+  id: number
+  username: string
+  nickname: string
+  deptId: number
+  postIds: string[]
+  email: string
+  mobile: string
+  sex: number
+  avatar: string
+  loginIp: string
+  status: number
+  remark: string
+  loginDate: Date
+  createTime: Date
+}
+
+export interface UserPageReqVO extends PageParam {
+  deptId?: number
+  username?: string
+  mobile?: string
+  status?: number
+  createTime?: Date[]
+}
+
+export interface UserExportReqVO {
+  code?: string
+  name?: string
+  status?: number
+  createTime?: Date[]
+}
+
+// 查询用户管理列表
+export const getUserPageApi = (params: UserPageReqVO) => {
+  return request.get({ url: '/system/user/page', params })
+}
+
+// 查询用户详情
+export const getUserApi = (id: number) => {
+  return request.get({ url: '/system/user/get?id=' + id })
+}
+
+// 新增用户
+export const createUserApi = (data: UserVO) => {
+  return request.post({ url: '/system/user/create', data })
+}
+
+// 修改用户
+export const updateUserApi = (data: UserVO) => {
+  return request.put({ url: '/system/user/update', data })
+}
+
+// 删除用户
+export const deleteUserApi = (id: number) => {
+  return request.delete({ url: '/system/user/delete?id=' + id })
+}
+
+// 导出用户
+export const exportUserApi = (params: UserExportReqVO) => {
+  return request.download({ url: '/system/user/export', params })
+}
+
+// 下载用户导入模板
+export const importUserTemplateApi = () => {
+  return request.download({ url: '/system/user/get-import-template' })
+}
+
+// 用户密码重置
+export const resetUserPwdApi = (id: number, password: string) => {
+  const data = {
+    id,
+    password
+  }
+  return request.put({ url: '/system/user/update-password', data: data })
+}
+
+// 用户状态修改
+export const updateUserStatusApi = (id: number, status: number) => {
+  const data = {
+    id,
+    status
+  }
+  return request.put({ url: '/system/user/update-status', data: data })
+}
+
+// 获取用户精简信息列表
+export const getListSimpleUsersApi = () => {
+  return request.get({ url: '/system/user/list-all-simple' })
+}

+ 77 - 0
src/api/system/user/profile.ts

@@ -0,0 +1,77 @@
+import request from '@/config/axios'
+
+export interface ProfileDept {
+  id: number
+  name: string
+}
+export interface ProfileRole {
+  id: number
+  name: string
+}
+export interface ProfilePost {
+  id: number
+  name: string
+}
+export interface SocialUser {
+  id: number
+  type: number
+  openid: string
+  token: string
+  rawTokenInfo: string
+  nickname: string
+  avatar: string
+  rawUserInfo: string
+  code: string
+  state: string
+}
+export interface ProfileVO {
+  id: number
+  username: string
+  nickname: string
+  dept: ProfileDept
+  roles: ProfileRole[]
+  posts: ProfilePost[]
+  socialUsers: SocialUser[]
+  email: string
+  mobile: string
+  sex: number
+  avatar: string
+  status: number
+  remark: string
+  loginIp: string
+  loginDate: Date
+  createTime: Date
+}
+
+export interface UserProfileUpdateReqVO {
+  nickname: string
+  email: string
+  mobile: string
+  sex: number
+}
+
+// 查询用户个人信息
+export const getUserProfileApi = () => {
+  return request.get({ url: '/system/user/profile/get' })
+}
+
+// 修改用户个人信息
+export const updateUserProfileApi = (data: UserProfileUpdateReqVO) => {
+  return request.put({ url: '/system/user/profile/update', data })
+}
+
+// 用户密码重置
+export const updateUserPwdApi = (oldPassword: string, newPassword: string) => {
+  return request.put({
+    url: '/system/user/profile/update-password',
+    data: {
+      oldPassword: oldPassword,
+      newPassword: newPassword
+    }
+  })
+}
+
+// 用户头像上传
+export const uploadAvatarApi = (data) => {
+  return request.upload({ url: '/system/user/profile/update-avatar', data: data })
+}

+ 31 - 0
src/api/system/user/socialUser.ts

@@ -0,0 +1,31 @@
+import request from '@/config/axios'
+
+// 社交绑定,使用 code 授权码
+export const socialBind = (type, code, state) => {
+  return request.post({
+    url: '/system/social-user/bind',
+    data: {
+      type,
+      code,
+      state
+    }
+  })
+}
+
+// 取消社交绑定
+export const socialUnbind = (type, openid) => {
+  return request.delete({
+    url: '/system/social-user/unbind',
+    data: {
+      type,
+      openid
+    }
+  })
+}
+
+// 社交授权的跳转
+export const socialAuthRedirect = (type, redirectUri) => {
+  return request.get({
+    url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri
+  })
+}

BIN
src/assets/imgs/avatar.gif


BIN
src/assets/imgs/avatar.jpg


BIN
src/assets/imgs/logo.png


File diff suppressed because it is too large
+ 0 - 0
src/assets/svgs/403.svg


File diff suppressed because it is too large
+ 0 - 0
src/assets/svgs/404.svg


File diff suppressed because it is too large
+ 0 - 0
src/assets/svgs/500.svg


+ 1 - 0
src/assets/svgs/icon.svg

@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.147.062a13 13 0 014.94.945c1.55.63 2.907 1.526 4.069 2.688a13.148 13.148 0 012.761 4.069c.678 1.55 1.017 3.245 1.017 5.086v102.3c0 3.681-1.187 6.733-3.56 9.155-2.373 2.422-5.352 3.633-8.937 3.633H12.992c-3.875 0-7-1.26-9.373-3.779-2.373-2.518-3.56-5.667-3.56-9.445V12.704c0-3.39 1.163-6.345 3.488-8.863C5.872 1.32 8.972.062 12.847.062h102.3zM81.434 109.047c1.744 0 3.003-.412 3.778-1.235.775-.824 1.163-1.914 1.163-3.27 0-1.26-.388-2.325-1.163-3.197-.775-.872-2.034-1.307-3.778-1.307H72.57c.097-.194.145-.485.145-.872V27.09h9.01c1.743 0 2.954-.436 3.633-1.308.678-.872 1.017-1.938 1.017-3.197 0-1.26-.34-2.325-1.017-3.197-.679-.872-1.89-1.308-3.633-1.308H46.268c-1.743 0-2.954.436-3.632 1.308-.678.872-1.018 1.938-1.018 3.197 0 1.26.34 2.325 1.018 3.197.678.872 1.889 1.308 3.632 1.308h8.138v72.075c0 .193.024.339.073.436.048.096.072.242.072.436H46.56c-1.744 0-3.003.435-3.778 1.307-.775.872-1.163 1.938-1.163 3.197 0 1.356.388 2.446 1.163 3.27.775.823 2.034 1.235 3.778 1.235h34.875z"/></svg>

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