From c2d7588391b0010f2b911102b0939b2a91510751 Mon Sep 17 00:00:00 2001
From: "[huawei.guo]" <[huawei.guo@vhall.com]>
Date: Mon, 2 Dec 2024 16:59:30 +0800
Subject: [PATCH] init ui
---
.editorconfig | 21 +
.env.development | 35 +
.env.production | 38 +
.eslintignore | 17 +
.eslintrc-auto-import.json | 312 ++++
.eslintrc.cjs | 51 +
.gitignore | 29 +
.prettierignore | 9 +
.prettierrc | 20 +
LICENSE | 20 +
README.md | 76 +
bin/build.bat | 12 +
bin/package.bat | 12 +
bin/run-web.bat | 12 +
html/ie.html | 242 ++++
index.html | 214 +++
package.json | 91 ++
public/favicon.ico | Bin 0 -> 8131 bytes
src/App.vue | 20 +
src/animate.ts | 48 +
src/api/demo/demo/index.ts | 62 +
src/api/demo/demo/types.ts | 90 ++
src/api/demo/tree/index.ts | 62 +
src/api/demo/tree/types.ts | 80 ++
src/api/login.ts | 111 ++
src/api/menu.ts | 11 +
src/api/monitor/cache/index.ts | 59 +
src/api/monitor/cache/types.ts | 7 +
src/api/monitor/loginInfo/index.ts | 36 +
src/api/monitor/loginInfo/types.ts | 20 +
src/api/monitor/online/index.ts | 36 +
src/api/monitor/online/types.ts | 15 +
src/api/monitor/operlog/index.ts | 28 +
src/api/monitor/operlog/types.ts | 53 +
src/api/system/client/index.ts | 80 ++
src/api/system/client/types.ts | 135 ++
src/api/system/config/index.ts | 74 +
src/api/system/config/types.ts | 23 +
src/api/system/dept/index.ts | 62 +
src/api/system/dept/types.ts | 48 +
src/api/system/dict/data/index.ts | 53 +
src/api/system/dict/data/types.ts | 26 +
src/api/system/dict/type/index.ts | 62 +
src/api/system/dict/type/types.ts | 18 +
src/api/system/menu/index.ts | 70 +
src/api/system/menu/types.ts | 69 +
src/api/system/notice/index.ts | 45 +
src/api/system/notice/types.ts | 26 +
src/api/system/oss/index.ts | 28 +
src/api/system/oss/types.ts | 22 +
src/api/system/ossConfig/index.ts | 60 +
src/api/system/ossConfig/types.ts | 38 +
src/api/system/post/index.ts | 58 +
src/api/system/post/types.ts | 31 +
src/api/system/role/index.ts | 160 +++
src/api/system/role/types.ts | 52 +
src/api/system/social/auth.ts | 28 +
src/api/system/tenant/index.ts | 101 ++
src/api/system/tenant/types.ts | 46 +
src/api/system/tenantPackage/index.ts | 67 +
src/api/system/tenantPackage/types.ts | 20 +
src/api/system/user/index.ts | 229 +++
src/api/system/user/types.ts | 84 ++
src/api/tool/gen/index.ts | 86 ++
src/api/tool/gen/types.ts | 180 +++
src/api/types.ts | 59 +
src/api/workflow/category/index.ts | 63 +
src/api/workflow/category/types.ts | 67 +
src/api/workflow/definitionConfig/index.ts | 49 +
src/api/workflow/definitionConfig/types.ts | 102 ++
src/api/workflow/formManage/index.ts | 76 +
src/api/workflow/formManage/types.ts | 69 +
src/api/workflow/leave/index.ts | 63 +
src/api/workflow/leave/types.ts | 24 +
src/api/workflow/model/index.ts | 104 ++
src/api/workflow/model/types.ts | 66 +
src/api/workflow/nodeConfig/types.ts | 38 +
src/api/workflow/processDefinition/index.ts | 114 ++
src/api/workflow/processDefinition/types.ts | 24 +
src/api/workflow/processInstance/index.ts | 136 ++
src/api/workflow/processInstance/types.ts | 27 +
src/api/workflow/task/index.ts | 264 ++++
src/api/workflow/task/types.ts | 49 +
src/api/workflow/workflowCommon/index.ts | 29 +
src/api/workflow/workflowCommon/types.ts | 16 +
src/assets/401_images/401.gif | Bin 0 -> 164227 bytes
src/assets/404_images/404.png | Bin 0 -> 98071 bytes
src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes
src/assets/icons/svg/404.svg | 1 +
src/assets/icons/svg/bug.svg | 1 +
src/assets/icons/svg/build.svg | 1 +
src/assets/icons/svg/button.svg | 1 +
src/assets/icons/svg/caret-back.svg | 1 +
src/assets/icons/svg/caret-forward.svg | 1 +
src/assets/icons/svg/cascader.svg | 1 +
src/assets/icons/svg/category.svg | 1 +
src/assets/icons/svg/chart.svg | 1 +
src/assets/icons/svg/checkbox.svg | 1 +
src/assets/icons/svg/clipboard.svg | 1 +
src/assets/icons/svg/code.svg | 1 +
src/assets/icons/svg/color.svg | 1 +
src/assets/icons/svg/company.svg | 1 +
src/assets/icons/svg/component.svg | 1 +
src/assets/icons/svg/dashboard.svg | 1 +
src/assets/icons/svg/date-range.svg | 1 +
src/assets/icons/svg/date.svg | 1 +
src/assets/icons/svg/dict.svg | 1 +
src/assets/icons/svg/documentation.svg | 1 +
src/assets/icons/svg/download.svg | 1 +
src/assets/icons/svg/drag.svg | 1 +
src/assets/icons/svg/druid.svg | 1 +
src/assets/icons/svg/edit.svg | 1 +
src/assets/icons/svg/education.svg | 1 +
src/assets/icons/svg/email.svg | 1 +
src/assets/icons/svg/example.svg | 1 +
src/assets/icons/svg/excel.svg | 1 +
src/assets/icons/svg/exit-fullscreen.svg | 1 +
src/assets/icons/svg/eye-open.svg | 1 +
src/assets/icons/svg/eye.svg | 1 +
src/assets/icons/svg/finish.svg | 1 +
src/assets/icons/svg/form.svg | 1 +
src/assets/icons/svg/fullscreen.svg | 1 +
src/assets/icons/svg/gitee.svg | 1 +
src/assets/icons/svg/github.svg | 1 +
src/assets/icons/svg/guide.svg | 1 +
src/assets/icons/svg/icon.svg | 1 +
src/assets/icons/svg/input.svg | 1 +
src/assets/icons/svg/international.svg | 1 +
src/assets/icons/svg/job.svg | 1 +
src/assets/icons/svg/language.svg | 1 +
src/assets/icons/svg/link.svg | 1 +
src/assets/icons/svg/list.svg | 1 +
src/assets/icons/svg/lock.svg | 1 +
src/assets/icons/svg/log.svg | 1 +
src/assets/icons/svg/logininfor.svg | 1 +
src/assets/icons/svg/maxkey.svg | 3 +
src/assets/icons/svg/message.svg | 1 +
src/assets/icons/svg/model.svg | 1 +
src/assets/icons/svg/money.svg | 1 +
src/assets/icons/svg/monitor.svg | 2 +
src/assets/icons/svg/my-copy.svg | 1 +
src/assets/icons/svg/my-task.svg | 1 +
src/assets/icons/svg/nested.svg | 1 +
src/assets/icons/svg/number.svg | 1 +
src/assets/icons/svg/online.svg | 1 +
src/assets/icons/svg/password.svg | 1 +
src/assets/icons/svg/pdf.svg | 1 +
src/assets/icons/svg/people.svg | 1 +
src/assets/icons/svg/peoples.svg | 1 +
src/assets/icons/svg/phone.svg | 1 +
src/assets/icons/svg/post.svg | 1 +
src/assets/icons/svg/process-definition.svg | 1 +
src/assets/icons/svg/qq.svg | 1 +
src/assets/icons/svg/question.svg | 1 +
src/assets/icons/svg/radio.svg | 1 +
src/assets/icons/svg/rate.svg | 1 +
src/assets/icons/svg/redis-list.svg | 2 +
src/assets/icons/svg/redis.svg | 1 +
src/assets/icons/svg/row.svg | 1 +
src/assets/icons/svg/search.svg | 1 +
src/assets/icons/svg/select.svg | 1 +
src/assets/icons/svg/server.svg | 1 +
src/assets/icons/svg/shopping.svg | 1 +
src/assets/icons/svg/size.svg | 1 +
src/assets/icons/svg/skill.svg | 1 +
src/assets/icons/svg/slider.svg | 1 +
src/assets/icons/svg/star.svg | 1 +
src/assets/icons/svg/swagger.svg | 1 +
src/assets/icons/svg/switch.svg | 1 +
src/assets/icons/svg/system.svg | 2 +
src/assets/icons/svg/tab.svg | 1 +
src/assets/icons/svg/table.svg | 1 +
src/assets/icons/svg/textarea.svg | 1 +
src/assets/icons/svg/theme.svg | 1 +
src/assets/icons/svg/time-range.svg | 1 +
src/assets/icons/svg/time.svg | 1 +
src/assets/icons/svg/tool.svg | 1 +
src/assets/icons/svg/topiam.svg | 29 +
src/assets/icons/svg/tree-table.svg | 1 +
src/assets/icons/svg/tree.svg | 1 +
src/assets/icons/svg/upload.svg | 1 +
src/assets/icons/svg/user.svg | 1 +
src/assets/icons/svg/validCode.svg | 1 +
src/assets/icons/svg/waiting.svg | 1 +
src/assets/icons/svg/wechat.svg | 1 +
src/assets/icons/svg/workflow.svg | 1 +
src/assets/icons/svg/zip.svg | 1 +
src/assets/images/dark.svg | 39 +
src/assets/images/light.svg | 39 +
src/assets/images/login-background.jpg | Bin 0 -> 577784 bytes
src/assets/images/profile.jpg | Bin 0 -> 275351 bytes
src/assets/logo/logo.png | Bin 0 -> 8131 bytes
src/assets/styles/btn.scss | 99 ++
src/assets/styles/element-ui.scss | 149 ++
src/assets/styles/index.scss | 215 +++
src/assets/styles/mixin.scss | 60 +
src/assets/styles/ruoyi.scss | 290 ++++
src/assets/styles/sidebar.scss | 232 +++
src/assets/styles/transition.scss | 49 +
src/assets/styles/variables.module.scss | 121 ++
src/bpmn/assets/defaultXML.ts | 23 +
src/bpmn/assets/lang/zh.ts | 126 ++
src/bpmn/assets/moddle/flowable.ts | 1250 +++++++++++++++++
.../ContextPad/CustomContextPadProvider.ts | 138 ++
.../module/Palette/CustomPaletteProvider.ts | 109 ++
.../assets/module/Renderer/CustomRenderer.ts | 56 +
src/bpmn/assets/module/Translate/index.ts | 15 +
src/bpmn/assets/module/index.ts | 17 +
src/bpmn/assets/showConfig.ts | 50 +
src/bpmn/assets/style/index.scss | 284 ++++
src/bpmn/hooks/usePanel.ts | 145 ++
src/bpmn/hooks/useParseElement.ts | 34 +
src/bpmn/index.vue | 496 +++++++
src/bpmn/panel/GatewayPanel.vue | 68 +
src/bpmn/panel/ParticipantPanel.vue | 68 +
src/bpmn/panel/ProcessPanel.vue | 71 +
src/bpmn/panel/SequenceFlowPanel.vue | 95 ++
src/bpmn/panel/StartEndPanel.vue | 67 +
src/bpmn/panel/SubProcessPanel.vue | 193 +++
src/bpmn/panel/TaskPanel.vue | 491 +++++++
src/bpmn/panel/index.vue | 110 ++
src/bpmn/panel/property/DueDate.vue | 252 ++++
src/bpmn/panel/property/ExecutionListener.vue | 308 ++++
src/bpmn/panel/property/ListenerParam.vue | 121 ++
src/bpmn/panel/property/TaskListener.vue | 310 ++++
src/components/BpmnDesign/index.vue | 71 +
src/components/BpmnView/index.vue | 411 ++++++
src/components/Breadcrumb/index.vue | 63 +
src/components/BuildCode/index.vue | 61 +
src/components/BuildCode/render.vue | 57 +
src/components/DictTag/index.vue | 94 ++
src/components/Editor/index.vue | 244 ++++
src/components/FileUpload/index.vue | 229 +++
src/components/Hamburger/index.vue | 35 +
src/components/HeaderSearch/index.vue | 195 +++
src/components/IconSelect/index.vue | 104 ++
src/components/IconSelect/requireIcons.ts | 7 +
src/components/ImagePreview/index.vue | 79 ++
src/components/ImageUpload/index.vue | 234 +++
src/components/LangSelect/index.vue | 39 +
src/components/Pagination/index.vue | 88 ++
src/components/ParentView/index.vue | 3 +
src/components/Process/approvalRecord.vue | 116 ++
src/components/Process/multiInstanceUser.vue | 378 +++++
src/components/Process/submitVerify.vue | 366 +++++
src/components/RightToolbar/index.vue | 102 ++
src/components/RoleSelect/index.vue | 250 ++++
src/components/RuoYiDoc/index.vue | 13 +
src/components/RuoYiGit/index.vue | 13 +
src/components/Screenfull/index.vue | 9 +
src/components/SizeSelect/index.vue | 41 +
src/components/SvgIcon/index.vue | 40 +
src/components/TopNav/index.vue | 200 +++
src/components/TreeSelect/index.vue | 147 ++
src/components/UserSelect/index.vue | 306 ++++
src/components/iFrame/index.vue | 26 +
src/directive/common/copyText.ts | 67 +
src/directive/index.ts | 9 +
src/directive/permission/index.ts | 44 +
src/enums/LanguageEnum.ts | 5 +
src/enums/MenuTypeEnum.ts | 15 +
src/enums/RespEnum.ts | 90 ++
src/enums/SettingTypeEnum.ts | 16 +
src/enums/SideThemeEnum.ts | 4 +
src/enums/bpmn/IndexEnums.ts | 17 +
src/enums/layout/LayoutEnum.ts | 4 +
src/hooks/useDialog.ts | 31 +
src/lang/en_US.json | 25 +
src/lang/en_US.ts | 28 +
src/lang/index.ts | 27 +
src/lang/zh_CN.json | 25 +
src/lang/zh_CN.ts | 27 +
src/layout/components/AppMain.vue | 87 ++
src/layout/components/IframeToggle/index.vue | 28 +
src/layout/components/InnerLink/index.vue | 15 +
src/layout/components/Navbar.vue | 300 ++++
src/layout/components/Settings/index.vue | 238 ++++
src/layout/components/Sidebar/Link.vue | 40 +
src/layout/components/Sidebar/Logo.vue | 95 ++
src/layout/components/Sidebar/SidebarItem.vue | 103 ++
src/layout/components/Sidebar/index.vue | 55 +
.../components/SocialCallback/index.vue | 95 ++
src/layout/components/TagsView/ScrollPane.vue | 102 ++
src/layout/components/TagsView/index.vue | 341 +++++
src/layout/components/TopBar/search.vue | 158 +++
src/layout/components/index.ts | 4 +
src/layout/components/notice/index.vue | 131 ++
src/layout/index.vue | 135 ++
src/main.ts | 57 +
src/permission.ts | 65 +
src/plugins/auth.ts | 60 +
src/plugins/cache.ts | 77 +
src/plugins/download.ts | 65 +
src/plugins/index.ts | 43 +
src/plugins/modal.ts | 81 ++
src/plugins/svgicon.ts | 10 +
src/plugins/tab.ts | 96 ++
src/router/index.ts | 198 +++
src/settings.ts | 62 +
src/store/index.ts | 3 +
src/store/modules/app.ts | 72 +
src/store/modules/dict.ts | 78 +
src/store/modules/modeler.ts | 76 +
src/store/modules/notice.ts | 42 +
src/store/modules/permission.ts | 218 +++
src/store/modules/settings.ts | 47 +
src/store/modules/tagsView.ts | 233 +++
src/store/modules/user.ts | 91 ++
src/types/axios.d.ts | 9 +
src/types/bpmn/editor/global.d.ts | 13 +
src/types/bpmn/index.d.ts | 15 +
src/types/bpmn/moddle.d.ts | 37 +
src/types/bpmn/panel.d.ts | 92 ++
src/types/element.d.ts | 35 +
src/types/env.d.ts | 27 +
src/types/global.d.ts | 164 +++
src/types/module.d.ts | 39 +
src/types/router.d.ts | 38 +
src/utils/auth.ts | 9 +
src/utils/createCustomNameComponent.tsx | 39 +
src/utils/crypto.ts | 66 +
src/utils/dict.ts | 27 +
src/utils/dynamicTitle.ts | 14 +
src/utils/errorCode.ts | 7 +
src/utils/i18n.ts | 16 +
src/utils/index.ts | 318 +++++
src/utils/jsencrypt.ts | 21 +
src/utils/permission.ts | 51 +
src/utils/propTypes.ts | 26 +
src/utils/request.ts | 207 +++
src/utils/ruoyi.ts | 251 ++++
src/utils/scroll-to.ts | 65 +
src/utils/sse.ts | 45 +
src/utils/theme.ts | 52 +
src/utils/validate.ts | 92 ++
src/utils/websocket.ts | 51 +
src/views/demo/demo/index.vue | 254 ++++
src/views/demo/tree/index.vue | 258 ++++
src/views/error/401.vue | 76 +
src/views/error/404.vue | 223 +++
src/views/index.vue | 165 +++
src/views/login.vue | 282 ++++
src/views/monitor/admin/index.vue | 9 +
src/views/monitor/cache/index.vue | 192 +++
src/views/monitor/logininfor/index.vue | 208 +++
src/views/monitor/online/index.vue | 116 ++
src/views/monitor/operlog/index.vue | 305 ++++
src/views/monitor/snailjob/index.vue | 9 +
src/views/redirect/index.vue | 14 +
src/views/register.vue | 230 +++
src/views/system/client/index.vue | 316 +++++
src/views/system/config/index.vue | 261 ++++
src/views/system/dept/index.vue | 319 +++++
src/views/system/dict/data.vue | 309 ++++
src/views/system/dict/index.vue | 259 ++++
src/views/system/menu/index.vue | 410 ++++++
src/views/system/notice/index.vue | 243 ++++
src/views/system/oss/config.vue | 334 +++++
src/views/system/oss/index.vue | 332 +++++
src/views/system/post/index.vue | 360 +++++
src/views/system/role/authUser.vue | 160 +++
src/views/system/role/index.vue | 502 +++++++
src/views/system/role/selectUser.vue | 132 ++
src/views/system/tenant/index.vue | 349 +++++
src/views/system/tenantPackage/index.vue | 335 +++++
src/views/system/user/authRole.vue | 139 ++
src/views/system/user/index.vue | 660 +++++++++
src/views/system/user/profile/index.vue | 122 ++
.../system/user/profile/onlineDevice.vue | 57 +
src/views/system/user/profile/resetPwd.vue | 73 +
src/views/system/user/profile/thirdParty.vue | 144 ++
src/views/system/user/profile/userAvatar.vue | 182 +++
src/views/system/user/profile/userInfo.vue | 69 +
src/views/tool/gen/basicInfoForm.vue | 49 +
src/views/tool/gen/editTable.vue | 198 +++
src/views/tool/gen/genInfoForm.vue | 294 ++++
src/views/tool/gen/importTable.vue | 123 ++
src/views/tool/gen/index.vue | 254 ++++
src/views/workflow/category/index.vue | 263 ++++
src/views/workflow/formManage/index.vue | 243 ++++
src/views/workflow/leave/index.vue | 242 ++++
src/views/workflow/leave/leaveEdit.vue | 252 ++++
src/views/workflow/model/index.vue | 383 +++++
.../components/processPreview.vue | 45 +
.../workflow/processDefinition/index.vue | 517 +++++++
src/views/workflow/processInstance/index.vue | 364 +++++
src/views/workflow/task/allTaskWaiting.vue | 286 ++++
src/views/workflow/task/myDocument.vue | 255 ++++
src/views/workflow/task/taskCopyList.vue | 150 ++
src/views/workflow/task/taskFinish.vue | 136 ++
src/views/workflow/task/taskWaiting.vue | 149 ++
tsconfig.json | 31 +
uno.config.ts | 33 +
vite.config.ts | 82 ++
vite/plugins/auto-import.ts | 24 +
vite/plugins/components.ts | 17 +
vite/plugins/compression.ts | 28 +
vite/plugins/i18n.ts | 6 +
vite/plugins/icons.ts | 8 +
vite/plugins/index.ts | 24 +
vite/plugins/setup-extend.ts | 5 +
vite/plugins/svg-icon.ts | 10 +
vite/plugins/unocss.ts | 7 +
403 files changed, 34559 insertions(+)
create mode 100644 .editorconfig
create mode 100644 .env.development
create mode 100644 .env.production
create mode 100644 .eslintignore
create mode 100644 .eslintrc-auto-import.json
create mode 100644 .eslintrc.cjs
create mode 100644 .gitignore
create mode 100644 .prettierignore
create mode 100644 .prettierrc
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 bin/build.bat
create mode 100644 bin/package.bat
create mode 100644 bin/run-web.bat
create mode 100644 html/ie.html
create mode 100644 index.html
create mode 100644 package.json
create mode 100644 public/favicon.ico
create mode 100644 src/App.vue
create mode 100644 src/animate.ts
create mode 100644 src/api/demo/demo/index.ts
create mode 100644 src/api/demo/demo/types.ts
create mode 100644 src/api/demo/tree/index.ts
create mode 100644 src/api/demo/tree/types.ts
create mode 100644 src/api/login.ts
create mode 100644 src/api/menu.ts
create mode 100644 src/api/monitor/cache/index.ts
create mode 100644 src/api/monitor/cache/types.ts
create mode 100644 src/api/monitor/loginInfo/index.ts
create mode 100644 src/api/monitor/loginInfo/types.ts
create mode 100644 src/api/monitor/online/index.ts
create mode 100644 src/api/monitor/online/types.ts
create mode 100644 src/api/monitor/operlog/index.ts
create mode 100644 src/api/monitor/operlog/types.ts
create mode 100644 src/api/system/client/index.ts
create mode 100644 src/api/system/client/types.ts
create mode 100644 src/api/system/config/index.ts
create mode 100644 src/api/system/config/types.ts
create mode 100644 src/api/system/dept/index.ts
create mode 100644 src/api/system/dept/types.ts
create mode 100644 src/api/system/dict/data/index.ts
create mode 100644 src/api/system/dict/data/types.ts
create mode 100644 src/api/system/dict/type/index.ts
create mode 100644 src/api/system/dict/type/types.ts
create mode 100644 src/api/system/menu/index.ts
create mode 100644 src/api/system/menu/types.ts
create mode 100644 src/api/system/notice/index.ts
create mode 100644 src/api/system/notice/types.ts
create mode 100644 src/api/system/oss/index.ts
create mode 100644 src/api/system/oss/types.ts
create mode 100644 src/api/system/ossConfig/index.ts
create mode 100644 src/api/system/ossConfig/types.ts
create mode 100644 src/api/system/post/index.ts
create mode 100644 src/api/system/post/types.ts
create mode 100644 src/api/system/role/index.ts
create mode 100644 src/api/system/role/types.ts
create mode 100644 src/api/system/social/auth.ts
create mode 100644 src/api/system/tenant/index.ts
create mode 100644 src/api/system/tenant/types.ts
create mode 100644 src/api/system/tenantPackage/index.ts
create mode 100644 src/api/system/tenantPackage/types.ts
create mode 100644 src/api/system/user/index.ts
create mode 100644 src/api/system/user/types.ts
create mode 100644 src/api/tool/gen/index.ts
create mode 100644 src/api/tool/gen/types.ts
create mode 100644 src/api/types.ts
create mode 100644 src/api/workflow/category/index.ts
create mode 100644 src/api/workflow/category/types.ts
create mode 100644 src/api/workflow/definitionConfig/index.ts
create mode 100644 src/api/workflow/definitionConfig/types.ts
create mode 100644 src/api/workflow/formManage/index.ts
create mode 100644 src/api/workflow/formManage/types.ts
create mode 100644 src/api/workflow/leave/index.ts
create mode 100644 src/api/workflow/leave/types.ts
create mode 100644 src/api/workflow/model/index.ts
create mode 100644 src/api/workflow/model/types.ts
create mode 100644 src/api/workflow/nodeConfig/types.ts
create mode 100644 src/api/workflow/processDefinition/index.ts
create mode 100644 src/api/workflow/processDefinition/types.ts
create mode 100644 src/api/workflow/processInstance/index.ts
create mode 100644 src/api/workflow/processInstance/types.ts
create mode 100644 src/api/workflow/task/index.ts
create mode 100644 src/api/workflow/task/types.ts
create mode 100644 src/api/workflow/workflowCommon/index.ts
create mode 100644 src/api/workflow/workflowCommon/types.ts
create mode 100644 src/assets/401_images/401.gif
create mode 100644 src/assets/404_images/404.png
create mode 100644 src/assets/404_images/404_cloud.png
create mode 100644 src/assets/icons/svg/404.svg
create mode 100644 src/assets/icons/svg/bug.svg
create mode 100644 src/assets/icons/svg/build.svg
create mode 100644 src/assets/icons/svg/button.svg
create mode 100644 src/assets/icons/svg/caret-back.svg
create mode 100644 src/assets/icons/svg/caret-forward.svg
create mode 100644 src/assets/icons/svg/cascader.svg
create mode 100644 src/assets/icons/svg/category.svg
create mode 100644 src/assets/icons/svg/chart.svg
create mode 100644 src/assets/icons/svg/checkbox.svg
create mode 100644 src/assets/icons/svg/clipboard.svg
create mode 100644 src/assets/icons/svg/code.svg
create mode 100644 src/assets/icons/svg/color.svg
create mode 100644 src/assets/icons/svg/company.svg
create mode 100644 src/assets/icons/svg/component.svg
create mode 100644 src/assets/icons/svg/dashboard.svg
create mode 100644 src/assets/icons/svg/date-range.svg
create mode 100644 src/assets/icons/svg/date.svg
create mode 100644 src/assets/icons/svg/dict.svg
create mode 100644 src/assets/icons/svg/documentation.svg
create mode 100644 src/assets/icons/svg/download.svg
create mode 100644 src/assets/icons/svg/drag.svg
create mode 100644 src/assets/icons/svg/druid.svg
create mode 100644 src/assets/icons/svg/edit.svg
create mode 100644 src/assets/icons/svg/education.svg
create mode 100644 src/assets/icons/svg/email.svg
create mode 100644 src/assets/icons/svg/example.svg
create mode 100644 src/assets/icons/svg/excel.svg
create mode 100644 src/assets/icons/svg/exit-fullscreen.svg
create mode 100644 src/assets/icons/svg/eye-open.svg
create mode 100644 src/assets/icons/svg/eye.svg
create mode 100644 src/assets/icons/svg/finish.svg
create mode 100644 src/assets/icons/svg/form.svg
create mode 100644 src/assets/icons/svg/fullscreen.svg
create mode 100644 src/assets/icons/svg/gitee.svg
create mode 100644 src/assets/icons/svg/github.svg
create mode 100644 src/assets/icons/svg/guide.svg
create mode 100644 src/assets/icons/svg/icon.svg
create mode 100644 src/assets/icons/svg/input.svg
create mode 100644 src/assets/icons/svg/international.svg
create mode 100644 src/assets/icons/svg/job.svg
create mode 100644 src/assets/icons/svg/language.svg
create mode 100644 src/assets/icons/svg/link.svg
create mode 100644 src/assets/icons/svg/list.svg
create mode 100644 src/assets/icons/svg/lock.svg
create mode 100644 src/assets/icons/svg/log.svg
create mode 100644 src/assets/icons/svg/logininfor.svg
create mode 100644 src/assets/icons/svg/maxkey.svg
create mode 100644 src/assets/icons/svg/message.svg
create mode 100644 src/assets/icons/svg/model.svg
create mode 100644 src/assets/icons/svg/money.svg
create mode 100644 src/assets/icons/svg/monitor.svg
create mode 100644 src/assets/icons/svg/my-copy.svg
create mode 100644 src/assets/icons/svg/my-task.svg
create mode 100644 src/assets/icons/svg/nested.svg
create mode 100644 src/assets/icons/svg/number.svg
create mode 100644 src/assets/icons/svg/online.svg
create mode 100644 src/assets/icons/svg/password.svg
create mode 100644 src/assets/icons/svg/pdf.svg
create mode 100644 src/assets/icons/svg/people.svg
create mode 100644 src/assets/icons/svg/peoples.svg
create mode 100644 src/assets/icons/svg/phone.svg
create mode 100644 src/assets/icons/svg/post.svg
create mode 100644 src/assets/icons/svg/process-definition.svg
create mode 100644 src/assets/icons/svg/qq.svg
create mode 100644 src/assets/icons/svg/question.svg
create mode 100644 src/assets/icons/svg/radio.svg
create mode 100644 src/assets/icons/svg/rate.svg
create mode 100644 src/assets/icons/svg/redis-list.svg
create mode 100644 src/assets/icons/svg/redis.svg
create mode 100644 src/assets/icons/svg/row.svg
create mode 100644 src/assets/icons/svg/search.svg
create mode 100644 src/assets/icons/svg/select.svg
create mode 100644 src/assets/icons/svg/server.svg
create mode 100644 src/assets/icons/svg/shopping.svg
create mode 100644 src/assets/icons/svg/size.svg
create mode 100644 src/assets/icons/svg/skill.svg
create mode 100644 src/assets/icons/svg/slider.svg
create mode 100644 src/assets/icons/svg/star.svg
create mode 100644 src/assets/icons/svg/swagger.svg
create mode 100644 src/assets/icons/svg/switch.svg
create mode 100644 src/assets/icons/svg/system.svg
create mode 100644 src/assets/icons/svg/tab.svg
create mode 100644 src/assets/icons/svg/table.svg
create mode 100644 src/assets/icons/svg/textarea.svg
create mode 100644 src/assets/icons/svg/theme.svg
create mode 100644 src/assets/icons/svg/time-range.svg
create mode 100644 src/assets/icons/svg/time.svg
create mode 100644 src/assets/icons/svg/tool.svg
create mode 100644 src/assets/icons/svg/topiam.svg
create mode 100644 src/assets/icons/svg/tree-table.svg
create mode 100644 src/assets/icons/svg/tree.svg
create mode 100644 src/assets/icons/svg/upload.svg
create mode 100644 src/assets/icons/svg/user.svg
create mode 100644 src/assets/icons/svg/validCode.svg
create mode 100644 src/assets/icons/svg/waiting.svg
create mode 100644 src/assets/icons/svg/wechat.svg
create mode 100644 src/assets/icons/svg/workflow.svg
create mode 100644 src/assets/icons/svg/zip.svg
create mode 100644 src/assets/images/dark.svg
create mode 100644 src/assets/images/light.svg
create mode 100644 src/assets/images/login-background.jpg
create mode 100644 src/assets/images/profile.jpg
create mode 100644 src/assets/logo/logo.png
create mode 100644 src/assets/styles/btn.scss
create mode 100644 src/assets/styles/element-ui.scss
create mode 100644 src/assets/styles/index.scss
create mode 100644 src/assets/styles/mixin.scss
create mode 100644 src/assets/styles/ruoyi.scss
create mode 100644 src/assets/styles/sidebar.scss
create mode 100644 src/assets/styles/transition.scss
create mode 100644 src/assets/styles/variables.module.scss
create mode 100644 src/bpmn/assets/defaultXML.ts
create mode 100644 src/bpmn/assets/lang/zh.ts
create mode 100644 src/bpmn/assets/moddle/flowable.ts
create mode 100644 src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts
create mode 100644 src/bpmn/assets/module/Palette/CustomPaletteProvider.ts
create mode 100644 src/bpmn/assets/module/Renderer/CustomRenderer.ts
create mode 100644 src/bpmn/assets/module/Translate/index.ts
create mode 100644 src/bpmn/assets/module/index.ts
create mode 100644 src/bpmn/assets/showConfig.ts
create mode 100644 src/bpmn/assets/style/index.scss
create mode 100644 src/bpmn/hooks/usePanel.ts
create mode 100644 src/bpmn/hooks/useParseElement.ts
create mode 100644 src/bpmn/index.vue
create mode 100644 src/bpmn/panel/GatewayPanel.vue
create mode 100644 src/bpmn/panel/ParticipantPanel.vue
create mode 100644 src/bpmn/panel/ProcessPanel.vue
create mode 100644 src/bpmn/panel/SequenceFlowPanel.vue
create mode 100644 src/bpmn/panel/StartEndPanel.vue
create mode 100644 src/bpmn/panel/SubProcessPanel.vue
create mode 100644 src/bpmn/panel/TaskPanel.vue
create mode 100644 src/bpmn/panel/index.vue
create mode 100644 src/bpmn/panel/property/DueDate.vue
create mode 100644 src/bpmn/panel/property/ExecutionListener.vue
create mode 100644 src/bpmn/panel/property/ListenerParam.vue
create mode 100644 src/bpmn/panel/property/TaskListener.vue
create mode 100644 src/components/BpmnDesign/index.vue
create mode 100644 src/components/BpmnView/index.vue
create mode 100644 src/components/Breadcrumb/index.vue
create mode 100644 src/components/BuildCode/index.vue
create mode 100644 src/components/BuildCode/render.vue
create mode 100644 src/components/DictTag/index.vue
create mode 100644 src/components/Editor/index.vue
create mode 100644 src/components/FileUpload/index.vue
create mode 100644 src/components/Hamburger/index.vue
create mode 100644 src/components/HeaderSearch/index.vue
create mode 100644 src/components/IconSelect/index.vue
create mode 100644 src/components/IconSelect/requireIcons.ts
create mode 100644 src/components/ImagePreview/index.vue
create mode 100644 src/components/ImageUpload/index.vue
create mode 100644 src/components/LangSelect/index.vue
create mode 100644 src/components/Pagination/index.vue
create mode 100644 src/components/ParentView/index.vue
create mode 100644 src/components/Process/approvalRecord.vue
create mode 100644 src/components/Process/multiInstanceUser.vue
create mode 100644 src/components/Process/submitVerify.vue
create mode 100644 src/components/RightToolbar/index.vue
create mode 100644 src/components/RoleSelect/index.vue
create mode 100644 src/components/RuoYiDoc/index.vue
create mode 100644 src/components/RuoYiGit/index.vue
create mode 100644 src/components/Screenfull/index.vue
create mode 100644 src/components/SizeSelect/index.vue
create mode 100644 src/components/SvgIcon/index.vue
create mode 100644 src/components/TopNav/index.vue
create mode 100644 src/components/TreeSelect/index.vue
create mode 100644 src/components/UserSelect/index.vue
create mode 100644 src/components/iFrame/index.vue
create mode 100644 src/directive/common/copyText.ts
create mode 100644 src/directive/index.ts
create mode 100644 src/directive/permission/index.ts
create mode 100644 src/enums/LanguageEnum.ts
create mode 100644 src/enums/MenuTypeEnum.ts
create mode 100644 src/enums/RespEnum.ts
create mode 100644 src/enums/SettingTypeEnum.ts
create mode 100644 src/enums/SideThemeEnum.ts
create mode 100644 src/enums/bpmn/IndexEnums.ts
create mode 100644 src/enums/layout/LayoutEnum.ts
create mode 100644 src/hooks/useDialog.ts
create mode 100644 src/lang/en_US.json
create mode 100644 src/lang/en_US.ts
create mode 100644 src/lang/index.ts
create mode 100644 src/lang/zh_CN.json
create mode 100644 src/lang/zh_CN.ts
create mode 100644 src/layout/components/AppMain.vue
create mode 100644 src/layout/components/IframeToggle/index.vue
create mode 100644 src/layout/components/InnerLink/index.vue
create mode 100644 src/layout/components/Navbar.vue
create mode 100644 src/layout/components/Settings/index.vue
create mode 100644 src/layout/components/Sidebar/Link.vue
create mode 100644 src/layout/components/Sidebar/Logo.vue
create mode 100644 src/layout/components/Sidebar/SidebarItem.vue
create mode 100644 src/layout/components/Sidebar/index.vue
create mode 100644 src/layout/components/SocialCallback/index.vue
create mode 100644 src/layout/components/TagsView/ScrollPane.vue
create mode 100644 src/layout/components/TagsView/index.vue
create mode 100644 src/layout/components/TopBar/search.vue
create mode 100644 src/layout/components/index.ts
create mode 100644 src/layout/components/notice/index.vue
create mode 100644 src/layout/index.vue
create mode 100644 src/main.ts
create mode 100644 src/permission.ts
create mode 100644 src/plugins/auth.ts
create mode 100644 src/plugins/cache.ts
create mode 100644 src/plugins/download.ts
create mode 100644 src/plugins/index.ts
create mode 100644 src/plugins/modal.ts
create mode 100644 src/plugins/svgicon.ts
create mode 100644 src/plugins/tab.ts
create mode 100644 src/router/index.ts
create mode 100644 src/settings.ts
create mode 100644 src/store/index.ts
create mode 100644 src/store/modules/app.ts
create mode 100644 src/store/modules/dict.ts
create mode 100644 src/store/modules/modeler.ts
create mode 100644 src/store/modules/notice.ts
create mode 100644 src/store/modules/permission.ts
create mode 100644 src/store/modules/settings.ts
create mode 100644 src/store/modules/tagsView.ts
create mode 100644 src/store/modules/user.ts
create mode 100644 src/types/axios.d.ts
create mode 100644 src/types/bpmn/editor/global.d.ts
create mode 100644 src/types/bpmn/index.d.ts
create mode 100644 src/types/bpmn/moddle.d.ts
create mode 100644 src/types/bpmn/panel.d.ts
create mode 100644 src/types/element.d.ts
create mode 100644 src/types/env.d.ts
create mode 100644 src/types/global.d.ts
create mode 100644 src/types/module.d.ts
create mode 100644 src/types/router.d.ts
create mode 100644 src/utils/auth.ts
create mode 100644 src/utils/createCustomNameComponent.tsx
create mode 100644 src/utils/crypto.ts
create mode 100644 src/utils/dict.ts
create mode 100644 src/utils/dynamicTitle.ts
create mode 100644 src/utils/errorCode.ts
create mode 100644 src/utils/i18n.ts
create mode 100644 src/utils/index.ts
create mode 100644 src/utils/jsencrypt.ts
create mode 100644 src/utils/permission.ts
create mode 100644 src/utils/propTypes.ts
create mode 100644 src/utils/request.ts
create mode 100644 src/utils/ruoyi.ts
create mode 100644 src/utils/scroll-to.ts
create mode 100644 src/utils/sse.ts
create mode 100644 src/utils/theme.ts
create mode 100644 src/utils/validate.ts
create mode 100644 src/utils/websocket.ts
create mode 100644 src/views/demo/demo/index.vue
create mode 100644 src/views/demo/tree/index.vue
create mode 100644 src/views/error/401.vue
create mode 100644 src/views/error/404.vue
create mode 100644 src/views/index.vue
create mode 100644 src/views/login.vue
create mode 100644 src/views/monitor/admin/index.vue
create mode 100644 src/views/monitor/cache/index.vue
create mode 100644 src/views/monitor/logininfor/index.vue
create mode 100644 src/views/monitor/online/index.vue
create mode 100644 src/views/monitor/operlog/index.vue
create mode 100644 src/views/monitor/snailjob/index.vue
create mode 100644 src/views/redirect/index.vue
create mode 100644 src/views/register.vue
create mode 100644 src/views/system/client/index.vue
create mode 100644 src/views/system/config/index.vue
create mode 100644 src/views/system/dept/index.vue
create mode 100644 src/views/system/dict/data.vue
create mode 100644 src/views/system/dict/index.vue
create mode 100644 src/views/system/menu/index.vue
create mode 100644 src/views/system/notice/index.vue
create mode 100644 src/views/system/oss/config.vue
create mode 100644 src/views/system/oss/index.vue
create mode 100644 src/views/system/post/index.vue
create mode 100644 src/views/system/role/authUser.vue
create mode 100644 src/views/system/role/index.vue
create mode 100644 src/views/system/role/selectUser.vue
create mode 100644 src/views/system/tenant/index.vue
create mode 100644 src/views/system/tenantPackage/index.vue
create mode 100644 src/views/system/user/authRole.vue
create mode 100644 src/views/system/user/index.vue
create mode 100644 src/views/system/user/profile/index.vue
create mode 100644 src/views/system/user/profile/onlineDevice.vue
create mode 100644 src/views/system/user/profile/resetPwd.vue
create mode 100644 src/views/system/user/profile/thirdParty.vue
create mode 100644 src/views/system/user/profile/userAvatar.vue
create mode 100644 src/views/system/user/profile/userInfo.vue
create mode 100644 src/views/tool/gen/basicInfoForm.vue
create mode 100644 src/views/tool/gen/editTable.vue
create mode 100644 src/views/tool/gen/genInfoForm.vue
create mode 100644 src/views/tool/gen/importTable.vue
create mode 100644 src/views/tool/gen/index.vue
create mode 100644 src/views/workflow/category/index.vue
create mode 100644 src/views/workflow/formManage/index.vue
create mode 100644 src/views/workflow/leave/index.vue
create mode 100644 src/views/workflow/leave/leaveEdit.vue
create mode 100644 src/views/workflow/model/index.vue
create mode 100644 src/views/workflow/processDefinition/components/processPreview.vue
create mode 100644 src/views/workflow/processDefinition/index.vue
create mode 100644 src/views/workflow/processInstance/index.vue
create mode 100644 src/views/workflow/task/allTaskWaiting.vue
create mode 100644 src/views/workflow/task/myDocument.vue
create mode 100644 src/views/workflow/task/taskCopyList.vue
create mode 100644 src/views/workflow/task/taskFinish.vue
create mode 100644 src/views/workflow/task/taskWaiting.vue
create mode 100644 tsconfig.json
create mode 100644 uno.config.ts
create mode 100644 vite.config.ts
create mode 100644 vite/plugins/auto-import.ts
create mode 100644 vite/plugins/components.ts
create mode 100644 vite/plugins/compression.ts
create mode 100644 vite/plugins/i18n.ts
create mode 100644 vite/plugins/icons.ts
create mode 100644 vite/plugins/index.ts
create mode 100644 vite/plugins/setup-extend.ts
create mode 100644 vite/plugins/svg-icon.ts
create mode 100644 vite/plugins/unocss.ts
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..5b1a804
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,21 @@
+# 告诉EditorConfig插件,这是根文件,不用继续往上查找
+root = true
+
+# 匹配全部文件
+[*]
+# 缩进风格,可选space、tab
+indent_style = space
+# 缩进的空格数
+indent_size = 2
+# 设置字符集
+charset = utf-8
+# 结尾换行符,可选lf、cr、crlf
+end_of_line = lf
+# 在文件结尾插入新行
+trim_trailing_whitespace = true
+# 删除一行中的前后空格
+insert_final_newline = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..14e1335
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,35 @@
+# 页面标题
+VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
+
+# 开发环境配置
+VITE_APP_ENV = 'development'
+
+# 开发环境
+VITE_APP_BASE_API = '/dev-api'
+
+# 应用访问路径 例如使用前缀 /admin/
+VITE_APP_CONTEXT_PATH = '/'
+
+# 监控地址
+VITE_APP_MONITOR_ADMIN = 'http://localhost:9090/admin/applications'
+
+# SnailJob 控制台地址
+VITE_APP_SNAILJOB_ADMIN = 'http://localhost:8800/snail-job'
+
+VITE_APP_PORT = 80
+
+# 接口加密功能开关(如需关闭 后端也必须对应关闭)
+VITE_APP_ENCRYPT = true
+# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换
+VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
+# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换
+VITE_APP_RSA_PRIVATE_KEY = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE='
+
+# 客户端id
+VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
+
+# websocket 开关 默认使用sse推送
+VITE_APP_WEBSOCKET = false
+
+# sse 开关
+VITE_APP_SSE = true
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..1109bc6
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,38 @@
+# 页面标题
+VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
+
+# 生产环境配置
+VITE_APP_ENV = 'production'
+
+# 应用访问路径 例如使用前缀 /admin/
+VITE_APP_CONTEXT_PATH = '/'
+
+# 监控地址
+VITE_APP_MONITOR_ADMIN = '/admin/applications'
+
+# SnailJob 控制台地址
+VITE_APP_SNAILJOB_ADMIN = '/snail-job'
+
+# 生产环境
+VITE_APP_BASE_API = '/prod-api'
+
+# 是否在打包时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip
+
+VITE_APP_PORT = 80
+
+# 接口加密功能开关(如需关闭 后端也必须对应关闭)
+VITE_APP_ENCRYPT = true
+# 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换
+VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
+# 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换
+VITE_APP_RSA_PRIVATE_KEY = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE='
+
+# 客户端id
+VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
+
+# websocket 开关 默认使用sse推送
+VITE_APP_WEBSOCKET = false
+
+# sse 开关
+VITE_APP_SSE = true
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..e74db40
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,17 @@
+*.sh
+node_modules
+*.md
+*.woff
+*.ttf
+.vscode
+.idea
+dist
+/public
+/docs
+.husky
+.local
+/bin
+.eslintrc.cjs
+prettier.config.js
+src/assets
+tailwind.config.js
diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
new file mode 100644
index 0000000..a6661b6
--- /dev/null
+++ b/.eslintrc-auto-import.json
@@ -0,0 +1,312 @@
+{
+ "globals": {
+ "ComponentInternalInstance": true,
+ "TransferKey": true,
+ "ElFormRules": true,
+ "CheckboxValueType": true,
+ "PropType": true,
+ "DateModelType": true,
+ "UploadFile": true,
+ "ElFormInstance": true,
+ "ElTableInstance": true,
+ "ElTreeInstance": true,
+ "ElTreeSelectInstance": true,
+ "ElSelectInstance": true,
+ "ElUploadInstance": true,
+ "ElCardInstance": true,
+ "ElDialogInstance": true,
+ "ElInputInstance": true,
+ "ElInputNumberInstance": true,
+ "ElRadioInstance": true,
+ "ElRadioGroupInstance": true,
+ "ElRadioButtonInstance": true,
+ "ElCheckboxInstance": true,
+ "ElCheckboxGroupInstance": true,
+ "ElSwitchInstance": true,
+ "ElDatePickerInstance": true,
+ "ElTimePickerInstance": true,
+ "ElTimeSelectInstance": true,
+ "ElScrollbarInstance": true,
+ "ElCascaderInstance": true,
+ "ElColorPickerInstance": true,
+ "ElRateInstance": true,
+ "ElSliderInstance": true,
+ "useRouter": true,
+ "useRoute": true,
+ "EffectScope": true,
+ "ElTable": true,
+ "ElSelect": true,
+ "ElUpload": true,
+ "ElForm": true,
+ "ElTree": true,
+ "ElMessage": true,
+ "ElMessageBox": 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,
+ "resolveDirective": 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,
+ "useArrayFindLast": true,
+ "useArrayJoin": true,
+ "useArrayMap": true,
+ "useArrayReduce": true,
+ "useArraySome": true,
+ "useArrayUnique": true,
+ "useAsyncQueue": true,
+ "useAsyncState": true,
+ "useAttrs": true,
+ "useBase64": true,
+ "useBattery": true,
+ "useBluetooth": true,
+ "useBreakpoints": true,
+ "useBroadcastChannel": true,
+ "useBrowserLocation": true,
+ "useCached": true,
+ "useClipboard": true,
+ "useCloned": 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,
+ "usePointerLock": true,
+ "usePointerSwipe": true,
+ "usePreferredColorScheme": true,
+ "usePreferredContrast": true,
+ "usePreferredDark": true,
+ "usePreferredLanguages": true,
+ "usePreferredReducedMotion": true,
+ "usePrevious": true,
+ "useRafFn": true,
+ "useRefHistory": true,
+ "useResizeObserver": true,
+ "useScreenOrientation": true,
+ "useScreenSafeArea": true,
+ "useScriptTag": true,
+ "useScroll": true,
+ "useScrollLock": true,
+ "useSessionStorage": true,
+ "useShare": true,
+ "useSlots": true,
+ "useSorted": 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,
+ "useToNumber": true,
+ "useToString": 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,
+ "ImportOption": true,
+ "TreeType": true,
+ "FieldOption": true,
+ "PageData": true,
+ "storeToRefs": true,
+ "DictDataOption": true,
+ "UploadOption": true
+ }
+}
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..6042c39
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,51 @@
+module.exports = {
+ env: {
+ browser: true,
+ node: true,
+ es6: true
+ },
+ parser: 'vue-eslint-parser',
+ extends: [
+ 'plugin:vue/vue3-recommended',
+ './.eslintrc-auto-import.json',
+ 'plugin:@typescript-eslint/recommended',
+ 'prettier',
+ 'plugin:prettier/recommended'
+ ],
+ parserOptions: {
+ ecmaVersion: '2020',
+ sourceType: 'module',
+ project: './tsconfig.*?.json',
+ parser: '@typescript-eslint/parser'
+ },
+ plugins: ['vue', '@typescript-eslint', 'import', 'promise', 'node', 'prettier'],
+ rules: {
+ '@typescript-eslint/no-empty-function': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-this-alias': 'off',
+
+ // vue
+ 'vue/multi-word-component-names': 'off',
+ 'vue/valid-define-props': 'off',
+ 'vue/no-v-model-argument': 'off',
+ 'prefer-rest-params': 'off',
+ // prettier
+ 'prettier/prettier': 'error',
+ '@typescript-eslint/ban-types': [
+ 'error',
+ {
+ // 关闭空类型检查 {}
+ extendDefaults: true,
+ types: {
+ '{}': false,
+ Function: false
+ }
+ }
+ ]
+ },
+ globals: {
+ DialogOption: 'readonly',
+ OptionType: 'readonly'
+ }
+};
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1fd56f0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+.DS_Store
+.history
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock
+pnpm-lock.yaml
+
+# 编译生成的文件
+auto-imports.d.ts
+components.d.ts
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..d251d2e
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,9 @@
+/dist/*
+.local
+.output.js
+/node_modules/**
+
+**/*.svg
+**/*.sh
+
+/public/*
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..6ca3ce5
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,20 @@
+{
+ "printWidth": 150,
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": true,
+ "singleQuote": true,
+ "quoteProps": "preserve",
+ "jsxSingleQuote": false,
+ "bracketSameLine": false,
+ "trailingComma": "none",
+ "bracketSpacing": true,
+ "embeddedLanguageFormatting": "auto",
+ "arrowParens": "always",
+ "requirePragma": false,
+ "insertPragma": false,
+ "proseWrap": "preserve",
+ "htmlWhitespaceSensitivity": "css",
+ "vueIndentScriptAndStyle": false,
+ "endOfLine": "auto"
+}
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..32b3071
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2019 RuoYi-Vue-Plus
+
+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.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..010adb9
--- /dev/null
+++ b/README.md
@@ -0,0 +1,76 @@
+## 平台简介
+
+- 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [TS](https://www.typescriptlang.org/) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。
+- 成员项目: 基于 vben(ant-design-vue) 的前端项目 [ruoyi-plus-vben](https://gitee.com/dapppp/ruoyi-plus-vben)
+- 配套后端代码仓库地址
+- [RuoYi-Vue-Plus 5.X(注意版本号)](https://gitee.com/dromara/RuoYi-Vue-Plus)
+- [RuoYi-Cloud-Plus 2.X(注意版本号)](https://gitee.com/dromara/RuoYi-Cloud-Plus)
+
+## 前端运行
+
+```bash
+# 克隆项目
+git clone https://gitee.com/JavaLionLi/plus-ui.git
+
+# 安装依赖
+npm install --registry=https://registry.npmmirror.com
+
+# 启动服务
+npm run dev
+
+# 构建生产环境
+npm run build:prod
+
+# 前端访问地址 http://localhost:80
+```
+
+## 本框架与RuoYi的业务差异
+
+| 业务 | 功能说明 | 本框架 | RuoYi |
+| ------------ | ------------------------------------------------------------- | ------ | ----------------------------- |
+| 租户管理 | 系统内租户的管理 如:租户套餐、过期时间、用户数量、企业信息等 | 支持 | 无 |
+| 租户套餐管理 | 系统内租户所能使用的套餐管理 如:套餐内所包含的菜单等 | 支持 | 无 |
+| 用户管理 | 用户的管理配置 如:新增用户、分配用户所属部门、角色、岗位等 | 支持 | 支持 |
+| 部门管理 | 配置系统组织机构(公司、部门、小组) 树结构展现支持数据权限 | 支持 | 支持 |
+| 岗位管理 | 配置系统用户所属担任职务 | 支持 | 支持 |
+| 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等 | 支持 | 支持 |
+| 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | 支持 | 支持 |
+| 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | 支持 | 支持 |
+| 参数管理 | 对系统动态配置常用参数 | 支持 | 支持 |
+| 通知公告 | 系统通知公告信息发布维护 | 支持 | 支持 |
+| 操作日志 | 系统正常操作日志记录和查询 系统异常信息日志记录和查询 | 支持 | 支持 |
+| 登录日志 | 系统登录日志记录查询包含登录异常 | 支持 | 支持 |
+| 文件管理 | 系统文件展示、上传、下载、删除等管理 | 支持 | 无 |
+| 文件配置管理 | 系统文件上传、下载所需要的配置信息动态添加、修改、删除等管理 | 支持 | 无 |
+| 在线用户管理 | 已登录系统的在线用户信息监控与强制踢出操作 | 支持 | 支持 |
+| 定时任务 | 运行报表、任务管理(添加、修改、删除)、日志管理、执行器管理等 | 支持 | 仅支持任务与日志管理 |
+| 代码生成 | 多数据源前后端代码的生成(java、html、xml、sql)支持CRUD下载 | 支持 | 仅支持单数据源 |
+| 系统接口 | 根据业务代码自动生成相关的api接口文档 | 支持 | 支持 |
+| 服务监控 | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等 | 支持 | 仅支持单机CPU、内存、磁盘监控 |
+| 缓存监控 | 对系统的缓存信息查询,命令统计等。 | 支持 | 支持 |
+| 在线构建器 | 拖动表单元素生成相应的HTML代码。 | 支持 | 支持 |
+| 使用案例 | 系统的一些功能案例 | 支持 | 不支持 |
+
+## 演示图例
+
+| | |
+| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
+| ![输入图片说明](https://foruda.gitee.com/images/1680077524361362822/270bb429_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680077619939771291/989bf9b6_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680077681751513929/1c27c5bd_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680077721559267315/74d63e23_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680077765638904515/1b75d4a6_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078026375951297/eded7a4b_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078237104531207/0eb1b6a7_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078254306078709/5931e22f_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078287971528493/0b9af60a_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078308138770249/8d3b6696_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078352553634393/db5ef880_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078378238393374/601e4357_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078414983206024/2aae27c1_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078446738419874/ecce7d59_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078475971341775/149e8634_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078491666717143/3fadece7_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078558863188826/fb8ced2a_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078574561685461/ae68a0b2_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078594932772013/9d8bfec6_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078626493093532/fcfe4ff6_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078643608812515/0295bd4f_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078685196286463/d7612c81_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078703877318597/56fce0bc_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078716586545643/b6dbd68f_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078734103217688/eb1e6aa6_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078759131415480/73c525d8_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078779416197879/75e3ed02_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078802329118061/77e10915_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078893627848351/34a1c342_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078928175016986/f126ec4a_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078941718318363/b68a0f72_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078963175518631/3bb769a1_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680078982294090567/b31c343d_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680079000642440444/77ca82a9_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680079020995074177/03b7d52e_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680079039367822173/76811806_1766278.png '屏幕截图') |
+| ![输入图片说明](https://foruda.gitee.com/images/1680079274333484664/4dfdc7c0_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680079290467458224/d6715fcf_1766278.png '屏幕截图') |
diff --git a/bin/build.bat b/bin/build.bat
new file mode 100644
index 0000000..ecbb454
--- /dev/null
+++ b/bin/build.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] Weḅdistļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn build:prod
+
+pause
\ No newline at end of file
diff --git a/bin/package.bat b/bin/package.bat
new file mode 100644
index 0000000..f5b24e0
--- /dev/null
+++ b/bin/package.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] װWeḅnode_modulesļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn --registry=https://registry.npmmirror.com
+
+pause
\ No newline at end of file
diff --git a/bin/run-web.bat b/bin/run-web.bat
new file mode 100644
index 0000000..d2fe397
--- /dev/null
+++ b/bin/run-web.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] ʹ Vite Web ̡
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn dev
+
+pause
\ No newline at end of file
diff --git a/html/ie.html b/html/ie.html
new file mode 100644
index 0000000..4d2773d
--- /dev/null
+++ b/html/ie.html
@@ -0,0 +1,242 @@
+
+
+
+
+ 请升级您的浏览器
+
+
+
+
+
+
+ 请升级您的浏览器,以便我们更好的为您提供服务!
+ 您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。
+
+ 请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束
+
+ 自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11
+ 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅
+ 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明
+ 。
+
+
+ 您可以选择更先进的浏览器
+ 推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。
+
+
+
+
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..aa1c86d
--- /dev/null
+++ b/index.html
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+ RuoYi-Vue-Plus多租户管理系统
+
+
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..e67d60f
--- /dev/null
+++ b/package.json
@@ -0,0 +1,91 @@
+{
+ "name": "ruoyi-vue-plus",
+ "version": "5.2.3",
+ "description": "RuoYi-Vue-Plus多租户管理系统",
+ "author": "LionLi",
+ "license": "MIT",
+ "type": "module",
+ "scripts": {
+ "dev": "vite serve --mode development",
+ "build:prod": "vite build --mode production",
+ "build:dev": "vite build --mode development",
+ "preview": "vite preview",
+ "lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ",
+ "prettier": "prettier --write ."
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://gitee.com/JavaLionLi/plus-ui.git"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "2.3.1",
+ "@highlightjs/vue-plugin": "2.1.0",
+ "@vueup/vue-quill": "1.2.0",
+ "@vueuse/core": "10.9.0",
+ "animate.css": "4.1.1",
+ "await-to-js": "3.0.0",
+ "axios": "1.6.8",
+ "bpmn-js": "16.4.0",
+ "crypto-js": "4.2.0",
+ "diagram-js": "12.3.0",
+ "didi": "9.0.2",
+ "echarts": "5.5.0",
+ "element-plus": "2.7.8",
+ "file-saver": "2.0.5",
+ "fuse.js": "7.0.0",
+ "highlight.js": "11.9.0",
+ "image-conversion": "^2.1.1",
+ "js-cookie": "3.0.5",
+ "jsencrypt": "3.3.2",
+ "nprogress": "0.2.0",
+ "pinia": "2.1.7",
+ "screenfull": "6.0.2",
+ "vue": "3.4.34",
+ "vue-cropper": "1.1.1",
+ "vue-i18n": "9.10.2",
+ "vue-router": "4.3.2",
+ "vue-types": "5.1.1",
+ "vxe-table": "4.5.22"
+ },
+ "devDependencies": {
+ "@iconify/json": "2.2.201",
+ "@intlify/unplugin-vue-i18n": "3.0.1",
+ "@types/crypto-js": "4.2.2",
+ "@types/file-saver": "2.0.7",
+ "@types/js-cookie": "3.0.6",
+ "@types/node": "18.18.2",
+ "@types/nprogress": "0.2.3",
+ "@typescript-eslint/eslint-plugin": "7.3.1",
+ "@typescript-eslint/parser": "7.3.1",
+ "@unocss/preset-attributify": "0.58.6",
+ "@unocss/preset-icons": "0.58.6",
+ "@unocss/preset-uno": "0.58.6",
+ "@vitejs/plugin-vue": "5.0.4",
+ "@vue/compiler-sfc": "3.4.23",
+ "autoprefixer": "10.4.18",
+ "eslint": "8.57.0",
+ "eslint-config-prettier": "9.1.0",
+ "eslint-define-config": "2.1.0",
+ "eslint-plugin-prettier": "5.1.3",
+ "eslint-plugin-promise": "6.1.1",
+ "eslint-plugin-node": "11.1.0",
+ "eslint-plugin-import": "2.29.1",
+ "eslint-plugin-vue": "9.23.0",
+ "fast-glob": "3.3.2",
+ "postcss": "8.4.36",
+ "prettier": "3.2.5",
+ "sass": "1.72.0",
+ "typescript": "5.4.5",
+ "unocss": "0.58.6",
+ "unplugin-auto-import": "0.17.5",
+ "unplugin-icons": "0.18.5",
+ "unplugin-vue-components": "0.26.0",
+ "unplugin-vue-setup-extend-plus": "1.0.1",
+ "vite": "5.2.12",
+ "vite-plugin-compression": "0.5.1",
+ "vite-plugin-svg-icons": "2.0.1",
+ "vitest": "1.5.0",
+ "vue-eslint-parser": "9.4.2",
+ "vue-tsc": "2.0.13"
+ }
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..3f919d85a5d1e093fd8d80ebcbe9987a3bdbb54f
GIT binary patch
literal 8131
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
d+2AD?_zza
+
+
+
+
+
+
diff --git a/src/animate.ts b/src/animate.ts
new file mode 100644
index 0000000..7a23df8
--- /dev/null
+++ b/src/animate.ts
@@ -0,0 +1,48 @@
+// 前缀
+const animatePrefix = 'animate__animated ';
+// 开启随机动画 随机动画值
+const animateList: string[] = [
+ animatePrefix + 'animate__pulse',
+ animatePrefix + 'animate__rubberBand',
+ animatePrefix + 'animate__bounceIn',
+ animatePrefix + 'animate__bounceInLeft',
+ animatePrefix + 'animate__fadeIn',
+ animatePrefix + 'animate__fadeInLeft',
+ animatePrefix + 'animate__fadeInDown',
+ animatePrefix + 'animate__fadeInUp',
+ animatePrefix + 'animate__flipInX',
+ animatePrefix + 'animate__lightSpeedInLeft',
+ animatePrefix + 'animate__rotateInDownLeft',
+ animatePrefix + 'animate__rollIn',
+ animatePrefix + 'animate__rotateInDownLeft',
+ animatePrefix + 'animate__zoomIn',
+ animatePrefix + 'animate__zoomInDown',
+ animatePrefix + 'animate__slideInLeft',
+ animatePrefix + 'animate__lightSpeedIn'
+];
+// 关闭随机动画后的默认效果
+const defaultAnimate = animatePrefix + 'animate__fadeIn';
+// 搜索隐藏显示动画
+const searchAnimate = {
+ enter: '',
+ leave: ''
+};
+
+// 菜单搜索动画
+const menuSearchAnimate = {
+ enter: animatePrefix + 'animate__fadeIn',
+ leave: animatePrefix + 'animate__fadeOut'
+};
+// logo动画
+const logoAnimate = {
+ enter: animatePrefix + 'animate__fadeIn',
+ leave: animatePrefix + 'animate__fadeOut'
+};
+
+export default {
+ animateList,
+ defaultAnimate,
+ searchAnimate,
+ menuSearchAnimate,
+ logoAnimate
+};
diff --git a/src/api/demo/demo/index.ts b/src/api/demo/demo/index.ts
new file mode 100644
index 0000000..7441720
--- /dev/null
+++ b/src/api/demo/demo/index.ts
@@ -0,0 +1,62 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { DemoVO, DemoForm, DemoQuery } from '@/api/demo/demo/types';
+
+/**
+ * 查询测试单列表
+ * @param query
+ * @returns {*}
+ */
+export const listDemo = (query?: DemoQuery): AxiosPromise => {
+ return request({
+ url: '/demo/demo/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询测试单详细
+ * @param id
+ */
+export const getDemo = (id: string | number): AxiosPromise => {
+ return request({
+ url: '/demo/demo/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增测试单
+ * @param data
+ */
+export const addDemo = (data: DemoForm) => {
+ return request({
+ url: '/demo/demo',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改测试单
+ * @param data
+ */
+export const updateDemo = (data: DemoForm) => {
+ return request({
+ url: '/demo/demo',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除测试单
+ * @param id
+ */
+export const delDemo = (id: string | number | Array) => {
+ return request({
+ url: '/demo/demo/' + id,
+ method: 'delete'
+ });
+};
diff --git a/src/api/demo/demo/types.ts b/src/api/demo/demo/types.ts
new file mode 100644
index 0000000..ea51d32
--- /dev/null
+++ b/src/api/demo/demo/types.ts
@@ -0,0 +1,90 @@
+export interface DemoVO {
+ /**
+ * 主键
+ */
+ id: string | number;
+
+ /**
+ * 部门id
+ */
+ deptId: string | number;
+
+ /**
+ * 用户id
+ */
+ userId: string | number;
+
+ /**
+ * 排序号
+ */
+ orderNum: number;
+
+ /**
+ * key键
+ */
+ testKey: string;
+
+ /**
+ * 值
+ */
+ value: string;
+}
+
+export interface DemoForm extends BaseEntity {
+ /**
+ * 主键
+ */
+ id?: string | number;
+
+ /**
+ * 部门id
+ */
+ deptId?: string | number;
+
+ /**
+ * 用户id
+ */
+ userId?: string | number;
+
+ /**
+ * 排序号
+ */
+ orderNum?: number;
+
+ /**
+ * key键
+ */
+ testKey?: string;
+
+ /**
+ * 值
+ */
+ value?: string;
+}
+
+export interface DemoQuery extends PageQuery {
+ /**
+ * 部门id
+ */
+ deptId?: string | number;
+
+ /**
+ * 用户id
+ */
+ userId?: string | number;
+
+ /**
+ * 排序号
+ */
+ orderNum?: number;
+
+ /**
+ * key键
+ */
+ testKey?: string;
+
+ /**
+ * 值
+ */
+ value?: string;
+}
diff --git a/src/api/demo/tree/index.ts b/src/api/demo/tree/index.ts
new file mode 100644
index 0000000..562deb6
--- /dev/null
+++ b/src/api/demo/tree/index.ts
@@ -0,0 +1,62 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { TreeVO, TreeForm, TreeQuery } from '@/api/demo/tree/types';
+
+/**
+ * 查询测试树列表
+ * @param query
+ * @returns {*}
+ */
+export const listTree = (query?: TreeQuery): AxiosPromise => {
+ return request({
+ url: '/demo/tree/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询测试树详细
+ * @param id
+ */
+export const getTree = (id: string | number): AxiosPromise => {
+ return request({
+ url: '/demo/tree/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增测试树
+ * @param data
+ */
+export const addTree = (data: TreeForm) => {
+ return request({
+ url: '/demo/tree',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改测试树
+ * @param data
+ */
+export const updateTree = (data: TreeForm) => {
+ return request({
+ url: '/demo/tree',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除测试树
+ * @param id
+ */
+export const delTree = (id: string | number | Array) => {
+ return request({
+ url: '/demo/tree/' + id,
+ method: 'delete'
+ });
+};
diff --git a/src/api/demo/tree/types.ts b/src/api/demo/tree/types.ts
new file mode 100644
index 0000000..e164d8b
--- /dev/null
+++ b/src/api/demo/tree/types.ts
@@ -0,0 +1,80 @@
+export interface TreeVO {
+ /**
+ * 主键
+ */
+ id: string | number;
+
+ /**
+ * 父id
+ */
+ parentId: string | number;
+
+ /**
+ * 部门id
+ */
+ deptId: string | number;
+
+ /**
+ * 用户id
+ */
+ userId: string | number;
+
+ /**
+ * 值
+ */
+ treeName: string;
+
+ /**
+ * 子对象
+ */
+ children: TreeVO[];
+}
+
+export interface TreeForm extends BaseEntity {
+ /**
+ * 主键
+ */
+ id?: string | number;
+
+ /**
+ * 父id
+ */
+ parentId?: string | number;
+
+ /**
+ * 部门id
+ */
+ deptId?: string | number;
+
+ /**
+ * 用户id
+ */
+ userId?: string | number;
+
+ /**
+ * 值
+ */
+ treeName?: string;
+}
+
+export interface TreeQuery {
+ /**
+ * 父id
+ */
+ parentId?: string | number;
+
+ /**
+ * 部门id
+ */
+ deptId?: string | number;
+
+ /**
+ * 用户id
+ */
+ userId?: string | number;
+
+ /**
+ * 值
+ */
+ treeName?: string;
+}
diff --git a/src/api/login.ts b/src/api/login.ts
new file mode 100644
index 0000000..c7c291e
--- /dev/null
+++ b/src/api/login.ts
@@ -0,0 +1,111 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { LoginData, LoginResult, VerifyCodeResult, TenantInfo } from './types';
+import { UserInfo } from '@/api/system/user/types';
+
+// pc端固定客户端授权id
+const clientId = import.meta.env.VITE_APP_CLIENT_ID;
+
+/**
+ * @param data {LoginData}
+ * @returns
+ */
+export function login(data: LoginData): AxiosPromise {
+ const params = {
+ ...data,
+ clientId: data.clientId || clientId,
+ grantType: data.grantType || 'password'
+ };
+ return request({
+ url: '/auth/login',
+ headers: {
+ isToken: false,
+ isEncrypt: true,
+ repeatSubmit: false
+ },
+ method: 'post',
+ data: params
+ });
+}
+
+// 注册方法
+export function register(data: any) {
+ const params = {
+ ...data,
+ clientId: clientId,
+ grantType: 'password'
+ };
+ return request({
+ url: '/auth/register',
+ headers: {
+ isToken: false,
+ isEncrypt: true,
+ repeatSubmit: false
+ },
+ method: 'post',
+ data: params
+ });
+}
+
+/**
+ * 注销
+ */
+export function logout() {
+ request({
+ url: '/resource/sse/close',
+ method: 'get'
+ });
+ return request({
+ url: '/auth/logout',
+ method: 'post'
+ });
+}
+
+/**
+ * 获取验证码
+ */
+export function getCodeImg(): AxiosPromise {
+ return request({
+ url: '/auth/code',
+ headers: {
+ isToken: false
+ },
+ method: 'get',
+ timeout: 20000
+ });
+}
+
+/**
+ * 第三方登录
+ */
+export function callback(data: LoginData): AxiosPromise {
+ const LoginData = {
+ ...data,
+ clientId: clientId,
+ grantType: 'social'
+ };
+ return request({
+ url: '/auth/social/callback',
+ method: 'post',
+ data: LoginData
+ });
+}
+
+// 获取用户详细信息
+export function getInfo(): AxiosPromise {
+ return request({
+ url: '/system/user/getInfo',
+ method: 'get'
+ });
+}
+
+// 获取租户列表
+export function getTenantList(): AxiosPromise {
+ return request({
+ url: '/auth/tenant/list',
+ headers: {
+ isToken: false
+ },
+ method: 'get'
+ });
+}
diff --git a/src/api/menu.ts b/src/api/menu.ts
new file mode 100644
index 0000000..a3ae80e
--- /dev/null
+++ b/src/api/menu.ts
@@ -0,0 +1,11 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { RouteRecordRaw } from 'vue-router';
+
+// 获取路由
+export function getRouters(): AxiosPromise {
+ return request({
+ url: '/system/menu/getRouters',
+ method: 'get'
+ });
+}
diff --git a/src/api/monitor/cache/index.ts b/src/api/monitor/cache/index.ts
new file mode 100644
index 0000000..e45d6fb
--- /dev/null
+++ b/src/api/monitor/cache/index.ts
@@ -0,0 +1,59 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { CacheVO } from './types';
+
+// 查询缓存详细
+export function getCache(): AxiosPromise {
+ return request({
+ url: '/monitor/cache',
+ method: 'get'
+ });
+}
+
+// 查询缓存名称列表
+export function listCacheName() {
+ return request({
+ url: '/monitor/cache/getNames',
+ method: 'get'
+ });
+}
+
+// 查询缓存键名列表
+export function listCacheKey(cacheName: string) {
+ return request({
+ url: '/monitor/cache/getKeys/' + cacheName,
+ method: 'get'
+ });
+}
+
+// 查询缓存内容
+export function getCacheValue(cacheName: string, cacheKey: string) {
+ return request({
+ url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey,
+ method: 'get'
+ });
+}
+
+// 清理指定名称缓存
+export function clearCacheName(cacheName: string) {
+ return request({
+ url: '/monitor/cache/clearCacheName/' + cacheName,
+ method: 'delete'
+ });
+}
+
+// 清理指定键名缓存
+export function clearCacheKey(cacheName: string, cacheKey: string) {
+ return request({
+ url: '/monitor/cache/clearCacheKey/' + cacheName + '/' + cacheKey,
+ method: 'delete'
+ });
+}
+
+// 清理全部缓存
+export function clearCacheAll() {
+ return request({
+ url: '/monitor/cache/clearCacheAll',
+ method: 'delete'
+ });
+}
diff --git a/src/api/monitor/cache/types.ts b/src/api/monitor/cache/types.ts
new file mode 100644
index 0000000..4017b65
--- /dev/null
+++ b/src/api/monitor/cache/types.ts
@@ -0,0 +1,7 @@
+export interface CacheVO {
+ commandStats: Array<{ name: string; value: string }>;
+
+ dbSize: number;
+
+ info: { [key: string]: string };
+}
diff --git a/src/api/monitor/loginInfo/index.ts b/src/api/monitor/loginInfo/index.ts
new file mode 100644
index 0000000..f8877c9
--- /dev/null
+++ b/src/api/monitor/loginInfo/index.ts
@@ -0,0 +1,36 @@
+import request from '@/utils/request';
+import { LoginInfoQuery, LoginInfoVO } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询登录日志列表
+export function list(query: LoginInfoQuery): AxiosPromise {
+ return request({
+ url: '/monitor/logininfor/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 删除登录日志
+export function delLoginInfo(infoId: string | number | Array) {
+ return request({
+ url: '/monitor/logininfor/' + infoId,
+ method: 'delete'
+ });
+}
+
+// 解锁用户登录状态
+export function unlockLoginInfo(userName: string | Array) {
+ return request({
+ url: '/monitor/logininfor/unlock/' + userName,
+ method: 'get'
+ });
+}
+
+// 清空登录日志
+export function cleanLoginInfo() {
+ return request({
+ url: '/monitor/logininfor/clean',
+ method: 'delete'
+ });
+}
diff --git a/src/api/monitor/loginInfo/types.ts b/src/api/monitor/loginInfo/types.ts
new file mode 100644
index 0000000..202c779
--- /dev/null
+++ b/src/api/monitor/loginInfo/types.ts
@@ -0,0 +1,20 @@
+export interface LoginInfoVO {
+ infoId: string | number;
+ tenantId: string | number;
+ userName: string;
+ status: string;
+ ipaddr: string;
+ loginLocation: string;
+ browser: string;
+ os: string;
+ msg: string;
+ loginTime: string;
+}
+
+export interface LoginInfoQuery extends PageQuery {
+ ipaddr: string;
+ userName: string;
+ status: string;
+ orderByColumn: string;
+ isAsc: string;
+}
diff --git a/src/api/monitor/online/index.ts b/src/api/monitor/online/index.ts
new file mode 100644
index 0000000..7484702
--- /dev/null
+++ b/src/api/monitor/online/index.ts
@@ -0,0 +1,36 @@
+import request from '@/utils/request';
+import { OnlineQuery, OnlineVO } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询在线用户列表
+export function list(query: OnlineQuery): AxiosPromise {
+ return request({
+ url: '/monitor/online/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 强退用户
+export function forceLogout(tokenId: string) {
+ return request({
+ url: '/monitor/online/' + tokenId,
+ method: 'delete'
+ });
+}
+
+// 获取当前用户登录在线设备
+export function getOnline() {
+ return request({
+ url: '/monitor/online',
+ method: 'get'
+ });
+}
+
+// 删除当前在线设备
+export function delOnline(tokenId: string) {
+ return request({
+ url: '/monitor/online/' + tokenId,
+ method: 'post'
+ });
+}
diff --git a/src/api/monitor/online/types.ts b/src/api/monitor/online/types.ts
new file mode 100644
index 0000000..8c0ec27
--- /dev/null
+++ b/src/api/monitor/online/types.ts
@@ -0,0 +1,15 @@
+export interface OnlineQuery extends PageQuery {
+ ipaddr: string;
+ userName: string;
+}
+
+export interface OnlineVO extends BaseEntity {
+ tokenId: string;
+ deptName: string;
+ userName: string;
+ ipaddr: string;
+ loginLocation: string;
+ browser: string;
+ os: string;
+ loginTime: number;
+}
diff --git a/src/api/monitor/operlog/index.ts b/src/api/monitor/operlog/index.ts
new file mode 100644
index 0000000..7ac3453
--- /dev/null
+++ b/src/api/monitor/operlog/index.ts
@@ -0,0 +1,28 @@
+import request from '@/utils/request';
+import { OperLogQuery, OperLogVO } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询操作日志列表
+export function list(query: OperLogQuery): AxiosPromise {
+ return request({
+ url: '/monitor/operlog/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 删除操作日志
+export function delOperlog(operId: string | number | Array) {
+ return request({
+ url: '/monitor/operlog/' + operId,
+ method: 'delete'
+ });
+}
+
+// 清空操作日志
+export function cleanOperlog() {
+ return request({
+ url: '/monitor/operlog/clean',
+ method: 'delete'
+ });
+}
diff --git a/src/api/monitor/operlog/types.ts b/src/api/monitor/operlog/types.ts
new file mode 100644
index 0000000..10f65c7
--- /dev/null
+++ b/src/api/monitor/operlog/types.ts
@@ -0,0 +1,53 @@
+export interface OperLogQuery extends PageQuery {
+ operIp: string;
+ title: string;
+ operName: string;
+ businessType: string;
+ status: string;
+ orderByColumn: string;
+ isAsc: string;
+}
+
+export interface OperLogVO extends BaseEntity {
+ operId: string | number;
+ tenantId: string;
+ title: string;
+ businessType: number;
+ businessTypes: number[] | undefined;
+ method: string;
+ requestMethod: string;
+ operatorType: number;
+ operName: string;
+ deptName: string;
+ operUrl: string;
+ operIp: string;
+ operLocation: string;
+ operParam: string;
+ jsonResult: string;
+ status: number;
+ errorMsg: string;
+ operTime: string;
+ costTime: number;
+}
+
+export interface OperLogForm {
+ operId: number | string | undefined;
+ tenantId: string | number | undefined;
+ title: string;
+ businessType: number;
+ businessTypes: number[] | undefined;
+ method: string;
+ requestMethod: string;
+ operatorType: number;
+ operName: string;
+ deptName: string;
+ operUrl: string;
+ operIp: string;
+ operLocation: string;
+ operParam: string;
+ jsonResult: string;
+ status: number;
+ errorMsg: string;
+ operTime: string;
+ costTime: number;
+}
diff --git a/src/api/system/client/index.ts b/src/api/system/client/index.ts
new file mode 100644
index 0000000..6b302b0
--- /dev/null
+++ b/src/api/system/client/index.ts
@@ -0,0 +1,80 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ClientVO, ClientForm, ClientQuery } from '@/api/system/client/types';
+
+/**
+ * 查询客户端管理列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listClient = (query?: ClientQuery): AxiosPromise => {
+ return request({
+ url: '/system/client/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询客户端管理详细
+ * @param id
+ */
+export const getClient = (id: string | number): AxiosPromise => {
+ return request({
+ url: '/system/client/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增客户端管理
+ * @param data
+ */
+export const addClient = (data: ClientForm) => {
+ return request({
+ url: '/system/client',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改客户端管理
+ * @param data
+ */
+export const updateClient = (data: ClientForm) => {
+ return request({
+ url: '/system/client',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除客户端管理
+ * @param id
+ */
+export const delClient = (id: string | number | Array) => {
+ return request({
+ url: '/system/client/' + id,
+ method: 'delete'
+ });
+};
+
+/**
+ * 状态修改
+ * @param clientId 客户端id
+ * @param status 状态
+ */
+export function changeStatus(clientId: string, status: string) {
+ const data = {
+ clientId,
+ status
+ };
+ return request({
+ url: '/system/client/changeStatus',
+ method: 'put',
+ data: data
+ });
+}
diff --git a/src/api/system/client/types.ts b/src/api/system/client/types.ts
new file mode 100644
index 0000000..142118d
--- /dev/null
+++ b/src/api/system/client/types.ts
@@ -0,0 +1,135 @@
+export interface ClientVO {
+ /**
+ * id
+ */
+ id: string | number;
+
+ /**
+ * 客户端id
+ */
+ clientId: string;
+
+ /**
+ * 客户端key
+ */
+ clientKey: string;
+
+ /**
+ * 客户端秘钥
+ */
+ clientSecret: string;
+
+ /**
+ * 授权类型
+ */
+ grantTypeList: string[];
+
+ /**
+ * 设备类型
+ */
+ deviceType: string;
+
+ /**
+ * token活跃超时时间
+ */
+ activeTimeout: number;
+
+ /**
+ * token固定超时
+ */
+ timeout: number;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ status: string;
+}
+
+export interface ClientForm extends BaseEntity {
+ /**
+ * id
+ */
+ id?: string | number;
+
+ /**
+ * 客户端id
+ */
+ clientId?: string | number;
+
+ /**
+ * 客户端key
+ */
+ clientKey?: string;
+
+ /**
+ * 客户端秘钥
+ */
+ clientSecret?: string;
+
+ /**
+ * 授权类型
+ */
+ grantTypeList?: string[];
+
+ /**
+ * 设备类型
+ */
+ deviceType?: string;
+
+ /**
+ * token活跃超时时间
+ */
+ activeTimeout?: number;
+
+ /**
+ * token固定超时
+ */
+ timeout?: number;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ status?: string;
+}
+
+export interface ClientQuery extends PageQuery {
+ /**
+ * 客户端id
+ */
+ clientId?: string | number;
+
+ /**
+ * 客户端key
+ */
+ clientKey?: string;
+
+ /**
+ * 客户端秘钥
+ */
+ clientSecret?: string;
+
+ /**
+ * 授权类型
+ */
+ grantType?: string;
+
+ /**
+ * 设备类型
+ */
+ deviceType?: string;
+
+ /**
+ * token活跃超时时间
+ */
+ activeTimeout?: number;
+
+ /**
+ * token固定超时
+ */
+ timeout?: number;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ status?: string;
+}
diff --git a/src/api/system/config/index.ts b/src/api/system/config/index.ts
new file mode 100644
index 0000000..1e4842d
--- /dev/null
+++ b/src/api/system/config/index.ts
@@ -0,0 +1,74 @@
+import request from '@/utils/request';
+import { ConfigForm, ConfigQuery, ConfigVO } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询参数列表
+export function listConfig(query: ConfigQuery): AxiosPromise {
+ return request({
+ url: '/system/config/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 查询参数详细
+export function getConfig(configId: string | number): AxiosPromise {
+ return request({
+ url: '/system/config/' + configId,
+ method: 'get'
+ });
+}
+
+// 根据参数键名查询参数值
+export function getConfigKey(configKey: string): AxiosPromise {
+ return request({
+ url: '/system/config/configKey/' + configKey,
+ method: 'get'
+ });
+}
+
+// 新增参数配置
+export function addConfig(data: ConfigForm) {
+ return request({
+ url: '/system/config',
+ method: 'post',
+ data: data
+ });
+}
+
+// 修改参数配置
+export function updateConfig(data: ConfigForm) {
+ return request({
+ url: '/system/config',
+ method: 'put',
+ data: data
+ });
+}
+
+// 修改参数配置
+export function updateConfigByKey(key: string, value: any) {
+ return request({
+ url: '/system/config/updateByKey',
+ method: 'put',
+ data: {
+ configKey: key,
+ configValue: value
+ }
+ });
+}
+
+// 删除参数配置
+export function delConfig(configId: string | number | Array) {
+ return request({
+ url: '/system/config/' + configId,
+ method: 'delete'
+ });
+}
+
+// 刷新参数缓存
+export function refreshCache() {
+ return request({
+ url: '/system/config/refreshCache',
+ method: 'delete'
+ });
+}
diff --git a/src/api/system/config/types.ts b/src/api/system/config/types.ts
new file mode 100644
index 0000000..b68f073
--- /dev/null
+++ b/src/api/system/config/types.ts
@@ -0,0 +1,23 @@
+export interface ConfigVO extends BaseEntity {
+ configId: number | string;
+ configName: string;
+ configKey: string;
+ configValue: string;
+ configType: string;
+ remark: string;
+}
+
+export interface ConfigForm {
+ configId: number | string | undefined;
+ configName: string;
+ configKey: string;
+ configValue: string;
+ configType: string;
+ remark: string;
+}
+
+export interface ConfigQuery extends PageQuery {
+ configName: string;
+ configKey: string;
+ configType: string;
+}
diff --git a/src/api/system/dept/index.ts b/src/api/system/dept/index.ts
new file mode 100644
index 0000000..7e097fd
--- /dev/null
+++ b/src/api/system/dept/index.ts
@@ -0,0 +1,62 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { DeptForm, DeptQuery, DeptVO } from './types';
+
+// 查询部门列表
+export const listDept = (query?: DeptQuery) => {
+ return request({
+ url: '/system/dept/list',
+ method: 'get',
+ params: query
+ });
+};
+
+// 查询部门列表(排除节点)
+export const listDeptExcludeChild = (deptId: string | number): AxiosPromise => {
+ return request({
+ url: '/system/dept/list/exclude/' + deptId,
+ method: 'get'
+ });
+};
+
+// 查询部门详细
+export const getDept = (deptId: string | number): AxiosPromise => {
+ return request({
+ url: '/system/dept/' + deptId,
+ method: 'get'
+ });
+};
+
+// 查询部门下拉树结构
+export const treeselect = (): AxiosPromise => {
+ return request({
+ url: '/system/dept/treeselect',
+ method: 'get'
+ });
+};
+
+// 新增部门
+export const addDept = (data: DeptForm) => {
+ return request({
+ url: '/system/dept',
+ method: 'post',
+ data: data
+ });
+};
+
+// 修改部门
+export const updateDept = (data: DeptForm) => {
+ return request({
+ url: '/system/dept',
+ method: 'put',
+ data: data
+ });
+};
+
+// 删除部门
+export const delDept = (deptId: number | string) => {
+ return request({
+ url: '/system/dept/' + deptId,
+ method: 'delete'
+ });
+};
diff --git a/src/api/system/dept/types.ts b/src/api/system/dept/types.ts
new file mode 100644
index 0000000..494745c
--- /dev/null
+++ b/src/api/system/dept/types.ts
@@ -0,0 +1,48 @@
+/**
+ * 部门查询参数
+ */
+export interface DeptQuery extends PageQuery {
+ deptName?: string;
+ deptCategory?: string;
+ status?: number;
+}
+
+/**
+ * 部门类型
+ */
+export interface DeptVO extends BaseEntity {
+ id: number | string;
+ parentName: string;
+ parentId: number | string;
+ children: DeptVO[];
+ deptId: number | string;
+ deptName: string;
+ deptCategory: string;
+ orderNum: number;
+ leader: string;
+ phone: string;
+ email: string;
+ status: string;
+ delFlag: string;
+ ancestors: string;
+ menuId: string | number;
+}
+
+/**
+ * 部门表单类型
+ */
+export interface DeptForm {
+ parentName?: string;
+ parentId?: number | string;
+ children?: DeptForm[];
+ deptId?: number | string;
+ deptName?: string;
+ deptCategory?: string;
+ orderNum?: number;
+ leader?: string;
+ phone?: string;
+ email?: string;
+ status?: string;
+ delFlag?: string;
+ ancestors?: string;
+}
diff --git a/src/api/system/dict/data/index.ts b/src/api/system/dict/data/index.ts
new file mode 100644
index 0000000..7692abc
--- /dev/null
+++ b/src/api/system/dict/data/index.ts
@@ -0,0 +1,53 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { DictDataForm, DictDataQuery, DictDataVO } from './types';
+// 根据字典类型查询字典数据信息
+export function getDicts(dictType: string): AxiosPromise {
+ return request({
+ url: '/system/dict/data/type/' + dictType,
+ method: 'get'
+ });
+}
+
+// 查询字典数据列表
+export function listData(query: DictDataQuery): AxiosPromise {
+ return request({
+ url: '/system/dict/data/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 查询字典数据详细
+export function getData(dictCode: string | number): AxiosPromise {
+ return request({
+ url: '/system/dict/data/' + dictCode,
+ method: 'get'
+ });
+}
+
+// 新增字典数据
+export function addData(data: DictDataForm) {
+ return request({
+ url: '/system/dict/data',
+ method: 'post',
+ data: data
+ });
+}
+
+// 修改字典数据
+export function updateData(data: DictDataForm) {
+ return request({
+ url: '/system/dict/data',
+ method: 'put',
+ data: data
+ });
+}
+
+// 删除字典数据
+export function delData(dictCode: string | number | Array) {
+ return request({
+ url: '/system/dict/data/' + dictCode,
+ method: 'delete'
+ });
+}
diff --git a/src/api/system/dict/data/types.ts b/src/api/system/dict/data/types.ts
new file mode 100644
index 0000000..e4abb9b
--- /dev/null
+++ b/src/api/system/dict/data/types.ts
@@ -0,0 +1,26 @@
+export interface DictDataQuery extends PageQuery {
+ dictName: string;
+ dictType: string;
+ dictLabel: string;
+}
+
+export interface DictDataVO extends BaseEntity {
+ dictCode: string;
+ dictLabel: string;
+ dictValue: string;
+ cssClass: string;
+ listClass: ElTagType;
+ dictSort: number;
+ remark: string;
+}
+
+export interface DictDataForm {
+ dictType?: string;
+ dictCode: string | undefined;
+ dictLabel: string;
+ dictValue: string;
+ cssClass: string;
+ listClass: ElTagType;
+ dictSort: number;
+ remark: string;
+}
diff --git a/src/api/system/dict/type/index.ts b/src/api/system/dict/type/index.ts
new file mode 100644
index 0000000..7dc3d66
--- /dev/null
+++ b/src/api/system/dict/type/index.ts
@@ -0,0 +1,62 @@
+import request from '@/utils/request';
+import { DictTypeForm, DictTypeVO, DictTypeQuery } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询字典类型列表
+export function listType(query: DictTypeQuery): AxiosPromise {
+ return request({
+ url: '/system/dict/type/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 查询字典类型详细
+export function getType(dictId: number | string): AxiosPromise {
+ return request({
+ url: '/system/dict/type/' + dictId,
+ method: 'get'
+ });
+}
+
+// 新增字典类型
+export function addType(data: DictTypeForm) {
+ return request({
+ url: '/system/dict/type',
+ method: 'post',
+ data: data
+ });
+}
+
+// 修改字典类型
+export function updateType(data: DictTypeForm) {
+ return request({
+ url: '/system/dict/type',
+ method: 'put',
+ data: data
+ });
+}
+
+// 删除字典类型
+export function delType(dictId: string | number | Array) {
+ return request({
+ url: '/system/dict/type/' + dictId,
+ method: 'delete'
+ });
+}
+
+// 刷新字典缓存
+export function refreshCache() {
+ return request({
+ url: '/system/dict/type/refreshCache',
+ method: 'delete'
+ });
+}
+
+// 获取字典选择框列表
+export function optionselect(): AxiosPromise {
+ return request({
+ url: '/system/dict/type/optionselect',
+ method: 'get'
+ });
+}
diff --git a/src/api/system/dict/type/types.ts b/src/api/system/dict/type/types.ts
new file mode 100644
index 0000000..4987dbf
--- /dev/null
+++ b/src/api/system/dict/type/types.ts
@@ -0,0 +1,18 @@
+export interface DictTypeVO extends BaseEntity {
+ dictId: number | string;
+ dictName: string;
+ dictType: string;
+ remark: string;
+}
+
+export interface DictTypeForm {
+ dictId: number | string | undefined;
+ dictName: string;
+ dictType: string;
+ remark: string;
+}
+
+export interface DictTypeQuery extends PageQuery {
+ dictName: string;
+ dictType: string;
+}
diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts
new file mode 100644
index 0000000..7a0cf74
--- /dev/null
+++ b/src/api/system/menu/index.ts
@@ -0,0 +1,70 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { MenuQuery, MenuVO, MenuForm, MenuTreeOption, RoleMenuTree } from './types';
+
+// 查询菜单列表
+export const listMenu = (query?: MenuQuery): AxiosPromise => {
+ return request({
+ url: '/system/menu/list',
+ method: 'get',
+ params: query
+ });
+};
+
+// 查询菜单详细
+export const getMenu = (menuId: string | number): AxiosPromise => {
+ return request({
+ url: '/system/menu/' + menuId,
+ method: 'get'
+ });
+};
+
+// 查询菜单下拉树结构
+export const treeselect = (): AxiosPromise => {
+ return request({
+ url: '/system/menu/treeselect',
+ method: 'get'
+ });
+};
+
+// 根据角色ID查询菜单下拉树结构
+export const roleMenuTreeselect = (roleId: string | number): AxiosPromise => {
+ return request({
+ url: '/system/menu/roleMenuTreeselect/' + roleId,
+ method: 'get'
+ });
+};
+
+// 根据角色ID查询菜单下拉树结构
+export const tenantPackageMenuTreeselect = (packageId: string | number): AxiosPromise => {
+ return request({
+ url: '/system/menu/tenantPackageMenuTreeselect/' + packageId,
+ method: 'get'
+ });
+};
+
+// 新增菜单
+export const addMenu = (data: MenuForm) => {
+ return request({
+ url: '/system/menu',
+ method: 'post',
+ data: data
+ });
+};
+
+// 修改菜单
+export const updateMenu = (data: MenuForm) => {
+ return request({
+ url: '/system/menu',
+ method: 'put',
+ data: data
+ });
+};
+
+// 删除菜单
+export const delMenu = (menuId: string | number) => {
+ return request({
+ url: '/system/menu/' + menuId,
+ method: 'delete'
+ });
+};
diff --git a/src/api/system/menu/types.ts b/src/api/system/menu/types.ts
new file mode 100644
index 0000000..ca19840
--- /dev/null
+++ b/src/api/system/menu/types.ts
@@ -0,0 +1,69 @@
+import { MenuTypeEnum } from '@/enums/MenuTypeEnum';
+
+/**
+ * 菜单树形结构类型
+ */
+export interface MenuTreeOption {
+ id: string | number;
+ label: string;
+ parentId: string | number;
+ weight: number;
+ children?: MenuTreeOption[];
+}
+
+export interface RoleMenuTree {
+ menus: MenuTreeOption[];
+ checkedKeys: string[];
+}
+
+/**
+ * 菜单查询参数类型
+ */
+export interface MenuQuery {
+ keywords?: string;
+ menuName?: string;
+ status?: string;
+}
+
+/**
+ * 菜单视图对象类型
+ */
+export interface MenuVO extends BaseEntity {
+ parentName: string;
+ parentId: string | number;
+ children: MenuVO[];
+ menuId: string | number;
+ menuName: string;
+ orderNum: number;
+ path: string;
+ component: string;
+ queryParam: string;
+ isFrame: string;
+ isCache: string;
+ menuType: MenuTypeEnum;
+ visible: string;
+ status: string;
+ icon: string;
+ remark: string;
+}
+
+export interface MenuForm {
+ parentName?: string;
+ parentId?: string | number;
+ children?: MenuForm[];
+ menuId?: string | number;
+ menuName: string;
+ orderNum: number;
+ path: string;
+ component?: string;
+ queryParam?: string;
+ isFrame?: string;
+ isCache?: string;
+ menuType?: MenuTypeEnum;
+ visible?: string;
+ status?: string;
+ icon?: string;
+ remark?: string;
+ query?: string;
+ perms?: string;
+}
diff --git a/src/api/system/notice/index.ts b/src/api/system/notice/index.ts
new file mode 100644
index 0000000..285d1f4
--- /dev/null
+++ b/src/api/system/notice/index.ts
@@ -0,0 +1,45 @@
+import request from '@/utils/request';
+import { NoticeForm, NoticeQuery, NoticeVO } from './types';
+import { AxiosPromise } from 'axios';
+// 查询公告列表
+export function listNotice(query: NoticeQuery): AxiosPromise {
+ return request({
+ url: '/system/notice/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 查询公告详细
+export function getNotice(noticeId: string | number): AxiosPromise {
+ return request({
+ url: '/system/notice/' + noticeId,
+ method: 'get'
+ });
+}
+
+// 新增公告
+export function addNotice(data: NoticeForm) {
+ return request({
+ url: '/system/notice',
+ method: 'post',
+ data: data
+ });
+}
+
+// 修改公告
+export function updateNotice(data: NoticeForm) {
+ return request({
+ url: '/system/notice',
+ method: 'put',
+ data: data
+ });
+}
+
+// 删除公告
+export function delNotice(noticeId: string | number | Array) {
+ return request({
+ url: '/system/notice/' + noticeId,
+ method: 'delete'
+ });
+}
diff --git a/src/api/system/notice/types.ts b/src/api/system/notice/types.ts
new file mode 100644
index 0000000..abfd5b2
--- /dev/null
+++ b/src/api/system/notice/types.ts
@@ -0,0 +1,26 @@
+export interface NoticeVO extends BaseEntity {
+ noticeId: number;
+ noticeTitle: string;
+ noticeType: string;
+ noticeContent: string;
+ status: string;
+ remark: string;
+ createByName: string;
+}
+
+export interface NoticeQuery extends PageQuery {
+ noticeTitle: string;
+ createByName: string;
+ status: string;
+ noticeType: string;
+}
+
+export interface NoticeForm {
+ noticeId: number | string | undefined;
+ noticeTitle: string;
+ noticeType: string;
+ noticeContent: string;
+ status: string;
+ remark: string;
+ createByName: string;
+}
diff --git a/src/api/system/oss/index.ts b/src/api/system/oss/index.ts
new file mode 100644
index 0000000..4472112
--- /dev/null
+++ b/src/api/system/oss/index.ts
@@ -0,0 +1,28 @@
+import request from '@/utils/request';
+import { OssQuery, OssVO } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询OSS对象存储列表
+export function listOss(query: OssQuery): AxiosPromise {
+ return request({
+ url: '/resource/oss/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 查询OSS对象基于id串
+export function listByIds(ossId: string | number): AxiosPromise {
+ return request({
+ url: '/resource/oss/listByIds/' + ossId,
+ method: 'get'
+ });
+}
+
+// 删除OSS对象存储
+export function delOss(ossId: string | number | Array) {
+ return request({
+ url: '/resource/oss/' + ossId,
+ method: 'delete'
+ });
+}
diff --git a/src/api/system/oss/types.ts b/src/api/system/oss/types.ts
new file mode 100644
index 0000000..bc0bc1f
--- /dev/null
+++ b/src/api/system/oss/types.ts
@@ -0,0 +1,22 @@
+export interface OssVO extends BaseEntity {
+ ossId: string | number;
+ fileName: string;
+ originalName: string;
+ fileSuffix: string;
+ url: string;
+ createByName: string;
+ service: string;
+}
+
+export interface OssQuery extends PageQuery {
+ fileName: string;
+ originalName: string;
+ fileSuffix: string;
+ createTime: string;
+ service: string;
+ orderByColumn: string;
+ isAsc: string;
+}
+export interface OssForm {
+ file: undefined | string;
+}
diff --git a/src/api/system/ossConfig/index.ts b/src/api/system/ossConfig/index.ts
new file mode 100644
index 0000000..d0faefe
--- /dev/null
+++ b/src/api/system/ossConfig/index.ts
@@ -0,0 +1,60 @@
+import request from '@/utils/request';
+import { OssConfigForm, OssConfigQuery, OssConfigVO } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询对象存储配置列表
+export function listOssConfig(query: OssConfigQuery): AxiosPromise {
+ return request({
+ url: '/resource/oss/config/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 查询对象存储配置详细
+export function getOssConfig(ossConfigId: string | number): AxiosPromise {
+ return request({
+ url: '/resource/oss/config/' + ossConfigId,
+ method: 'get'
+ });
+}
+
+// 新增对象存储配置
+export function addOssConfig(data: OssConfigForm) {
+ return request({
+ url: '/resource/oss/config',
+ method: 'post',
+ data: data
+ });
+}
+
+// 修改对象存储配置
+export function updateOssConfig(data: OssConfigForm) {
+ return request({
+ url: '/resource/oss/config',
+ method: 'put',
+ data: data
+ });
+}
+
+// 删除对象存储配置
+export function delOssConfig(ossConfigId: string | number | Array) {
+ return request({
+ url: '/resource/oss/config/' + ossConfigId,
+ method: 'delete'
+ });
+}
+
+// 对象存储状态修改
+export function changeOssConfigStatus(ossConfigId: string | number, status: string, configKey: string) {
+ const data = {
+ ossConfigId,
+ status,
+ configKey
+ };
+ return request({
+ url: '/resource/oss/config/changeStatus',
+ method: 'put',
+ data: data
+ });
+}
diff --git a/src/api/system/ossConfig/types.ts b/src/api/system/ossConfig/types.ts
new file mode 100644
index 0000000..d227bd0
--- /dev/null
+++ b/src/api/system/ossConfig/types.ts
@@ -0,0 +1,38 @@
+export interface OssConfigVO extends BaseEntity {
+ ossConfigId: number | string;
+ configKey: string;
+ accessKey: string;
+ secretKey: string;
+ bucketName: string;
+ prefix: string;
+ endpoint: string;
+ domain: string;
+ isHttps: string;
+ region: string;
+ status: string;
+ ext1: string;
+ remark: string;
+ accessPolicy: string;
+}
+
+export interface OssConfigQuery extends PageQuery {
+ configKey: string;
+ bucketName: string;
+ status: string;
+}
+
+export interface OssConfigForm {
+ ossConfigId: string | number | undefined;
+ configKey: string;
+ accessKey: string;
+ secretKey: string;
+ bucketName: string;
+ prefix: string;
+ endpoint: string;
+ domain: string;
+ isHttps: string;
+ accessPolicy: string;
+ region: string;
+ status: string;
+ remark: string;
+}
diff --git a/src/api/system/post/index.ts b/src/api/system/post/index.ts
new file mode 100644
index 0000000..5f6ab18
--- /dev/null
+++ b/src/api/system/post/index.ts
@@ -0,0 +1,58 @@
+import request from '@/utils/request';
+import { PostForm, PostQuery, PostVO } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询岗位列表
+export function listPost(query: PostQuery): AxiosPromise {
+ return request({
+ url: '/system/post/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 查询岗位详细
+export function getPost(postId: string | number): AxiosPromise {
+ return request({
+ url: '/system/post/' + postId,
+ method: 'get'
+ });
+}
+
+// 获取岗位选择框列表
+export function optionselect(deptId?: number | string, postIds?: (number | string)[]): AxiosPromise {
+ return request({
+ url: '/system/post/optionselect',
+ method: 'get',
+ params: {
+ postIds: postIds,
+ deptId: deptId
+ }
+ });
+}
+
+// 新增岗位
+export function addPost(data: PostForm) {
+ return request({
+ url: '/system/post',
+ method: 'post',
+ data: data
+ });
+}
+
+// 修改岗位
+export function updatePost(data: PostForm) {
+ return request({
+ url: '/system/post',
+ method: 'put',
+ data: data
+ });
+}
+
+// 删除岗位
+export function delPost(postId: string | number | (string | number)[]) {
+ return request({
+ url: '/system/post/' + postId,
+ method: 'delete'
+ });
+}
diff --git a/src/api/system/post/types.ts b/src/api/system/post/types.ts
new file mode 100644
index 0000000..45a0540
--- /dev/null
+++ b/src/api/system/post/types.ts
@@ -0,0 +1,31 @@
+export interface PostVO extends BaseEntity {
+ postId: number | string;
+ deptId: number | string;
+ postCode: string;
+ postName: string;
+ postCategory: string;
+ deptName: string;
+ postSort: number;
+ status: string;
+ remark: string;
+}
+
+export interface PostForm {
+ postId: number | string | undefined;
+ deptId: number | string | undefined;
+ postCode: string;
+ postName: string;
+ postCategory: string;
+ postSort: number;
+ status: string;
+ remark: string;
+}
+
+export interface PostQuery extends PageQuery {
+ deptId: number | string;
+ belongDeptId: number | string;
+ postCode: string;
+ postName: string;
+ postCategory: string;
+ status: string;
+}
diff --git a/src/api/system/role/index.ts b/src/api/system/role/index.ts
new file mode 100644
index 0000000..fb0fcab
--- /dev/null
+++ b/src/api/system/role/index.ts
@@ -0,0 +1,160 @@
+import { UserVO } from '@/api/system/user/types';
+import { UserQuery } from '@/api/system/user/types';
+import { AxiosPromise } from 'axios';
+import { RoleQuery, RoleVO, RoleDeptTree } from './types';
+import request from '@/utils/request';
+
+export const listRole = (query: RoleQuery): AxiosPromise => {
+ return request({
+ url: '/system/role/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 通过roleIds查询角色
+ * @param roleIds
+ */
+export const optionSelect = (roleIds: (number | string)[]): AxiosPromise => {
+ return request({
+ url: '/system/role/optionselect?roleIds=' + roleIds,
+ method: 'get'
+ });
+};
+
+/**
+ * 查询角色详细
+ */
+export const getRole = (roleId: string | number): AxiosPromise => {
+ return request({
+ url: '/system/role/' + roleId,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增角色
+ */
+export const addRole = (data: any) => {
+ return request({
+ url: '/system/role',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改角色
+ * @param data
+ */
+export const updateRole = (data: any) => {
+ return request({
+ url: '/system/role',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 角色数据权限
+ */
+export const dataScope = (data: any) => {
+ return request({
+ url: '/system/role/dataScope',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 角色状态修改
+ */
+export const changeRoleStatus = (roleId: string | number, status: string) => {
+ const data = {
+ roleId,
+ status
+ };
+ return request({
+ url: '/system/role/changeStatus',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除角色
+ */
+export const delRole = (roleId: Array | string | number) => {
+ return request({
+ url: '/system/role/' + roleId,
+ method: 'delete'
+ });
+};
+
+/**
+ * 查询角色已授权用户列表
+ */
+export const allocatedUserList = (query: UserQuery): AxiosPromise => {
+ return request({
+ url: '/system/role/authUser/allocatedList',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询角色未授权用户列表
+ */
+export const unallocatedUserList = (query: UserQuery): AxiosPromise => {
+ return request({
+ url: '/system/role/authUser/unallocatedList',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 取消用户授权角色
+ */
+export const authUserCancel = (data: any) => {
+ return request({
+ url: '/system/role/authUser/cancel',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 批量取消用户授权角色
+ */
+export const authUserCancelAll = (data: any) => {
+ return request({
+ url: '/system/role/authUser/cancelAll',
+ method: 'put',
+ params: data
+ });
+};
+
+/**
+ * 授权用户选择
+ */
+export const authUserSelectAll = (data: any) => {
+ return request({
+ url: '/system/role/authUser/selectAll',
+ method: 'put',
+ params: data
+ });
+};
+// 根据角色ID查询部门树结构
+export const deptTreeSelect = (roleId: string | number): AxiosPromise => {
+ return request({
+ url: '/system/role/deptTree/' + roleId,
+ method: 'get'
+ });
+};
+
+export default {
+ optionSelect,
+ listRole
+};
diff --git a/src/api/system/role/types.ts b/src/api/system/role/types.ts
new file mode 100644
index 0000000..7dbb6ff
--- /dev/null
+++ b/src/api/system/role/types.ts
@@ -0,0 +1,52 @@
+/**
+ * 菜单树形结构类型
+ */
+export interface DeptTreeOption {
+ id: string;
+ label: string;
+ parentId: string;
+ weight: number;
+ children?: DeptTreeOption[];
+}
+
+export interface RoleDeptTree {
+ checkedKeys: string[];
+ depts: DeptTreeOption[];
+}
+
+export interface RoleVO extends BaseEntity {
+ roleId: string | number;
+ roleName: string;
+ roleKey: string;
+ roleSort: number;
+ dataScope: string;
+ menuCheckStrictly: boolean;
+ deptCheckStrictly: boolean;
+ status: string;
+ delFlag: string;
+ remark?: any;
+ flag: boolean;
+ menuIds?: Array;
+ deptIds?: Array;
+ admin: boolean;
+}
+
+export interface RoleQuery extends PageQuery {
+ roleName: string;
+ roleKey: string;
+ status: string;
+}
+
+export interface RoleForm {
+ roleName: string;
+ roleKey: string;
+ roleSort: number;
+ status: string;
+ menuCheckStrictly: boolean;
+ deptCheckStrictly: boolean;
+ remark: string;
+ dataScope?: string;
+ roleId: string | undefined;
+ menuIds: Array;
+ deptIds: Array;
+}
diff --git a/src/api/system/social/auth.ts b/src/api/system/social/auth.ts
new file mode 100644
index 0000000..69f0d7e
--- /dev/null
+++ b/src/api/system/social/auth.ts
@@ -0,0 +1,28 @@
+import request from '@/utils/request';
+
+// 绑定账号
+export function authBinding(source: string, tenantId: string) {
+ return request({
+ url: '/auth/binding/' + source,
+ method: 'get',
+ params: {
+ tenantId: tenantId,
+ domain: window.location.host
+ }
+ });
+}
+
+// 解绑账号
+export function authUnlock(authId: string) {
+ return request({
+ url: '/auth/unlock/' + authId,
+ method: 'delete'
+ });
+}
+//获取授权列表
+export function getAuthList() {
+ return request({
+ url: '/system/social/list',
+ method: 'get'
+ });
+}
diff --git a/src/api/system/tenant/index.ts b/src/api/system/tenant/index.ts
new file mode 100644
index 0000000..7b7b93f
--- /dev/null
+++ b/src/api/system/tenant/index.ts
@@ -0,0 +1,101 @@
+import request from '@/utils/request';
+import { TenantForm, TenantQuery, TenantVO } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询租户列表
+export function listTenant(query: TenantQuery): AxiosPromise {
+ return request({
+ url: '/system/tenant/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 查询租户详细
+export function getTenant(id: string | number): AxiosPromise {
+ return request({
+ url: '/system/tenant/' + id,
+ method: 'get'
+ });
+}
+
+// 新增租户
+export function addTenant(data: TenantForm) {
+ return request({
+ url: '/system/tenant',
+ method: 'post',
+ headers: {
+ isEncrypt: true,
+ repeatSubmit: false
+ },
+ data: data
+ });
+}
+
+// 修改租户
+export function updateTenant(data: TenantForm) {
+ return request({
+ url: '/system/tenant',
+ method: 'put',
+ data: data
+ });
+}
+
+// 租户状态修改
+export function changeTenantStatus(id: string | number, tenantId: string | number, status: string) {
+ const data = {
+ id,
+ tenantId,
+ status
+ };
+ return request({
+ url: '/system/tenant/changeStatus',
+ method: 'put',
+ data: data
+ });
+}
+
+// 删除租户
+export function delTenant(id: string | number | Array) {
+ return request({
+ url: '/system/tenant/' + id,
+ method: 'delete'
+ });
+}
+
+// 动态切换租户
+export function dynamicTenant(tenantId: string | number) {
+ return request({
+ url: '/system/tenant/dynamic/' + tenantId,
+ method: 'get'
+ });
+}
+
+// 清除动态租户
+export function dynamicClear() {
+ return request({
+ url: '/system/tenant/dynamic/clear',
+ method: 'get'
+ });
+}
+
+// 同步租户套餐
+export function syncTenantPackage(tenantId: string | number, packageId: string | number) {
+ const data = {
+ tenantId,
+ packageId
+ };
+ return request({
+ url: '/system/tenant/syncTenantPackage',
+ method: 'get',
+ params: data
+ });
+}
+
+// 同步租户字典
+export function syncTenantDict() {
+ return request({
+ url: '/system/tenant/syncTenantDict',
+ method: 'get',
+ });
+}
diff --git a/src/api/system/tenant/types.ts b/src/api/system/tenant/types.ts
new file mode 100644
index 0000000..25395fa
--- /dev/null
+++ b/src/api/system/tenant/types.ts
@@ -0,0 +1,46 @@
+export interface TenantVO extends BaseEntity {
+ id: number | string;
+ tenantId: number | string;
+ username: string;
+ contactUserName: string;
+ contactPhone: string;
+ companyName: string;
+ licenseNumber: string;
+ address: string;
+ domain: string;
+ intro: string;
+ remark: string;
+ packageId: string | number;
+ expireTime: string;
+ accountCount: number;
+ status: string;
+}
+
+export interface TenantQuery extends PageQuery {
+ tenantId: string | number;
+
+ contactUserName: string;
+
+ contactPhone: string;
+
+ companyName: string;
+}
+
+export interface TenantForm {
+ id: number | string | undefined;
+ tenantId: number | string | undefined;
+ username: string;
+ password: string;
+ contactUserName: string;
+ contactPhone: string;
+ companyName: string;
+ licenseNumber: string;
+ domain: string;
+ address: string;
+ intro: string;
+ remark: string;
+ packageId: string | number;
+ expireTime: string;
+ accountCount: number;
+ status: string;
+}
diff --git a/src/api/system/tenantPackage/index.ts b/src/api/system/tenantPackage/index.ts
new file mode 100644
index 0000000..70d0dab
--- /dev/null
+++ b/src/api/system/tenantPackage/index.ts
@@ -0,0 +1,67 @@
+import request from '@/utils/request';
+import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询租户套餐列表
+export function listTenantPackage(query?: TenantPkgQuery): AxiosPromise {
+ return request({
+ url: '/system/tenant/package/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 查询租户套餐下拉选列表
+export function selectTenantPackage(): AxiosPromise {
+ return request({
+ url: '/system/tenant/package/selectList',
+ method: 'get'
+ });
+}
+
+// 查询租户套餐详细
+export function getTenantPackage(packageId: string | number): AxiosPromise {
+ return request({
+ url: '/system/tenant/package/' + packageId,
+ method: 'get'
+ });
+}
+
+// 新增租户套餐
+export function addTenantPackage(data: TenantPkgForm) {
+ return request({
+ url: '/system/tenant/package',
+ method: 'post',
+ data: data
+ });
+}
+
+// 修改租户套餐
+export function updateTenantPackage(data: TenantPkgForm) {
+ return request({
+ url: '/system/tenant/package',
+ method: 'put',
+ data: data
+ });
+}
+
+// 租户套餐状态修改
+export function changePackageStatus(packageId: number | string, status: string) {
+ const data = {
+ packageId,
+ status
+ };
+ return request({
+ url: '/system/tenant/package/changeStatus',
+ method: 'put',
+ data: data
+ });
+}
+
+// 删除租户套餐
+export function delTenantPackage(packageId: string | number | Array) {
+ return request({
+ url: '/system/tenant/package/' + packageId,
+ method: 'delete'
+ });
+}
diff --git a/src/api/system/tenantPackage/types.ts b/src/api/system/tenantPackage/types.ts
new file mode 100644
index 0000000..c24b8fc
--- /dev/null
+++ b/src/api/system/tenantPackage/types.ts
@@ -0,0 +1,20 @@
+export interface TenantPkgVO extends BaseEntity {
+ packageId: string | number;
+ packageName: string;
+ menuIds: string;
+ remark: string;
+ menuCheckStrictly: boolean;
+ status: string;
+}
+
+export interface TenantPkgQuery extends PageQuery {
+ packageName: string;
+}
+
+export interface TenantPkgForm {
+ packageId: string | number | undefined;
+ packageName: string;
+ menuIds: string;
+ remark: string;
+ menuCheckStrictly: boolean;
+}
diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts
new file mode 100644
index 0000000..25c7884
--- /dev/null
+++ b/src/api/system/user/index.ts
@@ -0,0 +1,229 @@
+import { DeptVO } from './../dept/types';
+import { RoleVO } from '@/api/system/role/types';
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { UserForm, UserQuery, UserVO, UserInfoVO } from './types';
+import { parseStrEmpty } from '@/utils/ruoyi';
+
+/**
+ * 查询用户列表
+ * @param query
+ */
+export const listUser = (query: UserQuery): AxiosPromise => {
+ return request({
+ url: '/system/user/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 通过用户ids查询用户
+ * @param userIds
+ */
+export const optionSelect = (userIds: (number | string)[]): AxiosPromise => {
+ return request({
+ url: '/system/user/optionselect?userIds=' + userIds,
+ method: 'get'
+ });
+};
+
+/**
+ * 获取用户详情
+ * @param userId
+ */
+export const getUser = (userId?: string | number): AxiosPromise => {
+ return request({
+ url: '/system/user/' + parseStrEmpty(userId),
+ method: 'get'
+ });
+};
+
+/**
+ * 新增用户
+ */
+export const addUser = (data: UserForm) => {
+ return request({
+ url: '/system/user',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改用户
+ */
+export const updateUser = (data: UserForm) => {
+ return request({
+ url: '/system/user',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除用户
+ * @param userId 用户ID
+ */
+export const delUser = (userId: Array | string | number) => {
+ return request({
+ url: '/system/user/' + userId,
+ method: 'delete'
+ });
+};
+
+/**
+ * 用户密码重置
+ * @param userId 用户ID
+ * @param password 密码
+ */
+export const resetUserPwd = (userId: string | number, password: string) => {
+ const data = {
+ userId,
+ password
+ };
+ return request({
+ url: '/system/user/resetPwd',
+ method: 'put',
+ headers: {
+ isEncrypt: true,
+ repeatSubmit: false
+ },
+ data: data
+ });
+};
+
+/**
+ * 用户状态修改
+ * @param userId 用户ID
+ * @param status 用户状态
+ */
+export const changeUserStatus = (userId: number | string, status: string) => {
+ const data = {
+ userId,
+ status
+ };
+ return request({
+ url: '/system/user/changeStatus',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 查询用户个人信息
+ */
+export const getUserProfile = (): AxiosPromise => {
+ return request({
+ url: '/system/user/profile',
+ method: 'get'
+ });
+};
+
+/**
+ * 修改用户个人信息
+ * @param data 用户信息
+ */
+export const updateUserProfile = (data: UserForm) => {
+ return request({
+ url: '/system/user/profile',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 用户密码重置
+ * @param oldPassword 旧密码
+ * @param newPassword 新密码
+ */
+export const updateUserPwd = (oldPassword: string, newPassword: string) => {
+ const data = {
+ oldPassword,
+ newPassword
+ };
+ return request({
+ url: '/system/user/profile/updatePwd',
+ method: 'put',
+ headers: {
+ isEncrypt: true,
+ repeatSubmit: false
+ },
+ data: data
+ });
+};
+
+/**
+ * 用户头像上传
+ * @param data 头像文件
+ */
+export const uploadAvatar = (data: FormData) => {
+ return request({
+ url: '/system/user/profile/avatar',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 查询授权角色
+ * @param userId 用户ID
+ */
+export const getAuthRole = (userId: string | number): AxiosPromise<{ user: UserVO; roles: RoleVO[] }> => {
+ return request({
+ url: '/system/user/authRole/' + userId,
+ method: 'get'
+ });
+};
+
+/**
+ * 保存授权角色
+ * @param data 用户ID
+ */
+export const updateAuthRole = (data: { userId: string; roleIds: string }) => {
+ return request({
+ url: '/system/user/authRole',
+ method: 'put',
+ params: data
+ });
+};
+
+/**
+ * 查询当前部门的所有用户信息
+ * @param deptId
+ */
+export const listUserByDeptId = (deptId: string | number): AxiosPromise => {
+ return request({
+ url: '/system/user/list/dept/' + deptId,
+ method: 'get'
+ });
+};
+
+/**
+ * 查询部门下拉树结构
+ */
+export const deptTreeSelect = (): AxiosPromise => {
+ return request({
+ url: '/system/user/deptTree',
+ method: 'get'
+ });
+};
+
+export default {
+ listUser,
+ getUser,
+ optionSelect,
+ addUser,
+ updateUser,
+ delUser,
+ resetUserPwd,
+ changeUserStatus,
+ getUserProfile,
+ updateUserProfile,
+ updateUserPwd,
+ uploadAvatar,
+ getAuthRole,
+ updateAuthRole,
+ deptTreeSelect,
+ listUserByDeptId
+};
diff --git a/src/api/system/user/types.ts b/src/api/system/user/types.ts
new file mode 100644
index 0000000..0787372
--- /dev/null
+++ b/src/api/system/user/types.ts
@@ -0,0 +1,84 @@
+import { RoleVO } from '@/api/system/role/types';
+import { PostVO } from '@/api/system/post/types';
+
+/**
+ * 用户信息
+ */
+export interface UserInfo {
+ user: UserVO;
+ roles: string[];
+ permissions: string[];
+}
+
+/**
+ * 用户查询对象类型
+ */
+export interface UserQuery extends PageQuery {
+ userName?: string;
+ phonenumber?: string;
+ status?: string;
+ deptId?: string | number;
+ roleId?: string | number;
+}
+
+/**
+ * 用户返回对象
+ */
+export interface UserVO extends BaseEntity {
+ userId: string | number;
+ tenantId: string;
+ deptId: number;
+ userName: string;
+ nickName: string;
+ userType: string;
+ email: string;
+ phonenumber: string;
+ sex: string;
+ avatar: string;
+ status: string;
+ delFlag: string;
+ loginIp: string;
+ loginDate: string;
+ remark: string;
+ deptName: string;
+ roles: RoleVO[];
+ roleIds: any;
+ postIds: any;
+ roleId: any;
+ admin: boolean;
+}
+
+/**
+ * 用户表单类型
+ */
+export interface UserForm {
+ id?: string;
+ userId?: string;
+ deptId?: number;
+ userName: string;
+ nickName?: string;
+ password: string;
+ phonenumber?: string;
+ email?: string;
+ sex?: string;
+ status: string;
+ remark?: string;
+ postIds: string[];
+ roleIds: string[];
+}
+
+export interface UserInfoVO {
+ user: UserVO;
+ roles: RoleVO[];
+ roleIds: string[];
+ posts: PostVO[];
+ postIds: string[];
+ roleGroup: string;
+ postGroup: string;
+}
+
+export interface ResetPwdForm {
+ oldPassword: string;
+ newPassword: string;
+ confirmPassword: string;
+}
diff --git a/src/api/tool/gen/index.ts b/src/api/tool/gen/index.ts
new file mode 100644
index 0000000..efe079c
--- /dev/null
+++ b/src/api/tool/gen/index.ts
@@ -0,0 +1,86 @@
+import request from '@/utils/request';
+import { DbTableQuery, DbTableVO, TableQuery, TableVO, GenTableVO, DbTableForm } from './types';
+import { AxiosPromise } from 'axios';
+
+// 查询生成表数据
+export const listTable = (query: TableQuery): AxiosPromise => {
+ return request({
+ url: '/tool/gen/list',
+ method: 'get',
+ params: query
+ });
+};
+// 查询db数据库列表
+export const listDbTable = (query: DbTableQuery): AxiosPromise => {
+ return request({
+ url: '/tool/gen/db/list',
+ method: 'get',
+ params: query
+ });
+};
+
+// 查询表详细信息
+export const getGenTable = (tableId: string | number): AxiosPromise => {
+ return request({
+ url: '/tool/gen/' + tableId,
+ method: 'get'
+ });
+};
+
+// 修改代码生成信息
+export const updateGenTable = (data: DbTableForm): AxiosPromise => {
+ return request({
+ url: '/tool/gen',
+ method: 'put',
+ data: data
+ });
+};
+
+// 导入表
+export const importTable = (data: { tables: string; dataName: string }): AxiosPromise => {
+ return request({
+ url: '/tool/gen/importTable',
+ method: 'post',
+ params: data
+ });
+};
+
+// 预览生成代码
+export const previewTable = (tableId: string | number) => {
+ return request({
+ url: '/tool/gen/preview/' + tableId,
+ method: 'get'
+ });
+};
+
+// 删除表数据
+export const delTable = (tableId: string | number | Array) => {
+ return request({
+ url: '/tool/gen/' + tableId,
+ method: 'delete'
+ });
+};
+
+// 生成代码(自定义路径)
+export const genCode = (tableId: string | number) => {
+ return request({
+ url: '/tool/gen/genCode/' + tableId,
+ method: 'get'
+ });
+};
+
+// 同步数据库
+export const synchDb = (tableId: string | number) => {
+ return request({
+ url: '/tool/gen/synchDb/' + tableId,
+ method: 'get'
+ });
+};
+
+// 获取数据源名称
+export const getDataNames = () => {
+ return request({
+ url: '/tool/gen/getDataNames',
+ method: 'get'
+ });
+};
diff --git a/src/api/tool/gen/types.ts b/src/api/tool/gen/types.ts
new file mode 100644
index 0000000..7f7b62f
--- /dev/null
+++ b/src/api/tool/gen/types.ts
@@ -0,0 +1,180 @@
+export interface TableVO extends BaseEntity {
+ createDept: number | string;
+ tableId: string | number;
+ dataName: string;
+ tableName: string;
+ tableComment: string;
+ subTableName?: any;
+ subTableFkName?: any;
+ className: string;
+ tplCategory: string;
+ packageName: string;
+ moduleName: string;
+ businessName: string;
+ functionName: string;
+ functionAuthor: string;
+ genType: string;
+ genPath: string;
+ pkColumn?: any;
+ columns?: any;
+ options?: any;
+ remark?: any;
+ treeCode?: any;
+ treeParentCode?: any;
+ treeName?: any;
+ menuIds?: any;
+ parentMenuId?: any;
+ parentMenuName?: any;
+ tree: boolean;
+ crud: boolean;
+}
+
+export interface TableQuery extends PageQuery {
+ tableName: string;
+ tableComment: string;
+ dataName: string;
+}
+
+export interface DbColumnVO extends BaseEntity {
+ createDept?: any;
+ columnId?: any;
+ tableId?: any;
+ columnName?: any;
+ columnComment?: any;
+ columnType?: any;
+ javaType?: any;
+ javaField?: any;
+ isPk?: any;
+ isIncrement?: any;
+ isRequired?: any;
+ isInsert?: any;
+ isEdit?: any;
+ isList?: any;
+ isQuery?: any;
+ queryType?: any;
+ htmlType?: any;
+ dictType?: any;
+ sort?: any;
+ increment: boolean;
+ capJavaField?: any;
+ usableColumn: boolean;
+ superColumn: boolean;
+ list: boolean;
+ pk: boolean;
+ insert: boolean;
+ edit: boolean;
+ query: boolean;
+ required: boolean;
+}
+
+export interface DbTableVO {
+ createDept?: any;
+ tableId?: any;
+ tableName: string;
+ tableComment: string;
+ subTableName?: any;
+ subTableFkName?: any;
+ className?: any;
+ tplCategory?: any;
+ packageName?: any;
+ moduleName?: any;
+ businessName?: any;
+ functionName?: any;
+ functionAuthor?: any;
+ genType?: any;
+ genPath?: any;
+ pkColumn?: any;
+ columns: DbColumnVO[];
+ options?: any;
+ remark?: any;
+ treeCode?: any;
+ treeParentCode?: any;
+ treeName?: any;
+ menuIds?: any;
+ parentMenuId?: any;
+ parentMenuName?: any;
+ tree: boolean;
+ crud: boolean;
+}
+
+export interface DbTableQuery extends PageQuery {
+ dataName: string;
+ tableName: string;
+ tableComment: string;
+}
+
+export interface GenTableVO {
+ info: DbTableVO;
+ rows: DbColumnVO[];
+ tables: DbTableVO[];
+}
+
+export interface DbColumnForm extends BaseEntity {
+ createDept: number;
+ columnId: string;
+ tableId: string;
+ columnName: string;
+ columnComment: string;
+ columnType: string;
+ javaType: string;
+ javaField: string;
+ isPk: string;
+ isIncrement: string;
+ isRequired: string;
+ isInsert?: any;
+ isEdit: string;
+ isList: string;
+ isQuery?: any;
+ queryType: string;
+ htmlType: string;
+ dictType: string;
+ sort: number;
+ increment: boolean;
+ capJavaField: string;
+ usableColumn: boolean;
+ superColumn: boolean;
+ list: boolean;
+ pk: boolean;
+ insert: boolean;
+ edit: boolean;
+ query: boolean;
+ required: boolean;
+}
+
+export interface DbParamForm {
+ treeCode?: any;
+ treeName?: any;
+ treeParentCode?: any;
+ parentMenuId: string;
+}
+
+export interface DbTableForm extends BaseEntity {
+ createDept?: any;
+ tableId: string | string;
+ tableName: string;
+ tableComment: string;
+ subTableName?: any;
+ subTableFkName?: any;
+ className: string;
+ tplCategory: string;
+ packageName: string;
+ moduleName: string;
+ businessName: string;
+ functionName: string;
+ functionAuthor: string;
+ genType: string;
+ genPath: string;
+ pkColumn?: any;
+ columns: DbColumnForm[];
+ options: string;
+ remark?: any;
+ treeCode?: any;
+ treeParentCode?: any;
+ treeName?: any;
+ menuIds?: any;
+ parentMenuId: string;
+ parentMenuName?: any;
+ tree: boolean;
+ crud: boolean;
+ params: DbParamForm;
+}
diff --git a/src/api/types.ts b/src/api/types.ts
new file mode 100644
index 0000000..617286c
--- /dev/null
+++ b/src/api/types.ts
@@ -0,0 +1,59 @@
+/**
+ * 注册
+ */
+export type RegisterForm = {
+ tenantId: string;
+ username: string;
+ password: string;
+ confirmPassword?: string;
+ code?: string;
+ uuid?: string;
+ userType?: string;
+};
+
+/**
+ * 登录请求
+ */
+export interface LoginData {
+ tenantId?: string;
+ username?: string;
+ password?: string;
+ rememberMe?: boolean;
+ socialCode?: string;
+ socialState?: string;
+ source?: string;
+ code?: string;
+ uuid?: string;
+ clientId: string;
+ grantType: string;
+}
+
+/**
+ * 登录响应
+ */
+export interface LoginResult {
+ access_token: string;
+}
+
+/**
+ * 验证码返回
+ */
+export interface VerifyCodeResult {
+ captchaEnabled: boolean;
+ uuid?: string;
+ img?: string;
+}
+
+/**
+ * 租户
+ */
+export interface TenantVO {
+ companyName: string;
+ domain: any;
+ tenantId: string;
+}
+
+export interface TenantInfo {
+ tenantEnabled: boolean;
+ voList: TenantVO[];
+}
diff --git a/src/api/workflow/category/index.ts b/src/api/workflow/category/index.ts
new file mode 100644
index 0000000..e9723b0
--- /dev/null
+++ b/src/api/workflow/category/index.ts
@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { CategoryVO, CategoryForm, CategoryQuery } from '@/api/workflow/category/types';
+
+/**
+ * 查询流程分类列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listCategory = (query?: CategoryQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/category/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询流程分类详细
+ * @param id
+ */
+export const getCategory = (id: string | number): AxiosPromise => {
+ return request({
+ url: '/workflow/category/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增流程分类
+ * @param data
+ */
+export const addCategory = (data: CategoryForm) => {
+ return request({
+ url: '/workflow/category',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改流程分类
+ * @param data
+ */
+export const updateCategory = (data: CategoryForm) => {
+ return request({
+ url: '/workflow/category',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除流程分类
+ * @param id
+ */
+export const delCategory = (id: string | number | Array) => {
+ return request({
+ url: '/workflow/category/' + id,
+ method: 'delete'
+ });
+};
diff --git a/src/api/workflow/category/types.ts b/src/api/workflow/category/types.ts
new file mode 100644
index 0000000..414fa55
--- /dev/null
+++ b/src/api/workflow/category/types.ts
@@ -0,0 +1,67 @@
+export interface CategoryVO {
+ /**
+ * 主键
+ */
+ id: string;
+
+ /**
+ * 分类名称
+ */
+ categoryName: string;
+
+ /**
+ * 分类编码
+ */
+ categoryCode: string;
+
+ /**
+ * 父级id
+ */
+ parentId: string | number;
+
+ /**
+ * 排序
+ */
+ sortNum: number;
+
+ children?: CategoryVO[];
+}
+
+export interface CategoryForm extends BaseEntity {
+ /**
+ * 主键
+ */
+ id?: string | number;
+
+ /**
+ * 分类名称
+ */
+ categoryName?: string;
+
+ /**
+ * 分类编码
+ */
+ categoryCode?: string;
+
+ /**
+ * 父级id
+ */
+ parentId?: string | number;
+
+ /**
+ * 排序
+ */
+ sortNum?: number;
+}
+
+export interface CategoryQuery extends PageQuery {
+ /**
+ * 分类名称
+ */
+ categoryName?: string;
+
+ /**
+ * 分类编码
+ */
+ categoryCode?: string;
+}
diff --git a/src/api/workflow/definitionConfig/index.ts b/src/api/workflow/definitionConfig/index.ts
new file mode 100644
index 0000000..d34bf05
--- /dev/null
+++ b/src/api/workflow/definitionConfig/index.ts
@@ -0,0 +1,49 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { DefinitionConfigVO, DefinitionConfigForm } from '@/api/workflow/definitionConfig/types';
+
+/**
+ * 查询表单配置详细
+ * @param definitionId
+ */
+export const getByDefId = (definitionId: string | number): AxiosPromise => {
+ return request({
+ url: '/workflow/definitionConfig/getByDefId/' + definitionId,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增表单配置
+ * @param data
+ */
+export const saveOrUpdate = (data: DefinitionConfigForm) => {
+ return request({
+ url: '/workflow/definitionConfig/saveOrUpdate',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 删除表单配置
+ * @param id
+ */
+export const deldefinitionConfig = (id: string | number | Array) => {
+ return request({
+ url: '/workflow/definitionConfig/' + id,
+ method: 'delete'
+ });
+};
+
+/**
+ * 查询流程定义配置排除当前查询的流程定义
+ * @param tableName
+ * @param definitionId
+ */
+export const getByTableNameNotDefId = (tableName: string, definitionId: string | number) => {
+ return request({
+ url: `/workflow/definitionConfig/getByTableNameNotDefId/${tableName}/${definitionId}`,
+ method: 'get'
+ });
+};
diff --git a/src/api/workflow/definitionConfig/types.ts b/src/api/workflow/definitionConfig/types.ts
new file mode 100644
index 0000000..7627403
--- /dev/null
+++ b/src/api/workflow/definitionConfig/types.ts
@@ -0,0 +1,102 @@
+import { FormManageVO } from '@/api/workflow/formManage/types';
+
+export interface DefinitionConfigVO {
+ /**
+ * 主键
+ */
+ id: string | number;
+
+ /**
+ * 表名
+ */
+ tableName?: string;
+
+ /**
+ * 流程定义ID
+ */
+ definitionId: string | number;
+
+ /**
+ * 流程KEY
+ */
+ processKey: string;
+
+ /**
+ * 流程版本
+ */
+ version?: string | number;
+
+ /**
+ * 备注
+ */
+ remark: string;
+
+ /**
+ * 表单管理
+ */
+ wfFormManageVo: FormManageVO;
+}
+
+export interface DefinitionConfigForm extends BaseEntity {
+ /**
+ * 主键
+ */
+ id?: string | number;
+
+ /**
+ * 表名
+ */
+ tableName?: string;
+
+ /**
+ * 流程定义ID
+ */
+ definitionId?: string | number;
+
+ /**
+ * 流程KEY
+ */
+ processKey?: string;
+
+ /**
+ * 流程版本
+ */
+ version?: string | number;
+
+ /**
+ * 备注
+ */
+ remark?: string;
+
+ /**
+ * 表单管理
+ */
+ wfFormManageVo?: FormManageVO;
+}
+
+export interface DefinitionConfigQuery extends PageQuery {
+ /**
+ * 表名
+ */
+ tableName?: string;
+
+ /**
+ * 流程定义ID
+ */
+ definitionId?: string | number;
+
+ /**
+ * 流程KEY
+ */
+ processKey?: string;
+
+ /**
+ * 流程版本
+ */
+ version?: string | number;
+
+ /**
+ * 表单管理
+ */
+ wfFormManageVo: FormManageVO;
+}
diff --git a/src/api/workflow/formManage/index.ts b/src/api/workflow/formManage/index.ts
new file mode 100644
index 0000000..6c5ec60
--- /dev/null
+++ b/src/api/workflow/formManage/index.ts
@@ -0,0 +1,76 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { FormManageVO, FormManageForm, FormManageQuery } from '@/api/workflow/formManage/types';
+
+/**
+ * 查询表单管理列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listFormManage = (query?: FormManageQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/formManage/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询表单管理列表
+ * @param query
+ * @returns {*}
+ */
+
+export const selectListFormManage = (): AxiosPromise => {
+ return request({
+ url: '/workflow/formManage/list/selectList',
+ method: 'get'
+ });
+};
+
+/**
+ * 查询表单管理详细
+ * @param id
+ */
+export const getFormManage = (id: string | number): AxiosPromise => {
+ return request({
+ url: '/workflow/formManage/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增表单管理
+ * @param data
+ */
+export const addFormManage = (data: FormManageForm) => {
+ return request({
+ url: '/workflow/formManage',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改表单管理
+ * @param data
+ */
+export const updateFormManage = (data: FormManageForm) => {
+ return request({
+ url: '/workflow/formManage',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除表单管理
+ * @param id
+ */
+export const delFormManage = (id: string | number | Array) => {
+ return request({
+ url: '/workflow/formManage/' + id,
+ method: 'delete'
+ });
+};
diff --git a/src/api/workflow/formManage/types.ts b/src/api/workflow/formManage/types.ts
new file mode 100644
index 0000000..b9dc1d8
--- /dev/null
+++ b/src/api/workflow/formManage/types.ts
@@ -0,0 +1,69 @@
+export interface FormManageVO {
+ /**
+ * 主键
+ */
+ id: string | number;
+
+ /**
+ * 表单名称
+ */
+ formName: string;
+
+ /**
+ * 表单类型
+ */
+ formType: string;
+ /**
+ * 表单类型名称
+ */
+ formTypeName: string;
+
+ /**
+ * 路由地址/表单ID
+ */
+ router: string;
+
+ /**
+ * 备注
+ */
+ remark: string;
+}
+
+export interface FormManageForm extends BaseEntity {
+ /**
+ * 主键
+ */
+ id?: string | number;
+
+ /**
+ * 表单名称
+ */
+ formName?: string;
+
+ /**
+ * 表单类型
+ */
+ formType?: string;
+
+ /**
+ * 路由地址/表单ID
+ */
+ router?: string;
+
+ /**
+ * 备注
+ */
+ remark?: string;
+}
+
+export interface FormManageQuery extends PageQuery {
+ /**
+ * 表单名称
+ */
+ formName?: string;
+
+ /**
+ * 表单类型
+ */
+ formType?: string;
+}
diff --git a/src/api/workflow/leave/index.ts b/src/api/workflow/leave/index.ts
new file mode 100644
index 0000000..4e6f363
--- /dev/null
+++ b/src/api/workflow/leave/index.ts
@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { LeaveVO, LeaveQuery, LeaveForm } from '@/api/workflow/leave/types';
+
+/**
+ * 查询请假列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listLeave = (query?: LeaveQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/leave/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询请假详细
+ * @param id
+ */
+export const getLeave = (id: string | number): AxiosPromise => {
+ return request({
+ url: '/workflow/leave/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增请假
+ * @param data
+ */
+export const addLeave = (data: LeaveForm): AxiosPromise => {
+ return request({
+ url: '/workflow/leave',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改请假
+ * @param data
+ */
+export const updateLeave = (data: LeaveForm): AxiosPromise => {
+ return request({
+ url: '/workflow/leave',
+ method: 'put',
+ data: data
+ });
+};
+
+/**
+ * 删除请假
+ * @param id
+ */
+export const delLeave = (id: string | number | Array) => {
+ return request({
+ url: '/workflow/leave/' + id,
+ method: 'delete'
+ });
+};
diff --git a/src/api/workflow/leave/types.ts b/src/api/workflow/leave/types.ts
new file mode 100644
index 0000000..a44d35d
--- /dev/null
+++ b/src/api/workflow/leave/types.ts
@@ -0,0 +1,24 @@
+export interface LeaveVO {
+ id: string | number;
+ leaveType: string;
+ startDate: string;
+ endDate: string;
+ leaveDays: number;
+ remark: string;
+ status?: string;
+}
+
+export interface LeaveForm extends BaseEntity {
+ id?: string | number;
+ leaveType?: string;
+ startDate?: string;
+ endDate?: string;
+ leaveDays?: number;
+ remark?: string;
+ status?: string;
+}
+
+export interface LeaveQuery extends PageQuery {
+ startLeaveDays?: number;
+ endLeaveDays?: number;
+}
diff --git a/src/api/workflow/model/index.ts b/src/api/workflow/model/index.ts
new file mode 100644
index 0000000..1ca8b19
--- /dev/null
+++ b/src/api/workflow/model/index.ts
@@ -0,0 +1,104 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ModelForm, ModelQuery, ModelVO } from '@/api/workflow/model/types';
+
+/**
+ * 查询模型列表
+ * @param query
+ * @returns {*}
+ */
+export const listModel = (query: ModelQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/model/list',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询模型信息
+ * @param query
+ * @returns {*}
+ */
+export const getInfo = (id: string): AxiosPromise => {
+ return request({
+ url: '/workflow/model/getInfo/' + id,
+ method: 'get'
+ });
+};
+
+/**
+ * 新增模型
+ * @param data
+ * @returns {*}
+ */
+export const addModel = (data: ModelForm): AxiosPromise => {
+ return request({
+ url: '/workflow/model/save',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改模型信息
+ * @param data
+ * @returns {*}
+ */
+export function update(data: ModelForm): AxiosPromise {
+ return request({
+ url: '/workflow/model/update',
+ method: 'put',
+ data: data
+ });
+}
+
+/**
+ * 修改模型信息
+ * @param data
+ * @returns {*}
+ */
+export function editModelXml(data: ModelForm): AxiosPromise {
+ return request({
+ url: '/workflow/model/editModelXml',
+ method: 'put',
+ data: data
+ });
+}
+
+/**
+ * 按id删除模型
+ * @returns {*}
+ * @param id 模型id
+ */
+export function delModel(id: string | string[]): AxiosPromise {
+ return request({
+ url: '/workflow/model/' + id,
+ method: 'delete'
+ });
+}
+
+/**
+ * 模型部署
+ * @returns {*}
+ * @param id 模型id
+ */
+export const modelDeploy = (id: string): AxiosPromise => {
+ return request({
+ url: `/workflow/model/modelDeploy/${id}`,
+ method: 'post'
+ });
+};
+
+/**
+ * 复制模型
+ * @param data
+ * @returns {*}
+ */
+export const copyModel = (data: ModelForm): AxiosPromise => {
+ return request({
+ url: '/workflow/model/copyModel',
+ method: 'post',
+ data: data
+ });
+};
diff --git a/src/api/workflow/model/types.ts b/src/api/workflow/model/types.ts
new file mode 100644
index 0000000..77f947d
--- /dev/null
+++ b/src/api/workflow/model/types.ts
@@ -0,0 +1,66 @@
+export interface ModelForm {
+ id: string;
+ name: string;
+ key: string;
+ categoryCode: string;
+ xml: string;
+ svg: string;
+ description: string;
+}
+
+export interface ModelQuery extends PageQuery {
+ name?: string;
+ key?: string;
+ categoryCode?: string;
+}
+
+export interface OriginalPersistentState {
+ metaInfo: string;
+ editorSourceValueId: string;
+ createTime: string;
+ deploymentId?: string;
+ name: string;
+ tenantId: string;
+ category?: string;
+ version: number;
+ editorSourceExtraValueId?: string;
+ key: string;
+ lastUpdateTime: string;
+}
+
+export interface PersistentState {
+ metaInfo: string;
+ editorSourceValueId: string;
+ createTime: string;
+ deploymentId?: string;
+ name: string;
+ tenantId: string;
+ category?: string;
+ version: number;
+ editorSourceExtraValueId?: string;
+ key: string;
+ lastUpdateTime: string;
+}
+
+export interface ModelVO {
+ id: string;
+ revision: number;
+ originalPersistentState: OriginalPersistentState;
+ name: string;
+ key: string;
+ category?: string;
+ createTime: string;
+ lastUpdateTime: string;
+ version: number;
+ metaInfo: string;
+ deploymentId?: string;
+ editorSourceValueId: string;
+ editorSourceExtraValueId?: string;
+ tenantId: string;
+ persistentState: PersistentState;
+ revisionNext: number;
+ idPrefix: string;
+ inserted: boolean;
+ updated: boolean;
+ deleted: boolean;
+}
diff --git a/src/api/workflow/nodeConfig/types.ts b/src/api/workflow/nodeConfig/types.ts
new file mode 100644
index 0000000..a55fc91
--- /dev/null
+++ b/src/api/workflow/nodeConfig/types.ts
@@ -0,0 +1,38 @@
+import { FormManageVO } from '@/api/workflow/formManage/types';
+
+export interface NodeConfigVO {
+ /**
+ * 主键
+ */
+ id: string | number;
+
+ /**
+ * 表单id
+ */
+ formId: string | number;
+
+ /**
+ * 表单类型
+ */
+ formType: string;
+
+ /**
+ * 节点名称
+ */
+ nodeName: string;
+
+ /**
+ * 节点id
+ */
+ nodeId: string | number;
+
+ /**
+ * 流程定义id
+ */
+ definitionId: string | number;
+
+ /**
+ * 表单管理
+ */
+ wfFormManageVo: FormManageVO;
+}
diff --git a/src/api/workflow/processDefinition/index.ts b/src/api/workflow/processDefinition/index.ts
new file mode 100644
index 0000000..c063120
--- /dev/null
+++ b/src/api/workflow/processDefinition/index.ts
@@ -0,0 +1,114 @@
+import request from '@/utils/request';
+import { ProcessDefinitionQuery, ProcessDefinitionVO, definitionXmlVO } from '@/api/workflow/processDefinition/types';
+import { AxiosPromise } from 'axios';
+
+/**
+ * 获取流程定义列表
+ * @param query 流程实例id
+ * @returns
+ */
+export const listProcessDefinition = (query: ProcessDefinitionQuery): AxiosPromise => {
+ return request({
+ url: `/workflow/processDefinition/list`,
+ method: 'get',
+ params: query
+ });
+};
+/**
+ * 按照流程定义key获取流程定义
+ * @param processInstanceId 流程实例id
+ * @returns
+ */
+export const getListByKey = (key: string) => {
+ return request({
+ url: `/workflow/processDefinition/getListByKey/${key}`,
+ method: 'get'
+ });
+};
+
+/**
+ * 通过流程定义id获取流程图
+ */
+export const definitionImage = (processDefinitionId: string): AxiosPromise => {
+ return request({
+ url: `/workflow/processDefinition/definitionImage/${processDefinitionId}` + '?t' + Math.random(),
+ method: 'get'
+ });
+};
+
+/**
+ * 通过流程定义id获取xml
+ * @param processDefinitionId 流程定义id
+ * @returns
+ */
+export const definitionXml = (processDefinitionId: string): AxiosPromise => {
+ return request({
+ url: `/workflow/processDefinition/definitionXml/${processDefinitionId}`,
+ method: 'get'
+ });
+};
+
+/**
+ * 删除流程定义
+ * @param deploymentId 部署id
+ * @param processDefinitionId 流程定义id
+ * @returns
+ */
+export const deleteProcessDefinition = (deploymentId: string | string[], processDefinitionId: string | string[]) => {
+ return request({
+ url: `/workflow/processDefinition/${deploymentId}/${processDefinitionId}`,
+ method: 'delete'
+ });
+};
+
+/**
+ * 挂起/激活
+ * @param processDefinitionId 流程定义id
+ * @returns
+ */
+export const updateDefinitionState = (processDefinitionId: string) => {
+ return request({
+ url: `/workflow/processDefinition/updateDefinitionState/${processDefinitionId}`,
+ method: 'put'
+ });
+};
+
+/**
+ * 流程定义转换为模型
+ * @param processDefinitionId 流程定义id
+ * @returns
+ */
+export const convertToModel = (processDefinitionId: string) => {
+ return request({
+ url: `/workflow/processDefinition/convertToModel/${processDefinitionId}`,
+ method: 'put'
+ });
+};
+
+/**
+ * 通过zip或xml部署流程定义
+ * @returns
+ */
+export function deployProcessFile(data: any) {
+ return request({
+ url: '/workflow/processDefinition/deployByFile',
+ method: 'post',
+ data: data,
+ headers: {
+ repeatSubmit: false
+ }
+ });
+}
+
+/**
+ * 迁移流程
+ * @param currentProcessDefinitionId
+ * @param fromProcessDefinitionId
+ * @returns
+ */
+export const migrationDefinition = (currentProcessDefinitionId: string, fromProcessDefinitionId: string) => {
+ return request({
+ url: `/workflow/processDefinition/migrationDefinition/${currentProcessDefinitionId}/${fromProcessDefinitionId}`,
+ method: 'put'
+ });
+};
diff --git a/src/api/workflow/processDefinition/types.ts b/src/api/workflow/processDefinition/types.ts
new file mode 100644
index 0000000..979ec25
--- /dev/null
+++ b/src/api/workflow/processDefinition/types.ts
@@ -0,0 +1,24 @@
+import { DefinitionConfigVO } from '@/api/workflow/definitionConfig/types';
+export interface ProcessDefinitionQuery extends PageQuery {
+ key?: string;
+ name?: string;
+ categoryCode?: string;
+}
+
+export interface ProcessDefinitionVO extends BaseEntity {
+ id: string;
+ name: string;
+ key: string;
+ version: number;
+ suspensionState: number;
+ resourceName: string;
+ diagramResourceName: string;
+ deploymentId: string;
+ deploymentTime: string;
+ wfDefinitionConfigVo: DefinitionConfigVO;
+}
+
+export interface definitionXmlVO {
+ xml: string[];
+ xmlStr: string;
+}
diff --git a/src/api/workflow/processInstance/index.ts b/src/api/workflow/processInstance/index.ts
new file mode 100644
index 0000000..6d5e53b
--- /dev/null
+++ b/src/api/workflow/processInstance/index.ts
@@ -0,0 +1,136 @@
+import request from '@/utils/request';
+import { ProcessInstanceQuery, ProcessInstanceVO } from '@/api/workflow/processInstance/types';
+import { AxiosPromise } from 'axios';
+
+/**
+ * 查询运行中实例列表
+ * @param query
+ * @returns {*}
+ */
+export const getPageByRunning = (query: ProcessInstanceQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/processInstance/getPageByRunning',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询已完成实例列表
+ * @param query
+ * @returns {*}
+ */
+export const getPageByFinish = (query: ProcessInstanceQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/processInstance/getPageByFinish',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 通过业务id获取历史流程图
+ */
+export const getHistoryImage = (businessKey: string) => {
+ return request({
+ url: `/workflow/processInstance/getHistoryImage/${businessKey}` + '?t' + Math.random(),
+ method: 'get'
+ });
+};
+
+/**
+ * 通过业务id获取历史流程图运行中,历史等节点
+ */
+export const getHistoryList = (businessKey: string): AxiosPromise> => {
+ return request({
+ url: `/workflow/processInstance/getHistoryList/${businessKey}` + '?t' + Math.random(),
+ method: 'get'
+ });
+};
+
+/**
+ * 获取审批记录
+ * @param businessKey 业务id
+ * @returns
+ */
+export const getHistoryRecord = (businessKey: string | number) => {
+ return request({
+ url: `/workflow/processInstance/getHistoryRecord/${businessKey}`,
+ method: 'get'
+ });
+};
+
+/**
+ * 作废
+ * @param data 参数
+ * @returns
+ */
+export const deleteRunInstance = (data: object) => {
+ return request({
+ url: `/workflow/processInstance/deleteRunInstance`,
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
+ * @param businessKey 业务id
+ * @returns
+ */
+export const deleteRunAndHisInstance = (businessKey: string | string[]) => {
+ return request({
+ url: `/workflow/processInstance/deleteRunAndHisInstance/${businessKey}`,
+ method: 'delete'
+ });
+};
+
+/**
+ * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息
+ * @param businessKey 业务id
+ * @returns
+ */
+export const deleteFinishAndHisInstance = (businessKey: string | string[]) => {
+ return request({
+ url: `/workflow/processInstance/deleteFinishAndHisInstance/${businessKey}`,
+ method: 'delete'
+ });
+};
+
+/**
+ * 分页查询当前登录人单据
+ * @param query
+ * @returns {*}
+ */
+export const getPageByCurrent = (query: ProcessInstanceQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/processInstance/getPageByCurrent',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 撤销流程
+ * @param businessKey 业务id
+ * @returns
+ */
+export const cancelProcessApply = (businessKey: string) => {
+ return request({
+ url: `/workflow/processInstance/cancelProcessApply/${businessKey}`,
+ method: 'post'
+ });
+};
+
+export default {
+ getPageByRunning,
+ getPageByFinish,
+ getHistoryImage,
+ getHistoryList,
+ getHistoryRecord,
+ deleteRunInstance,
+ deleteRunAndHisInstance,
+ deleteFinishAndHisInstance,
+ getPageByCurrent,
+ cancelProcessApply
+};
diff --git a/src/api/workflow/processInstance/types.ts b/src/api/workflow/processInstance/types.ts
new file mode 100644
index 0000000..99d0511
--- /dev/null
+++ b/src/api/workflow/processInstance/types.ts
@@ -0,0 +1,27 @@
+import { TaskVO } from '@/api/workflow/task/types';
+
+export interface ProcessInstanceQuery extends PageQuery {
+ categoryCode?: string;
+ name?: string;
+ key?: string;
+ startUserId?: string;
+ businessKey?: string;
+}
+
+export interface ProcessInstanceVO extends BaseEntity {
+ id: string;
+ processDefinitionId: string;
+ processDefinitionName: string;
+ processDefinitionKey: string;
+ processDefinitionVersion: string;
+ deploymentId: string;
+ businessKey: string;
+ isSuspended?: any;
+ tenantId: string;
+ startTime: string;
+ endTime?: string;
+ startUserId: string;
+ businessStatus: string;
+ businessStatusName: string;
+ taskVoList: TaskVO[];
+}
diff --git a/src/api/workflow/task/index.ts b/src/api/workflow/task/index.ts
new file mode 100644
index 0000000..d29de30
--- /dev/null
+++ b/src/api/workflow/task/index.ts
@@ -0,0 +1,264 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { TaskQuery, TaskVO } from '@/api/workflow/task/types';
+
+/**
+ * 查询待办列表
+ * @param query
+ * @returns {*}
+ */
+export const getPageByTaskWait = (query: TaskQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/task/getPageByTaskWait',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询已办列表
+ * @param query
+ * @returns {*}
+ */
+export const getPageByTaskFinish = (query: TaskQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/task/getPageByTaskFinish',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 查询当前用户的抄送列表
+ * @param query
+ * @returns {*}
+ */
+export const getPageByTaskCopy = (query: TaskQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/task/getPageByTaskCopy',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 当前租户所有待办任务
+ * @param query
+ * @returns {*}
+ */
+export const getPageByAllTaskWait = (query: TaskQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/task/getPageByAllTaskWait',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 当前租户所有已办任务
+ * @param query
+ * @returns {*}
+ */
+export const getPageByAllTaskFinish = (query: TaskQuery): AxiosPromise => {
+ return request({
+ url: '/workflow/task/getPageByAllTaskFinish',
+ method: 'get',
+ params: query
+ });
+};
+
+/**
+ * 启动流程
+ * @param data
+ * @returns {*}
+ */
+export const startWorkFlow = (data: object): any => {
+ return request({
+ url: '/workflow/task/startWorkFlow',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 办理流程
+ * @param data
+ * @returns {*}
+ */
+export const completeTask = (data: object) => {
+ return request({
+ url: '/workflow/task/completeTask',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 认领任务
+ * @param taskId
+ * @returns {*}
+ */
+export const claim = (taskId: string): any => {
+ return request({
+ url: '/workflow/task/claim/' + taskId,
+ method: 'post'
+ });
+};
+
+/**
+ * 归还任务
+ * @param taskId
+ * @returns {*}
+ */
+export const returnTask = (taskId: string): any => {
+ return request({
+ url: '/workflow/task/returnTask/' + taskId,
+ method: 'post'
+ });
+};
+
+/**
+ * 任务驳回
+ * @param data
+ * @returns {*}
+ */
+export const backProcess = (data: any): any => {
+ return request({
+ url: '/workflow/task/backProcess',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 获取当前任务
+ * @param taskId
+ * @returns
+ */
+export const getTaskById = (taskId: string) => {
+ return request({
+ url: '/workflow/task/getTaskById/' + taskId,
+ method: 'get'
+ });
+};
+
+/**
+ * 加签
+ * @param data
+ * @returns
+ */
+export const addMultiInstanceExecution = (data: any) => {
+ return request({
+ url: '/workflow/task/addMultiInstanceExecution',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 减签
+ * @param data
+ * @returns
+ */
+export const deleteMultiInstanceExecution = (data: any) => {
+ return request({
+ url: '/workflow/task/deleteMultiInstanceExecution',
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 修改任务办理人
+ * @param taskIds
+ * @param userId
+ * @returns
+ */
+export const updateAssignee = (taskIds: Array, userId: string) => {
+ return request({
+ url: `/workflow/task/updateAssignee/${taskIds}/${userId}`,
+ method: 'put'
+ });
+};
+
+/**
+ * 转办任务
+ * @returns
+ */
+export const transferTask = (data: any) => {
+ return request({
+ url: `/workflow/task/transferTask`,
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 终止任务
+ * @returns
+ */
+export const terminationTask = (data: any) => {
+ return request({
+ url: `/workflow/task/terminationTask`,
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 查询流程变量
+ * @returns
+ */
+export const getInstanceVariable = (taskId: string) => {
+ return request({
+ url: `/workflow/task/getInstanceVariable/${taskId}`,
+ method: 'get'
+ });
+};
+
+/**
+ * 获取可驳回得任务节点
+ * @returns
+ */
+export const getTaskNodeList = (processInstanceId: string) => {
+ return request({
+ url: `/workflow/task/getTaskNodeList/${processInstanceId}`,
+ method: 'get'
+ });
+};
+
+/**
+ * 委托任务
+ * @returns
+ */
+export const delegateTask = (data: any) => {
+ return request({
+ url: `/workflow/task/delegateTask`,
+ method: 'post',
+ data: data
+ });
+};
+
+/**
+ * 查询工作流任务用户选择加签人员
+ * @param taskId
+ * @returns {*}
+ */
+export const getTaskUserIdsByAddMultiInstance = (taskId: string) => {
+ return request({
+ url: '/workflow/task/getTaskUserIdsByAddMultiInstance/' + taskId,
+ method: 'get'
+ });
+};
+
+/**
+ * 查询工作流选择减签人员
+ * @param taskId
+ * @returns {*}
+ */
+export const getListByDeleteMultiInstance = (taskId: string) => {
+ return request({
+ url: '/workflow/task/getListByDeleteMultiInstance/' + taskId,
+ method: 'get'
+ });
+};
diff --git a/src/api/workflow/task/types.ts b/src/api/workflow/task/types.ts
new file mode 100644
index 0000000..0425a1a
--- /dev/null
+++ b/src/api/workflow/task/types.ts
@@ -0,0 +1,49 @@
+import { NodeConfigVO } from '@/api/workflow/nodeConfig/types';
+import { DefinitionConfigVO } from '@/api/workflow/definitionConfig/types';
+export interface TaskQuery extends PageQuery {
+ name?: string;
+ processDefinitionKey?: string;
+ processDefinitionName?: string;
+}
+
+export interface ParticipantVo {
+ groupIds?: string[] | number[];
+ candidate: string[] | number[];
+ candidateName: string[];
+ claim: boolean;
+}
+
+export interface TaskVO extends BaseEntity {
+ id: string;
+ name: string;
+ description?: string;
+ priority: number;
+ owner?: string;
+ assignee?: string | number;
+ assigneeName?: string;
+ processInstanceId: string;
+ executionId: string;
+ taskDefinitionId?: any;
+ processDefinitionId: string;
+ endTime?: string;
+ taskDefinitionKey: string;
+ dueDate?: string;
+ category?: any;
+ parentTaskId?: any;
+ tenantId: string;
+ claimTime?: string;
+ businessStatus?: string;
+ businessStatusName?: string;
+ processDefinitionName?: string;
+ processDefinitionKey?: string;
+ participantVo?: ParticipantVo;
+ multiInstance?: boolean;
+ businessKey?: string;
+ wfNodeConfigVo?: NodeConfigVO;
+ wfDefinitionConfigVo?: DefinitionConfigVO;
+}
+
+export interface VariableVo {
+ key: string;
+ value: string;
+}
diff --git a/src/api/workflow/workflowCommon/index.ts b/src/api/workflow/workflowCommon/index.ts
new file mode 100644
index 0000000..63ce318
--- /dev/null
+++ b/src/api/workflow/workflowCommon/index.ts
@@ -0,0 +1,29 @@
+import { RouterJumpVo } from '@/api/workflow/workflowCommon/types';
+
+export default {
+ routerJump(routerJumpVo: RouterJumpVo, proxy) {
+ if (routerJumpVo.wfNodeConfigVo && routerJumpVo.wfNodeConfigVo.formType === 'static' && routerJumpVo.wfNodeConfigVo.wfFormManageVo) {
+ proxy.$tab.closePage(proxy.$route);
+ proxy.$router.push({
+ path: `${routerJumpVo.wfNodeConfigVo.wfFormManageVo.router}`,
+ query: {
+ id: routerJumpVo.businessKey,
+ type: routerJumpVo.type,
+ taskId: routerJumpVo.taskId
+ }
+ });
+ } else if (routerJumpVo.wfNodeConfigVo && routerJumpVo.wfNodeConfigVo.formType === 'dynamic' && routerJumpVo.wfNodeConfigVo.wfFormManageVo) {
+ proxy.$tab.closePage(proxy.$route);
+ proxy.$router.push({
+ path: `${routerJumpVo.wfNodeConfigVo.wfFormManageVo.router}`,
+ query: {
+ id: routerJumpVo.businessKey,
+ type: routerJumpVo.type,
+ taskId: routerJumpVo.taskId
+ }
+ });
+ } else {
+ proxy?.$modal.msgError('请到模型配置菜单!');
+ }
+ }
+};
diff --git a/src/api/workflow/workflowCommon/types.ts b/src/api/workflow/workflowCommon/types.ts
new file mode 100644
index 0000000..0f1ef1f
--- /dev/null
+++ b/src/api/workflow/workflowCommon/types.ts
@@ -0,0 +1,16 @@
+import { NodeConfigVO } from '@/api/workflow/nodeConfig/types';
+import { DefinitionConfigVO } from '@/api/workflow/definitionConfig/types';
+
+export interface RouterJumpVo {
+ wfNodeConfigVo: NodeConfigVO;
+ wfDefinitionConfigVo: DefinitionConfigVO;
+ businessKey: string;
+ taskId: string;
+ type: string;
+}
+
+export interface StartProcessBo {
+ businessKey: string | number;
+ tableName: string;
+ variables: any;
+}
diff --git a/src/assets/401_images/401.gif b/src/assets/401_images/401.gif
new file mode 100644
index 0000000000000000000000000000000000000000..cd6e0d9433421b3f29d0ec0c40f755e354728000
GIT binary patch
literal 164227
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