From 1a92e8b30e0340b0108a0b051a68b2b93b189d50 Mon Sep 17 00:00:00 2001 From: Asoka Date: Tue, 3 Jun 2025 16:45:54 +0800 Subject: [PATCH] init code --- .editorconfig | 23 + .env | 8 + .env.development | 5 + .env.production | 11 + .eslintignore | 19 + .eslintrc.js | 78 + .gitignore | 26 + .prettierrc.cjs | 39 + LICENSE | 21 + README.md | 117 + bin/build.bat | 12 + bin/install.bat | 12 + bin/run-web.bat | 12 + gen/gen-api.js | 56 + gen/gen-templates.js | 12 + gen/templates/api.ejs | 28 + gen/templates/data-contract-jsdoc.ejs | 37 + gen/templates/data-contracts.ejs | 28 + gen/templates/enum-contracts.ejs | 6 + gen/templates/enum-data-contract.ejs | 12 + gen/templates/http-client.ejs | 465 ++ gen/templates/interface-data-contract.ejs | 10 + gen/templates/object-field-jsdoc.ejs | 28 + gen/templates/procedure-call.ejs | 100 + gen/templates/route-docs.ejs | 30 + gen/templates/route-name.ejs | 27 + gen/templates/route-type.ejs | 22 + gen/templates/route-types.ejs | 18 + gen/templates/type-data-contract.ejs | 15 + index.html | 27 + package.json | 98 + public/favicon.ico | Bin 0 -> 6065 bytes public/print-lock.css | 356 + src/App.vue | 105 + src/api/admin.extend/Api.ts | 50 + src/api/admin.extend/enum-contracts.ts | 32 + src/api/admin/Api.ts | 312 + src/api/admin/Auth.ts | 302 + src/api/admin/Cache.ts | 58 + src/api/admin/Captcha.ts | 113 + src/api/admin/Dict.ts | 316 + src/api/admin/DictType.ts | 187 + src/api/admin/Doc.ts | 387 + src/api/admin/File.ts | 140 + src/api/admin/LoginLog.ts | 55 + src/api/admin/Msg.ts | 254 + src/api/admin/MsgType.ts | 191 + src/api/admin/OperationLog.ts | 60 + src/api/admin/Org.ts | 172 + src/api/admin/Permission.ts | 350 + src/api/admin/Pkg.ts | 347 + src/api/admin/PrintTemplate.ts | 250 + src/api/admin/Region.ts | 229 + src/api/admin/Role.ts | 298 + src/api/admin/Room.ts | 153 + src/api/admin/SiteMsg.ts | 181 + src/api/admin/Task.ts | 287 + src/api/admin/TaskLog.ts | 36 + src/api/admin/Tenant.ts | 213 + src/api/admin/User.ts | 495 ++ src/api/admin/View.ts | 206 + src/api/admin/WebSocket.ts | 53 + src/api/admin/data-contracts.ts | 6596 +++++++++++++++++ src/api/admin/enum-contracts.ts | 128 + src/api/admin/http-client.ts | 465 ++ src/assets/icons/bottom.svg | 9 + src/assets/icons/customSize.svg | 1 + src/assets/icons/distributeHor.svg | 8 + src/assets/icons/distributeVer.svg | 8 + src/assets/icons/export.svg | 11 + src/assets/icons/horizontal.svg | 8 + src/assets/icons/hot.svg | 1 + src/assets/icons/json.svg | 1 + src/assets/icons/left.svg | 11 + src/assets/icons/more.svg | 8 + src/assets/icons/qq.svg | 1 + src/assets/icons/recycle.svg | 1 + src/assets/icons/right.svg | 11 + src/assets/icons/rotate.svg | 11 + src/assets/icons/save.svg | 8 + src/assets/icons/top.svg | 8 + src/assets/icons/vertical.svg | 7 + src/assets/imgs/lockscreen.jpg | Bin 0 -> 102506 bytes src/assets/imgs/login/bg-login.jpg | Bin 0 -> 105500 bytes src/assets/login-main.svg | 1 + src/assets/logo-mini.png | Bin 0 -> 71581 bytes src/assets/svgs/401.svg | 85 + src/assets/svgs/404.svg | 90 + src/assets/svgs/hiprint/barcode.svg | 1 + src/assets/svgs/hiprint/emptyTable.svg | 1 + src/assets/svgs/hiprint/hline.svg | 1 + src/assets/svgs/hiprint/html.svg | 1 + src/assets/svgs/hiprint/image.svg | 1 + src/assets/svgs/hiprint/longText.svg | 1 + src/assets/svgs/hiprint/oval.svg | 1 + src/assets/svgs/hiprint/qrcode.svg | 1 + src/assets/svgs/hiprint/rect.svg | 1 + src/assets/svgs/hiprint/table.svg | 1 + src/assets/svgs/hiprint/text.svg | 1 + src/assets/svgs/hiprint/vline.svg | 1 + src/components/auth/auth.vue | 26 + src/components/auth/authAll.vue | 27 + src/components/auth/auths.vue | 32 + src/components/cropper/index.vue | 150 + src/components/editor/index.vue | 139 + src/components/iconSelector/index.vue | 241 + src/components/iconSelector/list.vue | 84 + src/components/my-captcha/dialog.vue | 30 + src/components/my-captcha/index.vue | 74 + src/components/my-captcha/slide-captcha.vue | 573 ++ src/components/my-cron/day.vue | 190 + src/components/my-cron/dialog.vue | 84 + src/components/my-cron/hour.vue | 145 + src/components/my-cron/index.vue | 298 + src/components/my-cron/min.vue | 144 + src/components/my-cron/month.vue | 159 + src/components/my-cron/result.vue | 561 ++ src/components/my-cron/second.vue | 147 + src/components/my-cron/week.vue | 208 + src/components/my-cron/year.vue | 165 + src/components/my-date-range/index.vue | 96 + src/components/my-dropdown-more/index.vue | 48 + src/components/my-editor/index.vue | 153 + src/components/my-high-search/dialog.vue | 68 + src/components/my-high-search/index.vue | 291 + src/components/my-icon/index.vue | 41 + src/components/my-import/index.vue | 406 + src/components/my-input-code/index.vue | 187 + src/components/my-json-editor/index.vue | 127 + src/components/my-layout/index.vue | 23 + src/components/my-layout/split-panes.vue | 42 + src/components/my-link/index.vue | 37 + src/components/my-search/index.vue | 187 + src/components/my-select-icon/icon-select.vue | 251 + src/components/my-select-icon/index.vue | 64 + src/components/my-select-input/index.vue | 63 + src/components/my-select/index.vue | 14 + src/components/my-upload/index.vue | 126 + src/components/noticeBar/index.vue | 191 + src/components/svgIcon/index.vue | 62 + src/components/table/index.vue | 301 + src/directive/authDirective.ts | 40 + src/directive/customDirective.ts | 178 + src/directive/index.ts | 18 + src/globalProperties/index.ts | 6 + src/globalProperties/modal.ts | 107 + src/i18n/index.ts | 68 + src/i18n/lang/en.ts | 193 + src/i18n/lang/zh-cn.ts | 193 + src/i18n/lang/zh-tw.ts | 193 + src/i18n/pages/formI18n/en.ts | 13 + src/i18n/pages/formI18n/zh-cn.ts | 13 + src/i18n/pages/formI18n/zh-tw.ts | 13 + src/i18n/pages/login/en.ts | 37 + src/i18n/pages/login/zh-cn.ts | 35 + src/i18n/pages/login/zh-tw.ts | 35 + src/layout/component/aside.vue | 167 + src/layout/component/columnsAside.vue | 356 + src/layout/component/header.vue | 18 + src/layout/component/main.vue | 65 + src/layout/footer/index.vue | 25 + src/layout/index.vue | 50 + src/layout/lockScreen/index.vue | 353 + src/layout/logo/index.vue | 81 + src/layout/main/classic.vue | 73 + src/layout/main/columns.vue | 73 + src/layout/main/defaults.vue | 73 + src/layout/main/transverse.vue | 60 + src/layout/navBars/index.vue | 35 + src/layout/navBars/tagsView/contextmenu.vue | 139 + src/layout/navBars/tagsView/tagsView.vue | 751 ++ src/layout/navBars/topBar/breadcrumb.vue | 195 + src/layout/navBars/topBar/closeFull.vue | 59 + src/layout/navBars/topBar/index.vue | 116 + src/layout/navBars/topBar/msg.vue | 203 + src/layout/navBars/topBar/search.vue | 128 + src/layout/navBars/topBar/setings.vue | 948 +++ src/layout/navBars/topBar/user.vue | 294 + src/layout/navBars/topBar/userNews.vue | 102 + src/layout/navMenu/horizontal.vue | 166 + src/layout/navMenu/subItem.vue | 49 + src/layout/navMenu/vertical.vue | 100 + src/layout/routerView/iframes.vue | 101 + src/layout/routerView/link.vue | 98 + src/layout/routerView/parent.vue | 104 + src/layout/upgrade/index.vue | 156 + src/main.ts | 33 + src/router/backEnd.ts | 184 + src/router/frontEnd.ts | 151 + src/router/index.ts | 147 + src/router/route.ts | 166 + src/stores/index.ts | 8 + src/stores/keepAliveNames.ts | 35 + src/stores/requestOldRoutes.ts | 16 + src/stores/route.ts | 19 + src/stores/routesList.ts | 26 + src/stores/tagsViewRoutes.ts | 23 + src/stores/themeConfig.ts | 158 + src/stores/userInfo.ts | 101 + src/theme/ace-cloud9-night.scss | 148 + src/theme/app.scss | 379 + src/theme/common/transition.scss | 147 + src/theme/dark.scss | 109 + src/theme/element.scss | 386 + src/theme/iconSelector.scss | 31 + src/theme/index.scss | 12 + src/theme/loading.scss | 51 + src/theme/media/chart.scss | 94 + src/theme/media/cityLinkage.scss | 10 + src/theme/media/date.scss | 25 + src/theme/media/dialog.scss | 12 + src/theme/media/drawer.scss | 10 + src/theme/media/error.scss | 45 + src/theme/media/form.scss | 34 + src/theme/media/home.scss | 23 + src/theme/media/index.scss | 15 + src/theme/media/layout.scss | 81 + src/theme/media/login.scss | 74 + src/theme/media/media.scss | 14 + src/theme/media/pagination.scss | 15 + src/theme/media/personal.scss | 16 + src/theme/media/scrollbar.scss | 56 + src/theme/media/tagsView.scss | 11 + src/theme/mixins/index.scss | 56 + src/theme/my-app.scss | 74 + src/theme/my-element.scss | 0 src/theme/my-flex.scss | 230 + src/theme/other.scss | 33 + src/theme/tableTool.scss | 27 + src/theme/waves.scss | 101 + src/types/axios.d.ts | 13 + src/types/axios.extend.d.ts | 10 + src/types/global.d.ts | 117 + src/types/global.extend.d.ts | 6 + src/types/layout.d.ts | 59 + src/types/mitt.d.ts | 80 + src/types/pinia.d.ts | 95 + src/types/pinia.extend.d.ts | 13 + src/types/views.d.ts | 361 + src/utils/arrayOperation.ts | 65 + src/utils/authFunction.ts | 38 + src/utils/commonFunction.ts | 66 + src/utils/digit.ts | 165 + src/utils/enum.ts | 55 + src/utils/formatTime.ts | 137 + src/utils/getStyleSheets.ts | 101 + src/utils/index.ts | 36 + src/utils/loading.ts | 44 + src/utils/mitt.ts | 8 + src/utils/other.ts | 226 + src/utils/request.ts | 69 + src/utils/setIconfont.ts | 51 + src/utils/storage.ts | 63 + src/utils/test.ts | 49 + src/utils/theme.ts | 63 + src/utils/toolsValidate.ts | 381 + src/utils/tree.ts | 301 + src/utils/validators.ts | 26 + src/utils/vite.ts | 51 + src/utils/watermark.ts | 47 + src/utils/ws.ts | 140 + src/views/admin/api/components/api-form.vue | 165 + src/views/admin/api/index.vue | 362 + src/views/admin/bio-automation/index.vue | 137 + src/views/admin/bio-detection/index.vue | 137 + src/views/admin/cache/index.vue | 60 + .../admin/change-password/component/email.vue | 216 + .../change-password/component/mobile.vue | 224 + src/views/admin/dict/components/dict-form.vue | 139 + .../admin/dict/components/dict-type-form.vue | 123 + src/views/admin/dict/dict-type.vue | 158 + src/views/admin/dict/dict.vue | 238 + src/views/admin/dict/index.vue | 29 + .../admin/file/components/file-upload.vue | 143 + src/views/admin/file/index.vue | 198 + src/views/admin/knowledge-base/index.vue | 137 + src/views/admin/login/component/aad.vue | 42 + src/views/admin/login/component/account.vue | 287 + src/views/admin/login/component/email.vue | 194 + src/views/admin/login/component/mobile.vue | 197 + src/views/admin/login/component/qq.vue | 75 + src/views/admin/login/index.vue | 375 + src/views/admin/logs/components/details.vue | 101 + src/views/admin/logs/login-log.vue | 138 + src/views/admin/logs/operation-log.vue | 151 + src/views/admin/module-entrance/index.vue | 156 + .../msg-type/components/msg-type-form.vue | 137 + src/views/admin/msg-type/index.vue | 138 + src/views/admin/msg/components/msg-form.vue | 187 + src/views/admin/msg/index.vue | 319 + src/views/admin/org/components/org-form.vue | 167 + src/views/admin/org/components/org-img.vue | 208 + src/views/admin/org/components/org-menu.vue | 150 + src/views/admin/org/index.vue | 177 + .../components/permission-dot-form.vue | 257 + .../components/permission-group-form.vue | 201 + .../components/permission-menu-form.vue | 296 + src/views/admin/permission/index.vue | 313 + .../components/change-password-form.vue | 140 + src/views/admin/personal/index.vue | 447 ++ src/views/admin/pkg/components/pkg-form.vue | 125 + .../admin/pkg/components/set-pkg-menu.vue | 217 + src/views/admin/pkg/index.vue | 340 + .../components/design-dialog.vue | 236 + .../print-template/components/design.vue | 595 ++ .../admin/print-template/components/form.vue | 122 + .../print-template/components/preview.vue | 119 + .../print-template/components/providers.ts | 165 + .../print-template/components/view-json.vue | 67 + src/views/admin/print-template/index.vue | 202 + src/views/admin/reg/component/email.vue | 193 + src/views/admin/reg/component/mobile.vue | 201 + .../admin/region/components/region-form.vue | 183 + .../admin/region/components/region-select.vue | 59 + src/views/admin/region/index.vue | 331 + src/views/admin/role/components/role-form.vue | 142 + .../role/components/set-role-data-scope.vue | 131 + .../admin/role/components/set-role-menu.vue | 215 + src/views/admin/role/index.vue | 341 + src/views/admin/room/components/room-form.vue | 129 + src/views/admin/room/index.vue | 186 + src/views/admin/site-msg/detail.vue | 73 + src/views/admin/site-msg/index.vue | 273 + src/views/admin/system-settings/index.vue | 137 + .../task/components/json-editor-dialog.vue | 112 + src/views/admin/task/components/task-form.vue | 264 + src/views/admin/task/components/task-logs.vue | 134 + src/views/admin/task/index.vue | 404 + .../tenant/components/set-tenant-menu.vue | 184 + .../admin/tenant/components/tenant-form.vue | 209 + .../admin/tenant/components/tenant-select.vue | 174 + src/views/admin/tenant/index.vue | 210 + .../admin/user/components/my-select-user.vue | 56 + src/views/admin/user/components/user-form.vue | 327 + .../user/components/user-recycle-dialog.vue | 190 + .../admin/user/components/user-reset-pwd.vue | 113 + .../admin/user/components/user-select.vue | 211 + .../admin/user/components/user-set-org.vue | 181 + .../user/components/user-update-form.vue | 218 + src/views/admin/user/index.vue | 471 ++ src/views/admin/view/components/view-form.vue | 186 + src/views/admin/view/index.vue | 170 + src/views/admin/workbench/index.vue | 633 ++ src/views/error/401.vue | 89 + src/views/error/404.vue | 88 + src/views/example/chart/chart.scss | 441 ++ src/views/example/chart/chart.ts | 59 + src/views/example/chart/head.vue | 100 + src/views/example/chart/index.vue | 477 ++ src/views/example/fun/clipboard/index.vue | 30 + src/views/example/fun/countup/index.vue | 152 + src/views/example/fun/cropper/index.vue | 57 + src/views/example/fun/echartsMap/index.vue | 118 + src/views/example/fun/echartsMap/mock.ts | 387 + src/views/example/fun/gridLayout/index.vue | 55 + src/views/example/fun/printJs/index.vue | 35 + src/views/example/fun/qrcode/index.vue | 69 + src/views/example/fun/splitpanes/index.vue | 44 + src/views/example/fun/tagsView/index.vue | 107 + src/views/example/fun/wangEditor/index.vue | 30 + src/views/example/home/index.vue | 633 ++ .../example/limits/backEnd/page/index.vue | 30 + .../example/limits/frontEnd/btn/index.vue | 379 + .../example/limits/frontEnd/page/index.vue | 59 + src/views/example/login/component/account.vue | 175 + src/views/example/login/component/mobile.vue | 70 + src/views/example/login/component/scan.vue | 63 + src/views/example/login/index.vue | 247 + src/views/example/make/noticeBar/index.vue | 158 + src/views/example/make/selector/index.vue | 118 + src/views/example/make/svgDemo/index.vue | 51 + src/views/example/make/tableDemo/index.vue | 136 + src/views/example/make/tableDemo/search.vue | 111 + src/views/example/menu/menu1/menu11/index.vue | 12 + .../menu/menu1/menu12/menu121/index.vue | 12 + .../menu/menu1/menu12/menu122/index.vue | 12 + src/views/example/menu/menu1/menu13/index.vue | 21 + src/views/example/menu/menu2/index.vue | 12 + src/views/example/pages/awesome/index.vue | 81 + src/views/example/pages/drag/index.vue | 59 + src/views/example/pages/dynamicForm/index.vue | 168 + src/views/example/pages/dynamicForm/mock.ts | 119 + src/views/example/pages/element/index.vue | 83 + src/views/example/pages/filtering/details.vue | 13 + .../example/pages/filtering/details1.vue | 13 + src/views/example/pages/filtering/index.vue | 338 + src/views/example/pages/filtering/mock.ts | 201 + src/views/example/pages/formAdapt/index.vue | 107 + src/views/example/pages/formI18n/index.vue | 53 + .../formRules/component/formRulesOne.vue | 64 + .../formRules/component/formRulesThree.vue | 43 + .../formRules/component/formRulesTwo.vue | 45 + src/views/example/pages/formRules/index.vue | 71 + src/views/example/pages/iocnfont/index.vue | 81 + src/views/example/pages/lazyImg/index.vue | 185 + src/views/example/pages/lazyImg/mock.ts | 313 + src/views/example/pages/listAdapt/index.vue | 178 + src/views/example/pages/listAdapt/mock.ts | 93 + src/views/example/pages/preview/index.vue | 21 + src/views/example/pages/steps/index.vue | 42 + src/views/example/pages/tableRules/index.vue | 112 + src/views/example/pages/tree/index.vue | 227 + src/views/example/pages/waterfall/index.vue | 164 + src/views/example/pages/waves/index.vue | 124 + .../workflow/component/contextmenu/index.vue | 111 + .../pages/workflow/component/drawer/index.vue | 63 + .../pages/workflow/component/drawer/line.vue | 56 + .../pages/workflow/component/drawer/node.vue | 254 + .../pages/workflow/component/tool/help.vue | 36 + .../pages/workflow/component/tool/index.vue | 74 + src/views/example/pages/workflow/index.vue | 631 ++ src/views/example/pages/workflow/js/config.ts | 99 + src/views/example/pages/workflow/js/mock.ts | 262 + src/views/example/params/common/details.vue | 18 + src/views/example/params/common/index.vue | 73 + src/views/example/params/dynamic/details.vue | 18 + src/views/example/params/dynamic/index.vue | 75 + src/views/example/personal/index.vue | 373 + src/views/example/personal/mock.ts | 46 + .../example/system/dept/component/addDept.vue | 143 + .../system/dept/component/editDept.vue | 148 + src/views/example/system/dept/dialog.vue | 167 + src/views/example/system/dept/index.vue | 135 + .../example/system/dic/component/addDic.vue | 114 + .../example/system/dic/component/editDic.vue | 128 + src/views/example/system/dic/dialog.vue | 150 + src/views/example/system/dic/index.vue | 132 + .../example/system/menu/component/addMenu.vue | 229 + .../system/menu/component/editMenu.vue | 237 + src/views/example/system/menu/dialog.vue | 256 + src/views/example/system/menu/index.vue | 122 + .../example/system/role/component/addRole.vue | 213 + .../system/role/component/editRole.vue | 221 + src/views/example/system/role/dialog.vue | 236 + src/views/example/system/role/index.vue | 146 + .../example/system/user/component/addUser.vue | 167 + .../system/user/component/editUser.vue | 168 + src/views/example/system/user/dialog.vue | 187 + src/views/example/system/user/index.vue | 158 + src/views/example/tools/index.vue | 494 ++ src/views/example/visualizing/demo1.vue | 1267 ++++ src/views/example/visualizing/demo2.vue | 1355 ++++ src/views/example/visualizing/mock/demo1.ts | 51 + src/views/example/visualizing/mock/demo2.ts | 131 + tsconfig.json | 74 + vite.config.ts | 83 + 446 files changed, 67221 insertions(+) create mode 100644 .editorconfig create mode 100644 .env create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .prettierrc.cjs create mode 100644 LICENSE create mode 100644 README.md create mode 100644 bin/build.bat create mode 100644 bin/install.bat create mode 100644 bin/run-web.bat create mode 100644 gen/gen-api.js create mode 100644 gen/gen-templates.js create mode 100644 gen/templates/api.ejs create mode 100644 gen/templates/data-contract-jsdoc.ejs create mode 100644 gen/templates/data-contracts.ejs create mode 100644 gen/templates/enum-contracts.ejs create mode 100644 gen/templates/enum-data-contract.ejs create mode 100644 gen/templates/http-client.ejs create mode 100644 gen/templates/interface-data-contract.ejs create mode 100644 gen/templates/object-field-jsdoc.ejs create mode 100644 gen/templates/procedure-call.ejs create mode 100644 gen/templates/route-docs.ejs create mode 100644 gen/templates/route-name.ejs create mode 100644 gen/templates/route-type.ejs create mode 100644 gen/templates/route-types.ejs create mode 100644 gen/templates/type-data-contract.ejs create mode 100644 index.html create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/print-lock.css create mode 100644 src/App.vue create mode 100644 src/api/admin.extend/Api.ts create mode 100644 src/api/admin.extend/enum-contracts.ts create mode 100644 src/api/admin/Api.ts create mode 100644 src/api/admin/Auth.ts create mode 100644 src/api/admin/Cache.ts create mode 100644 src/api/admin/Captcha.ts create mode 100644 src/api/admin/Dict.ts create mode 100644 src/api/admin/DictType.ts create mode 100644 src/api/admin/Doc.ts create mode 100644 src/api/admin/File.ts create mode 100644 src/api/admin/LoginLog.ts create mode 100644 src/api/admin/Msg.ts create mode 100644 src/api/admin/MsgType.ts create mode 100644 src/api/admin/OperationLog.ts create mode 100644 src/api/admin/Org.ts create mode 100644 src/api/admin/Permission.ts create mode 100644 src/api/admin/Pkg.ts create mode 100644 src/api/admin/PrintTemplate.ts create mode 100644 src/api/admin/Region.ts create mode 100644 src/api/admin/Role.ts create mode 100644 src/api/admin/Room.ts create mode 100644 src/api/admin/SiteMsg.ts create mode 100644 src/api/admin/Task.ts create mode 100644 src/api/admin/TaskLog.ts create mode 100644 src/api/admin/Tenant.ts create mode 100644 src/api/admin/User.ts create mode 100644 src/api/admin/View.ts create mode 100644 src/api/admin/WebSocket.ts create mode 100644 src/api/admin/data-contracts.ts create mode 100644 src/api/admin/enum-contracts.ts create mode 100644 src/api/admin/http-client.ts create mode 100644 src/assets/icons/bottom.svg create mode 100644 src/assets/icons/customSize.svg create mode 100644 src/assets/icons/distributeHor.svg create mode 100644 src/assets/icons/distributeVer.svg create mode 100644 src/assets/icons/export.svg create mode 100644 src/assets/icons/horizontal.svg create mode 100644 src/assets/icons/hot.svg create mode 100644 src/assets/icons/json.svg create mode 100644 src/assets/icons/left.svg create mode 100644 src/assets/icons/more.svg create mode 100644 src/assets/icons/qq.svg create mode 100644 src/assets/icons/recycle.svg create mode 100644 src/assets/icons/right.svg create mode 100644 src/assets/icons/rotate.svg create mode 100644 src/assets/icons/save.svg create mode 100644 src/assets/icons/top.svg create mode 100644 src/assets/icons/vertical.svg create mode 100644 src/assets/imgs/lockscreen.jpg create mode 100644 src/assets/imgs/login/bg-login.jpg create mode 100644 src/assets/login-main.svg create mode 100644 src/assets/logo-mini.png create mode 100644 src/assets/svgs/401.svg create mode 100644 src/assets/svgs/404.svg create mode 100644 src/assets/svgs/hiprint/barcode.svg create mode 100644 src/assets/svgs/hiprint/emptyTable.svg create mode 100644 src/assets/svgs/hiprint/hline.svg create mode 100644 src/assets/svgs/hiprint/html.svg create mode 100644 src/assets/svgs/hiprint/image.svg create mode 100644 src/assets/svgs/hiprint/longText.svg create mode 100644 src/assets/svgs/hiprint/oval.svg create mode 100644 src/assets/svgs/hiprint/qrcode.svg create mode 100644 src/assets/svgs/hiprint/rect.svg create mode 100644 src/assets/svgs/hiprint/table.svg create mode 100644 src/assets/svgs/hiprint/text.svg create mode 100644 src/assets/svgs/hiprint/vline.svg create mode 100644 src/components/auth/auth.vue create mode 100644 src/components/auth/authAll.vue create mode 100644 src/components/auth/auths.vue create mode 100644 src/components/cropper/index.vue create mode 100644 src/components/editor/index.vue create mode 100644 src/components/iconSelector/index.vue create mode 100644 src/components/iconSelector/list.vue create mode 100644 src/components/my-captcha/dialog.vue create mode 100644 src/components/my-captcha/index.vue create mode 100644 src/components/my-captcha/slide-captcha.vue create mode 100644 src/components/my-cron/day.vue create mode 100644 src/components/my-cron/dialog.vue create mode 100644 src/components/my-cron/hour.vue create mode 100644 src/components/my-cron/index.vue create mode 100644 src/components/my-cron/min.vue create mode 100644 src/components/my-cron/month.vue create mode 100644 src/components/my-cron/result.vue create mode 100644 src/components/my-cron/second.vue create mode 100644 src/components/my-cron/week.vue create mode 100644 src/components/my-cron/year.vue create mode 100644 src/components/my-date-range/index.vue create mode 100644 src/components/my-dropdown-more/index.vue create mode 100644 src/components/my-editor/index.vue create mode 100644 src/components/my-high-search/dialog.vue create mode 100644 src/components/my-high-search/index.vue create mode 100644 src/components/my-icon/index.vue create mode 100644 src/components/my-import/index.vue create mode 100644 src/components/my-input-code/index.vue create mode 100644 src/components/my-json-editor/index.vue create mode 100644 src/components/my-layout/index.vue create mode 100644 src/components/my-layout/split-panes.vue create mode 100644 src/components/my-link/index.vue create mode 100644 src/components/my-search/index.vue create mode 100644 src/components/my-select-icon/icon-select.vue create mode 100644 src/components/my-select-icon/index.vue create mode 100644 src/components/my-select-input/index.vue create mode 100644 src/components/my-select/index.vue create mode 100644 src/components/my-upload/index.vue create mode 100644 src/components/noticeBar/index.vue create mode 100644 src/components/svgIcon/index.vue create mode 100644 src/components/table/index.vue create mode 100644 src/directive/authDirective.ts create mode 100644 src/directive/customDirective.ts create mode 100644 src/directive/index.ts create mode 100644 src/globalProperties/index.ts create mode 100644 src/globalProperties/modal.ts create mode 100644 src/i18n/index.ts create mode 100644 src/i18n/lang/en.ts create mode 100644 src/i18n/lang/zh-cn.ts create mode 100644 src/i18n/lang/zh-tw.ts create mode 100644 src/i18n/pages/formI18n/en.ts create mode 100644 src/i18n/pages/formI18n/zh-cn.ts create mode 100644 src/i18n/pages/formI18n/zh-tw.ts create mode 100644 src/i18n/pages/login/en.ts create mode 100644 src/i18n/pages/login/zh-cn.ts create mode 100644 src/i18n/pages/login/zh-tw.ts create mode 100644 src/layout/component/aside.vue create mode 100644 src/layout/component/columnsAside.vue create mode 100644 src/layout/component/header.vue create mode 100644 src/layout/component/main.vue create mode 100644 src/layout/footer/index.vue create mode 100644 src/layout/index.vue create mode 100644 src/layout/lockScreen/index.vue create mode 100644 src/layout/logo/index.vue create mode 100644 src/layout/main/classic.vue create mode 100644 src/layout/main/columns.vue create mode 100644 src/layout/main/defaults.vue create mode 100644 src/layout/main/transverse.vue create mode 100644 src/layout/navBars/index.vue create mode 100644 src/layout/navBars/tagsView/contextmenu.vue create mode 100644 src/layout/navBars/tagsView/tagsView.vue create mode 100644 src/layout/navBars/topBar/breadcrumb.vue create mode 100644 src/layout/navBars/topBar/closeFull.vue create mode 100644 src/layout/navBars/topBar/index.vue create mode 100644 src/layout/navBars/topBar/msg.vue create mode 100644 src/layout/navBars/topBar/search.vue create mode 100644 src/layout/navBars/topBar/setings.vue create mode 100644 src/layout/navBars/topBar/user.vue create mode 100644 src/layout/navBars/topBar/userNews.vue create mode 100644 src/layout/navMenu/horizontal.vue create mode 100644 src/layout/navMenu/subItem.vue create mode 100644 src/layout/navMenu/vertical.vue create mode 100644 src/layout/routerView/iframes.vue create mode 100644 src/layout/routerView/link.vue create mode 100644 src/layout/routerView/parent.vue create mode 100644 src/layout/upgrade/index.vue create mode 100644 src/main.ts create mode 100644 src/router/backEnd.ts create mode 100644 src/router/frontEnd.ts create mode 100644 src/router/index.ts create mode 100644 src/router/route.ts create mode 100644 src/stores/index.ts create mode 100644 src/stores/keepAliveNames.ts create mode 100644 src/stores/requestOldRoutes.ts create mode 100644 src/stores/route.ts create mode 100644 src/stores/routesList.ts create mode 100644 src/stores/tagsViewRoutes.ts create mode 100644 src/stores/themeConfig.ts create mode 100644 src/stores/userInfo.ts create mode 100644 src/theme/ace-cloud9-night.scss create mode 100644 src/theme/app.scss create mode 100644 src/theme/common/transition.scss create mode 100644 src/theme/dark.scss create mode 100644 src/theme/element.scss create mode 100644 src/theme/iconSelector.scss create mode 100644 src/theme/index.scss create mode 100644 src/theme/loading.scss create mode 100644 src/theme/media/chart.scss create mode 100644 src/theme/media/cityLinkage.scss create mode 100644 src/theme/media/date.scss create mode 100644 src/theme/media/dialog.scss create mode 100644 src/theme/media/drawer.scss create mode 100644 src/theme/media/error.scss create mode 100644 src/theme/media/form.scss create mode 100644 src/theme/media/home.scss create mode 100644 src/theme/media/index.scss create mode 100644 src/theme/media/layout.scss create mode 100644 src/theme/media/login.scss create mode 100644 src/theme/media/media.scss create mode 100644 src/theme/media/pagination.scss create mode 100644 src/theme/media/personal.scss create mode 100644 src/theme/media/scrollbar.scss create mode 100644 src/theme/media/tagsView.scss create mode 100644 src/theme/mixins/index.scss create mode 100644 src/theme/my-app.scss create mode 100644 src/theme/my-element.scss create mode 100644 src/theme/my-flex.scss create mode 100644 src/theme/other.scss create mode 100644 src/theme/tableTool.scss create mode 100644 src/theme/waves.scss create mode 100644 src/types/axios.d.ts create mode 100644 src/types/axios.extend.d.ts create mode 100644 src/types/global.d.ts create mode 100644 src/types/global.extend.d.ts create mode 100644 src/types/layout.d.ts create mode 100644 src/types/mitt.d.ts create mode 100644 src/types/pinia.d.ts create mode 100644 src/types/pinia.extend.d.ts create mode 100644 src/types/views.d.ts create mode 100644 src/utils/arrayOperation.ts create mode 100644 src/utils/authFunction.ts create mode 100644 src/utils/commonFunction.ts create mode 100644 src/utils/digit.ts create mode 100644 src/utils/enum.ts create mode 100644 src/utils/formatTime.ts create mode 100644 src/utils/getStyleSheets.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/loading.ts create mode 100644 src/utils/mitt.ts create mode 100644 src/utils/other.ts create mode 100644 src/utils/request.ts create mode 100644 src/utils/setIconfont.ts create mode 100644 src/utils/storage.ts create mode 100644 src/utils/test.ts create mode 100644 src/utils/theme.ts create mode 100644 src/utils/toolsValidate.ts create mode 100644 src/utils/tree.ts create mode 100644 src/utils/validators.ts create mode 100644 src/utils/vite.ts create mode 100644 src/utils/watermark.ts create mode 100644 src/utils/ws.ts create mode 100644 src/views/admin/api/components/api-form.vue create mode 100644 src/views/admin/api/index.vue create mode 100644 src/views/admin/bio-automation/index.vue create mode 100644 src/views/admin/bio-detection/index.vue create mode 100644 src/views/admin/cache/index.vue create mode 100644 src/views/admin/change-password/component/email.vue create mode 100644 src/views/admin/change-password/component/mobile.vue create mode 100644 src/views/admin/dict/components/dict-form.vue create mode 100644 src/views/admin/dict/components/dict-type-form.vue create mode 100644 src/views/admin/dict/dict-type.vue create mode 100644 src/views/admin/dict/dict.vue create mode 100644 src/views/admin/dict/index.vue create mode 100644 src/views/admin/file/components/file-upload.vue create mode 100644 src/views/admin/file/index.vue create mode 100644 src/views/admin/knowledge-base/index.vue create mode 100644 src/views/admin/login/component/aad.vue create mode 100644 src/views/admin/login/component/account.vue create mode 100644 src/views/admin/login/component/email.vue create mode 100644 src/views/admin/login/component/mobile.vue create mode 100644 src/views/admin/login/component/qq.vue create mode 100644 src/views/admin/login/index.vue create mode 100644 src/views/admin/logs/components/details.vue create mode 100644 src/views/admin/logs/login-log.vue create mode 100644 src/views/admin/logs/operation-log.vue create mode 100644 src/views/admin/module-entrance/index.vue create mode 100644 src/views/admin/msg-type/components/msg-type-form.vue create mode 100644 src/views/admin/msg-type/index.vue create mode 100644 src/views/admin/msg/components/msg-form.vue create mode 100644 src/views/admin/msg/index.vue create mode 100644 src/views/admin/org/components/org-form.vue create mode 100644 src/views/admin/org/components/org-img.vue create mode 100644 src/views/admin/org/components/org-menu.vue create mode 100644 src/views/admin/org/index.vue create mode 100644 src/views/admin/permission/components/permission-dot-form.vue create mode 100644 src/views/admin/permission/components/permission-group-form.vue create mode 100644 src/views/admin/permission/components/permission-menu-form.vue create mode 100644 src/views/admin/permission/index.vue create mode 100644 src/views/admin/personal/components/change-password-form.vue create mode 100644 src/views/admin/personal/index.vue create mode 100644 src/views/admin/pkg/components/pkg-form.vue create mode 100644 src/views/admin/pkg/components/set-pkg-menu.vue create mode 100644 src/views/admin/pkg/index.vue create mode 100644 src/views/admin/print-template/components/design-dialog.vue create mode 100644 src/views/admin/print-template/components/design.vue create mode 100644 src/views/admin/print-template/components/form.vue create mode 100644 src/views/admin/print-template/components/preview.vue create mode 100644 src/views/admin/print-template/components/providers.ts create mode 100644 src/views/admin/print-template/components/view-json.vue create mode 100644 src/views/admin/print-template/index.vue create mode 100644 src/views/admin/reg/component/email.vue create mode 100644 src/views/admin/reg/component/mobile.vue create mode 100644 src/views/admin/region/components/region-form.vue create mode 100644 src/views/admin/region/components/region-select.vue create mode 100644 src/views/admin/region/index.vue create mode 100644 src/views/admin/role/components/role-form.vue create mode 100644 src/views/admin/role/components/set-role-data-scope.vue create mode 100644 src/views/admin/role/components/set-role-menu.vue create mode 100644 src/views/admin/role/index.vue create mode 100644 src/views/admin/room/components/room-form.vue create mode 100644 src/views/admin/room/index.vue create mode 100644 src/views/admin/site-msg/detail.vue create mode 100644 src/views/admin/site-msg/index.vue create mode 100644 src/views/admin/system-settings/index.vue create mode 100644 src/views/admin/task/components/json-editor-dialog.vue create mode 100644 src/views/admin/task/components/task-form.vue create mode 100644 src/views/admin/task/components/task-logs.vue create mode 100644 src/views/admin/task/index.vue create mode 100644 src/views/admin/tenant/components/set-tenant-menu.vue create mode 100644 src/views/admin/tenant/components/tenant-form.vue create mode 100644 src/views/admin/tenant/components/tenant-select.vue create mode 100644 src/views/admin/tenant/index.vue create mode 100644 src/views/admin/user/components/my-select-user.vue create mode 100644 src/views/admin/user/components/user-form.vue create mode 100644 src/views/admin/user/components/user-recycle-dialog.vue create mode 100644 src/views/admin/user/components/user-reset-pwd.vue create mode 100644 src/views/admin/user/components/user-select.vue create mode 100644 src/views/admin/user/components/user-set-org.vue create mode 100644 src/views/admin/user/components/user-update-form.vue create mode 100644 src/views/admin/user/index.vue create mode 100644 src/views/admin/view/components/view-form.vue create mode 100644 src/views/admin/view/index.vue create mode 100644 src/views/admin/workbench/index.vue create mode 100644 src/views/error/401.vue create mode 100644 src/views/error/404.vue create mode 100644 src/views/example/chart/chart.scss create mode 100644 src/views/example/chart/chart.ts create mode 100644 src/views/example/chart/head.vue create mode 100644 src/views/example/chart/index.vue create mode 100644 src/views/example/fun/clipboard/index.vue create mode 100644 src/views/example/fun/countup/index.vue create mode 100644 src/views/example/fun/cropper/index.vue create mode 100644 src/views/example/fun/echartsMap/index.vue create mode 100644 src/views/example/fun/echartsMap/mock.ts create mode 100644 src/views/example/fun/gridLayout/index.vue create mode 100644 src/views/example/fun/printJs/index.vue create mode 100644 src/views/example/fun/qrcode/index.vue create mode 100644 src/views/example/fun/splitpanes/index.vue create mode 100644 src/views/example/fun/tagsView/index.vue create mode 100644 src/views/example/fun/wangEditor/index.vue create mode 100644 src/views/example/home/index.vue create mode 100644 src/views/example/limits/backEnd/page/index.vue create mode 100644 src/views/example/limits/frontEnd/btn/index.vue create mode 100644 src/views/example/limits/frontEnd/page/index.vue create mode 100644 src/views/example/login/component/account.vue create mode 100644 src/views/example/login/component/mobile.vue create mode 100644 src/views/example/login/component/scan.vue create mode 100644 src/views/example/login/index.vue create mode 100644 src/views/example/make/noticeBar/index.vue create mode 100644 src/views/example/make/selector/index.vue create mode 100644 src/views/example/make/svgDemo/index.vue create mode 100644 src/views/example/make/tableDemo/index.vue create mode 100644 src/views/example/make/tableDemo/search.vue create mode 100644 src/views/example/menu/menu1/menu11/index.vue create mode 100644 src/views/example/menu/menu1/menu12/menu121/index.vue create mode 100644 src/views/example/menu/menu1/menu12/menu122/index.vue create mode 100644 src/views/example/menu/menu1/menu13/index.vue create mode 100644 src/views/example/menu/menu2/index.vue create mode 100644 src/views/example/pages/awesome/index.vue create mode 100644 src/views/example/pages/drag/index.vue create mode 100644 src/views/example/pages/dynamicForm/index.vue create mode 100644 src/views/example/pages/dynamicForm/mock.ts create mode 100644 src/views/example/pages/element/index.vue create mode 100644 src/views/example/pages/filtering/details.vue create mode 100644 src/views/example/pages/filtering/details1.vue create mode 100644 src/views/example/pages/filtering/index.vue create mode 100644 src/views/example/pages/filtering/mock.ts create mode 100644 src/views/example/pages/formAdapt/index.vue create mode 100644 src/views/example/pages/formI18n/index.vue create mode 100644 src/views/example/pages/formRules/component/formRulesOne.vue create mode 100644 src/views/example/pages/formRules/component/formRulesThree.vue create mode 100644 src/views/example/pages/formRules/component/formRulesTwo.vue create mode 100644 src/views/example/pages/formRules/index.vue create mode 100644 src/views/example/pages/iocnfont/index.vue create mode 100644 src/views/example/pages/lazyImg/index.vue create mode 100644 src/views/example/pages/lazyImg/mock.ts create mode 100644 src/views/example/pages/listAdapt/index.vue create mode 100644 src/views/example/pages/listAdapt/mock.ts create mode 100644 src/views/example/pages/preview/index.vue create mode 100644 src/views/example/pages/steps/index.vue create mode 100644 src/views/example/pages/tableRules/index.vue create mode 100644 src/views/example/pages/tree/index.vue create mode 100644 src/views/example/pages/waterfall/index.vue create mode 100644 src/views/example/pages/waves/index.vue create mode 100644 src/views/example/pages/workflow/component/contextmenu/index.vue create mode 100644 src/views/example/pages/workflow/component/drawer/index.vue create mode 100644 src/views/example/pages/workflow/component/drawer/line.vue create mode 100644 src/views/example/pages/workflow/component/drawer/node.vue create mode 100644 src/views/example/pages/workflow/component/tool/help.vue create mode 100644 src/views/example/pages/workflow/component/tool/index.vue create mode 100644 src/views/example/pages/workflow/index.vue create mode 100644 src/views/example/pages/workflow/js/config.ts create mode 100644 src/views/example/pages/workflow/js/mock.ts create mode 100644 src/views/example/params/common/details.vue create mode 100644 src/views/example/params/common/index.vue create mode 100644 src/views/example/params/dynamic/details.vue create mode 100644 src/views/example/params/dynamic/index.vue create mode 100644 src/views/example/personal/index.vue create mode 100644 src/views/example/personal/mock.ts create mode 100644 src/views/example/system/dept/component/addDept.vue create mode 100644 src/views/example/system/dept/component/editDept.vue create mode 100644 src/views/example/system/dept/dialog.vue create mode 100644 src/views/example/system/dept/index.vue create mode 100644 src/views/example/system/dic/component/addDic.vue create mode 100644 src/views/example/system/dic/component/editDic.vue create mode 100644 src/views/example/system/dic/dialog.vue create mode 100644 src/views/example/system/dic/index.vue create mode 100644 src/views/example/system/menu/component/addMenu.vue create mode 100644 src/views/example/system/menu/component/editMenu.vue create mode 100644 src/views/example/system/menu/dialog.vue create mode 100644 src/views/example/system/menu/index.vue create mode 100644 src/views/example/system/role/component/addRole.vue create mode 100644 src/views/example/system/role/component/editRole.vue create mode 100644 src/views/example/system/role/dialog.vue create mode 100644 src/views/example/system/role/index.vue create mode 100644 src/views/example/system/user/component/addUser.vue create mode 100644 src/views/example/system/user/component/editUser.vue create mode 100644 src/views/example/system/user/dialog.vue create mode 100644 src/views/example/system/user/index.vue create mode 100644 src/views/example/tools/index.vue create mode 100644 src/views/example/visualizing/demo1.vue create mode 100644 src/views/example/visualizing/demo2.vue create mode 100644 src/views/example/visualizing/mock/demo1.ts create mode 100644 src/views/example/visualizing/mock/demo2.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..77503d5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +# https://editorconfig.org +root = true + +# 匹配全部文件 +[*] +# 设置字符集 +charset = utf-8 +# 缩进风格,可选space、tab +indent_style = space +# 缩进的空格数 +indent_size = 2 +# 结尾换行符,可选lf、cr、crlf +end_of_line = lf +# 在文件结尾插入新行 +insert_final_newline = true +# 删除一行中的前后空格 +trim_trailing_whitespace = true + +# 匹配md结尾的文件 +[*.md] +indent_style = tab +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.env b/.env new file mode 100644 index 0000000..685b051 --- /dev/null +++ b/.env @@ -0,0 +1,8 @@ +# port 端口号 +VITE_PORT = 9010 + +# open 运行 npm run dev 时自动打开浏览器 +VITE_OPEN = true + +# public path 配置线上环境路径(打包)、本地通过 http-server 访问时,请置空即可 +VITE_PUBLIC_PATH = '' \ No newline at end of file diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..6de13e9 --- /dev/null +++ b/.env.development @@ -0,0 +1,5 @@ +# 本地环境 +ENV = 'development' + +# 本地环境接口地址 +VITE_API_URL = 'http://localhost:18010' \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..83a7148 --- /dev/null +++ b/.env.production @@ -0,0 +1,11 @@ +# 线上环境 +ENV = 'production' + +# 开启压缩 +VITE_COMPRESSION = true + +# public path 配置线上环境路径(打包) +VITE_PUBLIC_PATH = '/' + +# 线上环境接口地址,确保替换 http://localhost:16010 为你的实际线上接口地址 +VITE_API_URL = 'http://localhost:16010' \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a391981 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,19 @@ + +*.sh +node_modules +lib +*.md +*.scss +*.woff +*.ttf +.vscode +.idea +dist +mock +public +bin +build +config +index.html +src/assets +gen \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..510241c --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,78 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + }, + parser: 'vue-eslint-parser', + parserOptions: { + ecmaVersion: 12, + parser: '@typescript-eslint/parser', + sourceType: 'module', + }, + extends: ['plugin:vue/vue3-essential', 'plugin:vue/essential', 'eslint:recommended'], + plugins: ['vue', '@typescript-eslint'], + overrides: [ + { + files: ['*.ts', '*.tsx', '*.vue'], + rules: { + 'no-undef': 'off', + }, + }, + ], + rules: { + // http://eslint.cn/docs/rules/ + // https://eslint.vuejs.org/rules/ + // https://typescript-eslint.io/rules/no-unused-vars/ + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-redeclare': 'error', + '@typescript-eslint/no-non-null-asserted-optional-chain': 'off', + '@typescript-eslint/no-unused-vars': [2], + 'vue/custom-event-name-casing': 'off', + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/html-self-closing': 'off', + 'vue/no-multiple-template-root': 'off', + 'vue/require-default-prop': 'off', + 'vue/no-v-model-argument': 'off', + 'vue/no-arrow-functions-in-watch': 'off', + 'vue/no-template-key': 'off', + 'vue/no-v-html': 'off', + 'vue/comment-directive': 'off', + 'vue/no-parsing-error': 'off', + 'vue/no-deprecated-v-on-native-modifier': 'off', + 'vue/multi-word-component-names': 'off', + 'no-useless-escape': 'off', + 'no-sparse-arrays': 'off', + 'no-prototype-builtins': 'off', + 'no-constant-condition': 'off', + 'no-use-before-define': 'off', + 'no-restricted-globals': 'off', + 'no-restricted-syntax': 'off', + 'generator-star-spacing': 'off', + 'no-unreachable': 'off', + 'no-multiple-template-root': 'off', + 'no-unused-vars': 'error', + 'no-v-model-argument': 'off', + 'no-case-declarations': 'off', + 'no-console': 'error', + 'no-redeclare': 'off', + //修复prettier格式化语句在语句前生成分号后,eslintrc检测报错误的问题 + 'no-extra-semi': 'off', + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c651f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +pnpm-lock.yaml +package-lock.json \ No newline at end of file diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 0000000..ed8309c --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,39 @@ +module.exports = { + // 一行最多多少个字符 + printWidth: 150, + // 指定每个缩进级别的空格数 + tabWidth: 2, + // 使用制表符而不是空格缩进行 + useTabs: false, + // 在语句末尾打印分号 + semi: false, + // 使用单引号而不是双引号 + singleQuote: true, + // 更改引用对象属性的时间 可选值"" + quoteProps: 'as-needed', + // 在JSX中使用单引号而不是双引号 + jsxSingleQuote: false, + // 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"",默认none + trailingComma: 'es5', + // 在对象文字中的括号之间打印空格 + bracketSpacing: true, + // jsx 标签的反尖括号需要换行 + jsxBracketSameLine: false, + // 在单独的箭头函数参数周围包括括号 always:(x) => x \ avoid:x => x + arrowParens: 'always', + // 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码 + rangeStart: 0, + rangeEnd: Infinity, + // 指定要使用的解析器,不需要写文件开头的 @prettier + requirePragma: false, + // 不需要自动在文件开头插入 @prettier + insertPragma: false, + // 使用默认的折行标准 always\never\preserve + proseWrap: 'preserve', + // 指定HTML文件的全局空格敏感度 css\strict\ignore + htmlWhitespaceSensitivity: 'css', + // Vue文件脚本和样式标签缩进 + vueIndentScriptAndStyle: false, + // 换行符使用 lf 结尾是 可选值"" + endOfLine: 'lf', +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4e3c578 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 zhontai + +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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e62c3b1 --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +
+

NPP

+

前后端分离后台权限管理系统

+

+ + vue + + + element plus + + + vite + + + license + +

+

 

+
+ +#### 🌈 介绍 + +基于 vue3.x + CompositionAPI setup 语法糖 + typescript + vite + element plus + vue-router-next + pinia 技术,内置支持一键生成微服务接口,适配手机、平板、pc 的后台权限管理框架,希望减少工作量,帮助大家实现快速开发。 + +#### ⛱️ 线上预览 + +- vue3.x 版本预览(admin.ui.plus)https://admin.zhontai.net + +#### 💒 代码仓库 + +- vue3.x 版本 zhontai.ui.admin.vue3 + +#### 🚧 安装 pnpm + +- 复制代码(桌面 cmd 运行) `npm install -g pnpm --registry=https://registry.npmmirror.com` + +#### 🏭 环境支持 + +| Edge | Firefox | Chrome | Safari | +| --------- | ------------ | ----------- | ----------- | +| Edge ≥ 88 | Firefox ≥ 78 | Chrome ≥ 87 | Safari ≥ 13 | + +> 由于 Vue3 不再支持 IE11,故而 ElementPlus 也不支持 IE11 及之前版本。 + +#### ⚡ 使用说明 + +建议使用 pnpm,因为 yarn 有时会报错。node 版本 > 14.18+/16+ + +> Vite 不再支持 Node 12 / 13 / 15,因为上述版本已经进入了 EOL 阶段。现在你必须使用 Node 14.18+ / 16+ 版本。 + +```bash +# 克隆项目 +git clone https://github.com/zhontai/Admin.Core.git + +# 进入项目 +cd ui\zhontai.ui.admin.vue3 + +# 安装依赖 +pnpm install + +# 运行项目 +pnpm run dev + +# 打包发布 +pnpm run build +``` + +#### 📚 开发文档 + +- 查看开发文档:https://zhontai.net + +#### 💯 学习交流加 QQ 群 + +> 中台 admin 开发群(2000 人群)。 + +- QQ 群号:1058693879 + + + NPP 开发群 + + +#### 💕 特别感谢 + +- vue-next-admin + +#### ❤️ 鸣谢列表 + +- vue +- vue-next +- element-ui +- element-plus +- vue-router-next +- pinia +- echarts +- axios +- clipboard +- countUp +- mitt +- nprogress +- screenfull +- sortablejs +- sass +- typescript +- vite +- wangeditor +- cropperjs +- qrcodejs +- print-js +- vue-grid-layout +- splitpanes +- jsplumb +- js-table2excel + +#### 💌 支持作者 + +如果觉得框架不错,或者已经在使用了,希望你可以去 Github 或者 +Gitee 帮我点个 ⭐ Star,这将是对我极大的鼓励与支持。 diff --git a/bin/build.bat b/bin/build.bat new file mode 100644 index 0000000..36d353c --- /dev/null +++ b/bin/build.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo 发布网站,生成dist文件 +echo. + +%~d0 +cd %~dp0 + +cd .. +pnpm run build + +pause \ No newline at end of file diff --git a/bin/install.bat b/bin/install.bat new file mode 100644 index 0000000..95bd4c3 --- /dev/null +++ b/bin/install.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo 安装包,生成node_modules文件 +echo. + +%~d0 +cd %~dp0 + +cd .. +pnpm install --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..49199f0 --- /dev/null +++ b/bin/run-web.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo 运行网站 +echo. + +%~d0 +cd %~dp0 + +cd .. +pnpm run dev + +pause \ No newline at end of file diff --git a/gen/gen-api.js b/gen/gen-api.js new file mode 100644 index 0000000..17b78cd --- /dev/null +++ b/gen/gen-api.js @@ -0,0 +1,56 @@ +import axios from 'axios' +import ejs from 'ejs' +import fs from 'node:fs' +import path from 'node:path' +import { generateApi } from 'swagger-typescript-api' + +const projectPath = process.cwd() +const apiUrl = 'http://localhost:16010' + +const apis = [ + { + output: path.resolve(projectPath, './src/api/admin'), + url: `${apiUrl}/doc/admin/swagger/admin/swagger.json`, + enumUrl: `${apiUrl}/api/admin/get-enums`, + }, + // { + // output: path.resolve(projectPath, './src/api/app'), + // url: `${apiUrl}/doc/app/swagger/app/swagger.json`, + // // enumUrl: `${apiUrl}/api/app/get-enums`, + // }, +] + +const genEnums = async (api) => { + console.log(`✨ try to get enums by URL "${api.enumUrl}"`) + console.log(`⭐ start generating your typescript api`) + const res = await axios.get(api.enumUrl).catch((error) => { + console.error(error) + }) + + if (res?.data?.data?.length > 0) { + ejs.renderFile(path.resolve(projectPath, './gen/templates/enum-contracts.ejs'), res.data, {}, function (err, content) { + fs.writeFile(path.resolve(api.output + '/enum-contracts.ts'), content, (err) => {}) + console.log(`✅ api file "enum-contracts.ts" created in ${api.output}\n`) + }) + } +} + +apis?.forEach(async (api) => { + if (api.enumUrl) { + await genEnums(api) + } + + await generateApi({ + output: api.output, + templates: path.resolve(projectPath, './gen/templates'), + url: api.url, + httpClientType: 'axios', + modular: true, + cleanOutput: false, + moduleNameIndex: 2, // 0 api, 1 api htt-client data-contracts, 2 apis htt-client data-contracts + moduleNameFirstTag: true, //apis htt-client data-contracts + unwrapResponseData: true, + generateUnionEnums: true, + defaultResponseType: 'AxiosResponse', + }).catch((error) => console.error(error)) +}) diff --git a/gen/gen-templates.js b/gen/gen-templates.js new file mode 100644 index 0000000..fb01e21 --- /dev/null +++ b/gen/gen-templates.js @@ -0,0 +1,12 @@ +import path from 'node:path' +import { generateTemplates } from 'swagger-typescript-api' + +//导出swagger-typescript-api内置模板 +generateTemplates({ + cleanOutput: false, + output: path.resolve(process.cwd(), './gen/templates'), + httpClientType: 'axios', + modular: true, + silent: false, + rewrite: false, +}) diff --git a/gen/templates/api.ejs b/gen/templates/api.ejs new file mode 100644 index 0000000..357b3c2 --- /dev/null +++ b/gen/templates/api.ejs @@ -0,0 +1,28 @@ +<% +const { utils, route, config, modelTypes } = it; +const { _, pascalCase, require } = utils; +const apiClassName = pascalCase(route.moduleName); +const routes = route.routes; +const dataContracts = _.map(modelTypes, "name"); +%> + +<% if (config.httpClientType === config.constants.HTTP_CLIENT.AXIOS) { %> import { AxiosRequestConfig, AxiosResponse } from "axios"; <% } %> + +import { HttpClient, RequestParams, ContentType, HttpResponse } from "./<%~ config.fileNames.httpClient %>"; +<% if (dataContracts.length) { %> +import { <%~ dataContracts.join(", ") %> } from "./<%~ config.fileNames.dataContracts %>" +<% } %> + +export class <%= apiClassName %>Api<% if (!config.singleHttpClient) { %> extends HttpClient <% } %> { +<% if(config.singleHttpClient) { %> + http: HttpClient; + + constructor (http: HttpClient) { + this.http = http; + } +<% } %> + + <% routes.forEach((route) => { %> + <%~ includeFile('./procedure-call.ejs', { ...it, route }) %> + <% }) %> +} diff --git a/gen/templates/data-contract-jsdoc.ejs b/gen/templates/data-contract-jsdoc.ejs new file mode 100644 index 0000000..cd3c3de --- /dev/null +++ b/gen/templates/data-contract-jsdoc.ejs @@ -0,0 +1,37 @@ +<% +const { data, utils } = it; +const { formatDescription, require, _ } = utils; + +const stringify = (value) => _.isObject(value) ? JSON.stringify(value) : _.isString(value) ? `"${value}"` : value + +const jsDocLines = _.compact([ + data.title, + data.description && formatDescription(data.description), + !_.isUndefined(data.deprecated) && data.deprecated && '@deprecated', + !_.isUndefined(data.format) && `@format ${data.format}`, + !_.isUndefined(data.minimum) && `@min ${data.minimum}`, + !_.isUndefined(data.multipleOf) && `@multipleOf ${data.multipleOf}`, + !_.isUndefined(data.exclusiveMinimum) && `@exclusiveMin ${data.exclusiveMinimum}`, + !_.isUndefined(data.maximum) && `@max ${data.maximum}`, + !_.isUndefined(data.minLength) && `@minLength ${data.minLength}`, + !_.isUndefined(data.maxLength) && `@maxLength ${data.maxLength}`, + !_.isUndefined(data.exclusiveMaximum) && `@exclusiveMax ${data.exclusiveMaximum}`, + !_.isUndefined(data.maxItems) && `@maxItems ${data.maxItems}`, + !_.isUndefined(data.minItems) && `@minItems ${data.minItems}`, + !_.isUndefined(data.uniqueItems) && `@uniqueItems ${data.uniqueItems}`, + !_.isUndefined(data.default) && `@default ${stringify(data.default)}`, + !_.isUndefined(data.pattern) && `@pattern ${data.pattern}`, + !_.isUndefined(data.example) && `@example ${stringify(data.example)}` +]).join('\n').split('\n'); +%> +<% if (jsDocLines.every(_.isEmpty)) { %> +<% } else if (jsDocLines.length === 1) { %> +/** <%~ jsDocLines[0] %> */ +<% } else if (jsDocLines.length) { %> +/** +<% for (jsDocLine of jsDocLines) { %> + * <%~ jsDocLine %> + +<% } %> + */ +<% } %> diff --git a/gen/templates/data-contracts.ejs b/gen/templates/data-contracts.ejs new file mode 100644 index 0000000..bb54793 --- /dev/null +++ b/gen/templates/data-contracts.ejs @@ -0,0 +1,28 @@ +<% +const { modelTypes, utils, config } = it; +const { formatDescription, require, _, Ts } = utils; + + +const dataContractTemplates = { + enum: (contract) => { + return `enum ${contract.name} {\r\n${contract.content} \r\n }`; + }, + interface: (contract) => { + return `interface ${contract.name} {\r\n${contract.content}}`; + }, + type: (contract) => { + return `type ${contract.name} = ${contract.content}`; + }, +} +%> + +<% if (config.internalTemplateOptions.addUtilRequiredKeysType) { %> +type <%~ config.Ts.CodeGenKeyword.UtilRequiredKeys %> = Omit & Required> +<% } %> + +<% modelTypes.forEach((contract) => { %> + <%~ includeFile('./data-contract-jsdoc.ejs', { ...it, data: { ...contract, ...contract.typeData } }) %> + export <%~ (dataContractTemplates[contract.typeIdentifier] || dataContractTemplates.type)(contract) %> + + +<% }) %> diff --git a/gen/templates/enum-contracts.ejs b/gen/templates/enum-contracts.ejs new file mode 100644 index 0000000..ad243e9 --- /dev/null +++ b/gen/templates/enum-contracts.ejs @@ -0,0 +1,6 @@ +<% data.forEach((enumType) => { %>/** <%= enumType.desc %> */ +export const <%= enumType.name %> = {<% enumType.options.forEach((option) => { %> + <%= option.name %>: { name: '<%= option.name %>', value: <%= option.value %>, desc: '<%= option.desc %>' },<% }) %> +} + +<% }) %> \ No newline at end of file diff --git a/gen/templates/enum-data-contract.ejs b/gen/templates/enum-data-contract.ejs new file mode 100644 index 0000000..5610746 --- /dev/null +++ b/gen/templates/enum-data-contract.ejs @@ -0,0 +1,12 @@ +<% +const { contract, utils, config } = it; +const { formatDescription, require, _ } = utils; +const { name, $content } = contract; +%> +<% if (config.generateUnionEnums) { %> + export type <%~ name %> = <%~ _.map($content, ({ value }) => value).join(" | ") %> +<% } else { %> + export enum <%~ name %> { + <%~ _.map($content, ({ key, value }) => `${key} = ${value}`).join(",\n") %> + } +<% } %> diff --git a/gen/templates/http-client.ejs b/gen/templates/http-client.ejs new file mode 100644 index 0000000..4f4609a --- /dev/null +++ b/gen/templates/http-client.ejs @@ -0,0 +1,465 @@ +<% +const { apiConfig, generateResponses, config } = it; +%> + +import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, HeadersDefaults, ResponseType, RawAxiosRequestHeaders } from 'axios' +import { ElLoading, ElMessage, LoadingOptions } from 'element-plus' +import { useUserInfo } from '/@/stores/userInfo' + +export type QueryParamsType = Record; + +export interface FullRequestParams extends Omit { + /** set parameter to `true` for call `securityWorker` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseType; + /** request body */ + body?: unknown; + /** 显示错误消息 */ + showErrorMessage?: boolean + /** 显示成功消息 */ + showSuccessMessage?: boolean + /** 登录访问 */ + login?: boolean + /** 加载中 */ + loading?: boolean + /** 加载中选项 */ + loadingOptions?: LoadingOptions + /** 取消重复请求 */ + cancelRepeatRequest?: boolean + /** 返回整个响应对象 */ + returnResponse?: boolean +} + +export type RequestParams = Omit; + +export interface ApiConfig extends Omit { + securityWorker?: (securityData: SecurityDataType | null) => Promise | AxiosRequestConfig | void; + secure?: boolean; + format?: ResponseType; +} + +export enum ContentType { + Json = "application/json", + FormData = "multipart/form-data", + UrlEncoded = "application/x-www-form-urlencoded", + Text = "text/plain", +} + +export interface LoadingInstance { + target: any + count: number +} + +const pendingMap = new Map() + +const loadingInstance: LoadingInstance = { + target: null, + count: 0, +} + +export class HttpClient { + public instance: AxiosInstance; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig["securityWorker"]; + private secure?: boolean; + private format?: ResponseType; + + constructor({ securityWorker, secure, format, ...axiosConfig }: ApiConfig = {}) { + this.instance = axios.create({ ...axiosConfig, timeout: 60000, baseURL: axiosConfig.baseURL || import.meta.env.VITE_API_URL }) + this.secure = secure; + this.format = format; + this.securityWorker = securityWorker; + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data + } + + protected mergeRequestParams(params1: AxiosRequestConfig, params2?: AxiosRequestConfig): AxiosRequestConfig { + const method = params1.method || (params2 && params2.method) + + return { + ...this.instance.defaults, + ...params1, + ...(params2 || {}), + headers: { + ...((method && this.instance.defaults.headers[method.toLowerCase() as keyof HeadersDefaults]) || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + } as RawAxiosRequestHeaders, + }; + } + + protected stringifyFormItem(formItem: unknown) { + if (typeof formItem === "object" && formItem !== null) { + return JSON.stringify(formItem); + } else { + return `${formItem}`; + } + } + + protected createFormData(input: Record): FormData { + return Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + const propertyContent: any[] = (property instanceof Array) ? property : [property] + + for (const formItem of propertyContent) { + const isFileType = formItem instanceof Blob || formItem instanceof File; + formData.append( + key, + isFileType ? formItem : this.stringifyFormItem(formItem) + ); + } + + return formData; + }, new FormData()); + } + + /** + * 错误处理 + * @param {*} error + */ + protected errorHandle(error: any) { + if (!error) { + return + } + if (axios.isCancel(error)) return console.error('请求重复已被自动取消:' + error.message) + let message = '' + if (error.response) { + switch (error.response.status) { + case 302: + message = '接口重定向' + break + case 400: + message = '参数不正确' + break + case 401: + message = '您还没有登录' + break + case 403: + message = '您没有权限操作' + break + case 404: + message = '请求地址出错:' + error.response.config.url + break + case 408: + message = '请求超时' + break + case 409: + message = '系统已存在相同数据' + break + case 429: + message = '访问过于频繁' + break + case 500: + message = '服务器内部错误' + break + case 501: + message = '服务未实现' + break + case 502: + message = '网关错误' + break + case 503: + message = '服务不可用' + break + case 504: + message = '服务暂时无法访问,请稍后再试' + break + case 505: + message = 'HTTP版本不受支持' + break + default: + message = '异常问题,请联系网站管理员' + break + } + } + if (error.message.includes('timeout')) message = '请求超时' + if (error.message.includes('Network')) message = window.navigator.onLine ? '服务端异常' : '您已断网' + + if (message) { + ElMessage.error({ message, grouping: true }) + } + } + + /** + * 刷新token接口 + * @param string refreshToken + */ + protected async refreshApi(refreshToken: string) { + return this.request({ + path: `/api/admin/auth/refresh`, + method: 'GET', + secure: true, + format: 'json', + login: false, + query: { + token: refreshToken, + }, + }) + } + + /** + * 刷新token + * @param {*} config + */ + protected async refreshToken(config: any) { + const storesUseUserInfo = useUserInfo() + const token = storesUseUserInfo.getToken() + if (!token) { + storesUseUserInfo.clear() + return Promise.reject(config) + } + + if (window.tokenRefreshing) { + window.requests = window.requests ? window.requests : [] + return new Promise((resolve) => { + window.requests.push(() => { + resolve(this.instance(config)) + }) + }) + } + + window.tokenRefreshing = true + + return this.refreshApi(token) + .then((res) => { + if (res?.success) { + storesUseUserInfo.setTokenInfo(res.data) + if (window.requests?.length > 0) { + window.requests.forEach((apiRequest) => apiRequest()) + window.requests = [] + } + return this.instance(config) + } else { + storesUseUserInfo.clear() + return Promise.reject(res) + } + }) + .catch((error) => { + storesUseUserInfo.clear() + return Promise.reject(error) + }) + .finally(() => { + window.tokenRefreshing = false + }) + } + + /** + * 储存每个请求的唯一cancel回调, 以此为标识 + */ + protected addPending(config: AxiosRequestConfig) { + const pendingKey = this.getPendingKey(config) + config.cancelToken = + config.cancelToken || + new axios.CancelToken((cancel) => { + if (!pendingMap.has(pendingKey)) { + pendingMap.set(pendingKey, cancel) + } + }) + } + + /** + * 删除重复的请求 + */ + protected removePending(config: AxiosRequestConfig) { + const pendingKey = this.getPendingKey(config) + if (pendingMap.has(pendingKey)) { + const cancelToken = pendingMap.get(pendingKey) + cancelToken(pendingKey) + pendingMap.delete(pendingKey) + } + } + + /** + * 生成每个请求的唯一key + */ + protected getPendingKey(config: AxiosRequestConfig) { + let { data, headers } = config + headers = headers as RawAxiosRequestHeaders + const { url, method, params } = config + if (typeof data === 'string') data = JSON.parse(data) + return [url, method, headers && headers.Authorization ? headers.Authorization : '', JSON.stringify(params), JSON.stringify(data)].join('&') + } + + /** + * 关闭Loading层实例 + */ + protected closeLoading(loading: boolean = false) { + if (loading && loadingInstance.count > 0) loadingInstance.count-- + if (loadingInstance.count === 0) { + loadingInstance.target.close() + loadingInstance.target = null + } + } + + public request = async ({ + secure, + path, + type, + query, + format, + body, + showErrorMessage = true, + showSuccessMessage = false, + login = true, + loading = false, + loadingOptions = { + background: 'rgba(0,0,0,0.5)', + }, + cancelRepeatRequest = false, + returnResponse = false, + ...params +<% if (config.unwrapResponseData) { %> + }: FullRequestParams): Promise => { +<% } else { %> + }: FullRequestParams): Promise> => { +<% } %> + const secureParams = ((typeof secure === 'boolean' ? secure : this.secure) && this.securityWorker && (await this.securityWorker(this.securityData))) || {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const responseFormat = (format || this.format) || undefined; + + if (type === ContentType.FormData && body && body !== null && typeof body === "object") { + body = this.createFormData(body as Record); + } + + if (type === ContentType.Text && body && body !== null && typeof body !== "string") { + body = JSON.stringify(body); + } + + // 请求拦截 + this.instance.interceptors.request.use( + async (config) => { + this.removePending(config) + cancelRepeatRequest && this.addPending(config) + + if (loading) { + loadingInstance.count++ + if (loadingInstance.count === 1) { + loadingInstance.target = ElLoading.service(loadingOptions) + } + } + + const storesUseUserInfo = useUserInfo() + const tokenInfo = storesUseUserInfo.getTokenInfo() + + if (tokenInfo && tokenInfo.accessToken) { + // 判断 accessToken 是否快失效 + const now = new Date().getTime() + const expiresAt = new Date(tokenInfo.accessTokenExpiresAt).getTime() + const maxThreshold = tokenInfo.accessTokenLifeTime * 0.5 + // 确保阈值不超过 5 分钟且不超过 accessTokenLifeTime 的一半 + const threshold = Math.min(5 * 60 * 1000, maxThreshold) + if (expiresAt - now < threshold) { + //加锁 + if (!window.tokenRefreshing) { + window.tokenRefreshing = true + try { + const res = await this.refreshApi(tokenInfo.accessToken) + if (res?.success) { + storesUseUserInfo.setTokenInfo(res.data) + //处理等待队列中的请求 + if (window.requests?.length > 0) { + window.requests.forEach((apiRequest) => apiRequest()) + window.requests = [] + } + } else { + storesUseUserInfo.clear() + return Promise.reject(res) + } + } catch (error) { + // 清空等待队列 + window.requests = [] + return Promise.reject(error) + } finally { + // 解锁 + window.tokenRefreshing = false + } + } else { + // 如果正在刷新,则将当前请求加入等待队列 + if (config.url !== '/api/admin/auth/refresh') { + window.requests = window.requests ? window.requests : [] + return new Promise((resolve) => { + window.requests.push(() => { + resolve(this.instance(config)) + }) + }) + } + } + } + } + + const accessToken = storesUseUserInfo.getToken() + config.headers!['Authorization'] = `Bearer ${accessToken}` + return config + }, + (error) => { + return Promise.reject(error) + } + ) + // 响应拦截 + this.instance.interceptors.response.use( + (res) => { + this.removePending(res.config) + loading && this.closeLoading(loading) + + if (res.config?.responseType == 'blob') { + return res + } + + const data = res.data + if (data.success) { + if (showSuccessMessage) { + ElMessage.success({ message: data.msg ? data.msg : '操作成功', grouping: true }) + } + } else { + if (showErrorMessage) { + ElMessage.error({ message: data.msg ? data.msg : '操作失败', grouping: true }) + } + // return Promise.reject(res) + } + + return res + }, + async (error) => { + error.config && this.removePending(error.config) + loading && this.closeLoading(loading) + + //刷新token + if (login && error?.response?.status === 401) { + return this.refreshToken(error.config) + } + + //错误处理 + if (showErrorMessage) { + this.errorHandle(error) + } + + return Promise.reject(error) + } + ) + + return this.instance.request({ + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData ? { "Content-Type": type } : {}), + } as RawAxiosRequestHeaders, + params: query, + responseType: responseFormat, + data: body, + url: path, +<% if (config.unwrapResponseData) { %> + }).then(response => returnResponse ? response : response.data); +<% } else { %> + }); +<% } %> + }; +} diff --git a/gen/templates/interface-data-contract.ejs b/gen/templates/interface-data-contract.ejs new file mode 100644 index 0000000..cd20803 --- /dev/null +++ b/gen/templates/interface-data-contract.ejs @@ -0,0 +1,10 @@ +<% +const { contract, utils } = it; +const { formatDescription, require, _ } = utils; +%> +export interface <%~ contract.name %> { + <% _.forEach(contract.$content, (field) => { %> + <%~ includeFile('./object-field-jsdoc.ejs', { ...it, field }) %> + <%~ field.name %><%~ field.isRequired ? '' : '?' %>: <%~ field.value %><%~ field.isNullable ? ' | null' : ''%>; + <% }) %> +} diff --git a/gen/templates/object-field-jsdoc.ejs b/gen/templates/object-field-jsdoc.ejs new file mode 100644 index 0000000..ec39314 --- /dev/null +++ b/gen/templates/object-field-jsdoc.ejs @@ -0,0 +1,28 @@ +<% +const { field, utils } = it; +const { formatDescription, require, _ } = utils; + +const comments = _.uniq( + _.compact([ + field.title, + field.description, + field.deprecated && ` * @deprecated`, + !_.isUndefined(field.format) && `@format ${field.format}`, + !_.isUndefined(field.minimum) && `@min ${field.minimum}`, + !_.isUndefined(field.maximum) && `@max ${field.maximum}`, + !_.isUndefined(field.pattern) && `@pattern ${field.pattern}`, + !_.isUndefined(field.example) && + `@example ${_.isObject(field.example) ? JSON.stringify(field.example) : field.example}`, + ]).reduce((acc, comment) => [...acc, ...comment.split(/\n/g)], []), +); +%> +<% if (comments.length === 1) { %> + /** <%~ comments[0] %> */ +<% } else if (comments.length) { %> + /** + <% comments.forEach(comment => { %> + * <%~ comment %> + + <% }) %> + */ +<% } %> diff --git a/gen/templates/procedure-call.ejs b/gen/templates/procedure-call.ejs new file mode 100644 index 0000000..1e05b85 --- /dev/null +++ b/gen/templates/procedure-call.ejs @@ -0,0 +1,100 @@ +<% +const { utils, route, config } = it; +const { requestBodyInfo, responseBodyInfo, specificArgNameResolver } = route; +const { _, getInlineParseContent, getParseContent, parseSchema, getComponentByRef, require } = utils; +const { parameters, path, method, payload, query, formData, security, requestParams } = route.request; +const { type, errorType, contentTypes } = route.response; +const { HTTP_CLIENT, RESERVED_REQ_PARAMS_ARG_NAMES } = config.constants; +const routeDocs = includeFile("./route-docs", { config, route, utils }); +const queryName = (query && query.name) || "query"; +const pathParams = _.values(parameters); +const pathParamsNames = _.map(pathParams, "name"); + +const isFetchTemplate = config.httpClientType === HTTP_CLIENT.FETCH; + +const requestConfigParam = { + name: specificArgNameResolver.resolve(RESERVED_REQ_PARAMS_ARG_NAMES), + optional: true, + type: "RequestParams", + defaultValue: "{}", +} + +const argToTmpl = ({ name, optional, type, defaultValue }) => `${name}${!defaultValue && optional ? '?' : ''}: ${type}${defaultValue ? ` = ${defaultValue}` : ''}`; + +const rawWrapperArgs = config.extractRequestParams ? + _.compact([ + requestParams && { + name: pathParams.length ? `{ ${_.join(pathParamsNames, ", ")}, ...${queryName} }` : queryName, + optional: false, + type: getInlineParseContent(requestParams), + }, + ...(!requestParams ? pathParams : []), + payload, + requestConfigParam, + ]) : + _.compact([ + ...pathParams, + query, + payload, + requestConfigParam, + ]) + +const wrapperArgs = _ + // Sort by optionality + .sortBy(rawWrapperArgs, [o => o.optional]) + .map(argToTmpl) + .join(', ') + +// RequestParams["type"] +const requestContentKind = { + "JSON": "ContentType.Json", + "URL_ENCODED": "ContentType.UrlEncoded", + "FORM_DATA": "ContentType.FormData", + "TEXT": "ContentType.Text", +} +// RequestParams["format"] +const responseContentKind = { + "JSON": '"json"', + "IMAGE": '"blob"', + "FORM_DATA": isFetchTemplate ? '"formData"' : '"document"' +} + +const bodyTmpl = _.get(payload, "name") || null; +const queryTmpl = (query != null && queryName) || null; +const bodyContentKindTmpl = requestContentKind[requestBodyInfo.contentKind] || null; +const responseFormatTmpl = responseContentKind[responseBodyInfo.success && responseBodyInfo.success.schema && responseBodyInfo.success.schema.contentKind] || null; +const securityTmpl = security ? 'true' : null; + +const describeReturnType = () => { + if (!config.toJS) return ""; + + switch(config.httpClientType) { + case HTTP_CLIENT.AXIOS: { + return `Promise>` + } + default: { + return `Promise` + } + } +} + +%> +/** +<%~ routeDocs.description %> + + *<% /* Here you can add some other JSDoc tags */ %> + +<%~ routeDocs.lines %> + + */ +<%~ route.routeName.usage %> = (<%~ wrapperArgs %>)<%~ config.toJS ? `: ${describeReturnType()}` : "" %> => + <%~ config.singleHttpClient ? 'this.http.request' : 'this.request' %><<%~ type %>, <%~ errorType %>>({ + path: `<%~ path %>`, + method: '<%~ _.upperCase(method) %>', + <%~ queryTmpl ? `query: ${queryTmpl},` : '' %> + <%~ bodyTmpl ? `body: ${bodyTmpl},` : '' %> + <%~ securityTmpl ? `secure: ${securityTmpl},` : '' %> + <%~ bodyContentKindTmpl ? `type: ${bodyContentKindTmpl},` : '' %> + <%~ responseFormatTmpl ? `format: ${responseFormatTmpl},` : '' %> + ...<%~ _.get(requestConfigParam, "name") %>, + }) diff --git a/gen/templates/route-docs.ejs b/gen/templates/route-docs.ejs new file mode 100644 index 0000000..3de625a --- /dev/null +++ b/gen/templates/route-docs.ejs @@ -0,0 +1,30 @@ +<% +const { config, route, utils } = it; +const { _, formatDescription, fmtToJSDocLine, pascalCase, require } = utils; +const { raw, request, routeName } = route; + +const jsDocDescription = raw.description ? + ` * @description ${formatDescription(raw.description, true)}` : + fmtToJSDocLine('No description', { eol: false }); +const jsDocLines = _.compact([ + _.size(raw.tags) && ` * @tags ${raw.tags.join(", ")}`, + ` * @name ${pascalCase(routeName.usage)}`, + raw.summary && ` * @summary ${raw.summary}`, + ` * @request ${_.upperCase(request.method)}:${raw.route}`, + raw.deprecated && ` * @deprecated`, + routeName.duplicate && ` * @originalName ${routeName.original}`, + routeName.duplicate && ` * @duplicate`, + request.security && ` * @secure`, + ...(config.generateResponses && raw.responsesTypes.length + ? raw.responsesTypes.map( + ({ type, status, description, isSuccess }) => + ` * @response \`${status}\` \`${_.replace(_.replace(type, /\/\*/g, "\\*"), /\*\//g, "*\\")}\` ${description}`, + ) + : []), +]).map(str => str.trimEnd()).join("\n"); + +return { + description: jsDocDescription, + lines: jsDocLines, +} +%> diff --git a/gen/templates/route-name.ejs b/gen/templates/route-name.ejs new file mode 100644 index 0000000..d343e9d --- /dev/null +++ b/gen/templates/route-name.ejs @@ -0,0 +1,27 @@ +<% +const { routeInfo, utils } = it; +const { + operationId, + method, + route, + moduleName, + responsesTypes, + description, + tags, + summary, + pathArgs, +} = routeInfo; +const { _, fmtToJSDocLine, require } = utils; + +const createCustomOperationId = (method, route, moduleName) => { + const hasPathInserts = /\{(\w){1,}\}/g.test(route); + const splitedRouteBySlash = _.compact(_.replace(route, /\{(\w){1,}\}/g, "").split("/")); + const routeParts = (splitedRouteBySlash.length > 1 + ? [splitedRouteBySlash[splitedRouteBySlash.length-1]] + : splitedRouteBySlash + ).join("_"); + return _.camelCase(_.lowerCase(routeParts)); +}; + +return createCustomOperationId(method, route, moduleName); +%> \ No newline at end of file diff --git a/gen/templates/route-type.ejs b/gen/templates/route-type.ejs new file mode 100644 index 0000000..e174397 --- /dev/null +++ b/gen/templates/route-type.ejs @@ -0,0 +1,22 @@ +<% +const { route, utils, config } = it; +const { _, pascalCase, require } = utils; +const { query, payload, pathParams, headers } = route.request; + +const routeDocs = includeFile("./route-docs", { config, route, utils }); +const routeNamespace = pascalCase(route.routeName.usage); + +%> +/** +<%~ routeDocs.description %> + +<%~ routeDocs.lines %> + +*/ +export namespace <%~ routeNamespace %> { + export type RequestParams = <%~ (pathParams && pathParams.type) || '{}' %>; + export type RequestQuery = <%~ (query && query.type) || '{}' %>; + export type RequestBody = <%~ (payload && payload.type) || 'never' %>; + export type RequestHeaders = <%~ (headers && headers.type) || '{}' %>; + export type ResponseBody = <%~ route.response.type %>; +} \ No newline at end of file diff --git a/gen/templates/route-types.ejs b/gen/templates/route-types.ejs new file mode 100644 index 0000000..70d07a4 --- /dev/null +++ b/gen/templates/route-types.ejs @@ -0,0 +1,18 @@ +<% +const { utils, config, route, modelTypes } = it; +const { _, pascalCase } = utils; +const { routes, moduleName } = route; +const dataContracts = config.modular ? _.map(modelTypes, "name") : []; + +%> +<% if (dataContracts.length) { %> +import { <%~ dataContracts.join(", ") %> } from "./<%~ config.fileNames.dataContracts %>" +<% } %> + +export namespace <%~ pascalCase(moduleName) %> { + <% _.forEach(routes, (route) => { %> + + <%~ includeFile('./route-type.ejs', { ...it, route }) %> + + <% }) %> +} diff --git a/gen/templates/type-data-contract.ejs b/gen/templates/type-data-contract.ejs new file mode 100644 index 0000000..af88e01 --- /dev/null +++ b/gen/templates/type-data-contract.ejs @@ -0,0 +1,15 @@ +<% +const { contract, utils } = it; +const { formatDescription, require, _ } = utils; + +%> +<% if (contract.$content.length) { %> +export type <%~ contract.name %> = { + <% _.forEach(contract.$content, (field) => { %> + <%~ includeFile('./object-field-jsdoc.ejs', { ...it, field }) %> + <%~ field.field %>; + <% }) %> +}<%~ utils.isNeedToAddNull(contract) ? ' | null' : ''%> +<% } else { %> +export type <%~ contract.name %> = Record; +<% } %> diff --git a/index.html b/index.html new file mode 100644 index 0000000..cd04312 --- /dev/null +++ b/index.html @@ -0,0 +1,27 @@ + + + + + + + + + + NPP + + + +
+ + + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..cbbfd90 --- /dev/null +++ b/package.json @@ -0,0 +1,98 @@ +{ + "name": "zhontai.ui.admin.vue3", + "version": "9.1.1", + "description": "vue3 vite admin plus", + "author": "", + "license": "MIT", + "type": "module", + "scripts": { + "dev": "vite --force", + "build": "vite build", + "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/", + "format": "npx prettier --write .", + "install:pkg": "pnpm install", + "gen:api": "node ./gen/gen-api" + }, + "dependencies": { + "@azure/msal-browser": "^4.12.0", + "@element-plus/icons-vue": "^2.3.1", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "axios": "^1.9.0", + "countup.js": "^2.8.2", + "cropperjs": "^2.0.0", + "dayjs": "^1.11.13", + "echarts": "^5.6.0", + "echarts-gl": "^2.0.9", + "echarts-wordcloud": "^2.1.0", + "element-plus": "2.9.11", + "js-cookie": "^3.0.5", + "js-table2excel": "^1.1.2", + "jsoneditor": "^10.2.0", + "jsplumb": "^2.15.6", + "lodash-es": "^4.17.21", + "mitt": "^3.0.1", + "nprogress": "^0.2.0", + "pinia": "^3.0.2", + "print-js": "^1.6.0", + "qrcodejs2-fixes": "^0.0.2", + "qs": "^6.14.0", + "screenfull": "^6.0.2", + "sm-crypto-v2": "^1.11.0", + "sortablejs": "^1.15.6", + "splitpanes": "^4.0.4", + "vue": "3.5.14", + "vue-clipboard3": "^2.0.0", + "vue-demi": "^0.14.10", + "vue-grid-layout": "^3.0.0-beta1", + "vue-i18n": "^11.1.3", + "vue-plugin-hiprint": "^0.0.60", + "vue-router": "^4.5.1", + "vue3-tree-org": "^4.2.2" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.15.21", + "@types/nprogress": "^0.2.3", + "@types/sortablejs": "^1.15.8", + "@typescript-eslint/eslint-plugin": "^8.32.1", + "@typescript-eslint/parser": "^8.32.1", + "@vitejs/plugin-vue": "^5.2.4", + "@vue/compiler-sfc": "^3.5.14", + "dotenv": "16.5.0", + "ejs": "^3.1.10", + "eslint": "^9.27.0", + "eslint-plugin-vue": "^10.1.0", + "prettier": "^3.5.3", + "sass": "^1.89.0", + "swagger-typescript-api": "13.0.28", + "typescript": "^5.8.3", + "vite": "^6.3.5", + "vite-plugin-compression": "0.5.1", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-vue-setup-extend": "^0.4.0", + "vue-eslint-parser": "^10.1.3" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ], + "bugs": { + "url": "https://github.com/zhontai/admin.ui.plus/issues" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">= 7.0.0" + }, + "keywords": [ + "vue3", + "element-plus", + "zhontai", + "admin" + ], + "repository": { + "type": "git", + "url": "https://github.com/zhontai/admin.ui.plus/git" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8e6593a767247e11df7746067607ded8afa5afd4 GIT binary patch literal 6065 zcmbVQ2Ut_twmzX(BMQ=#Ac%rU6;Npb1tTE61VM>P6A&1BU;+_vXi|o%(n1|6B7zj9 zMF~Z4G)gB(3rG+U5^9i?7o76$_wK#lci-J-ud~})Yybb==R4=@#T;YK00&Jkn_LD! zAOHZdE`Z4ZbS~K#8`@dgXiIy#DS7|o?kOFrrmQM09}?u{=P7Ms3X?XqGKNWqYN;!n zkq!vCb=NC6Tv|{1f+`<#0=NXQv$5@GR^nh~P99E94h~K}Zf-6f0X_i%em;JF!2^d5 z3LX$Tz|Vj1$U&jQ!XhFf0$@?GBf?^bghhn+oq*U`HXNM1oSeMEg8YKQ|L??n4G8f7 zuYuR>AQ^y72*fS~Vs-%#7D-Ofj|BXgKx{0GT--doeEckh#)AMGh@G8{gMA-0OFNP^ z4sZx@9y+dO$aUEI7Pm}*uzGZQF^}xUx;G*=pU5Z9-VTi6Rk0?3{;> z9_N;nmX-hZq@uE_{zXG$Q}fGLEuFZo?w;PaefwNa zJ(@@OVtR4i8(!J7He`|8fuHz}oY0t+qwG`r!R$XH7V}>*`>$?Wu?qoE zfNoQ&VQs*5rzH6!$XL8o1F(jDG1;|Z`((0f!>|LaO?ItWEhbQyg)Yp>vSMRE%ORw4 zIbi@xDu<+fH8BQMcE7@Qe^lnaTQeeTtPS`X5!O`3zV;_r1bCNtk52)LH+2FmH%4+Y zX`AIm>>H&UB}o8O8>%h;SA#W}wlVUMwpmKsEaG4SdUsgjg~pq*O!qDS%R!w1371U? zz*N4xh@*t%BZmdXOCBgma$@zB+ynn`oc1B@!+%@lyJU9d4p3fJUc{D@kp#%ICKEIII+V|S?1+vuW=tK~^e0WF$6 z(6m}%loh=-SS21>kGap#>@7B_nxH;dshhad7c3iaruadR8^KU*H;{dO9o`5;8XLPK z;f@#=@`udI8{-AqtLq;m6Q4d<(^_2=FI9>zC`->5m@5y5f4i}F(Hs2&hSQ?7V`5KI z3LpAt_g3`!B9-PFQeIw5wQg2kQTUqjdh-LISH)WD4qGaY32^e0;W*5FDR#=UXxDQo zDyX}Qx%#o5s;NYam>Zw922zdOZf4AbKBw;C(8p-*l_<|oDE?}c;&5=D;(HNI9js8< zf{&z5thh&mvJBscGT*niG70zeT9S6xw%^ffi1c(_$Sge+Az)4{ed>)E@AKgtYj*Qj z%GWa0idt1m-69gOG+}%f0-Q5wMNQk&MUK9alFXe|njcY?j4*P3B6x@msq4ovGp7OC z@!wrGM)s8N8Fsz8c=AdU9Gjx;>s|Xe%;SlAjy(IHI2(h1Y8= zCW}1c(gW$;VKY^H1NFiXs=(v8E{wotB~9n#OO(%3!Q*nNiOkj4qc9t%Q zn>EKIKHG_WXx|6yUNbn4_wdVJA_jZPi}@Y994-u!6OqIpb>sS}Y_qS&YbMr!-`HbW zySpRBRcR8plEM|)w<)#t8r?Y;g(f<@#M8E!z%snwgJzxOW-n`|`m|USxIL)fO7Wz?N_6GHVb?U&hsdeFv-+Ou5`*wZW(^mP``h%Vx2{$IHst3k| zw૴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 literal 0 HcmV?d00001 diff --git a/public/print-lock.css b/public/print-lock.css new file mode 100644 index 0000000..3128ca4 --- /dev/null +++ b/public/print-lock.css @@ -0,0 +1,356 @@ +@media print { + body { + margin: 0px; + padding: 0px; + } +} + +@page { + margin: 0; +} + +.hiprint-printPaper * { + box-sizing: border-box; + -moz-box-sizing: border-box; /* Firefox */ + -webkit-box-sizing: border-box; /* Safari */ +} + +.hiprint-printPaper *:focus { + outline: -webkit-focus-ring-color auto 0px; +} + +.hiprint-printPaper { + position: relative; + padding: 0 0 0 0; + page-break-after: always; + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -moz-user-select: none; /* Firefox */ + user-select: none; + overflow-x: hidden; + overflow: hidden; +} + +.hiprint-printPaper .hiprint-printPaper-content { + position: relative; +} + +/* 火狐浏览器打印 第一页过后 重叠问题 */ +@-moz-document url-prefix() { + .hiprint-printPaper .hiprint-printPaper-content { + position: relative; + margin-top: 20px; + top: -20px; + } +} + +.hiprint-printPaper.design { + overflow: visible; +} + +.hiprint-printTemplate .hiprint-printPanel { + page-break-after: always; +} + +.hiprint-printPaper, +hiprint-printPanel { + box-sizing: border-box; + border: 0px; +} + +.hiprint-printPanel .hiprint-printPaper:last-child { + page-break-after: avoid; +} + +.hiprint-printTemplate .hiprint-printPanel:last-child { + page-break-after: avoid; +} + +.hiprint-printPaper .hideheaderLinetarget { + border-top: 0px dashed rgb(201, 190, 190) !important; +} + +.hiprint-printPaper .hidefooterLinetarget { + border-top: 0px dashed rgb(201, 190, 190) !important; +} + +.hiprint-printPaper.design { + border: 1px dashed rgba(170, 170, 170, 0.7); +} + +.design .hiprint-printElement-table-content, +.design .hiprint-printElement-longText-content { + overflow: hidden; + box-sizing: border-box; +} + +.design .resize-panel { + box-sizing: border-box; + border: 1px dotted; +} + +.hiprint-printElement-text { + background-color: transparent; + background-repeat: repeat; + padding: 0 0 0 0; + border: 0.75pt none rgb(0, 0, 0); + direction: ltr; + font-family: 'SimSun'; + font-size: 9pt; + font-style: normal; + font-weight: normal; + padding-bottom: 0pt; + padding-left: 0pt; + padding-right: 0pt; + padding-top: 0pt; + text-align: left; + text-decoration: none; + line-height: 9.75pt; + box-sizing: border-box; + word-wrap: break-word; + word-break: break-all; +} + +.design .hiprint-printElement-text-content { + border: 1px dashed rgb(206, 188, 188); + box-sizing: border-box; +} + +.hiprint-printElement-longText { + background-color: transparent; + background-repeat: repeat; + border: 0.75pt none rgb(0, 0, 0); + direction: ltr; + font-family: 'SimSun'; + font-size: 9pt; + font-style: normal; + font-weight: normal; + padding-bottom: 0pt; + padding-left: 0pt; + padding-right: 0pt; + padding-top: 0pt; + text-align: left; + text-decoration: none; + line-height: 9.75pt; + box-sizing: border-box; + word-wrap: break-word; + word-break: break-all; + /*white-space: pre-wrap*/ +} + +.hiprint-printElement-table { + background-color: transparent; + background-repeat: repeat; + color: rgb(0, 0, 0); + border-color: rgb(0, 0, 0); + border-style: none; + direction: ltr; + font-family: 'SimSun'; + font-size: 9pt; + font-style: normal; + font-weight: normal; + padding-bottom: 0pt; + padding-left: 0pt; + padding-right: 0pt; + padding-top: 0pt; + text-align: left; + text-decoration: none; + padding: 0 0 0 0; + box-sizing: border-box; + line-height: 9.75pt; +} + +.hiprint-printElement-table thead { + background: #e8e8e8; + font-weight: 700; +} + +table.hiprint-printElement-tableTarget { + width: 100%; +} + +.hiprint-printElement-tableTarget, +.hiprint-printElement-tableTarget tr, +.hiprint-printElement-tableTarget td { + border-color: rgb(0, 0, 0); + /*border-style: none;*/ + /*border: 1px solid rgb(0, 0, 0);*/ + font-weight: normal; + direction: ltr; + padding-bottom: 0pt; + padding-left: 4pt; + padding-right: 4pt; + padding-top: 0pt; + text-decoration: none; + vertical-align: middle; + box-sizing: border-box; + word-wrap: break-word; + word-break: break-all; + /*line-height: 9.75pt; + font-size: 9pt;*/ +} + +.hiprint-printElement-tableTarget-border-all { + border: 1px solid; +} +.hiprint-printElement-tableTarget-border-none { + border: 0px solid; +} +.hiprint-printElement-tableTarget-border-lr { + border-left: 1px solid; + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-left { + border-left: 1px solid; +} +.hiprint-printElement-tableTarget-border-right { + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-tb { + border-top: 1px solid; + border-bottom: 1px solid; +} +.hiprint-printElement-tableTarget-border-top { + border-top: 1px solid; +} +.hiprint-printElement-tableTarget-border-bottom { + border-bottom: 1px solid; +} + +.hiprint-printElement-tableTarget-border-td-none td { + border: 0px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:not(:nth-last-child(-n + 2)) { + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:not(last-child) { + border-right: 1px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:last-child { + border-left: 1px solid; +} +.hiprint-printElement-tableTarget-border-td-all td:last-child:first-child { + border-left: none; +} + +/*.hiprint-printElement-tableTarget tr,*/ +.hiprint-printElement-tableTarget td { + height: 18pt; +} + +.hiprint-printPaper .hiprint-paperNumber { + font-size: 9pt; +} + +.design .hiprint-printElement-table-handle { + position: absolute; + height: 21pt; + width: 21pt; + background: red; + z-index: 1; +} + +.hiprint-printPaper .hiprint-paperNumber-disabled { + float: right !important; + right: 0 !important; + color: gainsboro !important; +} + +.hiprint-printElement-vline, +.hiprint-printElement-hline { + border: 0px none rgb(0, 0, 0); +} + +.hiprint-printElement-vline { + border-left: 0.75pt solid #000; + border-right: 0px none rgb(0, 0, 0) !important; + border-bottom: 0px none rgb(0, 0, 0) !important; + border-top: 0px none rgb(0, 0, 0) !important; +} + +.hiprint-printElement-hline { + border-top: 0.75pt solid #000; + border-right: 0px none rgb(0, 0, 0) !important; + border-bottom: 0px none rgb(0, 0, 0) !important; + border-left: 0px none rgb(0, 0, 0) !important; +} + +.hiprint-printElement-oval, +.hiprint-printElement-rect { + border: 0.75pt solid #000; +} + +.hiprint-text-content-middle { +} + +.hiprint-text-content-middle > div { + display: grid; + align-items: center; +} + +.hiprint-text-content-bottom { +} + +.hiprint-text-content-bottom > div { + display: grid; + align-items: flex-end; +} + +.hiprint-text-content-wrap { +} + +.hiprint-text-content-wrap .hiprint-text-content-wrap-nowrap { + white-space: nowrap; +} + +.hiprint-text-content-wrap .hiprint-text-content-wrap-clip { + white-space: nowrap; + overflow: hidden; + text-overflow: clip; +} + +.hiprint-text-content-wrap .hiprint-text-content-wrap-ellipsis { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/*hi-grid-row */ +.hi-grid-row { + position: relative; + height: auto; + margin-right: 0; + margin-left: 0; + zoom: 1; + display: block; + box-sizing: border-box; +} + +.hi-grid-row::after, +.hi-grid-row::before { + display: table; + content: ''; + box-sizing: border-box; +} + +.hi-grid-col { + display: block; + box-sizing: border-box; + position: relative; + float: left; + flex: 0 0 auto; +} + +.table-grid-row { + margin-left: -0pt; + margin-right: -0pt; +} + +.tableGridColumnsGutterRow { + padding-left: 0pt; + padding-right: 0pt; +} + +.hiprint-gridColumnsFooter { + text-align: left; + clear: both; +} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..fe3646f --- /dev/null +++ b/src/App.vue @@ -0,0 +1,105 @@ + + + diff --git a/src/api/admin.extend/Api.ts b/src/api/admin.extend/Api.ts new file mode 100644 index 0000000..29eaa91 --- /dev/null +++ b/src/api/admin.extend/Api.ts @@ -0,0 +1,50 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { HttpClient, RequestParams } from '../admin/http-client' + +export class ApiApi extends HttpClient { + /** + * No description + * + * @tags api + * @name GetList + * @summary 获得swagger resources + * @request GET:/swagger-resources + * @secure + */ + getSwaggerResources = (path: string, params: RequestParams = {}) => + this.request({ + path: path, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags api + * @name GetList + * @summary 获得swagger json + * @request GET:/swagger-resources + * @secure + */ + getSwaggerJson = (path: string, params: RequestParams = {}) => + this.request({ + path: path, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin.extend/enum-contracts.ts b/src/api/admin.extend/enum-contracts.ts new file mode 100644 index 0000000..9ba76ae --- /dev/null +++ b/src/api/admin.extend/enum-contracts.ts @@ -0,0 +1,32 @@ +/** 组件类型 */ +export const ComponentType = { + Account: { name: 'account', value: 1, desc: '账号' }, + AAD: { name: 'aad', value: 2, desc: 'AAD' }, + Email: { name: 'email', value: 3, desc: '邮箱' }, +} + +/** 平台类型 */ +export const PlatformType = { + Web: { name: 'web', value: 1, desc: 'Web端' }, + App: { name: 'app', value: 2, desc: 'App端' }, + CS: { name: 'cs', value: 3, desc: 'CS端' }, +} + +/** 操作符 */ +export const Operator = { + equal: { label: '等于', value: 'Equal' }, + notEqual: { label: '不等于', value: 'NotEqual' }, + contains: { label: '包含', value: 'Contains' }, + notContains: { label: '不包含', value: 'NotContains' }, + startsWith: { label: '开始以', value: 'StartsWith' }, + notStartsWith: { label: '开始不是以', value: 'NotStartsWith' }, + endsWith: { label: '结束以', value: 'EndsWith' }, + notEndsWith: { label: '结束不是以', value: 'NotEndsWith' }, + lessThan: { label: '小于', value: 'LessThan' }, + lessThanOrEqual: { label: '小于等于', value: 'LessThanOrEqual' }, + greaterThan: { label: '大于', value: 'GreaterThan' }, + greaterThanOrEqual: { label: '大于等于', value: 'GreaterThanOrEqual' }, + dateRange: { label: '时间段', value: 'dateRange' }, + any: { label: '在列表', value: 'Any' }, + notAny: { label: '不在列表', value: 'NotAny' }, +} diff --git a/src/api/admin/Api.ts b/src/api/admin/Api.ts new file mode 100644 index 0000000..4aa9309 --- /dev/null +++ b/src/api/admin/Api.ts @@ -0,0 +1,312 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + ApiAddInput, + ApiSetEnableLogInput, + ApiSetEnableParamsInput, + ApiSetEnableResultInput, + ApiSyncInput, + ApiUpdateInput, + PageInputApiGetPageInput, + ResultOutputApiGetOutput, + ResultOutputInt64, + ResultOutputListApiGetListOutput, + ResultOutputListProjectConfig, + ResultOutputPageOutputApiEntity, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class ApiApi extends HttpClient { + /** + * No description + * + * @tags api + * @name Get + * @summary 查询 + * @request GET:/api/admin/api/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/api/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags api + * @name GetList + * @summary 查询列表 + * @request GET:/api/admin/api/get-list + * @secure + */ + getList = ( + query?: { + key?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/api/get-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags api + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/api/get-page + * @secure + */ + getPage = (data: PageInputApiGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/api/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags api + * @name Add + * @summary 添加 + * @request POST:/api/admin/api/add + * @secure + */ + add = (data: ApiAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/api/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags api + * @name Update + * @summary 修改 + * @request PUT:/api/admin/api/update + * @secure + */ + update = (data: ApiUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/api/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags api + * @name SetEnableLog + * @summary 设置启用接口日志 + * @request POST:/api/admin/api/set-enable-log + * @secure + */ + setEnableLog = (data: ApiSetEnableLogInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/api/set-enable-log`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags api + * @name SetEnableParams + * @summary 设置启用请求参数 + * @request POST:/api/admin/api/set-enable-params + * @secure + */ + setEnableParams = (data: ApiSetEnableParamsInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/api/set-enable-params`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags api + * @name SetEnableResult + * @summary 设置启用响应结果 + * @request POST:/api/admin/api/set-enable-result + * @secure + */ + setEnableResult = (data: ApiSetEnableResultInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/api/set-enable-result`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags api + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/api/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/api/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags api + * @name BatchDelete + * @summary 批量彻底删除 + * @request PUT:/api/admin/api/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/api/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags api + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/api/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/api/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags api + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/api/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/api/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags api + * @name Sync + * @summary 同步 + * @request POST:/api/admin/api/sync + * @secure + */ + sync = (data: ApiSyncInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/api/sync`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags api + * @name GetProjects + * @summary 获得项目列表 + * @request GET:/api/admin/api/get-projects + * @secure + */ + getProjects = ( + query?: { + /** @default "/swagger" */ + suffix?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/api/get-projects`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/Auth.ts b/src/api/admin/Auth.ts new file mode 100644 index 0000000..20489fc --- /dev/null +++ b/src/api/admin/Auth.ts @@ -0,0 +1,302 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + AuthChangePasswordByEmailInput, + AuthChangePasswordByMobileInput, + AuthEmailLoginInput, + AuthLoginInput, + AuthMobileLoginInput, + AuthRegByEmailInput, + AuthRegByMobileInput, + ResultOutputAuthGetPasswordEncryptKeyOutput, + ResultOutputAuthGetUserInfoOutput, + ResultOutputAuthGetUserPermissionsOutput, + ResultOutputAuthUserProfileOutput, + ResultOutputBoolean, + ResultOutputListAuthUserMenuOutput, + ResultOutputTokenInfo, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class AuthApi extends HttpClient { + /** + * No description + * + * @tags auth + * @name GetPasswordEncryptKey + * @summary 查询密钥 + * @request GET:/api/admin/auth/get-password-encrypt-key + * @secure + */ + getPasswordEncryptKey = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/get-password-encrypt-key`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags auth + * @name GetUserProfile + * @summary 查询用户个人信息 + * @request GET:/api/admin/auth/get-user-profile + * @secure + */ + getUserProfile = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/get-user-profile`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags auth + * @name GetUserMenus + * @summary 查询用户菜单列表 + * @request GET:/api/admin/auth/get-user-menus + * @secure + */ + getUserMenus = ( + query?: { + /** @default "web" */ + platform?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/auth/get-user-menus`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags auth + * @name GetUserPermissions + * @summary 查询用户权限列表 + * @request GET:/api/admin/auth/get-user-permissions + * @secure + */ + getUserPermissions = ( + query?: { + /** @default "web" */ + platform?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/auth/get-user-permissions`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags auth + * @name GetUserInfo + * @summary 查询用户信息 + * @request GET:/api/admin/auth/get-user-info + * @secure + */ + getUserInfo = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/get-user-info`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags auth + * @name Login + * @summary 登录 + * @request POST:/api/admin/auth/login + * @secure + */ + login = (data: AuthLoginInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/login`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags auth + * @name MobileLogin + * @summary 手机登录 + * @request POST:/api/admin/auth/mobile-login + * @secure + */ + mobileLogin = (data: AuthMobileLoginInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/mobile-login`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags auth + * @name EmailLogin + * @summary 邮箱登录 + * @request POST:/api/admin/auth/email-login + * @secure + */ + emailLogin = (data: AuthEmailLoginInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/email-login`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags auth + * @name ChangePasswordByEmail + * @summary 邮箱更改密码 + * @request POST:/api/admin/auth/change-password-by-email + * @secure + */ + changePasswordByEmail = (data: AuthChangePasswordByEmailInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/change-password-by-email`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags auth + * @name ChangePasswordByMobile + * @summary 手机更改密码 + * @request POST:/api/admin/auth/change-password-by-mobile + * @secure + */ + changePasswordByMobile = (data: AuthChangePasswordByMobileInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/change-password-by-mobile`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags auth + * @name RegByEmail + * @summary 邮箱注册 + * @request POST:/api/admin/auth/reg-by-email + * @secure + */ + regByEmail = (data: AuthRegByEmailInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/reg-by-email`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags auth + * @name RegByMobile + * @summary 手机号注册 + * @request POST:/api/admin/auth/reg-by-mobile + * @secure + */ + regByMobile = (data: AuthRegByMobileInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/reg-by-mobile`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags auth + * @name Refresh + * @summary 刷新Token +以旧换新 + * @request GET:/api/admin/auth/refresh + * @secure + */ + refresh = ( + query: { + token: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/auth/refresh`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags auth + * @name IsCaptcha + * @summary 是否开启验证码 + * @request GET:/api/admin/auth/is-captcha + * @secure + */ + isCaptcha = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/auth/is-captcha`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/Cache.ts b/src/api/admin/Cache.ts new file mode 100644 index 0000000..4bdb630 --- /dev/null +++ b/src/api/admin/Cache.ts @@ -0,0 +1,58 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { ResultOutputListObject } from './data-contracts' +import { HttpClient, RequestParams } from './http-client' + +export class CacheApi extends HttpClient { + /** + * No description + * + * @tags cache + * @name GetList + * @summary 查询列表 + * @request GET:/api/admin/cache/get-list + * @secure + */ + getList = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/cache/get-list`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags cache + * @name Clear + * @summary 清除缓存 + * @request DELETE:/api/admin/cache/clear + * @secure + */ + clear = ( + query?: { + /** 缓存键 */ + cacheKey?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/cache/clear`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) +} diff --git a/src/api/admin/Captcha.ts b/src/api/admin/Captcha.ts new file mode 100644 index 0000000..8d19273 --- /dev/null +++ b/src/api/admin/Captcha.ts @@ -0,0 +1,113 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { + ResultOutputCaptchaData, + ResultOutputString, + ResultOutputValidateResult, + SendEmailCodeInput, + SendSmsCodeInput, + SlideTrack, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class CaptchaApi extends HttpClient { + /** + * No description + * + * @tags captcha + * @name Generate + * @summary 生成 + * @request POST:/api/admin/captcha/generate + * @secure + */ + generate = ( + query?: { + /** 验证码id */ + captchaId?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/captcha/generate`, + method: 'POST', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags captcha + * @name Check + * @summary 验证 + * @request POST:/api/admin/captcha/check + * @secure + */ + check = ( + data: SlideTrack, + query?: { + /** 验证码Id */ + captchaId?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/captcha/check`, + method: 'POST', + query: query, + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags captcha + * @name SendSmsCode + * @summary 发送短信验证码 + * @request POST:/api/admin/captcha/send-sms-code + * @secure + */ + sendSmsCode = (data: SendSmsCodeInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/captcha/send-sms-code`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags captcha + * @name SendEmailCode + * @summary 发送邮件验证码 + * @request POST:/api/admin/captcha/send-email-code + * @secure + */ + sendEmailCode = (data: SendEmailCodeInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/captcha/send-email-code`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/Dict.ts b/src/api/admin/Dict.ts new file mode 100644 index 0000000..e19921e --- /dev/null +++ b/src/api/admin/Dict.ts @@ -0,0 +1,316 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + DictAddInput, + DictUpdateInput, + ExportInput, + PageInputDictGetPageInput, + ResultOutputDictGetOutput, + ResultOutputDictionaryStringListDictGetListOutput, + ResultOutputImportOutput, + ResultOutputInt64, + ResultOutputPageOutputDictGetPageOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class DictApi extends HttpClient { + /** + * No description + * + * @tags dict + * @name Get + * @summary 查询 + * @request GET:/api/admin/dict/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/dict/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags dict + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/dict/get-page + * @secure + */ + getPage = (data: PageInputDictGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags dict + * @name GetList + * @summary 通过类型编码查询列表 + * @request POST:/api/admin/dict/get-list + * @secure + */ + getList = (data: string[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict/get-list`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags dict + * @name GetListByNames + * @summary 通过类型名称查询列表 + * @request POST:/api/admin/dict/get-list-by-names + * @secure + */ + getListByNames = (data: string[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict/get-list-by-names`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags dict + * @name DownloadTemplate + * @summary 下载导入模板 + * @request POST:/api/admin/dict/download-template + * @secure + */ + downloadTemplate = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict/download-template`, + method: 'POST', + secure: true, + ...params, + }) + /** + * No description + * + * @tags dict + * @name DownloadErrorMark + * @summary 下载错误标记文件 + * @request POST:/api/admin/dict/download-error-mark + * @secure + */ + downloadErrorMark = ( + query?: { + fileId?: string + fileName?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/dict/download-error-mark`, + method: 'POST', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags dict + * @name ExportData + * @summary 导出数据 + * @request POST:/api/admin/dict/export-data + * @secure + */ + exportData = (data: ExportInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict/export-data`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags dict + * @name ImportData + * @summary 导入数据 + * @request POST:/api/admin/dict/import-data + * @secure + */ + importData = ( + data: { + /** @format binary */ + file: File + }, + query?: { + /** @format int32 */ + duplicateAction?: number + fileId?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/dict/import-data`, + method: 'POST', + query: query, + body: data, + secure: true, + type: ContentType.FormData, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags dict + * @name Add + * @summary 新增 + * @request POST:/api/admin/dict/add + * @secure + */ + add = (data: DictAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags dict + * @name Update + * @summary 修改 + * @request PUT:/api/admin/dict/update + * @secure + */ + update = (data: DictUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags dict + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/dict/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/dict/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags dict + * @name BatchDelete + * @summary 批量彻底删除 + * @request PUT:/api/admin/dict/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags dict + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/dict/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/dict/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags dict + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/dict/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/DictType.ts b/src/api/admin/DictType.ts new file mode 100644 index 0000000..6af962a --- /dev/null +++ b/src/api/admin/DictType.ts @@ -0,0 +1,187 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + DictTypeAddInput, + DictTypeUpdateInput, + PageInputDictTypeGetPageInput, + ResultOutputDictTypeGetOutput, + ResultOutputInt64, + ResultOutputPageOutputDictTypeGetPageOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class DictTypeApi extends HttpClient { + /** + * No description + * + * @tags dict-type + * @name Get + * @summary 查询 + * @request GET:/api/admin/dict-type/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/dict-type/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags dict-type + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/dict-type/get-page + * @secure + */ + getPage = (data: PageInputDictTypeGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict-type/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags dict-type + * @name Add + * @summary 新增 + * @request POST:/api/admin/dict-type/add + * @secure + */ + add = (data: DictTypeAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict-type/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags dict-type + * @name Update + * @summary 修改 + * @request PUT:/api/admin/dict-type/update + * @secure + */ + update = (data: DictTypeUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict-type/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags dict-type + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/dict-type/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/dict-type/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags dict-type + * @name BatchDelete + * @summary 批量彻底删除 + * @request PUT:/api/admin/dict-type/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict-type/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags dict-type + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/dict-type/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/dict-type/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags dict-type + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/dict-type/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/dict-type/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/Doc.ts b/src/api/admin/Doc.ts new file mode 100644 index 0000000..89fe692 --- /dev/null +++ b/src/api/admin/Doc.ts @@ -0,0 +1,387 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + DocAddGroupInput, + DocAddImageInput, + DocAddMenuInput, + DocUpdateContentInput, + DocUpdateGroupInput, + DocUpdateMenuInput, + ResultOutputDocGetContentOutput, + ResultOutputDocGetGroupOutput, + ResultOutputDocGetMenuOutput, + ResultOutputIEnumerableObject, + ResultOutputInt64, + ResultOutputListDocListOutput, + ResultOutputListString, + ResultOutputString, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class DocApi extends HttpClient { + /** + * No description + * + * @tags doc + * @name GetGroup + * @summary 查询分组 + * @request GET:/api/admin/doc/get-group + * @secure + */ + getGroup = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/doc/get-group`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags doc + * @name GetMenu + * @summary 查询菜单 + * @request GET:/api/admin/doc/get-menu + * @secure + */ + getMenu = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/doc/get-menu`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags doc + * @name GetContent + * @summary 查询文档内容 + * @request GET:/api/admin/doc/get-content + * @secure + */ + getContent = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/doc/get-content`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags doc + * @name GetList + * @summary 查询文档列表 + * @request GET:/api/admin/doc/get-list + * @secure + */ + getList = ( + query?: { + key?: string + /** @format date-time */ + start?: string + /** @format date-time */ + end?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/doc/get-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags doc + * @name GetImageList + * @summary 查询图片列表 + * @request GET:/api/admin/doc/get-image-list + * @secure + */ + getImageList = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/doc/get-image-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags doc + * @name AddGroup + * @summary 新增分组 + * @request POST:/api/admin/doc/add-group + * @secure + */ + addGroup = (data: DocAddGroupInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/doc/add-group`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags doc + * @name AddMenu + * @summary 新增菜单 + * @request POST:/api/admin/doc/add-menu + * @secure + */ + addMenu = (data: DocAddMenuInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/doc/add-menu`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags doc + * @name AddImage + * @summary 新增图片 + * @request POST:/api/admin/doc/add-image + * @secure + */ + addImage = (data: DocAddImageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/doc/add-image`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags doc + * @name UpdateGroup + * @summary 修改分组 + * @request PUT:/api/admin/doc/update-group + * @secure + */ + updateGroup = (data: DocUpdateGroupInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/doc/update-group`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags doc + * @name UpdateMenu + * @summary 修改菜单 + * @request PUT:/api/admin/doc/update-menu + * @secure + */ + updateMenu = (data: DocUpdateMenuInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/doc/update-menu`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags doc + * @name UpdateContent + * @summary 修改文档内容 + * @request PUT:/api/admin/doc/update-content + * @secure + */ + updateContent = (data: DocUpdateContentInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/doc/update-content`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags doc + * @name Delete + * @summary 彻底删除文档 + * @request DELETE:/api/admin/doc/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/doc/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags doc + * @name DeleteImage + * @summary 彻底删除图片 + * @request DELETE:/api/admin/doc/delete-image + * @secure + */ + deleteImage = ( + query?: { + /** @format int64 */ + documentId?: number + url?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/doc/delete-image`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags doc + * @name SoftDelete + * @summary 删除文档 + * @request DELETE:/api/admin/doc/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/doc/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags doc + * @name GetPlainList + * @summary 查询精简文档列表 + * @request GET:/api/admin/doc/get-plain-list + * @secure + */ + getPlainList = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/doc/get-plain-list`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags doc + * @name UploadImage + * @summary 上传文档图片 + * @request POST:/api/admin/doc/upload-image + * @secure + */ + uploadImage = ( + data: { + /** + * 上传文件 + * @format binary + */ + File?: File + /** + * 文档编号 + * @format int64 + */ + Id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/doc/upload-image`, + method: 'POST', + body: data, + secure: true, + type: ContentType.FormData, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/File.ts b/src/api/admin/File.ts new file mode 100644 index 0000000..8364ca0 --- /dev/null +++ b/src/api/admin/File.ts @@ -0,0 +1,140 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + FileDeleteInput, + PageInputFileGetPageInput, + ResultOutputFileEntity, + ResultOutputListFileEntity, + ResultOutputPageOutputFileGetPageOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class FileApi extends HttpClient { + /** + * No description + * + * @tags file + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/file/get-page + * @secure + */ + getPage = (data: PageInputFileGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/file/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags file + * @name Delete + * @summary 删除 + * @request POST:/api/admin/file/delete + * @secure + */ + delete = (data: FileDeleteInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/file/delete`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags file + * @name UploadFile + * @summary 上传文件 + * @request POST:/api/admin/file/upload-file + * @secure + */ + uploadFile = ( + data: { + /** + * 文件 + * @format binary + */ + file: File + }, + query?: { + /** + * 文件目录 + * @default "" + */ + fileDirectory?: string + /** + * 文件重命名 + * @default true + */ + fileReName?: boolean + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/file/upload-file`, + method: 'POST', + query: query, + body: data, + secure: true, + type: ContentType.FormData, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags file + * @name UploadFiles + * @summary 上传多文件 + * @request POST:/api/admin/file/upload-files + * @secure + */ + uploadFiles = ( + data: { + /** 文件列表 */ + files: File[] + }, + query?: { + /** + * 文件目录 + * @default "" + */ + fileDirectory?: string + /** + * 文件重命名 + * @default true + */ + fileReName?: boolean + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/file/upload-files`, + method: 'POST', + query: query, + body: data, + secure: true, + type: ContentType.FormData, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/LoginLog.ts b/src/api/admin/LoginLog.ts new file mode 100644 index 0000000..6b8defd --- /dev/null +++ b/src/api/admin/LoginLog.ts @@ -0,0 +1,55 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { LoginLogAddInput, PageInputLoginLogGetPageInput, ResultOutputInt64, ResultOutputPageOutputLoginLogGetPageOutput } from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class LoginLogApi extends HttpClient { + /** + * No description + * + * @tags login-log + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/login-log/get-page + * @secure + */ + getPage = (data: PageInputLoginLogGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/login-log/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags login-log + * @name Add + * @summary 新增 + * @request POST:/api/admin/login-log/add + * @secure + */ + add = (data: LoginLogAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/login-log/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/Msg.ts b/src/api/admin/Msg.ts new file mode 100644 index 0000000..b4f0677 --- /dev/null +++ b/src/api/admin/Msg.ts @@ -0,0 +1,254 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + MsgAddInput, + MsgAddMsgUserListInput, + MsgUpdateInput, + PageInputMsgGetPageInput, + ResultOutputInt64, + ResultOutputListMsgGetMsgUserListOutput, + ResultOutputMsgGetOutput, + ResultOutputPageOutputMsgGetPageOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class MsgApi extends HttpClient { + /** + * No description + * + * @tags msg + * @name Get + * @summary 查询 + * @request GET:/api/admin/msg/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/msg/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags msg + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/msg/get-page + * @secure + */ + getPage = (data: PageInputMsgGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags msg + * @name GetMsgUserList + * @summary 查询消息用户列表 + * @request GET:/api/admin/msg/get-msg-user-list + * @secure + */ + getMsgUserList = ( + query?: { + /** + * 消息Id + * @format int64 + */ + MsgId?: number + /** 姓名 */ + Name?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/msg/get-msg-user-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags msg + * @name AddMsgUser + * @summary 添加消息用户 + * @request POST:/api/admin/msg/add-msg-user + * @secure + */ + addMsgUser = (data: MsgAddMsgUserListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg/add-msg-user`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags msg + * @name RemoveMsgUser + * @summary 移除消息用户 + * @request POST:/api/admin/msg/remove-msg-user + * @secure + */ + removeMsgUser = (data: MsgAddMsgUserListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg/remove-msg-user`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags msg + * @name Add + * @summary 新增 + * @request POST:/api/admin/msg/add + * @secure + */ + add = (data: MsgAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags msg + * @name Update + * @summary 修改 + * @request PUT:/api/admin/msg/update + * @secure + */ + update = (data: MsgUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags msg + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/msg/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/msg/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags msg + * @name BatchDelete + * @summary 批量彻底删除 + * @request PUT:/api/admin/msg/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags msg + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/msg/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/msg/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags msg + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/msg/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/MsgType.ts b/src/api/admin/MsgType.ts new file mode 100644 index 0000000..9ae08cd --- /dev/null +++ b/src/api/admin/MsgType.ts @@ -0,0 +1,191 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + MsgTypeAddInput, + MsgTypeUpdateInput, + ResultOutputInt64, + ResultOutputListMsgTypeGetListOutput, + ResultOutputMsgTypeGetOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class MsgTypeApi extends HttpClient { + /** + * No description + * + * @tags msg-type + * @name Get + * @summary 查询 + * @request GET:/api/admin/msg-type/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/msg-type/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags msg-type + * @name GetList + * @summary 查询列表 + * @request GET:/api/admin/msg-type/get-list + * @secure + */ + getList = ( + query?: { + /** 名称 */ + Name?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/msg-type/get-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags msg-type + * @name Add + * @summary 新增 + * @request POST:/api/admin/msg-type/add + * @secure + */ + add = (data: MsgTypeAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg-type/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags msg-type + * @name Update + * @summary 修改 + * @request PUT:/api/admin/msg-type/update + * @secure + */ + update = (data: MsgTypeUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg-type/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags msg-type + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/msg-type/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/msg-type/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags msg-type + * @name BatchDelete + * @summary 批量彻底删除 + * @request PUT:/api/admin/msg-type/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg-type/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags msg-type + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/msg-type/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/msg-type/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags msg-type + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/msg-type/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/msg-type/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/OperationLog.ts b/src/api/admin/OperationLog.ts new file mode 100644 index 0000000..c117cc7 --- /dev/null +++ b/src/api/admin/OperationLog.ts @@ -0,0 +1,60 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { + OperationLogAddInput, + PageInputOperationLogGetPageInput, + ResultOutputInt64, + ResultOutputPageOutputOperationLogGetPageOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class OperationLogApi extends HttpClient { + /** + * No description + * + * @tags operation-log + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/operation-log/get-page + * @secure + */ + getPage = (data: PageInputOperationLogGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/operation-log/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags operation-log + * @name Add + * @summary 新增 + * @request POST:/api/admin/operation-log/add + * @secure + */ + add = (data: OperationLogAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/operation-log/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/Org.ts b/src/api/admin/Org.ts new file mode 100644 index 0000000..27f7f4d --- /dev/null +++ b/src/api/admin/Org.ts @@ -0,0 +1,172 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + OrgAddInput, + OrgUpdateInput, + ResultOutputInt64, + ResultOutputListOrgGetListOutput, + ResultOutputListOrgGetSimpleListWithPathOutput, + ResultOutputOrgGetOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class OrgApi extends HttpClient { + /** + * No description + * + * @tags org + * @name Get + * @summary 查询 + * @request GET:/api/admin/org/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/org/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags org + * @name GetList + * @summary 查询列表 + * @request GET:/api/admin/org/get-list + * @secure + */ + getList = ( + query?: { + key?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/org/get-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags org + * @name GetSimpleListWithPath + * @summary 获取部门路径列表 + * @request GET:/api/admin/org/get-simple-list-with-path + * @secure + */ + getSimpleListWithPath = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/org/get-simple-list-with-path`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags org + * @name Add + * @summary 新增 + * @request POST:/api/admin/org/add + * @secure + */ + add = (data: OrgAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/org/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags org + * @name Update + * @summary 修改 + * @request PUT:/api/admin/org/update + * @secure + */ + update = (data: OrgUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/org/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags org + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/org/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/org/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags org + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/org/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/org/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) +} diff --git a/src/api/admin/Permission.ts b/src/api/admin/Permission.ts new file mode 100644 index 0000000..1fd514a --- /dev/null +++ b/src/api/admin/Permission.ts @@ -0,0 +1,350 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + PermissionAddDotInput, + PermissionAddGroupInput, + PermissionAddMenuInput, + PermissionAssignInput, + PermissionGetListInput, + PermissionUpdateDotInput, + PermissionUpdateGroupInput, + PermissionUpdateMenuInput, + ResultOutputInt64, + ResultOutputListInt64, + ResultOutputListPermissionGetListOutput, + ResultOutputListPermissionGetPermissionListOutput, + ResultOutputPermissionGetDotOutput, + ResultOutputPermissionGetGroupOutput, + ResultOutputPermissionGetMenuOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class PermissionApi extends HttpClient { + /** + * No description + * + * @tags permission + * @name GetGroup + * @summary 查询分组 + * @request GET:/api/admin/permission/get-group + * @secure + */ + getGroup = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/permission/get-group`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags permission + * @name GetMenu + * @summary 查询菜单 + * @request GET:/api/admin/permission/get-menu + * @secure + */ + getMenu = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/permission/get-menu`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags permission + * @name GetDot + * @summary 查询权限点 + * @request GET:/api/admin/permission/get-dot + * @secure + */ + getDot = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/permission/get-dot`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags permission + * @name GetList + * @summary 查询权限列表 + * @request POST:/api/admin/permission/get-list + * @secure + */ + getList = (data: PermissionGetListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/permission/get-list`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags permission + * @name GetPermissionList + * @summary 查询授权权限列表 + * @request GET:/api/admin/permission/get-permission-list + * @secure + */ + getPermissionList = ( + query?: { + platform?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/permission/get-permission-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags permission + * @name GetRolePermissionList + * @summary 查询角色权限列表 + * @request GET:/api/admin/permission/get-role-permission-list + * @secure + */ + getRolePermissionList = ( + query?: { + /** + * @format int64 + * @default 0 + */ + roleId?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/permission/get-role-permission-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags permission + * @name AddGroup + * @summary 新增分组 + * @request POST:/api/admin/permission/add-group + * @secure + */ + addGroup = (data: PermissionAddGroupInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/permission/add-group`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags permission + * @name AddMenu + * @summary 新增菜单 + * @request POST:/api/admin/permission/add-menu + * @secure + */ + addMenu = (data: PermissionAddMenuInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/permission/add-menu`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags permission + * @name AddDot + * @summary 新增权限点 + * @request POST:/api/admin/permission/add-dot + * @secure + */ + addDot = (data: PermissionAddDotInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/permission/add-dot`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags permission + * @name UpdateGroup + * @summary 修改分组 + * @request PUT:/api/admin/permission/update-group + * @secure + */ + updateGroup = (data: PermissionUpdateGroupInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/permission/update-group`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags permission + * @name UpdateMenu + * @summary 修改菜单 + * @request PUT:/api/admin/permission/update-menu + * @secure + */ + updateMenu = (data: PermissionUpdateMenuInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/permission/update-menu`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags permission + * @name UpdateDot + * @summary 修改权限点 + * @request PUT:/api/admin/permission/update-dot + * @secure + */ + updateDot = (data: PermissionUpdateDotInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/permission/update-dot`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags permission + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/permission/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/permission/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags permission + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/permission/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/permission/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags permission + * @name Assign + * @summary 保存角色权限 + * @request POST:/api/admin/permission/assign + * @secure + */ + assign = (data: PermissionAssignInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/permission/assign`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/Pkg.ts b/src/api/admin/Pkg.ts new file mode 100644 index 0000000..a12c471 --- /dev/null +++ b/src/api/admin/Pkg.ts @@ -0,0 +1,347 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + PageInputPkgGetPageInput, + PageInputPkgGetPkgTenantListInput, + PkgAddInput, + PkgAddPkgTenantListInput, + PkgSetPkgPermissionsInput, + PkgUpdateInput, + ResultOutputInt64, + ResultOutputListInt64, + ResultOutputListPkgGetListOutput, + ResultOutputListPkgGetPkgTenantListOutput, + ResultOutputPageOutputPkgGetPageOutput, + ResultOutputPageOutputPkgGetPkgTenantListOutput, + ResultOutputPkgGetOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class PkgApi extends HttpClient { + /** + * No description + * + * @tags pkg + * @name Get + * @summary 查询 + * @request GET:/api/admin/pkg/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/pkg/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags pkg + * @name GetList + * @summary 查询列表 + * @request GET:/api/admin/pkg/get-list + * @secure + */ + getList = ( + query?: { + /** 名称 */ + Name?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/pkg/get-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags pkg + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/pkg/get-page + * @secure + */ + getPage = (data: PageInputPkgGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/pkg/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags pkg + * @name GetPkgTenantList + * @summary 查询套餐租户列表 + * @request GET:/api/admin/pkg/get-pkg-tenant-list + * @secure + */ + getPkgTenantList = ( + query?: { + /** 租户名 */ + TenantName?: string + /** + * 套餐Id + * @format int64 + */ + PkgId?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/pkg/get-pkg-tenant-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags pkg + * @name GetPkgTenantPage + * @summary 查询套餐租户分页 + * @request POST:/api/admin/pkg/get-pkg-tenant-page + * @secure + */ + getPkgTenantPage = (data: PageInputPkgGetPkgTenantListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/pkg/get-pkg-tenant-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags pkg + * @name GetPkgPermissionList + * @summary 查询套餐权限列表 + * @request GET:/api/admin/pkg/get-pkg-permission-list + * @secure + */ + getPkgPermissionList = ( + query?: { + /** + * 套餐编号 + * @format int64 + */ + pkgId?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/pkg/get-pkg-permission-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags pkg + * @name SetPkgPermissions + * @summary 设置套餐权限 + * @request POST:/api/admin/pkg/set-pkg-permissions + * @secure + */ + setPkgPermissions = (data: PkgSetPkgPermissionsInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/pkg/set-pkg-permissions`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags pkg + * @name AddPkgTenant + * @summary 添加套餐租户 + * @request POST:/api/admin/pkg/add-pkg-tenant + * @secure + */ + addPkgTenant = (data: PkgAddPkgTenantListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/pkg/add-pkg-tenant`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags pkg + * @name RemovePkgTenant + * @summary 移除套餐租户 + * @request POST:/api/admin/pkg/remove-pkg-tenant + * @secure + */ + removePkgTenant = (data: PkgAddPkgTenantListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/pkg/remove-pkg-tenant`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags pkg + * @name Add + * @summary 新增 + * @request POST:/api/admin/pkg/add + * @secure + */ + add = (data: PkgAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/pkg/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags pkg + * @name Update + * @summary 修改 + * @request PUT:/api/admin/pkg/update + * @secure + */ + update = (data: PkgUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/pkg/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags pkg + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/pkg/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/pkg/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags pkg + * @name BatchDelete + * @summary 批量彻底删除 + * @request PUT:/api/admin/pkg/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/pkg/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags pkg + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/pkg/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/pkg/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags pkg + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/pkg/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/pkg/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/PrintTemplate.ts b/src/api/admin/PrintTemplate.ts new file mode 100644 index 0000000..bf0b367 --- /dev/null +++ b/src/api/admin/PrintTemplate.ts @@ -0,0 +1,250 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + PageInputPrintTemplateGetPageInput, + PrintTemplateAddInput, + PrintTemplateSetEnableInput, + PrintTemplateUpdateInput, + PrintTemplateUpdateTemplateInput, + ResultOutputInt64, + ResultOutputPageOutputPrintTemplateGetPageOutput, + ResultOutputPrintTemplateGetOutput, + ResultOutputPrintTemplateGetUpdateTemplateOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class PrintTemplateApi extends HttpClient { + /** + * No description + * + * @tags print-template + * @name Get + * @summary 查询 + * @request GET:/api/admin/print-template/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/print-template/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags print-template + * @name GetUpdateTemplate + * @summary 查询修改模板 + * @request GET:/api/admin/print-template/get-update-template + * @secure + */ + getUpdateTemplate = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/print-template/get-update-template`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags print-template + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/print-template/get-page + * @secure + */ + getPage = (data: PageInputPrintTemplateGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/print-template/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags print-template + * @name Add + * @summary 新增 + * @request POST:/api/admin/print-template/add + * @secure + */ + add = (data: PrintTemplateAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/print-template/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags print-template + * @name Update + * @summary 修改 + * @request PUT:/api/admin/print-template/update + * @secure + */ + update = (data: PrintTemplateUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/print-template/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags print-template + * @name UpdateTemplate + * @summary 修改模板 + * @request PUT:/api/admin/print-template/update-template + * @secure + */ + updateTemplate = (data: PrintTemplateUpdateTemplateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/print-template/update-template`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags print-template + * @name SetEnable + * @summary 设置启用 + * @request POST:/api/admin/print-template/set-enable + * @secure + */ + setEnable = (data: PrintTemplateSetEnableInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/print-template/set-enable`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags print-template + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/print-template/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/print-template/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags print-template + * @name BatchDelete + * @summary 批量彻底删除 + * @request PUT:/api/admin/print-template/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/print-template/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags print-template + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/print-template/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/print-template/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags print-template + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/print-template/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/print-template/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/Region.ts b/src/api/admin/Region.ts new file mode 100644 index 0000000..5ad7cd1 --- /dev/null +++ b/src/api/admin/Region.ts @@ -0,0 +1,229 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + PageInputRegionGetPageInput, + RegionAddInput, + RegionGetListInput, + RegionLevel, + RegionSetEnableInput, + RegionSetHotInput, + RegionUpdateInput, + ResultOutputInt64, + ResultOutputListRegionGetChildListOutput, + ResultOutputPageOutputRegionGetPageOutput, + ResultOutputRegionGetOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class RegionApi extends HttpClient { + /** + * No description + * + * @tags region + * @name Get + * @summary 查询 + * @request GET:/api/admin/region/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/region/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags region + * @name GetChildList + * @summary 查询下级列表 + * @request POST:/api/admin/region/get-child-list + * @secure + */ + getChildList = (data: RegionGetListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/region/get-child-list`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags region + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/region/get-page + * @secure + */ + getPage = (data: PageInputRegionGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/region/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags region + * @name Add + * @summary 新增 + * @request POST:/api/admin/region/add + * @secure + */ + add = (data: RegionAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/region/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags region + * @name Update + * @summary 修改 + * @request PUT:/api/admin/region/update + * @secure + */ + update = (data: RegionUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/region/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags region + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/region/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/region/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags region + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/region/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/region/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags region + * @name SetEnable + * @summary 设置启用 + * @request POST:/api/admin/region/set-enable + * @secure + */ + setEnable = (data: RegionSetEnableInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/region/set-enable`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags region + * @name SetHot + * @summary 设置热门 + * @request POST:/api/admin/region/set-hot + * @secure + */ + setHot = (data: RegionSetHotInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/region/set-hot`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags region + * @name SyncData + * @summary 同步数据 + * @request POST:/api/admin/region/sync-data + * @secure + */ + syncData = (data: RegionLevel, params: RequestParams = {}) => + this.request({ + path: `/api/admin/region/sync-data`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/Role.ts b/src/api/admin/Role.ts new file mode 100644 index 0000000..58e2a37 --- /dev/null +++ b/src/api/admin/Role.ts @@ -0,0 +1,298 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + PageInputRoleGetPageInput, + ResultOutputInt64, + ResultOutputListRoleGetListOutput, + ResultOutputListRoleGetRoleUserListOutput, + ResultOutputPageOutputRoleGetPageOutput, + ResultOutputRoleGetOutput, + RoleAddInput, + RoleAddRoleUserListInput, + RoleSetDataScopeInput, + RoleUpdateInput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class RoleApi extends HttpClient { + /** + * No description + * + * @tags role + * @name Get + * @summary 查询 + * @request GET:/api/admin/role/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/role/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags role + * @name GetList + * @summary 查询列表 + * @request GET:/api/admin/role/get-list + * @secure + */ + getList = ( + query?: { + /** 名称 */ + Name?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/role/get-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags role + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/role/get-page + * @secure + */ + getPage = (data: PageInputRoleGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/role/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags role + * @name GetRoleUserList + * @summary 查询角色用户列表 + * @request GET:/api/admin/role/get-role-user-list + * @secure + */ + getRoleUserList = ( + query?: { + /** 姓名 */ + Name?: string + /** + * 角色Id + * @format int64 + */ + RoleId?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/role/get-role-user-list`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags role + * @name AddRoleUser + * @summary 添加角色用户 + * @request POST:/api/admin/role/add-role-user + * @secure + */ + addRoleUser = (data: RoleAddRoleUserListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/role/add-role-user`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags role + * @name RemoveRoleUser + * @summary 移除角色用户 + * @request POST:/api/admin/role/remove-role-user + * @secure + */ + removeRoleUser = (data: RoleAddRoleUserListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/role/remove-role-user`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags role + * @name Add + * @summary 新增 + * @request POST:/api/admin/role/add + * @secure + */ + add = (data: RoleAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/role/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags role + * @name Update + * @summary 修改 + * @request PUT:/api/admin/role/update + * @secure + */ + update = (data: RoleUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/role/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags role + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/role/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/role/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags role + * @name BatchDelete + * @summary 批量彻底删除 + * @request PUT:/api/admin/role/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/role/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags role + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/role/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/role/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags role + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/role/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/role/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags role + * @name SetDataScope + * @summary 设置数据权限 + * @request POST:/api/admin/role/set-data-scope + * @secure + */ + setDataScope = (data: RoleSetDataScopeInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/role/set-data-scope`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/Room.ts b/src/api/admin/Room.ts new file mode 100644 index 0000000..f4b67d4 --- /dev/null +++ b/src/api/admin/Room.ts @@ -0,0 +1,153 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + RoomAddInput, + RoomUpdateInput, + ResultOutputInt64, + ResultOutputListRoomGetListOutput, + ResultOutputRoomGetOutput, + PageInputRoomGetPageInput, + ResultOutputPageOutputRoomGetPageOutput +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class RoomApi extends HttpClient { + /** + * No description + * + * @tags room + * @name Get + * @summary 查询 + * @request GET:/api/admin/room/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/room/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags room + * @name GetList + * @summary 查询分页 + * @request GET:/api/admin/room/get-page + * @secure + */ + getPage = (data: PageInputRoomGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/room/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + + /** + * No description + * + * @tags room + * @name Add + * @summary 新增 + * @request POST:/api/admin/room/add + * @secure + */ + add = (data: RoomAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/room/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags room + * @name Update + * @summary 修改 + * @request PUT:/api/admin/room/update + * @secure + */ + update = (data: RoomUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/room/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags room + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/room/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/room/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags room + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/room/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/room/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) +} diff --git a/src/api/admin/SiteMsg.ts b/src/api/admin/SiteMsg.ts new file mode 100644 index 0000000..4a3bad6 --- /dev/null +++ b/src/api/admin/SiteMsg.ts @@ -0,0 +1,181 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + PageInputSiteMsgGetPageInput, + ResultOutputBoolean, + ResultOutputPageOutputSiteMsgGetPageOutput, + ResultOutputSiteMsgGetContentOutput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class SiteMsgApi extends HttpClient { + /** + * No description + * + * @tags site-msg + * @name GetContent + * @summary 获得内容 + * @request GET:/api/admin/site-msg/get-content + * @secure + */ + getContent = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/site-msg/get-content`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags site-msg + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/site-msg/get-page + * @secure + */ + getPage = (data: PageInputSiteMsgGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/site-msg/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags site-msg + * @name IsUnread + * @summary 是否未读 + * @request GET:/api/admin/site-msg/is-unread + * @secure + */ + isUnread = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/site-msg/is-unread`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags site-msg + * @name SetAllRead + * @summary 全部标为已读 + * @request POST:/api/admin/site-msg/set-all-read + * @secure + */ + setAllRead = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/site-msg/set-all-read`, + method: 'POST', + secure: true, + ...params, + }) + /** + * No description + * + * @tags site-msg + * @name SetRead + * @summary 标为已读 + * @request POST:/api/admin/site-msg/set-read + * @secure + */ + setRead = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/site-msg/set-read`, + method: 'POST', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags site-msg + * @name BatchSetRead + * @summary 批量标为已读 + * @request POST:/api/admin/site-msg/batch-set-read + * @secure + */ + batchSetRead = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/site-msg/batch-set-read`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags site-msg + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/site-msg/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/site-msg/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags site-msg + * @name BatchSoftDelete + * @summary 批量删除 + * @request POST:/api/admin/site-msg/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/site-msg/batch-soft-delete`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/Task.ts b/src/api/admin/Task.ts new file mode 100644 index 0000000..6770eca --- /dev/null +++ b/src/api/admin/Task.ts @@ -0,0 +1,287 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + PageInputTaskGetPageInput, + ResultOutputPageOutputTaskGetPageOutput, + ResultOutputString, + ResultOutputTaskGetOutput, + TaskAddInput, + TaskUpdateInput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class TaskApi extends HttpClient { + /** + * No description + * + * @tags task + * @name GetAlerEmail + * @summary 查询报警邮件 + * @request GET:/api/admin/task/get-aler-email + * @secure + */ + getAlerEmail = ( + query?: { + id?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/task/get-aler-email`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags task + * @name Get + * @summary 查询 + * @request GET:/api/admin/task/get + * @secure + */ + get = ( + query?: { + id?: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/task/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags task + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/task/get-page + * @secure + */ + getPage = (data: PageInputTaskGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/task/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags task + * @name Add + * @summary 新增 + * @request POST:/api/admin/task/add + * @secure + */ + add = (data: TaskAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/task/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags task + * @name Update + * @summary 修改 + * @request PUT:/api/admin/task/update + * @secure + */ + update = (data: TaskUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/task/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags task + * @name Pause + * @summary 暂停任务 + * @request POST:/api/admin/task/pause + * @secure + */ + pause = ( + query: { + id: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/task/pause`, + method: 'POST', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags task + * @name Resume + * @summary 启动任务 + * @request POST:/api/admin/task/resume + * @secure + */ + resume = ( + query: { + id: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/task/resume`, + method: 'POST', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags task + * @name Run + * @summary 执行任务 + * @request POST:/api/admin/task/run + * @secure + */ + run = ( + query: { + id: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/task/run`, + method: 'POST', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags task + * @name Delete + * @summary 删除任务 + * @request DELETE:/api/admin/task/delete + * @secure + */ + delete = ( + query: { + id: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/task/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags task + * @name BatchRun + * @summary 批量执行任务 + * @request PUT:/api/admin/task/batch-run + * @secure + */ + batchRun = (data: string[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/task/batch-run`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags task + * @name BatchPause + * @summary 批量暂停任务 + * @request PUT:/api/admin/task/batch-pause + * @secure + */ + batchPause = (data: string[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/task/batch-pause`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags task + * @name BatchResume + * @summary 批量启动任务 + * @request PUT:/api/admin/task/batch-resume + * @secure + */ + batchResume = (data: string[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/task/batch-resume`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags task + * @name BatchDelete + * @summary 批量删除任务 + * @request PUT:/api/admin/task/batch-delete + * @secure + */ + batchDelete = (data: string[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/task/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/TaskLog.ts b/src/api/admin/TaskLog.ts new file mode 100644 index 0000000..2220c62 --- /dev/null +++ b/src/api/admin/TaskLog.ts @@ -0,0 +1,36 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { PageInputTaskLogGetPageInput, ResultOutputPageOutputTaskLog } from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class TaskLogApi extends HttpClient { + /** + * No description + * + * @tags task-log + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/task-log/get-page + * @secure + */ + getPage = (data: PageInputTaskLogGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/task-log/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/Tenant.ts b/src/api/admin/Tenant.ts new file mode 100644 index 0000000..8a0f5dd --- /dev/null +++ b/src/api/admin/Tenant.ts @@ -0,0 +1,213 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + PageInputTenantGetPageInput, + ResultOutputInt64, + ResultOutputPageOutputTenantGetPageOutput, + ResultOutputTenantGetOutput, + ResultOutputTokenInfo, + TenantAddInput, + TenantSetEnableInput, + TenantUpdateInput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class TenantApi extends HttpClient { + /** + * No description + * + * @tags tenant + * @name Get + * @summary 查询 + * @request GET:/api/admin/tenant/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/tenant/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags tenant + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/tenant/get-page + * @secure + */ + getPage = (data: PageInputTenantGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/tenant/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags tenant + * @name Add + * @summary 新增 + * @request POST:/api/admin/tenant/add + * @secure + */ + add = (data: TenantAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/tenant/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags tenant + * @name Update + * @summary 修改 + * @request PUT:/api/admin/tenant/update + * @secure + */ + update = (data: TenantUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/tenant/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags tenant + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/tenant/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/tenant/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags tenant + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/tenant/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/tenant/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags tenant + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/tenant/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/tenant/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags tenant + * @name SetEnable + * @summary 设置启用 + * @request POST:/api/admin/tenant/set-enable + * @secure + */ + setEnable = (data: TenantSetEnableInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/tenant/set-enable`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags tenant + * @name OneClickLogin + * @summary 一键登录 + * @request POST:/api/admin/tenant/one-click-login + * @secure + */ + oneClickLogin = ( + query?: { + /** @format int64 */ + tenantId?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/tenant/one-click-login`, + method: 'POST', + query: query, + secure: true, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/User.ts b/src/api/admin/User.ts new file mode 100644 index 0000000..dd5f41e --- /dev/null +++ b/src/api/admin/User.ts @@ -0,0 +1,495 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + PageInput, + PageInputUserGetPageInput, + ResultOutputInt64, + ResultOutputPageOutputUserGetDeletedUserPageOutput, + ResultOutputPageOutputUserGetPageOutput, + ResultOutputString, + ResultOutputTokenInfo, + ResultOutputUserGetBasicOutput, + ResultOutputUserGetOutput, + ResultOutputUserGetPermissionOutput, + UserAddInput, + UserAddMemberInput, + UserBatchSetOrgInput, + UserChangePasswordInput, + UserResetPasswordInput, + UserRestoreInput, + UserSetEnableInput, + UserSetManagerInput, + UserUpdateBasicInput, + UserUpdateInput, + UserUpdateMemberInput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class UserApi extends HttpClient { + /** + * No description + * + * @tags user + * @name Get + * @summary 查询用户 + * @request GET:/api/admin/user/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/user/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name GetPage + * @summary 查询分页 + * @request POST:/api/admin/user/get-page + * @secure + */ + getPage = (data: PageInputUserGetPageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/get-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name GetDeletedPage + * @summary 查询已删除分页列表 + * @request POST:/api/admin/user/get-deleted-page + * @secure + */ + getDeletedPage = (data: PageInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/get-deleted-page`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name GetBasic + * @summary 查询用户基本信息 + * @request GET:/api/admin/user/get-basic + * @secure + */ + getBasic = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/get-basic`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name GetPermission + * @summary 查询用户权限信息 + * @request GET:/api/admin/user/get-permission + * @secure + */ + getPermission = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/get-permission`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name Add + * @summary 新增用户 + * @request POST:/api/admin/user/add + * @secure + */ + add = (data: UserAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name Update + * @summary 修改用户 + * @request PUT:/api/admin/user/update + * @secure + */ + update = (data: UserUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name AddMember + * @summary 新增会员 + * @request POST:/api/admin/user/add-member + * @secure + */ + addMember = (data: UserAddMemberInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/add-member`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name UpdateMember + * @summary 修改会员 + * @request PUT:/api/admin/user/update-member + * @secure + */ + updateMember = (data: UserUpdateMemberInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/update-member`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name UpdateBasic + * @summary 更新用户基本信息 + * @request PUT:/api/admin/user/update-basic + * @secure + */ + updateBasic = (data: UserUpdateBasicInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/update-basic`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name ChangePassword + * @summary 修改用户密码 + * @request PUT:/api/admin/user/change-password + * @secure + */ + changePassword = (data: UserChangePasswordInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/change-password`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name ResetPassword + * @summary 重置密码 + * @request POST:/api/admin/user/reset-password + * @secure + */ + resetPassword = (data: UserResetPasswordInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/reset-password`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name SetManager + * @summary 设置主管 + * @request POST:/api/admin/user/set-manager + * @secure + */ + setManager = (data: UserSetManagerInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/set-manager`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name SetEnable + * @summary 设置启用 + * @request POST:/api/admin/user/set-enable + * @secure + */ + setEnable = (data: UserSetEnableInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/set-enable`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name Restore + * @summary 恢复 + * @request POST:/api/admin/user/restore + * @secure + */ + restore = (data: UserRestoreInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/restore`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name BatchSetOrg + * @summary 批量设置部门 + * @request PUT:/api/admin/user/batch-set-org + * @secure + */ + batchSetOrg = (data: UserBatchSetOrgInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/batch-set-org`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name Delete + * @summary 彻底删除用户 + * @request DELETE:/api/admin/user/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/user/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags user + * @name BatchDelete + * @summary 批量彻底删除用户 + * @request PUT:/api/admin/user/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name SoftDelete + * @summary 删除用户 + * @request DELETE:/api/admin/user/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/user/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags user + * @name BatchSoftDelete + * @summary 批量删除用户 + * @request PUT:/api/admin/user/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/user/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags user + * @name AvatarUpload + * @summary 上传头像 + * @request POST:/api/admin/user/avatar-upload + * @secure + */ + avatarUpload = ( + data: { + /** @format binary */ + file?: File + }, + query?: { + /** @default false */ + autoUpdate?: boolean + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/user/avatar-upload`, + method: 'POST', + query: query, + body: data, + secure: true, + type: ContentType.FormData, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name OneClickLogin + * @summary 一键登录用户 + * @request GET:/api/admin/user/one-click-login + * @secure + */ + oneClickLogin = ( + query: { + userName: string + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/user/one-click-login`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags user + * @name ForceOffline + * @summary 强制用户下线 + * @request POST:/api/admin/user/force-offline + * @secure + */ + forceOffline = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/user/force-offline`, + method: 'POST', + query: query, + secure: true, + ...params, + }) +} diff --git a/src/api/admin/View.ts b/src/api/admin/View.ts new file mode 100644 index 0000000..ca7309e --- /dev/null +++ b/src/api/admin/View.ts @@ -0,0 +1,206 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { AxiosResponse } from 'axios' +import { + ResultOutputInt64, + ResultOutputListViewGetListOutput, + ResultOutputViewGetOutput, + ViewAddInput, + ViewGetListInput, + ViewSyncInput, + ViewUpdateInput, +} from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class ViewApi extends HttpClient { + /** + * No description + * + * @tags view + * @name Get + * @summary 查询 + * @request GET:/api/admin/view/get + * @secure + */ + get = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/view/get`, + method: 'GET', + query: query, + secure: true, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags view + * @name GetList + * @summary 查询列表 + * @request POST:/api/admin/view/get-list + * @secure + */ + getList = (data: ViewGetListInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/view/get-list`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags view + * @name Add + * @summary 新增 + * @request POST:/api/admin/view/add + * @secure + */ + add = (data: ViewAddInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/view/add`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags view + * @name Update + * @summary 修改 + * @request PUT:/api/admin/view/update + * @secure + */ + update = (data: ViewUpdateInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/view/update`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags view + * @name Delete + * @summary 彻底删除 + * @request DELETE:/api/admin/view/delete + * @secure + */ + delete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/view/delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags view + * @name BatchDelete + * @summary 批量彻底删除 + * @request PUT:/api/admin/view/batch-delete + * @secure + */ + batchDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/view/batch-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags view + * @name SoftDelete + * @summary 删除 + * @request DELETE:/api/admin/view/soft-delete + * @secure + */ + softDelete = ( + query?: { + /** @format int64 */ + id?: number + }, + params: RequestParams = {} + ) => + this.request({ + path: `/api/admin/view/soft-delete`, + method: 'DELETE', + query: query, + secure: true, + ...params, + }) + /** + * No description + * + * @tags view + * @name BatchSoftDelete + * @summary 批量删除 + * @request PUT:/api/admin/view/batch-soft-delete + * @secure + */ + batchSoftDelete = (data: number[], params: RequestParams = {}) => + this.request({ + path: `/api/admin/view/batch-soft-delete`, + method: 'PUT', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) + /** + * No description + * + * @tags view + * @name Sync + * @summary 同步 + * @request POST:/api/admin/view/sync + * @secure + */ + sync = (data: ViewSyncInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/view/sync`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + ...params, + }) +} diff --git a/src/api/admin/WebSocket.ts b/src/api/admin/WebSocket.ts new file mode 100644 index 0000000..7b38369 --- /dev/null +++ b/src/api/admin/WebSocket.ts @@ -0,0 +1,53 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { ResultOutputBoolean, ResultOutputObject, WebSocketPreConnectInput } from './data-contracts' +import { ContentType, HttpClient, RequestParams } from './http-client' + +export class WebSocketApi extends HttpClient { + /** + * No description + * + * @tags web-socket + * @name PreConnect + * @summary 获取websocket分区 + * @request POST:/api/admin/web-socket/pre-connect + * @secure + */ + preConnect = (data: WebSocketPreConnectInput, params: RequestParams = {}) => + this.request({ + path: `/api/admin/web-socket/pre-connect`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }) + /** + * No description + * + * @tags web-socket + * @name IsUseIm + * @summary 是否使用im + * @request GET:/api/admin/web-socket/is-use-im + * @secure + */ + isUseIm = (params: RequestParams = {}) => + this.request({ + path: `/api/admin/web-socket/is-use-im`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }) +} diff --git a/src/api/admin/data-contracts.ts b/src/api/admin/data-contracts.ts new file mode 100644 index 0000000..d9b6e28 --- /dev/null +++ b/src/api/admin/data-contracts.ts @@ -0,0 +1,6596 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +/** + * 账号类型:UserName=1,Mobile=2,Email=3 + * @format int32 + */ +export type AccountType = 1 | 2 | 3 + +/** 添加 */ +export interface ApiAddInput { + /** + * 所属模块 + * @format int64 + */ + parentId?: number | null + /** 接口名称 */ + label?: string | null + /** 接口地址 */ + path?: string | null + /** 接口提交方法 */ + httpMethods?: string | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean +} + +/** 接口管理 */ +export interface ApiEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** + * 所属模块 + * @format int64 + */ + parentId?: number + /** 接口命名 */ + name?: string | null + /** 接口名称 */ + label?: string | null + /** 接口地址 */ + path?: string | null + /** 接口提交方法 */ + httpMethods?: string | null + /** 启用接口日志 */ + enabledLog?: boolean + /** 启用请求参数 */ + enabledParams?: boolean + /** 启用响应结果 */ + enabledResult?: boolean + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + childs?: ApiEntity[] | null + permissions?: PermissionEntity[] | null +} + +/** 接口列表 */ +export interface ApiGetListOutput { + /** + * 接口Id + * @format int64 + */ + id?: number + /** + * 接口父级 + * @format int64 + */ + parentId?: number | null + /** 接口命名 */ + name?: string | null + /** 接口名称 */ + label?: string | null + /** 接口地址 */ + path?: string | null + /** 接口提交方法 */ + httpMethods?: string | null + /** 启用操作日志 */ + enabledLog?: boolean + /** 启用请求参数 */ + enabledParams?: boolean + /** 启用响应结果 */ + enabledResult?: boolean + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean +} + +/** 接口 */ +export interface ApiGetOutput { + /** + * 所属模块 + * @format int64 + */ + parentId?: number | null + /** 接口名称 */ + label?: string | null + /** 接口地址 */ + path?: string | null + /** 接口提交方法 */ + httpMethods?: string | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 接口Id + * @format int64 + */ + id: number +} + +/** 查询分页 */ +export interface ApiGetPageInput { + /** 接口名称 */ + label?: string | null +} + +/** 接口 */ +export interface ApiModel { + /** 请求方法 */ + httpMethods?: string | null + /** 请求地址 */ + path?: string | null +} + +/** 设置启用请求日志 */ +export interface ApiSetEnableLogInput { + /** + * 接口Id + * @format int64 + */ + apiId?: number + /** 是否启用请求参数 */ + enabledLog?: boolean +} + +/** 设置启用请求参数 */ +export interface ApiSetEnableParamsInput { + /** + * 接口Id + * @format int64 + */ + apiId?: number + /** 是否启用请求参数 */ + enabledParams?: boolean +} + +/** 设置启用请求参数 */ +export interface ApiSetEnableResultInput { + /** + * 接口Id + * @format int64 + */ + apiId?: number + /** 是否启用响应结果 */ + enabledResult?: boolean +} + +/** 接口同步 */ +export interface ApiSyncInput { + /** 接口同步列表 */ + apis?: ApiSyncModel[] | null +} + +/** 接口同步模型 */ +export interface ApiSyncModel { + /** 接口名称 */ + label?: string | null + /** 接口地址 */ + path?: string | null + /** 父级路径 */ + parentPath?: string | null + /** 接口提交方法 */ + httpMethods?: string | null +} + +/** 修改 */ +export interface ApiUpdateInput { + /** + * 所属模块 + * @format int64 + */ + parentId?: number | null + /** 接口名称 */ + label?: string | null + /** 接口地址 */ + path?: string | null + /** 接口提交方法 */ + httpMethods?: string | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 接口Id + * @format int64 + */ + id: number +} + +/** 邮箱更改密码 */ +export interface AuthChangePasswordByEmailInput { + /** + * 邮箱地址 + * @minLength 1 + */ + email: string + /** + * 验证码 + * @minLength 1 + */ + code: string + /** + * 验证码Id + * @minLength 1 + */ + codeId: string + /** + * 新密码 + * @minLength 1 + */ + newPassword: string + /** 确认新密码 */ + confirmPassword?: string | null +} + +/** 手机更改密码 */ +export interface AuthChangePasswordByMobileInput { + /** + * 手机号 + * @minLength 1 + */ + mobile: string + /** + * 验证码 + * @minLength 1 + */ + code: string + /** + * 验证码Id + * @minLength 1 + */ + codeId: string + /** + * 新密码 + * @minLength 1 + */ + newPassword: string + /** 确认新密码 */ + confirmPassword?: string | null +} + +/** 邮箱登录信息 */ +export interface AuthEmailLoginInput { + /** + * 邮箱地址 + * @minLength 1 + */ + email: string + /** + * 验证码 + * @minLength 1 + */ + code: string + /** + * 验证码Id + * @minLength 1 + */ + codeId: string +} + +/** 查询密钥 */ +export interface AuthGetPasswordEncryptKeyOutput { + /** 缓存键 */ + key?: string | null + /** 密码加密密钥 */ + encryptKey?: string | null + /** 密码加密向量 */ + iv?: string | null +} + +/** 用户信息 */ +export interface AuthGetUserInfoOutput { + /** 用户个人信息 */ + user?: AuthUserProfileOutput + /** 用户菜单列表 */ + menus?: AuthUserMenuOutput[] | null + /** 用户权限列表 */ + permissions?: string[] | null +} + +/** 用户权限 */ +export interface AuthGetUserPermissionsOutput { + /** 用户权限列表 */ + permissions?: string[] | null +} + +/** 登录信息 */ +export interface AuthLoginInput { + /** 用户名 */ + userName?: string | null + /** 手机号 */ + mobile?: string | null + /** 邮箱地址 */ + email?: string | null + /** 账号类型:UserName=1,Mobile=2,Email=3 */ + accountType?: AccountType + /** + * 密码 + * @minLength 1 + */ + password: string + /** 密码键 */ + passwordKey?: string | null + /** 验证码Id */ + captchaId?: string | null + /** 验证码数据 */ + captchaData?: string | null +} + +/** 手机号登录信息 */ +export interface AuthMobileLoginInput { + /** + * 手机号 + * @minLength 1 + */ + mobile: string + /** + * 验证码 + * @minLength 1 + */ + code: string + /** + * 验证码Id + * @minLength 1 + */ + codeId: string +} + +/** 邮箱注册 */ +export interface AuthRegByEmailInput { + /** + * 邮箱地址 + * @minLength 1 + */ + email: string + /** + * 验证码 + * @minLength 1 + */ + code: string + /** + * 验证码Id + * @minLength 1 + */ + codeId: string + /** + * 密码 + * @minLength 1 + */ + password: string + /** + * 企业名称 + * @minLength 1 + */ + corpName: string +} + +/** 手机号注册 */ +export interface AuthRegByMobileInput { + /** + * 手机号 + * @minLength 1 + */ + mobile: string + /** + * 验证码 + * @minLength 1 + */ + code: string + /** + * 验证码Id + * @minLength 1 + */ + codeId: string + /** + * 密码 + * @minLength 1 + */ + password: string + /** + * 企业名称 + * @minLength 1 + */ + corpName: string +} + +/** 用户菜单 */ +export interface AuthUserMenuOutput { + /** + * 权限Id + * @format int64 + */ + id?: number + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 路由地址 */ + path?: string | null + /** 路由命名 */ + name?: string | null + /** 视图地址 */ + viewPath?: string | null + /** 重定向地址 */ + redirect?: string | null + /** 权限名称 */ + label?: string | null + /** 图标 */ + icon?: string | null + /** 打开 */ + opened?: boolean | null + /** 隐藏 */ + hidden?: boolean + /** 打开新窗口 */ + newWindow?: boolean | null + /** 链接外显 */ + external?: boolean | null + /** 是否缓存 */ + isKeepAlive?: boolean + /** 是否固定 */ + isAffix?: boolean + /** 链接地址 */ + link?: string | null + /** 是否内嵌窗口 */ + isIframe?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number | null +} + +/** 用户个人信息 */ +export interface AuthUserProfileOutput { + /** 账号 */ + userName?: string | null + /** 姓名 */ + name?: string | null + /** 手机号 */ + mobile?: string | null + /** 昵称 */ + nickName?: string | null + /** 头像 */ + avatar?: string | null + /** 企业 */ + corpName?: string | null + /** 职位 */ + position?: string | null + /** 主属部门 */ + deptName?: string | null + /** 水印文案 */ + watermarkText?: string | null +} + +export interface CaptchaData { + id?: string | null + backgroundImage?: string | null + sliderImage?: string | null +} + +/** + * 数据范围:All=1,DeptWithChild=2,Dept=3,Self=4,Custom=5 + * @format int32 + */ +export type DataScope = 1 | 2 | 3 | 4 | 5 + +/** + * MySql=0,SqlServer=1,PostgreSQL=2,Oracle=3,Sqlite=4,OdbcOracle=5,OdbcSqlServer=6,OdbcMySql=7,OdbcPostgreSQL=8,Odbc=9,MsAccess=11,Dameng=12,ShenTong=14,KingbaseES=15,Firebird=16,Custom=17,ClickHouse=18,GBase=19,QuestDb=20,Xugu=21,CustomOracle=22,CustomSqlServer=23,CustomMySql=24,CustomPostgreSQL=25,DuckDB=26,TDengine=27 + * @format int32 + */ +export type DataType = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 + +/** 添加字典 */ +export interface DictAddInput { + /** + * 字典类型Id + * @format int64 + */ + dictTypeId?: number + /** + * 字典名称 + * @minLength 1 + */ + name: string + /** 字典编码 */ + code?: string | null + /** 字典值 */ + value?: string | null + /** 说明 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number | null +} + +/** 字典列表 */ +export interface DictGetListOutput { + /** 字典类型编码 */ + dictTypeCode?: string | null + /** 字典类型名称 */ + dictTypeName?: string | null + /** + * 主键Id + * @format int64 + */ + id?: number + /** 字典名称 */ + name?: string | null + /** 字典编码 */ + code?: string | null + /** 字典值 */ + value?: string | null +} + +/** 字典 */ +export interface DictGetOutput { + /** + * 字典类型Id + * @format int64 + */ + dictTypeId?: number + /** + * 字典名称 + * @minLength 1 + */ + name: string + /** 字典编码 */ + code?: string | null + /** 字典值 */ + value?: string | null + /** 说明 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 字典分页请求 */ +export interface DictGetPageInput { + /** + * 字典类型Id + * @format int64 + */ + dictTypeId?: number + /** 字典名称 */ + name?: string | null +} + +/** 字典分页响应 */ +export interface DictGetPageOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 字典名称 */ + name?: string | null + /** 字典编码 */ + code?: string | null + /** 字典值 */ + value?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number +} + +/** 字典类型 */ +export interface DictTypeAddInput { + /** + * 字典类型名称 + * @minLength 1 + */ + name: string + /** 字典类型编码 */ + code?: string | null + /** 描述 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number +} + +/** 字典类型 */ +export interface DictTypeGetOutput { + /** + * 字典类型名称 + * @minLength 1 + */ + name: string + /** 字典类型编码 */ + code?: string | null + /** 描述 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 字典类型分页请求 */ +export interface DictTypeGetPageInput { + /** 字典名称 */ + name?: string | null +} + +/** 字典类型分页响应 */ +export interface DictTypeGetPageOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 字典名称 */ + name?: string | null + /** 字典编码 */ + code?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number +} + +/** 修改 */ +export interface DictTypeUpdateInput { + /** + * 字典类型名称 + * @minLength 1 + */ + name: string + /** 字典类型编码 */ + code?: string | null + /** 描述 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 修改 */ +export interface DictUpdateInput { + /** + * 字典类型Id + * @format int64 + */ + dictTypeId?: number + /** + * 字典名称 + * @minLength 1 + */ + name: string + /** 字典编码 */ + code?: string | null + /** 字典值 */ + value?: string | null + /** 说明 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 添加分组 */ +export interface DocAddGroupInput { + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 文档类型:Group=1,Markdown=2 */ + type?: DocType + /** 名称 */ + label?: string | null + /** 命名 */ + name?: string | null + /** 打开 */ + opened?: boolean | null +} + +/** 添加图片 */ +export interface DocAddImageInput { + /** + * 用户Id + * @format int64 + */ + documentId?: number + /** 请求路径 */ + url?: string | null +} + +/** 添加菜单 */ +export interface DocAddMenuInput { + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 文档类型:Group=1,Markdown=2 */ + type?: DocType + /** 命名 */ + name?: string | null + /** 名称 */ + label?: string | null + /** 说明 */ + description?: string | null +} + +/** 文档内容 */ +export interface DocGetContentOutput { + /** + * 编号 + * @format int64 + */ + id?: number + /** 名称 */ + label?: string | null + /** 内容 */ + content?: string | null +} + +/** 文档分组 */ +export interface DocGetGroupOutput { + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 文档类型:Group=1,Markdown=2 */ + type?: DocType + /** 名称 */ + label?: string | null + /** 命名 */ + name?: string | null + /** 打开 */ + opened?: boolean | null + /** + * 编号 + * @format int64 + */ + id: number +} + +/** 文档菜单 */ +export interface DocGetMenuOutput { + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 文档类型:Group=1,Markdown=2 */ + type?: DocType + /** 命名 */ + name?: string | null + /** 名称 */ + label?: string | null + /** 说明 */ + description?: string | null + /** + * 编号 + * @format int64 + */ + id: number +} + +/** 文档列表 */ +export interface DocListOutput { + /** + * 编号 + * @format int64 + */ + id?: number + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 名称 */ + label?: string | null + /** 文档类型:Group=1,Markdown=2 */ + type?: DocType + /** 命名 */ + name?: string | null + /** 描述 */ + description?: string | null + /** 组打开 */ + opened?: boolean | null +} + +/** + * 文档类型:Group=1,Markdown=2 + * @format int32 + */ +export type DocType = 1 | 2 + +/** 更新文档内容 */ +export interface DocUpdateContentInput { + /** + * 编号 + * @format int64 + */ + id: number + /** 名称 */ + label?: string | null + /** 内容 */ + content?: string | null + /** Html */ + html?: string | null +} + +/** 更新分组 */ +export interface DocUpdateGroupInput { + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 文档类型:Group=1,Markdown=2 */ + type?: DocType + /** 名称 */ + label?: string | null + /** 命名 */ + name?: string | null + /** 打开 */ + opened?: boolean | null + /** + * 编号 + * @format int64 + */ + id: number +} + +/** 更新菜单 */ +export interface DocUpdateMenuInput { + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 文档类型:Group=1,Markdown=2 */ + type?: DocType + /** 命名 */ + name?: string | null + /** 名称 */ + label?: string | null + /** 说明 */ + description?: string | null + /** + * 编号 + * @format int64 + */ + id: number +} + +export interface DynamicFilterInfo { + field?: string | null + /** Contains=0,StartsWith=1,EndsWith=2,NotContains=3,NotStartsWith=4,NotEndsWith=5,Equal=6,Equals=7,Eq=8,NotEqual=9,GreaterThan=10,GreaterThanOrEqual=11,LessThan=12,LessThanOrEqual=13,Range=14,DateRange=15,Any=16,NotAny=17,Custom=18 */ + operator?: DynamicFilterOperator + value?: any + /** And=0,Or=1 */ + logic?: DynamicFilterLogic + filters?: DynamicFilterInfo[] | null +} + +/** + * And=0,Or=1 + * @format int32 + */ +export type DynamicFilterLogic = 0 | 1 + +/** + * Contains=0,StartsWith=1,EndsWith=2,NotContains=3,NotStartsWith=4,NotEndsWith=5,Equal=6,Equals=7,Eq=8,NotEqual=9,GreaterThan=10,GreaterThanOrEqual=11,LessThan=12,LessThanOrEqual=13,Range=14,DateRange=15,Any=16,NotAny=17,Custom=18 + * @format int32 + */ +export type DynamicFilterOperator = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 + +/** 导出信息输入 */ +export interface ExportInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** 文件名 */ + fileName?: string | null +} + +/** 删除 */ +export interface FileDeleteInput { + /** + * 文件Id + * @format int64 + */ + id: number +} + +/** 文件 */ +export interface FileEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** Invalid=0,Minio=1,Aliyun=2,QCloud=3,Qiniu=4,HuaweiCloud=5,BaiduCloud=6,Ctyun=7 */ + provider?: OSSProvider + /** 存储桶名称 */ + bucketName?: string | null + /** 文件目录 */ + fileDirectory?: string | null + /** + * 文件Guid + * @format uuid + */ + fileGuid?: string + /** 保存文件名 */ + saveFileName?: string | null + /** 文件名 */ + fileName?: string | null + /** 文件扩展名 */ + extension?: string | null + /** + * 文件字节长度 + * @format int64 + */ + size?: number + /** 文件大小格式化 */ + sizeFormat?: string | null + /** 链接地址 */ + linkUrl?: string | null + /** md5码,防止上传重复文件 */ + md5?: string | null +} + +/** 文件分页请求 */ +export interface FileGetPageInput { + /** 文件名 */ + fileName?: string | null +} + +/** 文件分页响应 */ +export interface FileGetPageOutput { + /** + * 文件Id + * @format int64 + */ + id?: number + /** OSS供应商 */ + providerName?: string | null + /** 存储桶名称 */ + bucketName?: string | null + /** 文件目录 */ + fileDirectory?: string | null + /** + * 文件Guid + * @format uuid + */ + fileGuid?: string + /** 文件名 */ + fileName?: string | null + /** 文件扩展名 */ + extension?: string | null + /** 文件大小格式化 */ + sizeFormat?: string | null + /** 链接地址 */ + linkUrl?: string | null + /** 创建者 */ + createdUserName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** 修改者 */ + modifiedUserName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null +} + +/** 导入信息输出 */ +export interface ImportOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** + * 新增数 + * @format int64 + */ + insertCount?: number + /** + * 更新数 + * @format int64 + */ + updateCount?: number +} + +/** 添加 */ +export interface LoginLogAddInput { + /** + * 租户Id + * @format int64 + */ + tenantId?: number | null + /** 姓名 */ + name?: string | null + /** IP */ + ip?: string | null + /** 国家 */ + country?: string | null + /** 省份 */ + province?: string | null + /** 城市 */ + city?: string | null + /** 网络服务商 */ + isp?: string | null + /** + * 耗时(毫秒) + * @format int64 + */ + elapsedMilliseconds?: number + /** 操作状态 */ + status?: boolean | null + /** 操作消息 */ + msg?: string | null + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** 创建者用户名 */ + createdUserName?: string | null + /** 创建者姓名 */ + createdUserRealName?: string | null +} + +/** 分页请求 */ +export interface LoginLogGetPageInput { + /** 创建者 */ + createdUserName?: string | null + /** 操作状态 */ + status?: boolean | null + /** IP */ + ip?: string | null + /** + * 创建开始时间 + * @format date-time + */ + addStartTime?: string | null + /** + * 创建结束时间 + * @format date-time + */ + addEndTime?: string | null +} + +/** 分页响应 */ +export interface LoginLogGetPageOutput { + /** + * 编号 + * @format int64 + */ + id?: number + /** 昵称 */ + nickName?: string | null + /** 创建者 */ + createdUserName?: string | null + /** IP */ + ip?: string | null + /** 国家 */ + country?: string | null + /** 省份 */ + province?: string | null + /** 城市 */ + city?: string | null + /** 网络服务商 */ + isp?: string | null + /** 浏览器 */ + browser?: string | null + /** 操作系统 */ + os?: string | null + /** 设备 */ + device?: string | null + /** + * 耗时(毫秒) + * @format int64 + */ + elapsedMilliseconds?: number + /** 操作状态 */ + status?: boolean + /** 操作消息 */ + msg?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** 添加 */ +export interface MsgAddInput { + /** 标题 */ + title?: string | null + /** 内容 */ + content?: string | null + /** + * 类型Id + * @format int64 + */ + typeId?: number + /** 类型名称 */ + typeName?: string | null + /** 消息状态:Draft=1,Published=2,Scheduled=3,Revoked=4,Archived=5 */ + status?: MsgStatusEnum +} + +/** 添加消息用户列表 */ +export interface MsgAddMsgUserListInput { + /** + * 消息 + * @format int64 + */ + msgId: number + /** 用户 */ + userIds?: number[] | null +} + +/** 消息用户列表 */ +export interface MsgGetMsgUserListOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 姓名 */ + name?: string | null + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** 是否已读 */ + isRead?: boolean + /** + * 已读时间 + * @format date-time + */ + readTime?: string | null +} + +/** 消息 */ +export interface MsgGetOutput { + /** 标题 */ + title?: string | null + /** 内容 */ + content?: string | null + /** + * 类型Id + * @format int64 + */ + typeId?: number + /** 类型名称 */ + typeName?: string | null + /** 消息状态:Draft=1,Published=2,Scheduled=3,Revoked=4,Archived=5 */ + status?: MsgStatusEnum + /** + * 消息Id + * @format int64 + */ + id: number +} + +/** 消息分页请求 */ +export interface MsgGetPageInput { + /** 标题 */ + title?: string | null +} + +/** 消息分页响应 */ +export interface MsgGetPageOutput { + /** + * 消息Id + * @format int64 + */ + id?: number + /** 标题 */ + title?: string | null + /** + * 类型Id + * @format int64 + */ + typeId?: number + /** 类型名称 */ + typeName?: string | null + /** 消息状态:Draft=1,Published=2,Scheduled=3,Revoked=4,Archived=5 */ + status?: MsgStatusEnum + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** + * 消息状态:Draft=1,Published=2,Scheduled=3,Revoked=4,Archived=5 + * @format int32 + */ +export type MsgStatusEnum = 1 | 2 | 3 | 4 | 5 + +/** 添加 */ +export interface MsgTypeAddInput { + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 说明 */ + description?: string | null +} + +/** 查询列表响应 */ +export interface MsgTypeGetListOutput { + /** + * 主键 + * @format int64 + */ + id?: number + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 描述 */ + description?: string | null +} + +/** 消息类型 */ +export interface MsgTypeGetOutput { + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 说明 */ + description?: string | null + /** + * 消息分类Id + * @format int64 + */ + id: number +} + +/** 修改 */ +export interface MsgTypeUpdateInput { + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 说明 */ + description?: string | null + /** + * 消息分类Id + * @format int64 + */ + id: number +} + +/** 修改 */ +export interface MsgUpdateInput { + /** 标题 */ + title?: string | null + /** 内容 */ + content?: string | null + /** + * 类型Id + * @format int64 + */ + typeId?: number + /** 类型名称 */ + typeName?: string | null + /** 消息状态:Draft=1,Published=2,Scheduled=3,Revoked=4,Archived=5 */ + status?: MsgStatusEnum + /** + * 消息Id + * @format int64 + */ + id: number +} + +/** + * Invalid=0,Minio=1,Aliyun=2,QCloud=3,Qiniu=4,HuaweiCloud=5,BaiduCloud=6,Ctyun=7 + * @format int32 + */ +export type OSSProvider = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 + +/** 添加 */ +export interface OperationLogAddInput { + /** 姓名 */ + name?: string | null + /** 接口名称 */ + apiLabel?: string | null + /** 接口地址 */ + apiPath?: string | null + /** 接口提交方法 */ + apiMethod?: string | null + /** IP */ + ip?: string | null + /** 国家 */ + country?: string | null + /** 省份 */ + province?: string | null + /** 城市 */ + city?: string | null + /** 网络服务商 */ + isp?: string | null + /** 浏览器 */ + browser?: string | null + /** 操作系统 */ + os?: string | null + /** 设备 */ + device?: string | null + /** 浏览器信息 */ + browserInfo?: string | null + /** + * 耗时(毫秒) + * @format int64 + */ + elapsedMilliseconds?: number + /** 操作状态 */ + status?: boolean | null + /** 操作消息 */ + msg?: string | null + /** 操作参数 */ + params?: string | null + /** + * 状态码 + * @format int32 + */ + statusCode?: number | null + /** 操作结果 */ + result?: string | null +} + +/** 查询分页请求 */ +export interface OperationLogGetPageInput { + /** 创建者 */ + createdUserName?: string | null + /** 操作状态 */ + status?: boolean | null + /** 操作接口 */ + api?: string | null + /** IP */ + ip?: string | null + /** + * 创建开始时间 + * @format date-time + */ + addStartTime?: string | null + /** + * 创建结束时间 + * @format date-time + */ + addEndTime?: string | null +} + +/** 查询分页响应 */ +export interface OperationLogGetPageOutput { + /** + * 编号 + * @format int64 + */ + id?: number + /** 昵称 */ + nickName?: string | null + /** 接口名称 */ + apiLabel?: string | null + /** 接口地址 */ + apiPath?: string | null + /** 接口提交方法 */ + apiMethod?: string | null + /** IP */ + ip?: string | null + /** 国家 */ + country?: string | null + /** 省份 */ + province?: string | null + /** 城市 */ + city?: string | null + /** 网络服务商 */ + isp?: string | null + /** 浏览器 */ + browser?: string | null + /** 操作系统 */ + os?: string | null + /** 设备 */ + device?: string | null + /** + * 耗时(毫秒) + * @format int64 + */ + elapsedMilliseconds?: number + /** 操作状态 */ + status?: boolean + /** + * 状态码 + * @format int32 + */ + statusCode?: number | null + /** 操作消息 */ + msg?: string | null + /** 请求参数 */ + params?: string | null + /** 响应结果 */ + result?: string | null + /** 创建者 */ + createdUserName?: string | null + /** 创建者姓名 */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** 添加 */ +export interface OrgAddInput { + /** + * 父级 + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 值 */ + value?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 描述 */ + description?: string | null +} + +/** 组织架构 */ +export interface OrgEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** + * 租户Id + * @format int64 + */ + tenantId?: number | null + /** + * 父级 + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 值 */ + value?: string | null + /** + * 成员数 + * @format int32 + */ + memberCount?: number + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 描述 */ + description?: string | null + /** 员工列表 */ + staffs?: UserStaffEntity[] | null + /** 用户列表 */ + users?: UserEntity[] | null + /** 角色列表 */ + roles?: RoleEntity[] | null + /** 子级列表 */ + childs?: OrgEntity[] | null +} + +/** 部门列表 */ +export interface OrgGetListOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 父级 + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 值 */ + value?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 描述 */ + description?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** 部门 */ +export interface OrgGetOutput { + /** + * 父级 + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 值 */ + value?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 描述 */ + description?: string | null + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 部门路径列表 */ +export interface OrgGetSimpleListWithPathOutput { + /** + * 部门Id + * @format int64 + */ + id?: number + /** 部门路径 */ + path?: string | null +} + +/** 修改 */ +export interface OrgUpdateInput { + /** + * 父级 + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 值 */ + value?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 描述 */ + description?: string | null + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 分页信息输入 */ +export interface PageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number +} + +/** 分页信息输入 */ +export interface PageInputApiGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 查询分页 */ + filter?: ApiGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputDictGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 字典分页请求 */ + filter?: DictGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputDictTypeGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 字典类型分页请求 */ + filter?: DictTypeGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputFileGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 文件分页请求 */ + filter?: FileGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputLoginLogGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 分页请求 */ + filter?: LoginLogGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputMsgGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 消息分页请求 */ + filter?: MsgGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputOperationLogGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 查询分页请求 */ + filter?: OperationLogGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputPkgGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 套餐分页请求 */ + filter?: PkgGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputPkgGetPkgTenantListInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 套餐租户列表请求 */ + filter?: PkgGetPkgTenantListInput +} + +/** 分页信息输入 */ +export interface PageInputPrintTemplateGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 分页请求 */ + filter?: PrintTemplateGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputRegionGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 地区分页请求 */ + filter?: RegionGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputRoleGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 角色分页请求 */ + filter?: RoleGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputSiteMsgGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 站点消息分页请求 */ + filter?: SiteMsgGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputTaskGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 任务分页请求 */ + filter?: TaskGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputTaskLogGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 任务日志分页请求 */ + filter?: TaskLogGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputTenantGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 租户分页请求 */ + filter?: TenantGetPageInput +} + +/** 分页信息输入 */ +export interface PageInputUserGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 用户分页查询条件 */ + filter?: UserGetPageInput +} + +/** 分页信息输出 */ +export interface PageOutputApiEntity { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: ApiEntity[] | null +} + +/** 分页信息输出 */ +export interface PageOutputDictGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: DictGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputDictTypeGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: DictTypeGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputFileGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: FileGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputLoginLogGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: LoginLogGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputMsgGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: MsgGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputOperationLogGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: OperationLogGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputPkgGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: PkgGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputPkgGetPkgTenantListOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: PkgGetPkgTenantListOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputPrintTemplateGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: PrintTemplateGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputRegionGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: RegionGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputRoleGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: RoleGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputSiteMsgGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: SiteMsgGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputTaskGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: TaskGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputTaskLog { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: TaskLog[] | null +} + +/** 分页信息输出 */ +export interface PageOutputTenantGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: TenantGetPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputUserGetDeletedUserPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: UserGetDeletedUserPageOutput[] | null +} + +/** 分页信息输出 */ +export interface PageOutputUserGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: UserGetPageOutput[] | null +} + +/** + * 密码加密类型:MD5Encrypt32=0,PasswordHasher=1 + * @format int32 + */ +export type PasswordEncryptType = 0 | 1 + +/** 添加权限点 */ +export interface PermissionAddDotInput { + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 关联接口 */ + apiIds?: number[] | null + /** 权限名称 */ + label?: string | null + /** 权限编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** 图标 */ + icon?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean +} + +/** 条件分组 */ +export interface PermissionAddGroupInput { + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** + * 视图 + * @format int64 + */ + viewId?: number | null + /** 路由命名 */ + name?: string | null + /** 访问路由地址 */ + path?: string | null + /** 重定向地址 */ + redirect?: string | null + /** 权限名称 */ + label?: string | null + /** 隐藏 */ + hidden?: boolean + /** 图标 */ + icon?: string | null + /** 展开 */ + opened?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean +} + +/** 添加菜单 */ +export interface PermissionAddMenuInput { + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** + * 视图 + * @format int64 + */ + viewId?: number | null + /** 路由命名 */ + name?: string | null + /** 路由地址 */ + path?: string | null + /** 权限名称 */ + label?: string | null + /** 说明 */ + description?: string | null + /** 隐藏 */ + hidden?: boolean + /** 图标 */ + icon?: string | null + /** 打开新窗口 */ + newWindow?: boolean + /** 链接外显 */ + external?: boolean + /** 是否缓存 */ + isKeepAlive?: boolean + /** 是否固定 */ + isAffix?: boolean + /** 链接地址 */ + link?: string | null + /** 是否内嵌窗口 */ + isIframe?: boolean + /** 是否系统权限 */ + isSystem?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean +} + +/** 权限分配 */ +export interface PermissionAssignInput { + /** 平台 */ + platform?: string | null + /** @format int64 */ + roleId: number + permissionIds: number[] +} + +/** 权限 */ +export interface PermissionEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 权限名称 */ + label?: string | null + /** 权限编码 */ + code?: string | null + /** 权限类型:Group=1,Menu=2,Dot=3 */ + type?: PermissionType + /** + * 视图Id + * @format int64 + */ + viewId?: number | null + /** 视图管理 */ + view?: ViewEntity + /** 路由命名 */ + name?: string | null + /** 路由地址 */ + path?: string | null + /** 重定向地址 */ + redirect?: string | null + /** 图标 */ + icon?: string | null + /** 隐藏 */ + hidden?: boolean + /** 展开分组 */ + opened?: boolean + /** 打开新窗口 */ + newWindow?: boolean + /** 链接外显 */ + external?: boolean + /** 是否缓存 */ + isKeepAlive?: boolean + /** 是否固定 */ + isAffix?: boolean + /** 链接地址 */ + link?: string | null + /** 是否内嵌窗口 */ + isIframe?: boolean + /** 是否系统权限 */ + isSystem?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 描述 */ + description?: string | null + /** 启用 */ + enabled?: boolean + apis?: ApiEntity[] | null + childs?: PermissionEntity[] | null +} + +/** 权限点 */ +export interface PermissionGetDotOutput { + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 关联接口 */ + apiIds?: number[] | null + /** 权限名称 */ + label?: string | null + /** 权限编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** 图标 */ + icon?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 权限Id + * @format int64 + */ + id: number +} + +/** 权限分组 */ +export interface PermissionGetGroupOutput { + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** + * 视图 + * @format int64 + */ + viewId?: number | null + /** 路由命名 */ + name?: string | null + /** 访问路由地址 */ + path?: string | null + /** 重定向地址 */ + redirect?: string | null + /** 权限名称 */ + label?: string | null + /** 隐藏 */ + hidden?: boolean + /** 图标 */ + icon?: string | null + /** 展开 */ + opened?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 权限Id + * @format int64 + */ + id: number +} + +/** 查询列表 */ +export interface PermissionGetListInput { + /** 平台 */ + platform?: string | null + /** 路由地址 */ + path?: string | null + /** 权限名称 */ + label?: string | null +} + +/** 权限列表 */ +export interface PermissionGetListOutput { + /** + * 权限Id + * @format int64 + */ + id?: number + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 权限名称 */ + label?: string | null + /** 权限类型:Group=1,Menu=2,Dot=3 */ + type?: PermissionType + /** 路由地址 */ + path?: string | null + /** 重定向地址 */ + redirect?: string | null + /** 视图地址 */ + viewPath?: string | null + /** 链接地址 */ + link?: string | null + /** 接口路径 */ + apiPaths?: string | null + /** 图标 */ + icon?: string | null + /** 展开 */ + opened?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** 描述 */ + description?: string | null + /** 启用 */ + enabled?: boolean +} + +/** 权限菜单 */ +export interface PermissionGetMenuOutput { + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** + * 视图 + * @format int64 + */ + viewId?: number | null + /** 路由命名 */ + name?: string | null + /** 路由地址 */ + path?: string | null + /** 权限名称 */ + label?: string | null + /** 说明 */ + description?: string | null + /** 隐藏 */ + hidden?: boolean + /** 图标 */ + icon?: string | null + /** 打开新窗口 */ + newWindow?: boolean + /** 链接外显 */ + external?: boolean + /** 是否缓存 */ + isKeepAlive?: boolean + /** 是否固定 */ + isAffix?: boolean + /** 链接地址 */ + link?: string | null + /** 是否内嵌窗口 */ + isIframe?: boolean + /** 是否系统权限 */ + isSystem?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 权限Id + * @format int64 + */ + id: number +} + +/** 权限列表 */ +export interface PermissionGetPermissionListOutput { + /** + * 权限Id + * @format int64 + */ + id?: number + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 权限名称 */ + label?: string | null + /** 行显示 */ + row?: boolean + /** 权限列表 */ + children?: PermissionGetPermissionListOutput[] | null +} + +/** + * 权限类型:Group=1,Menu=2,Dot=3 + * @format int32 + */ +export type PermissionType = 1 | 2 | 3 + +/** 修改权限点 */ +export interface PermissionUpdateDotInput { + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** 关联接口 */ + apiIds?: number[] | null + /** 权限名称 */ + label?: string | null + /** 权限编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** 图标 */ + icon?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 权限Id + * @format int64 + */ + id: number +} + +/** 修改权限分组 */ +export interface PermissionUpdateGroupInput { + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** + * 视图 + * @format int64 + */ + viewId?: number | null + /** 路由命名 */ + name?: string | null + /** 访问路由地址 */ + path?: string | null + /** 重定向地址 */ + redirect?: string | null + /** 权限名称 */ + label?: string | null + /** 隐藏 */ + hidden?: boolean + /** 图标 */ + icon?: string | null + /** 展开 */ + opened?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 权限Id + * @format int64 + */ + id: number +} + +/** 修改权限菜单 */ +export interface PermissionUpdateMenuInput { + /** 平台 */ + platform?: string | null + /** + * 父级节点 + * @format int64 + */ + parentId?: number + /** + * 视图 + * @format int64 + */ + viewId?: number | null + /** 路由命名 */ + name?: string | null + /** 路由地址 */ + path?: string | null + /** 权限名称 */ + label?: string | null + /** 说明 */ + description?: string | null + /** 隐藏 */ + hidden?: boolean + /** 图标 */ + icon?: string | null + /** 打开新窗口 */ + newWindow?: boolean + /** 链接外显 */ + external?: boolean + /** 是否缓存 */ + isKeepAlive?: boolean + /** 是否固定 */ + isAffix?: boolean + /** 链接地址 */ + link?: string | null + /** 是否内嵌窗口 */ + isIframe?: boolean + /** 是否系统权限 */ + isSystem?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 权限Id + * @format int64 + */ + id: number +} + +/** 添加 */ +export interface PkgAddInput { + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean +} + +/** 添加套餐租户列表 */ +export interface PkgAddPkgTenantListInput { + /** + * 套餐 + * @format int64 + */ + pkgId: number + /** 租户列表 */ + tenantIds?: number[] | null +} + +/** 套餐 */ +export interface PkgEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 子级列表 */ + childs?: PkgEntity[] | null + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 租户列表 */ + tenants?: TenantEntity[] | null + /** 权限列表 */ + permissions?: PermissionEntity[] | null +} + +/** 套餐列表响应 */ +export interface PkgGetListOutput { + /** + * 主键 + * @format int64 + */ + id?: number + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 描述 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** 套餐 */ +export interface PkgGetOutput { + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 套餐Id + * @format int64 + */ + id: number +} + +/** 套餐分页请求 */ +export interface PkgGetPageInput { + /** 名称 */ + name?: string | null +} + +/** 套餐分页响应 */ +export interface PkgGetPageOutput { + /** + * 主键 + * @format int64 + */ + id?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** 套餐租户列表请求 */ +export interface PkgGetPkgTenantListInput { + /** 租户名 */ + tenantName?: string | null + /** + * 套餐Id + * @format int64 + */ + pkgId?: number | null +} + +/** 套餐租户列表响应 */ +export interface PkgGetPkgTenantListOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 租户名 */ + name?: string | null + /** 租户编码 */ + code?: string | null +} + +/** 设置套餐权限 */ +export interface PkgSetPkgPermissionsInput { + /** 平台 */ + platform?: string | null + /** @format int64 */ + pkgId: number + permissionIds: number[] +} + +/** 修改 */ +export interface PkgUpdateInput { + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** + * 套餐Id + * @format int64 + */ + id: number +} + +/** 添加 */ +export interface PrintTemplateAddInput { + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number +} + +/** 表单响应 */ +export interface PrintTemplateGetOutput { + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** + * 打印模板Id + * @format int64 + */ + id: number + /** + * 版本 + * @format int64 + */ + version?: number +} + +/** 分页请求 */ +export interface PrintTemplateGetPageInput { + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null +} + +/** 分页响应 */ +export interface PrintTemplateGetPageOutput { + /** + * 打印模板Id + * @format int64 + */ + id?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** + * 版本 + * @format int64 + */ + version?: number +} + +/** 修改模板响应 */ +export interface PrintTemplateGetUpdateTemplateOutput { + /** + * 打印模板Id + * @format int64 + */ + id: number + /** 模板 */ + template?: string | null + /** 打印数据 */ + printData?: string | null + /** + * 版本 + * @format int64 + */ + version?: number +} + +/** 设置启用 */ +export interface PrintTemplateSetEnableInput { + /** + * 打印模板Id + * @format int64 + */ + printTemplateId?: number + /** 是否启用 */ + enabled?: boolean +} + +/** 修改 */ +export interface PrintTemplateUpdateInput { + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** + * 打印模板Id + * @format int64 + */ + id: number + /** + * 版本 + * @format int64 + */ + version?: number +} + +/** 修改模板 */ +export interface PrintTemplateUpdateTemplateInput { + /** + * 打印模板Id + * @format int64 + */ + id: number + /** 模板 */ + template?: string | null + /** 打印数据 */ + printData?: string | null + /** + * 版本 + * @format int64 + */ + version?: number +} + +/** 项目配置 */ +export interface ProjectConfig { + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 版本 */ + version?: string | null + /** 描述 */ + description?: string | null +} + +/** 添加 */ +export interface RegionAddInput { + /** + * 上级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 简称 */ + shortName?: string | null + /** 地区级别:Province=1,City=2,County=3,Town(镇/乡)=4,Vilage(村/社区)=5 */ + level?: RegionLevel + /** 代码 */ + code?: string | null + /** 驻地 */ + capital?: string | null + /** + * 人口(万人) + * @format int32 + */ + population?: number | null + /** + * 面积(平方千米) + * @format int32 + */ + area?: number | null + /** 区号 */ + areaCode?: string | null + /** 邮编 */ + zipCode?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** 热门 */ + hot?: boolean + /** 启用 */ + enabled?: boolean +} + +/** 下级列表 */ +export interface RegionGetChildListOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 名称 */ + name?: string | null + /** 地区级别:Province=1,City=2,County=3,Town(镇/乡)=4,Vilage(村/社区)=5 */ + level?: RegionLevel + /** 拼音 */ + pinyin?: string | null + /** 拼音首字母 */ + pinyinFirst?: string | null + /** 启用 */ + enabled?: boolean + /** 热门 */ + hot?: boolean + /** 叶子节点 */ + leaf?: boolean +} + +/** 地区列表请求 */ +export interface RegionGetListInput { + /** + * 上级Id + * @format int64 + */ + parentId?: number + /** 热门 */ + hot?: boolean | null + /** 启用 */ + enabled?: boolean | null +} + +/** 地区 */ +export interface RegionGetOutput { + /** + * 上级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 简称 */ + shortName?: string | null + /** 地区级别:Province=1,City=2,County=3,Town(镇/乡)=4,Vilage(村/社区)=5 */ + level?: RegionLevel + /** 代码 */ + code?: string | null + /** 驻地 */ + capital?: string | null + /** + * 人口(万人) + * @format int32 + */ + population?: number | null + /** + * 面积(平方千米) + * @format int32 + */ + area?: number | null + /** 区号 */ + areaCode?: string | null + /** 邮编 */ + zipCode?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** 热门 */ + hot?: boolean + /** 启用 */ + enabled?: boolean + /** + * 主键Id + * @format int64 + */ + id: number + /** 上级Id列表 */ + parentIdList?: number[] | null +} + +/** 地区分页请求 */ +export interface RegionGetPageInput { + /** + * 上级Id + * @format int64 + */ + parentId?: number | null + /** 名称 */ + name?: string | null + /** 地区级别:Province=1,City=2,County=3,Town(镇/乡)=4,Vilage(村/社区)=5 */ + level?: RegionLevel + /** 热门 */ + hot?: boolean | null + /** 启用 */ + enabled?: boolean | null +} + +/** 地区分页响应 */ +export interface RegionGetPageOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 上级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 简称 */ + shortName?: string | null + /** 地区级别:Province=1,City=2,County=3,Town(镇/乡)=4,Vilage(村/社区)=5 */ + level?: RegionLevel + /** 代码 */ + code?: string | null + /** 拼音 */ + pinyin?: string | null + /** 拼音首字母 */ + pinyinFirst?: string | null + /** 驻地 */ + capital?: string | null + /** + * 人口(万人) + * @format int32 + */ + population?: number | null + /** + * 面积(平方千米) + * @format int32 + */ + area?: number | null + /** 区号 */ + areaCode?: string | null + /** 邮编 */ + zipCode?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** 热门 */ + hot?: boolean + /** 启用 */ + enabled?: boolean +} + +/** + * 地区级别:Province=1,City=2,County=3,Town(镇/乡)=4,Vilage(村/社区)=5 + * @format int32 + */ +export type RegionLevel = 1 | 2 | 3 | 4 | 5 + +/** 设置启用 */ +export interface RegionSetEnableInput { + /** + * 地区Id + * @format int64 + */ + regionId?: number + /** 是否启用 */ + enabled?: boolean +} + +/** 设置热门 */ +export interface RegionSetHotInput { + /** + * 地区Id + * @format int64 + */ + regionId?: number + /** 热门 */ + hot?: boolean +} + +/** 修改 */ +export interface RegionUpdateInput { + /** + * 上级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 简称 */ + shortName?: string | null + /** 地区级别:Province=1,City=2,County=3,Town(镇/乡)=4,Vilage(村/社区)=5 */ + level?: RegionLevel + /** 代码 */ + code?: string | null + /** 驻地 */ + capital?: string | null + /** + * 人口(万人) + * @format int32 + */ + population?: number | null + /** + * 面积(平方千米) + * @format int32 + */ + area?: number | null + /** 区号 */ + areaCode?: string | null + /** 邮编 */ + zipCode?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** 热门 */ + hot?: boolean + /** 启用 */ + enabled?: boolean + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 结果输出 */ +export interface ResultOutputApiGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 接口 */ + data?: ApiGetOutput +} + +/** 结果输出 */ +export interface ResultOutputAuthGetPasswordEncryptKeyOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 查询密钥 */ + data?: AuthGetPasswordEncryptKeyOutput +} + +/** 结果输出 */ +export interface ResultOutputAuthGetUserInfoOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 用户信息 */ + data?: AuthGetUserInfoOutput +} + +/** 结果输出 */ +export interface ResultOutputAuthGetUserPermissionsOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 用户权限 */ + data?: AuthGetUserPermissionsOutput +} + +/** 结果输出 */ +export interface ResultOutputAuthUserProfileOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 用户个人信息 */ + data?: AuthUserProfileOutput +} + +/** 结果输出 */ +export interface ResultOutputBoolean { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: boolean +} + +/** 结果输出 */ +export interface ResultOutputCaptchaData { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + data?: CaptchaData +} + +/** 结果输出 */ +export interface ResultOutputDictGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 字典 */ + data?: DictGetOutput +} + +/** 结果输出 */ +export interface ResultOutputDictTypeGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 字典类型 */ + data?: DictTypeGetOutput +} + +/** 结果输出 */ +export interface ResultOutputDictionaryStringListDictGetListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: Record +} + +/** 结果输出 */ +export interface ResultOutputDocGetContentOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 文档内容 */ + data?: DocGetContentOutput +} + +/** 结果输出 */ +export interface ResultOutputDocGetGroupOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 文档分组 */ + data?: DocGetGroupOutput +} + +/** 结果输出 */ +export interface ResultOutputDocGetMenuOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 文档菜单 */ + data?: DocGetMenuOutput +} + +/** 结果输出 */ +export interface ResultOutputFileEntity { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 文件 */ + data?: FileEntity +} + +/** 结果输出 */ +export interface ResultOutputIEnumerableObject { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: any[] | null +} + +/** 结果输出 */ +export interface ResultOutputImportOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 导入信息输出 */ + data?: ImportOutput +} + +/** 结果输出 */ +export interface ResultOutputInt64 { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** + * 数据 + * @format int64 + */ + data?: number +} + +/** 结果输出 */ +export interface ResultOutputListApiGetListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: ApiGetListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListAuthUserMenuOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: AuthUserMenuOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListDocListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: DocListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListFileEntity { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: FileEntity[] | null +} + +/** 结果输出 */ +export interface ResultOutputListInt64 { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: number[] | null +} + +/** 结果输出 */ +export interface ResultOutputListMsgGetMsgUserListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: MsgGetMsgUserListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListMsgTypeGetListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: MsgTypeGetListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListObject { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: any[] | null +} + +/** 结果输出 */ +export interface ResultOutputListOrgGetListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: OrgGetListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListOrgGetSimpleListWithPathOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: OrgGetSimpleListWithPathOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListPermissionGetListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: PermissionGetListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListPermissionGetPermissionListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: PermissionGetPermissionListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListPkgGetListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: PkgGetListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListPkgGetPkgTenantListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: PkgGetPkgTenantListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListProjectConfig { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: ProjectConfig[] | null +} + +/** 结果输出 */ +export interface ResultOutputListRegionGetChildListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: RegionGetChildListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListRoleGetListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: RoleGetListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListRoleGetRoleUserListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: RoleGetRoleUserListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputListString { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: string[] | null +} + +/** 结果输出 */ +export interface ResultOutputListViewGetListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: ViewGetListOutput[] | null +} + +/** 结果输出 */ +export interface ResultOutputMsgGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 消息 */ + data?: MsgGetOutput +} + +/** 结果输出 */ +export interface ResultOutputMsgTypeGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 消息类型 */ + data?: MsgTypeGetOutput +} + +/** 结果输出 */ +export interface ResultOutputObject { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: any +} + +/** 结果输出 */ +export interface ResultOutputOrgGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 部门 */ + data?: OrgGetOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputApiEntity { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputApiEntity +} + +/** 结果输出 */ +export interface ResultOutputPageOutputDictGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputDictGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputDictTypeGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputDictTypeGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputFileGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputFileGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputLoginLogGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputLoginLogGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputMsgGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputMsgGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputOperationLogGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputOperationLogGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputPkgGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputPkgGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputPkgGetPkgTenantListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputPkgGetPkgTenantListOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputPrintTemplateGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputPrintTemplateGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputRegionGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputRegionGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputRoleGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputRoleGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputSiteMsgGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputSiteMsgGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputTaskGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputTaskGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputTaskLog { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputTaskLog +} + +/** 结果输出 */ +export interface ResultOutputPageOutputTenantGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputTenantGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputUserGetDeletedUserPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputUserGetDeletedUserPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPageOutputUserGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputUserGetPageOutput +} + +/** 结果输出 */ +export interface ResultOutputPermissionGetDotOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 权限点 */ + data?: PermissionGetDotOutput +} + +/** 结果输出 */ +export interface ResultOutputPermissionGetGroupOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 权限分组 */ + data?: PermissionGetGroupOutput +} + +/** 结果输出 */ +export interface ResultOutputPermissionGetMenuOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 权限菜单 */ + data?: PermissionGetMenuOutput +} + +/** 结果输出 */ +export interface ResultOutputPkgGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 套餐 */ + data?: PkgGetOutput +} + +/** 结果输出 */ +export interface ResultOutputPrintTemplateGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 表单响应 */ + data?: PrintTemplateGetOutput +} + +/** 结果输出 */ +export interface ResultOutputPrintTemplateGetUpdateTemplateOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 修改模板响应 */ + data?: PrintTemplateGetUpdateTemplateOutput +} + +/** 结果输出 */ +export interface ResultOutputRegionGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 地区 */ + data?: RegionGetOutput +} + +/** 结果输出 */ +export interface ResultOutputRoleGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 角色 */ + data?: RoleGetOutput +} + +/** 结果输出 */ +export interface ResultOutputSiteMsgGetContentOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 消息内容 */ + data?: SiteMsgGetContentOutput +} + +/** 结果输出 */ +export interface ResultOutputString { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: string | null +} + +/** 结果输出 */ +export interface ResultOutputTaskGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 任务 */ + data?: TaskGetOutput +} + +/** 结果输出 */ +export interface ResultOutputTenantGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + data?: TenantGetOutput +} + +/** 结果输出 */ +export interface ResultOutputTokenInfo { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 令牌信息 */ + data?: TokenInfo +} + +/** 结果输出 */ +export interface ResultOutputUserGetBasicOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 用户基本信息 */ + data?: UserGetBasicOutput +} + +/** 结果输出 */ +export interface ResultOutputUserGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 用户 */ + data?: UserGetOutput +} + +/** 结果输出 */ +export interface ResultOutputUserGetPermissionOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 用户权限 */ + data?: UserGetPermissionOutput +} + +/** 结果输出 */ +export interface ResultOutputValidateResult { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + data?: ValidateResult +} + +/** 结果输出 */ +export interface ResultOutputViewGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 视图 */ + data?: ViewGetOutput +} + +/** 添加 */ +export interface RoleAddInput { + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 角色类型:Group=1,Role=2 */ + type?: RoleType + /** 数据范围:All=1,DeptWithChild=2,Dept=3,Self=4,Custom=5 */ + dataScope?: DataScope + /** 指定部门 */ + orgIds?: number[] | null + /** 部门列表 */ + orgs?: OrgEntity[] | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number +} + +/** 添加角色用户列表 */ +export interface RoleAddRoleUserListInput { + /** + * 角色 + * @format int64 + */ + roleId: number + /** 用户 */ + userIds?: number[] | null +} + +/** 角色 */ +export interface RoleEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** + * 租户Id + * @format int64 + */ + tenantId?: number | null + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 子级列表 */ + childs?: RoleEntity[] | null + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 角色类型:Group=1,Role=2 */ + type?: RoleType + /** 数据范围:All=1,DeptWithChild=2,Dept=3,Self=4,Custom=5 */ + dataScope?: DataScope + /** 说明 */ + description?: string | null + /** 隐藏 */ + hidden?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 用户列表 */ + users?: UserEntity[] | null + /** 部门列表 */ + orgs?: OrgEntity[] | null + /** 权限列表 */ + permissions?: PermissionEntity[] | null +} + +/** 角色列表响应 */ +export interface RoleGetListOutput { + /** + * 主键 + * @format int64 + */ + id?: number + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 角色类型:Group=1,Role=2 */ + type?: RoleType + /** + * 排序 + * @format int32 + */ + sort?: number + /** 描述 */ + description?: string | null +} + +/** 角色 */ +export interface RoleGetOutput { + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 角色类型:Group=1,Role=2 */ + type?: RoleType + /** 数据范围:All=1,DeptWithChild=2,Dept=3,Self=4,Custom=5 */ + dataScope?: DataScope + /** 指定部门 */ + orgIds?: number[] | null + /** 部门列表 */ + orgs?: OrgEntity[] | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** + * 角色Id + * @format int64 + */ + id: number +} + +/** 角色分页请求 */ +export interface RoleGetPageInput { + /** 名称 */ + name?: string | null +} + +/** 角色分页响应 */ +export interface RoleGetPageOutput { + /** + * 主键 + * @format int64 + */ + id?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 说明 */ + description?: string | null + /** 隐藏 */ + hidden?: boolean + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** 角色用户列表响应 */ +export interface RoleGetRoleUserListOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 姓名 */ + name?: string | null + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null +} + +/** 设置数据范围 */ +export interface RoleSetDataScopeInput { + /** + * 角色Id + * @format int64 + */ + roleId: number + /** 数据范围:All=1,DeptWithChild=2,Dept=3,Self=4,Custom=5 */ + dataScope?: DataScope + /** 指定部门 */ + orgIds?: number[] | null +} + +/** + * 角色类型:Group=1,Role=2 + * @format int32 + */ +export type RoleType = 1 | 2 + +/** 修改 */ +export interface RoleUpdateInput { + /** + * 父级Id + * @format int64 + */ + parentId?: number + /** 名称 */ + name?: string | null + /** 编码 */ + code?: string | null + /** 角色类型:Group=1,Role=2 */ + type?: RoleType + /** 数据范围:All=1,DeptWithChild=2,Dept=3,Self=4,Custom=5 */ + dataScope?: DataScope + /** 指定部门 */ + orgIds?: number[] | null + /** 部门列表 */ + orgs?: OrgEntity[] | null + /** 说明 */ + description?: string | null + /** + * 排序 + * @format int32 + */ + sort?: number + /** + * 角色Id + * @format int64 + */ + id: number +} + +/** 发送邮箱验证码 */ +export interface SendEmailCodeInput { + /** + * 邮箱地址 + * @minLength 1 + */ + email: string + /** 验证码Id */ + codeId?: string | null + /** + * 验证码Id + * @minLength 1 + */ + captchaId: string + track: SlideTrack +} + +/** 发送短信验证码 */ +export interface SendSmsCodeInput { + /** + * 手机号 + * @minLength 1 + */ + mobile: string + /** 验证码Id */ + codeId?: string | null + /** + * 验证码Id + * @minLength 1 + */ + captchaId: string + track: SlideTrack +} + +/** + * 性别:Unknown(未知)=0,Male(男)=1,Female(女)=2 + * @format int32 + */ +export type Sex = 0 | 1 | 2 + +/** 消息内容 */ +export interface SiteMsgGetContentOutput { + /** + * 消息Id + * @format int64 + */ + msgId?: number + /** 标题 */ + title?: string | null + /** 类型名称 */ + typeName?: string | null + /** 内容 */ + content?: string | null + /** + * 接收时间 + * @format date-time + */ + receivedTime?: string | null + /** 是否已读 */ + isRead?: boolean | null +} + +/** 站点消息分页请求 */ +export interface SiteMsgGetPageInput { + /** 是否已读 */ + isRead?: boolean | null + /** + * 分类Id + * @format int64 + */ + typeId?: number | null + /** 标题 */ + title?: string | null +} + +/** 站点消息分页响应 */ +export interface SiteMsgGetPageOutput { + /** + * 唯一Id + * @format int64 + */ + id?: number + /** + * 消息Id + * @format int64 + */ + msgId?: number + /** 标题 */ + title?: string | null + /** + * 类型Id + * @format int64 + */ + typeId?: number + /** 类型名称 */ + typeName?: string | null + /** 是否已读 */ + isRead?: boolean | null + /** + * 接收时间 + * @format date-time + */ + receivedTime?: string | null +} + +export interface SlideTrack { + /** @format int32 */ + backgroundImageWidth?: number + /** @format int32 */ + backgroundImageHeight?: number + /** @format int32 */ + sliderImageWidth?: number + /** @format int32 */ + sliderImageHeight?: number + /** @format date-time */ + startTime?: string + /** @format date-time */ + endTime?: string + tracks?: Track[] | null + /** @format float */ + percent?: number +} + +/** 排序 */ +export interface SortInput { + /** 属性名称 */ + propName?: string | null + /** 排序方式:Asc=0,Desc=1 */ + order?: SortOrder + /** 是否升序 */ + isAscending?: boolean | null +} + +/** + * 排序方式:Asc=0,Desc=1 + * @format int32 + */ +export type SortOrder = 0 | 1 + +/** 员工添加 */ +export interface StaffAddInput { + /** 工号 */ + jobNumber?: string | null + /** 职位 */ + position?: string | null + /** 性别:Unknown(未知)=0,Male(男)=1,Female(女)=2 */ + sex?: Sex + /** + * 入职时间 + * @format date-time + */ + entryTime?: string | null + /** 企业微信名片 */ + workWeChatCard?: string | null + /** 个人简介 */ + introduce?: string | null +} + +/** 添加 */ +export interface TaskAddInput { + /** 任务标题 */ + topic?: string | null + /** 任务参数 */ + body?: string | null + /** + * 任务执行多少轮,-1为永久循环 + * @format int32 + */ + round?: number + /** SEC=1,RunOnDay=11,RunOnWeek=12,RunOnMonth=13,Custom=21 */ + interval?: TaskInterval + /** 定时参数 60,60,60,120,120,1200,1200 */ + intervalArgument?: string | null + /** 报警邮件,多个邮件地址则逗号分隔 */ + alarmEmail?: string | null + /** + * 失败重试次数 + * @format int32 + */ + failRetryCount?: number | null + /** + * 失败重试间隔(秒) + * @format int32 + */ + failRetryInterval?: number | null +} + +/** 任务 */ +export interface TaskGetOutput { + /** 任务标题 */ + topic?: string | null + /** 任务参数 */ + body?: string | null + /** + * 任务执行多少轮,-1为永久循环 + * @format int32 + */ + round?: number + /** SEC=1,RunOnDay=11,RunOnWeek=12,RunOnMonth=13,Custom=21 */ + interval?: TaskInterval + /** 定时参数 60,60,60,120,120,1200,1200 */ + intervalArgument?: string | null + /** 报警邮件,多个邮件地址则逗号分隔 */ + alarmEmail?: string | null + /** + * 失败重试次数 + * @format int32 + */ + failRetryCount?: number | null + /** + * 失败重试间隔(秒) + * @format int32 + */ + failRetryInterval?: number | null + /** + * 任务Id + * @minLength 1 + */ + id: string +} + +/** 任务分页请求 */ +export interface TaskGetPageInput { + /** 分组名称 */ + groupName?: string | null + /** 任务名称 */ + taskName?: string | null + /** 集群Id */ + clusterId?: string | null + /** Running=0,Paused=1,Completed=2 */ + taskStatus?: TaskStatus + /** + * 创建开始时间 + * @format date-time + */ + startAddTime?: string | null + /** + * 创建结束时间 + * @format date-time + */ + endAddTime?: string | null +} + +/** 任务分页响应 */ +export interface TaskGetPageOutput { + /** 主键 */ + id?: string | null + /** 任务标题 */ + topic?: string | null + /** 任务数据 */ + body?: string | null + /** + * 任务执行多少轮 + * @format int32 + */ + round?: number + /** SEC=1,RunOnDay=11,RunOnWeek=12,RunOnMonth=13,Custom=21 */ + interval?: TaskInterval + /** 定时参数值 */ + intervalArgument?: string | null + /** Running=0,Paused=1,Completed=2 */ + status?: TaskStatus + /** + * 创建时间 + * @format date-time + */ + createTime?: string + /** + * 最后运行时间 + * @format date-time + */ + lastRunTime?: string + /** + * 当前运行到第几轮 + * @format int32 + */ + currentRound?: number + /** + * 错次数 + * @format int32 + */ + errorTimes?: number +} + +/** + * SEC=1,RunOnDay=11,RunOnWeek=12,RunOnMonth=13,Custom=21 + * @format int32 + */ +export type TaskInterval = 1 | 11 | 12 | 13 | 21 + +export interface TaskLog { + taskId?: string | null + /** @format int32 */ + round?: number + /** @format int64 */ + elapsedMilliseconds?: number + success?: boolean + exception?: string | null + remark?: string | null + /** @format date-time */ + createTime?: string +} + +/** 任务日志分页请求 */ +export interface TaskLogGetPageInput { + /** 任务Id */ + taskId?: string | null +} + +/** + * Running=0,Paused=1,Completed=2 + * @format int32 + */ +export type TaskStatus = 0 | 1 | 2 + +/** 修改 */ +export interface TaskUpdateInput { + /** 任务标题 */ + topic?: string | null + /** 任务参数 */ + body?: string | null + /** + * 任务执行多少轮,-1为永久循环 + * @format int32 + */ + round?: number + /** SEC=1,RunOnDay=11,RunOnWeek=12,RunOnMonth=13,Custom=21 */ + interval?: TaskInterval + /** 定时参数 60,60,60,120,120,1200,1200 */ + intervalArgument?: string | null + /** 报警邮件,多个邮件地址则逗号分隔 */ + alarmEmail?: string | null + /** + * 失败重试次数 + * @format int32 + */ + failRetryCount?: number | null + /** + * 失败重试间隔(秒) + * @format int32 + */ + failRetryInterval?: number | null + /** + * 任务Id + * @minLength 1 + */ + id: string +} + +/** 添加 */ +export interface TenantAddInput { + /** + * 租户Id + * @format int64 + */ + id?: number + /** + * 企业名称 + * @minLength 1 + */ + name: string + /** 编码 */ + code?: string | null + /** 套餐Ids */ + pkgIds?: number[] | null + /** 姓名 */ + realName?: string | null + /** + * 账号 + * @minLength 1 + */ + userName: string + /** 密码 */ + password?: string | null + /** 手机号码 */ + phone?: string | null + /** 邮箱地址 */ + email?: string | null + /** 域名 */ + domain?: string | null + /** 数据库注册键 */ + dbKey?: string | null + /** MySql=0,SqlServer=1,PostgreSQL=2,Oracle=3,Sqlite=4,OdbcOracle=5,OdbcSqlServer=6,OdbcMySql=7,OdbcPostgreSQL=8,Odbc=9,MsAccess=11,Dameng=12,ShenTong=14,KingbaseES=15,Firebird=16,Custom=17,ClickHouse=18,GBase=19,QuestDb=20,Xugu=21,CustomOracle=22,CustomSqlServer=23,CustomMySql=24,CustomPostgreSQL=25,DuckDB=26,TDengine=27 */ + dbType?: DataType + /** 连接字符串 */ + connectionString?: string | null + /** 启用 */ + enabled?: boolean + /** 说明 */ + description?: string | null +} + +/** 租户 */ +export interface TenantEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** + * 授权用户 + * @format int64 + */ + userId?: number + /** 用户 */ + user?: UserEntity + /** + * 授权部门 + * @format int64 + */ + orgId?: number + /** 组织架构 */ + org?: OrgEntity + /** 租户类型:Platform=1,Tenant=2 */ + tenantType?: TenantType + /** 域名 */ + domain?: string | null + /** 数据库注册键 */ + dbKey?: string | null + /** MySql=0,SqlServer=1,PostgreSQL=2,Oracle=3,Sqlite=4,OdbcOracle=5,OdbcSqlServer=6,OdbcMySql=7,OdbcPostgreSQL=8,Odbc=9,MsAccess=11,Dameng=12,ShenTong=14,KingbaseES=15,Firebird=16,Custom=17,ClickHouse=18,GBase=19,QuestDb=20,Xugu=21,CustomOracle=22,CustomSqlServer=23,CustomMySql=24,CustomPostgreSQL=25,DuckDB=26,TDengine=27 */ + dbType?: DataType + /** 连接字符串 */ + connectionString?: string | null + /** 启用 */ + enabled?: boolean + /** 说明 */ + description?: string | null + /** 套餐列表 */ + pkgs?: PkgEntity[] | null +} + +export interface TenantGetOutput { + /** + * 企业名称 + * @minLength 1 + */ + name: string + /** 编码 */ + code?: string | null + /** 姓名 */ + realName?: string | null + /** + * 账号 + * @minLength 1 + */ + userName: string + /** 密码 */ + password?: string | null + /** 手机号码 */ + phone?: string | null + /** 邮箱地址 */ + email?: string | null + /** 域名 */ + domain?: string | null + /** 数据库注册键 */ + dbKey?: string | null + /** MySql=0,SqlServer=1,PostgreSQL=2,Oracle=3,Sqlite=4,OdbcOracle=5,OdbcSqlServer=6,OdbcMySql=7,OdbcPostgreSQL=8,Odbc=9,MsAccess=11,Dameng=12,ShenTong=14,KingbaseES=15,Firebird=16,Custom=17,ClickHouse=18,GBase=19,QuestDb=20,Xugu=21,CustomOracle=22,CustomSqlServer=23,CustomMySql=24,CustomPostgreSQL=25,DuckDB=26,TDengine=27 */ + dbType?: DataType + /** 连接字符串 */ + connectionString?: string | null + /** 启用 */ + enabled?: boolean + /** 说明 */ + description?: string | null + /** + * 租户Id + * @format int64 + */ + id: number + /** 套餐列表 */ + pkgs?: PkgEntity[] | null + /** 套餐Id列表 */ + pkgIds?: number[] | null +} + +/** 租户分页请求 */ +export interface TenantGetPageInput { + /** 企业名称 */ + name?: string | null +} + +/** 租户分页响应 */ +export interface TenantGetPageOutput { + /** + * 主键 + * @format int64 + */ + id?: number + /** 企业名称 */ + name?: string | null + /** 企业编码 */ + code?: string | null + pkgs?: PkgEntity[] | null + /** 套餐 */ + pkgNames?: string[] | null + /** 姓名 */ + realName?: string | null + /** 账号 */ + userName?: string | null + /** 手机号码 */ + phone?: string | null + /** 邮箱地址 */ + email?: string | null + /** MySql=0,SqlServer=1,PostgreSQL=2,Oracle=3,Sqlite=4,OdbcOracle=5,OdbcSqlServer=6,OdbcMySql=7,OdbcPostgreSQL=8,Odbc=9,MsAccess=11,Dameng=12,ShenTong=14,KingbaseES=15,Firebird=16,Custom=17,ClickHouse=18,GBase=19,QuestDb=20,Xugu=21,CustomOracle=22,CustomSqlServer=23,CustomMySql=24,CustomPostgreSQL=25,DuckDB=26,TDengine=27 */ + dbType?: DataType + /** 数据库名称 */ + dbTypeName?: string | null + /** 启用 */ + enabled?: boolean + /** 说明 */ + description?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** 设置启用 */ +export interface TenantSetEnableInput { + /** + * 租户Id + * @format int64 + */ + tenantId?: number + /** 是否启用 */ + enabled?: boolean +} + +/** + * 租户类型:Platform=1,Tenant=2 + * @format int32 + */ +export type TenantType = 1 | 2 + +/** 修改 */ +export interface TenantUpdateInput { + /** + * 企业名称 + * @minLength 1 + */ + name: string + /** 编码 */ + code?: string | null + /** 套餐Ids */ + pkgIds?: number[] | null + /** 姓名 */ + realName?: string | null + /** + * 账号 + * @minLength 1 + */ + userName: string + /** 密码 */ + password?: string | null + /** 手机号码 */ + phone?: string | null + /** 邮箱地址 */ + email?: string | null + /** 域名 */ + domain?: string | null + /** 数据库注册键 */ + dbKey?: string | null + /** MySql=0,SqlServer=1,PostgreSQL=2,Oracle=3,Sqlite=4,OdbcOracle=5,OdbcSqlServer=6,OdbcMySql=7,OdbcPostgreSQL=8,Odbc=9,MsAccess=11,Dameng=12,ShenTong=14,KingbaseES=15,Firebird=16,Custom=17,ClickHouse=18,GBase=19,QuestDb=20,Xugu=21,CustomOracle=22,CustomSqlServer=23,CustomMySql=24,CustomPostgreSQL=25,DuckDB=26,TDengine=27 */ + dbType?: DataType + /** 连接字符串 */ + connectionString?: string | null + /** 启用 */ + enabled?: boolean + /** 说明 */ + description?: string | null + /** + * 租户Id + * @format int64 + */ + id: number +} + +/** 令牌信息 */ +export interface TokenInfo { + /** 访问令牌 */ + accessToken?: string | null + /** + * 访问令牌的过期时间 + * @format date-time + */ + accessTokenExpiresAt?: string + /** + * 访问令牌的生命周期(以秒为单位) + * @format int32 + */ + accessTokenLifeTime?: number + /** 刷新令牌 */ + refreshToken?: string | null + /** + * 刷新令牌的过期时间 + * @format date-time + */ + refreshTokenExpiresAt?: string + /** + * 刷新令牌的生命周期(以秒为单位) + * @format int32 + */ + refreshTokenLifeTime?: number + /** + * 创建令牌信息时间戳 + * @format int64 + */ + timestamp?: number +} + +export interface Track { + /** @format int32 */ + x?: number + /** @format int32 */ + y?: number + /** @format int32 */ + t?: number +} + +/** 添加 */ +export interface UserAddInput { + /** + * 用户Id + * @format int64 + */ + id?: number + /** + * 账号 + * @minLength 1 + */ + userName: string + /** + * 姓名 + * @minLength 1 + */ + name: string + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** 角色Ids */ + roleIds?: number[] | null + /** + * 直属主管Id + * @format int64 + */ + managerUserId?: number | null + /** 直属主管姓名 */ + managerUserName?: string | null + /** 员工添加 */ + staff: StaffAddInput + /** 所属部门Ids */ + orgIds?: number[] | null + /** + * 主属部门Id + * @format int64 + */ + orgId?: number + /** 密码 */ + password?: string | null + /** 启用 */ + enabled?: boolean + + isReceiveSite?: boolean + isReceiveEmail?: boolean + isReceiveSMS?: boolean +} + +/** 添加会员 */ +export interface UserAddMemberInput { + /** + * 会员Id + * @format int64 + */ + id?: number + /** + * 账号 + * @minLength 1 + */ + userName: string + /** 姓名 */ + name?: string | null + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** + * 密码 + * @minLength 1 + */ + password: string + /** 用户状态:WaitChangePasssword=2,WaitActive=3 */ + status?: UserStatus +} + +/** 批量设置部门 */ +export interface UserBatchSetOrgInput { + /** 用户Id列表 */ + userIds?: number[] | null + /** 所属部门Ids */ + orgIds?: number[] | null + /** + * 主属部门Id + * @format int64 + */ + orgId?: number +} + +/** 修改密码 */ +export interface UserChangePasswordInput { + /** + * 旧密码 + * @minLength 1 + */ + oldPassword: string + /** + * 新密码 + * @minLength 1 + */ + newPassword: string + /** + * 确认新密码 + * @minLength 1 + */ + confirmPassword: string +} + +/** 用户 */ +export interface UserEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** + * 租户Id + * @format int64 + */ + tenantId?: number | null + /** 租户 */ + tenant?: TenantEntity + /** 账号 */ + userName?: string | null + /** 密码 */ + password?: string | null + /** 密码加密类型:MD5Encrypt32=0,PasswordHasher=1 */ + passwordEncryptType?: PasswordEncryptType + /** 姓名 */ + name?: string | null + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** + * 主属部门Id + * @format int64 + */ + orgId?: number + /** 组织架构 */ + org?: OrgEntity + /** + * 直属主管Id + * @format int64 + */ + managerUserId?: number | null + /** 用户 */ + managerUser?: UserEntity + /** 昵称 */ + nickName?: string | null + /** 头像 */ + avatar?: string | null + /** 用户状态:WaitChangePasssword=2,WaitActive=3 */ + status?: UserStatus + /** 用户类型:Member=0,DefaultUser=1,TenantAdmin=10,PlatformAdmin=100 */ + type?: UserType + /** + * 最后登录时间 + * @format date-time + */ + lastLoginTime?: string | null + /** 最后登录IP */ + lastLoginIP?: string | null + /** 最后登录国家 */ + lastLoginCountry?: string | null + /** 最后登录省份 */ + lastLoginProvince?: string | null + /** 最后登录城市 */ + lastLoginCity?: string | null + /** 启用 */ + enabled?: boolean + /** 角色列表 */ + roles?: RoleEntity[] | null + /** 部门列表 */ + orgs?: OrgEntity[] | null + /** 用户员工 */ + staff?: UserStaffEntity +} + +/** 用户基本信息 */ +export interface UserGetBasicOutput { + /** 头像 */ + avatar?: string | null + /** 姓名 */ + name?: string | null + /** 昵称 */ + nickName?: string | null + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** + * 最后登录时间 + * @format date-time + */ + lastLoginTime?: string | null + /** 最后登录IP */ + lastLoginIP?: string | null + /** 最后登录国家 */ + lastLoginCountry?: string | null + /** 最后登录省份 */ + lastLoginProvince?: string | null + /** 最后登录城市 */ + lastLoginCity?: string | null +} + +/** 已删除用户分页查询响应 */ +export interface UserGetDeletedUserPageOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 账号 */ + userName?: string | null + /** 姓名 */ + name?: string | null + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** 用户类型:Member=0,DefaultUser=1,TenantAdmin=10,PlatformAdmin=100 */ + type?: UserType + roles?: RoleEntity[] | null + /** 角色 */ + roleNames?: string | null + /** 启用 */ + enabled?: boolean + /** 性别:Unknown(未知)=0,Male(男)=1,Female(女)=2 */ + sex?: Sex + /** + * 主属部门Id + * @format int64 + */ + orgId?: number + /** 主属部门 */ + orgPath?: string | null + /** 部门列表 */ + orgs?: OrgEntity[] | null + /** 所属部门Id列表 */ + orgIds?: number[] | null + /** 所属部门 */ + orgPaths?: string | null + /** 创建者用户名 */ + createdUserName?: string | null + /** 创建者姓名 */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** 修改者用户名 */ + modifiedUserName?: string | null + /** 修改者姓名 */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null +} + +/** 用户 */ +export interface UserGetOutput { + /** + * 账号 + * @minLength 1 + */ + userName: string + /** + * 姓名 + * @minLength 1 + */ + name: string + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** + * 直属主管Id + * @format int64 + */ + managerUserId?: number | null + /** 直属主管姓名 */ + managerUserName?: string | null + /** 员工添加 */ + staff: StaffAddInput + /** + * 主键Id + * @format int64 + */ + id: number + /** 角色Id列表 */ + roleIds?: number[] | null +} + +/** 用户分页查询条件 */ +export interface UserGetPageInput { + /** + * 部门Id + * @format int64 + */ + orgId?: number | null +} + +/** 用户分页查询响应 */ +export interface UserGetPageOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 账号 */ + userName?: string | null + /** 姓名 */ + name?: string | null + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** 用户类型:Member=0,DefaultUser=1,TenantAdmin=10,PlatformAdmin=100 */ + type?: UserType + roles?: RoleEntity[] | null + /** 角色 */ + roleNames?: string | null + /** 是否主管 */ + isManager?: boolean + /** 启用 */ + enabled?: boolean + /** 在线 */ + online?: boolean + /** 性别:Unknown(未知)=0,Male(男)=1,Female(女)=2 */ + sex?: Sex + /** + * 主属部门Id + * @format int64 + */ + orgId?: number + /** 主属部门 */ + orgPath?: string | null + /** 部门列表 */ + orgs?: OrgEntity[] | null + /** 所属部门Id列表 */ + orgIds?: number[] | null + /** 所属部门 */ + orgPaths?: string | null + /** 创建者用户名 */ + createdUserName?: string | null + /** 创建者姓名 */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** 修改者用户名 */ + modifiedUserName?: string | null + /** 修改者姓名 */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null +} + +/** 用户权限 */ +export interface UserGetPermissionOutput { + /** 接口列表 */ + apis?: ApiModel[] | null + /** 权限点编码列表 */ + codes?: string[] | null +} + +/** 重置密码 */ +export interface UserResetPasswordInput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 密码 */ + password?: string | null +} + +/** 恢复 */ +export interface UserRestoreInput { + /** 用户Id列表 */ + userIds?: number[] | null +} + +/** 设置启用 */ +export interface UserSetEnableInput { + /** + * 用户Id + * @format int64 + */ + userId?: number + /** 是否启用 */ + enabled?: boolean +} + +/** 设置主管 */ +export interface UserSetManagerInput { + /** + * 用户Id + * @format int64 + */ + userId?: number + /** + * 部门Id + * @format int64 + */ + orgId?: number + /** 是否主管 */ + isManager?: boolean +} + +/** 用户员工 */ +export interface UserStaffEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** + * 租户Id + * @format int64 + */ + tenantId?: number | null + /** 职位 */ + position?: string | null + /** 工号 */ + jobNumber?: string | null + /** 性别:Unknown(未知)=0,Male(男)=1,Female(女)=2 */ + sex?: Sex + /** + * 入职时间 + * @format date-time + */ + entryTime?: string | null + /** 企业微信名片 */ + workWeChatCard?: string | null + /** 个人简介 */ + introduce?: string | null +} + +/** + * 用户状态:WaitChangePasssword=2,WaitActive=3 + * @format int32 + */ +export type UserStatus = 2 | 3 + +/** + * 用户类型:Member=0,DefaultUser=1,TenantAdmin=10,PlatformAdmin=100 + * @format int32 + */ +export type UserType = 0 | 1 | 10 | 100 + +/** 更新基本信息 */ +export interface UserUpdateBasicInput { + /** + * 姓名 + * @minLength 1 + */ + name: string + /** 昵称 */ + nickName?: string | null +} + +/** 修改 */ +export interface UserUpdateInput { + /** + * 账号 + * @minLength 1 + */ + userName: string + /** + * 姓名 + * @minLength 1 + */ + name: string + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** 角色Ids */ + roleIds?: number[] | null + /** + * 直属主管Id + * @format int64 + */ + managerUserId?: number | null + /** 直属主管姓名 */ + managerUserName?: string | null + /** 员工添加 */ + staff: StaffAddInput + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 修改会员 */ +export interface UserUpdateMemberInput { + /** + * 账号 + * @minLength 1 + */ + userName: string + /** 姓名 */ + name?: string | null + /** 手机号 */ + mobile?: string | null + /** 邮箱 */ + email?: string | null + /** + * 主键Id + * @format int64 + */ + id: number +} + +export interface ValidateResult { + /** Success=0,ValidateFail=1,Timeout=2 */ + result?: ValidateResultType + message?: string | null +} + +/** + * Success=0,ValidateFail=1,Timeout=2 + * @format int32 + */ +export type ValidateResultType = 0 | 1 | 2 + +/** 添加 */ +export interface ViewAddInput { + /** 平台 */ + platform?: string | null + /** + * 所属节点 + * @format int64 + */ + parentId?: number + /** 视图命名 */ + name?: string | null + /** 视图名称 */ + label?: string | null + /** 视图路径 */ + path?: string | null + /** 说明 */ + description?: string | null + /** 缓存 */ + cache?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** 启用 */ + enabled?: boolean +} + +/** 视图管理 */ +export interface ViewEntity { + /** + * 主键Id + * @format int64 + */ + id?: number + /** + * 创建者用户Id + * @format int64 + */ + createdUserId?: number | null + /** + * 创建者用户名 + * @maxLength 60 + */ + createdUserName?: string | null + /** + * 创建者姓名 + * @maxLength 60 + */ + createdUserRealName?: string | null + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null + /** + * 修改者用户Id + * @format int64 + */ + modifiedUserId?: number | null + /** + * 修改者用户名 + * @maxLength 60 + */ + modifiedUserName?: string | null + /** + * 修改者姓名 + * @maxLength 60 + */ + modifiedUserRealName?: string | null + /** + * 修改时间 + * @format date-time + */ + modifiedTime?: string | null + /** 是否删除 */ + isDeleted?: boolean + /** 平台 */ + platform?: string | null + /** + * 所属节点 + * @format int64 + */ + parentId?: number + /** 视图命名 */ + name?: string | null + /** 视图名称 */ + label?: string | null + /** 视图路径 */ + path?: string | null + /** 说明 */ + description?: string | null + /** 缓存 */ + cache?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + childs?: ViewEntity[] | null +} + +/** 视图查询 */ +export interface ViewGetListInput { + /** 平台 */ + platform?: string | null + /** 视图命名 */ + name?: string | null + /** 视图名称 */ + label?: string | null + /** 视图路径 */ + path?: string | null +} + +/** 视图列表 */ +export interface ViewGetListOutput { + /** + * 视图Id + * @format int64 + */ + id?: number + /** + * 视图父级 + * @format int64 + */ + parentId?: number | null + /** 平台 */ + platform?: string | null + /** 视图命名 */ + name?: string | null + /** 视图名称 */ + label?: string | null + /** 视图路径 */ + path?: string | null + /** 缓存 */ + cache?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + /** 说明 */ + description?: string | null +} + +/** 视图 */ +export interface ViewGetOutput { + /** 平台 */ + platform?: string | null + /** + * 所属节点 + * @format int64 + */ + parentId?: number + /** 视图命名 */ + name?: string | null + /** 视图名称 */ + label?: string | null + /** 视图路径 */ + path?: string | null + /** 说明 */ + description?: string | null + /** 缓存 */ + cache?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** 启用 */ + enabled?: boolean + /** + * 视图Id + * @format int64 + */ + id: number +} + +/** 视图同步 */ +export interface ViewSyncInput { + /** 视图列表 */ + views?: ViewSyncModel[] | null +} + +/** 视图同步模型 */ +export interface ViewSyncModel { + /** 视图命名 */ + name?: string | null + /** 地址 */ + path?: string | null + /** 视图名称 */ + label?: string | null + /** 说明 */ + description?: string | null + /** 缓存 */ + cache?: boolean +} + +/** 修改 */ +export interface ViewUpdateInput { + /** 平台 */ + platform?: string | null + /** + * 所属节点 + * @format int64 + */ + parentId?: number + /** 视图命名 */ + name?: string | null + /** 视图名称 */ + label?: string | null + /** 视图路径 */ + path?: string | null + /** 说明 */ + description?: string | null + /** 缓存 */ + cache?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number | null + /** 启用 */ + enabled?: boolean + /** + * 视图Id + * @format int64 + */ + id: number +} + +/** 房间 */ +export interface RoomGetOutput { + /** 名称 */ + roomNo?: string | null + /** 编码 */ + roomName?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 结果输出 */ +export interface ResultOutputRoomGetOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 部门 */ + data?: RoomGetOutput +} + +/** 添加 */ +export interface RoomAddInput { + /** 编码 */ + roomNo?: string | null + /** 名称 */ + roomName?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number +} + +/** 修改 */ +export interface RoomUpdateInput { + /** 编码 */ + roomNo?: string | null + /** 名称 */ + roomName?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** 启用 */ + enabled?: boolean + + /** + * 主键Id + * @format int64 + */ + id: number +} + +/** 结果输出 */ +export interface ResultOutputListRoomGetListOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 数据 */ + data?: RoomGetListOutput[] | null +} + +/** 房间列表 */ +export interface RoomGetListOutput { + /** + * 主键Id + * @format int64 + */ + id?: number + /** 名称 */ + roomName?: string | null + /** 编码 */ + roomNo?: string | null + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** 分页信息输入 */ +export interface PageInputRoomGetPageInput { + dynamicFilter?: DynamicFilterInfo + /** 排序列表 */ + sortList?: SortInput[] | null + /** + * 当前页标 + * @format int32 + */ + currentPage?: number + /** + * 每页大小 + * @format int32 + */ + pageSize?: number + /** 分页请求 */ + filter?: RoomGetPageInput +} + +/** 分页请求 */ +export interface RoomGetPageInput { + /** IP */ + keyWord?: string | null + +} + +/** 结果输出 */ +export interface ResultOutputPageOutputRoomGetPageOutput { + /** 是否成功标记 */ + success?: boolean + /** 编码 */ + code?: string | null + /** 消息 */ + msg?: string | null + /** 分页信息输出 */ + data?: PageOutputRoomGetPageOutput +} + +/** 分页信息输出 */ +export interface PageOutputRoomGetPageOutput { + /** + * 数据总数 + * @format int64 + */ + total?: number + /** 数据 */ + list?: RoomGetPageOutput[] | null +} + +/** 分页响应 */ +export interface RoomGetPageOutput { + /** + * 编号 + * @format int64 + */ + id?: number + + /** 编码 */ + roomNo?: string | null + + /** 名称 */ + roomName?: string | null + + /** 启用 */ + enabled?: boolean + /** + * 排序 + * @format int32 + */ + sort?: number + + /** 创建者 */ + createdUserName?: string | null + + /** + * 创建时间 + * @format date-time + */ + createdTime?: string | null +} + +/** WebSocket请求 */ +export interface WebSocketPreConnectInput { + /** + * WebSocketId + * @format int64 + */ + websocketId?: number | null +} diff --git a/src/api/admin/enum-contracts.ts b/src/api/admin/enum-contracts.ts new file mode 100644 index 0000000..b22e88d --- /dev/null +++ b/src/api/admin/enum-contracts.ts @@ -0,0 +1,128 @@ +/** 账号类型 */ +export const AccountType = { + UserName: { name: 'UserName', value: 1, desc: '账号' }, + Email: { name: 'Email', value: 2, desc: '邮箱' }, + Phone: { name: 'Phone', value: 3, desc: '手机号' }, + AAD: { name: 'AAD', value: 4, desc: 'AAD' }, +} + +/** 密码加密类型 */ +export const PasswordEncryptType = { + MD5Encrypt32: { name: 'MD5Encrypt32', value: 0, desc: '32位MD5加密' }, + PasswordHasher: { name: 'PasswordHasher', value: 1, desc: '标准标识密码哈希' }, +} + +/** 用户状态 */ +export const UserStatus = { + WaitChangePasssword: { name: 'WaitChangePasssword', value: 2, desc: '待修改密码' }, + WaitActive: { name: 'WaitActive', value: 3, desc: '待激活' }, +} + +/** 性别 */ +export const Sex = { + Unknown: { name: 'Unknown', value: 0, desc: '未知' }, + Male: { name: 'Male', value: 1, desc: '男' }, + Female: { name: 'Female', value: 2, desc: '女' }, +} + +/** 角色类型 */ +export const RoleType = { + Group: { name: 'Group', value: 1, desc: '分组' }, + Role: { name: 'Role', value: 2, desc: '角色' }, +} + +/** 地区级别 */ +export const RegionLevel = { + Province: { name: 'Province', value: 1, desc: '省份' }, + City: { name: 'City', value: 2, desc: '城市' }, + County: { name: 'County', value: 3, desc: '县/区' }, + Town: { name: 'Town', value: 4, desc: '镇/乡' }, + Vilage: { name: 'Vilage', value: 5, desc: '村/社区' }, +} + +/** 权限类型 */ +export const PermissionType = { + Group: { name: 'Group', value: 1, desc: '分组' }, + Menu: { name: 'Menu', value: 2, desc: '菜单' }, + Dot: { name: 'Dot', value: 3, desc: '权限点' }, +} + +/** 消息状态 */ +export const MsgStatusEnum = { + Draft: { name: 'Draft', value: 1, desc: '草稿' }, + Published: { name: 'Published', value: 2, desc: '已发布' }, + Scheduled: { name: 'Scheduled', value: 3, desc: '定时发布' }, + Revoked: { name: 'Revoked', value: 4, desc: '已撤销' }, + Archived: { name: 'Archived', value: 5, desc: '已归档' }, +} + +/** 文档类型 */ +export const DocType = { + Group: { name: 'Group', value: 1, desc: '分组' }, + Markdown: { name: 'Markdown', value: 2, desc: 'Markdown文档' }, +} + +/** 缓存类型 */ +export const CacheType = { + Memory: { name: 'Memory', value: 0, desc: '内存缓存' }, + Redis: { name: 'Redis', value: 1, desc: 'Redis缓存' }, +} + +/** 租户类型 */ +export const TenantType = { + Platform: { name: 'Platform', value: 1, desc: '平台' }, + Tenant: { name: 'Tenant', value: 2, desc: '租户' }, +} + +/** 数据范围 */ +export const DataScope = { + All: { name: 'All', value: 1, desc: '全部' }, + DeptWithChild: { name: 'DeptWithChild', value: 2, desc: '本部门和下级部门' }, + Dept: { name: 'Dept', value: 3, desc: '本部门' }, + Self: { name: 'Self', value: 4, desc: '本人数据' }, + Custom: { name: 'Custom', value: 5, desc: '指定部门' }, +} + +/** 用户类型 */ +export const UserType = { + Member: { name: 'Member', value: 0, desc: '会员' }, + DefaultUser: { name: 'DefaultUser', value: 1, desc: '普通用户' }, + TenantAdmin: { name: 'TenantAdmin', value: 10, desc: '租户管理员' }, + PlatformAdmin: { name: 'PlatformAdmin', value: 100, desc: '平台管理员' }, +} + +/** 接口版本 */ +export const ApiVersion = { + V1: { name: 'V1', value: 1, desc: 'V1 版本' }, + V2: { name: 'V2', value: 2, desc: 'V2 版本' }, +} + +/** 内容类型 */ +export const ContentTypeEnum = { + FormData: { name: 'FormData', value: 0, desc: '表单数据' }, + Json: { name: 'Json', value: 1, desc: 'Json格式' }, +} + +/** 状态码枚举 */ +export const StatusCodes = { + Status0NotOk: { name: 'Status0NotOk', value: 0, desc: '操作失败' }, + Status1Ok: { name: 'Status1Ok', value: 1, desc: '操作成功' }, + Status401Unauthorized: { name: 'Status401Unauthorized', value: 401, desc: '未登录' }, + Status403Forbidden: { name: 'Status403Forbidden', value: 403, desc: '权限不足' }, + Status404NotFound: { name: 'Status404NotFound', value: 404, desc: '资源不存在' }, + Status500InternalServerError: { name: 'Status500InternalServerError', value: 500, desc: '系统内部错误' }, +} + +/** 排序方式 */ +export const SortOrder = { + Asc: { name: 'Asc', value: 0, desc: '' }, + Desc: { name: 'Desc', value: 1, desc: '' }, +} + +/** 应用程序类型 */ +export const AppType = { + Controllers: { name: 'Controllers', value: 0, desc: '' }, + ControllersWithViews: { name: 'ControllersWithViews', value: 1, desc: '' }, + MVC: { name: 'MVC', value: 2, desc: '' }, +} + diff --git a/src/api/admin/http-client.ts b/src/api/admin/http-client.ts new file mode 100644 index 0000000..00841ae --- /dev/null +++ b/src/api/admin/http-client.ts @@ -0,0 +1,465 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, HeadersDefaults, RawAxiosRequestHeaders, ResponseType } from 'axios' +import { ElLoading, ElMessage, LoadingOptions } from 'element-plus' +import { useUserInfo } from '/@/stores/userInfo' + +export type QueryParamsType = Record + +export interface FullRequestParams extends Omit { + /** set parameter to `true` for call `securityWorker` for this request */ + secure?: boolean + /** request path */ + path: string + /** content type of request body */ + type?: ContentType + /** query params */ + query?: QueryParamsType + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseType + /** request body */ + body?: unknown + /** 显示错误消息 */ + showErrorMessage?: boolean + /** 显示成功消息 */ + showSuccessMessage?: boolean + /** 登录访问 */ + login?: boolean + /** 加载中 */ + loading?: boolean + /** 加载中选项 */ + loadingOptions?: LoadingOptions + /** 取消重复请求 */ + cancelRepeatRequest?: boolean + /** 返回整个响应对象 */ + returnResponse?: boolean +} + +export type RequestParams = Omit + +export interface ApiConfig extends Omit { + securityWorker?: (securityData: SecurityDataType | null) => Promise | AxiosRequestConfig | void + secure?: boolean + format?: ResponseType +} + +export enum ContentType { + Json = 'application/json', + FormData = 'multipart/form-data', + UrlEncoded = 'application/x-www-form-urlencoded', + Text = 'text/plain', +} + +export interface LoadingInstance { + target: any + count: number +} + +const pendingMap = new Map() + +const loadingInstance: LoadingInstance = { + target: null, + count: 0, +} + +export class HttpClient { + public instance: AxiosInstance + private securityData: SecurityDataType | null = null + private securityWorker?: ApiConfig['securityWorker'] + private secure?: boolean + private format?: ResponseType + + constructor({ securityWorker, secure, format, ...axiosConfig }: ApiConfig = {}) { + this.instance = axios.create({ ...axiosConfig, timeout: 60000, baseURL: axiosConfig.baseURL || import.meta.env.VITE_API_URL }) + this.secure = secure + this.format = format + this.securityWorker = securityWorker + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data + } + + protected mergeRequestParams(params1: AxiosRequestConfig, params2?: AxiosRequestConfig): AxiosRequestConfig { + const method = params1.method || (params2 && params2.method) + + return { + ...this.instance.defaults, + ...params1, + ...(params2 || {}), + headers: { + ...((method && this.instance.defaults.headers[method.toLowerCase() as keyof HeadersDefaults]) || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + } as RawAxiosRequestHeaders, + } + } + + protected stringifyFormItem(formItem: unknown) { + if (typeof formItem === 'object' && formItem !== null) { + return JSON.stringify(formItem) + } else { + return `${formItem}` + } + } + + protected createFormData(input: Record): FormData { + return Object.keys(input || {}).reduce((formData, key) => { + const property = input[key] + const propertyContent: any[] = property instanceof Array ? property : [property] + + for (const formItem of propertyContent) { + const isFileType = formItem instanceof Blob || formItem instanceof File + formData.append(key, isFileType ? formItem : this.stringifyFormItem(formItem)) + } + + return formData + }, new FormData()) + } + + /** + * 错误处理 + * @param {*} error + */ + protected errorHandle(error: any) { + if (!error) { + return + } + if (axios.isCancel(error)) return console.error('请求重复已被自动取消:' + error.message) + let message = '' + if (error.response) { + switch (error.response.status) { + case 302: + message = '接口重定向' + break + case 400: + message = '参数不正确' + break + case 401: + message = '您还没有登录' + break + case 403: + message = '您没有权限操作' + break + case 404: + message = '请求地址出错:' + error.response.config.url + break + case 408: + message = '请求超时' + break + case 409: + message = '系统已存在相同数据' + break + case 429: + message = '访问过于频繁' + break + case 500: + message = '服务器内部错误' + break + case 501: + message = '服务未实现' + break + case 502: + message = '网关错误' + break + case 503: + message = '服务不可用' + break + case 504: + message = '服务暂时无法访问,请稍后再试' + break + case 505: + message = 'HTTP版本不受支持' + break + default: + message = '异常问题,请联系网站管理员' + break + } + } + if (error.message.includes('timeout')) message = '请求超时' + if (error.message.includes('Network')) message = window.navigator.onLine ? '服务端异常' : '您已断网' + + if (message) { + ElMessage.error({ message, grouping: true }) + } + } + + /** + * 刷新token接口 + * @param string refreshToken + */ + protected async refreshApi(refreshToken: string) { + return this.request({ + path: `/api/admin/auth/refresh`, + method: 'GET', + secure: true, + format: 'json', + login: false, + query: { + token: refreshToken, + }, + }) + } + + /** + * 刷新token + * @param {*} config + */ + protected async refreshToken(config: any) { + const storesUseUserInfo = useUserInfo() + const token = storesUseUserInfo.getToken() + if (!token) { + storesUseUserInfo.clear() + return Promise.reject(config) + } + + if (window.tokenRefreshing) { + window.requests = window.requests ? window.requests : [] + return new Promise((resolve) => { + window.requests.push(() => { + resolve(this.instance(config)) + }) + }) + } + + window.tokenRefreshing = true + + return this.refreshApi(token) + .then((res) => { + if (res?.success) { + storesUseUserInfo.setTokenInfo(res.data) + if (window.requests?.length > 0) { + window.requests.forEach((apiRequest) => apiRequest()) + window.requests = [] + } + return this.instance(config) + } else { + storesUseUserInfo.clear() + return Promise.reject(res) + } + }) + .catch((error) => { + storesUseUserInfo.clear() + return Promise.reject(error) + }) + .finally(() => { + window.tokenRefreshing = false + }) + } + + /** + * 储存每个请求的唯一cancel回调, 以此为标识 + */ + protected addPending(config: AxiosRequestConfig) { + const pendingKey = this.getPendingKey(config) + config.cancelToken = + config.cancelToken || + new axios.CancelToken((cancel) => { + if (!pendingMap.has(pendingKey)) { + pendingMap.set(pendingKey, cancel) + } + }) + } + + /** + * 删除重复的请求 + */ + protected removePending(config: AxiosRequestConfig) { + const pendingKey = this.getPendingKey(config) + if (pendingMap.has(pendingKey)) { + const cancelToken = pendingMap.get(pendingKey) + cancelToken(pendingKey) + pendingMap.delete(pendingKey) + } + } + + /** + * 生成每个请求的唯一key + */ + protected getPendingKey(config: AxiosRequestConfig) { + let { data, headers } = config + headers = headers as RawAxiosRequestHeaders + const { url, method, params } = config + if (typeof data === 'string') data = JSON.parse(data) + return [url, method, headers && headers.Authorization ? headers.Authorization : '', JSON.stringify(params), JSON.stringify(data)].join('&') + } + + /** + * 关闭Loading层实例 + */ + protected closeLoading(loading: boolean = false) { + if (loading && loadingInstance.count > 0) loadingInstance.count-- + if (loadingInstance.count === 0) { + loadingInstance.target.close() + loadingInstance.target = null + } + } + + public request = async ({ + secure, + path, + type, + query, + format, + body, + showErrorMessage = true, + showSuccessMessage = false, + login = true, + loading = false, + loadingOptions = { + background: 'rgba(0,0,0,0.5)', + }, + cancelRepeatRequest = false, + returnResponse = false, + ...params + }: FullRequestParams): Promise => { + const secureParams = + ((typeof secure === 'boolean' ? secure : this.secure) && this.securityWorker && (await this.securityWorker(this.securityData))) || {} + const requestParams = this.mergeRequestParams(params, secureParams) + const responseFormat = format || this.format || undefined + + if (type === ContentType.FormData && body && body !== null && typeof body === 'object') { + body = this.createFormData(body as Record) + } + + if (type === ContentType.Text && body && body !== null && typeof body !== 'string') { + body = JSON.stringify(body) + } + + // 请求拦截 + this.instance.interceptors.request.use( + async (config) => { + this.removePending(config) + cancelRepeatRequest && this.addPending(config) + + if (loading) { + loadingInstance.count++ + if (loadingInstance.count === 1) { + loadingInstance.target = ElLoading.service(loadingOptions) + } + } + + const storesUseUserInfo = useUserInfo() + const tokenInfo = storesUseUserInfo.getTokenInfo() + + if (tokenInfo && tokenInfo.accessToken) { + // 判断 accessToken 是否快失效 + const now = new Date().getTime() + const expiresAt = new Date(tokenInfo.accessTokenExpiresAt).getTime() + const maxThreshold = tokenInfo.accessTokenLifeTime * 0.5 + // 确保阈值不超过 5 分钟且不超过 accessTokenLifeTime 的一半 + const threshold = Math.min(5 * 60 * 1000, maxThreshold) + if (expiresAt - now < threshold) { + //加锁 + if (!window.tokenRefreshing) { + window.tokenRefreshing = true + try { + const res = await this.refreshApi(tokenInfo.accessToken) + if (res?.success) { + storesUseUserInfo.setTokenInfo(res.data) + //处理等待队列中的请求 + if (window.requests?.length > 0) { + window.requests.forEach((apiRequest) => apiRequest()) + window.requests = [] + } + } else { + storesUseUserInfo.clear() + return Promise.reject(res) + } + } catch (error) { + // 清空等待队列 + window.requests = [] + return Promise.reject(error) + } finally { + // 解锁 + window.tokenRefreshing = false + } + } else { + // 如果正在刷新,则将当前请求加入等待队列 + if (config.url !== '/api/admin/auth/refresh') { + window.requests = window.requests ? window.requests : [] + return new Promise((resolve) => { + window.requests.push(() => { + resolve(this.instance(config)) + }) + }) + } + } + } + } + + const accessToken = storesUseUserInfo.getToken() + config.headers!['Authorization'] = `Bearer ${accessToken}` + return config + }, + (error) => { + return Promise.reject(error) + } + ) + // 响应拦截 + this.instance.interceptors.response.use( + (res) => { + this.removePending(res.config) + loading && this.closeLoading(loading) + + if (res.config?.responseType == 'blob') { + return res + } + + const data = res.data + if (data.success) { + if (showSuccessMessage) { + ElMessage.success({ message: data.msg ? data.msg : '操作成功', grouping: true }) + } + } else { + if (showErrorMessage) { + ElMessage.error({ message: data.msg ? data.msg : '操作失败', grouping: true }) + } + // return Promise.reject(res) + } + + return res + }, + async (error) => { + error.config && this.removePending(error.config) + loading && this.closeLoading(loading) + + //刷新token + if (login && error?.response?.status === 401) { + return this.refreshToken(error.config) + } + + //错误处理 + if (showErrorMessage) { + this.errorHandle(error) + } + + return Promise.reject(error) + } + ) + + return this.instance + .request({ + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData ? { 'Content-Type': type } : {}), + } as RawAxiosRequestHeaders, + params: query, + responseType: responseFormat, + data: body, + url: path, + }) + .then((response) => (returnResponse ? response : response.data)) + } +} diff --git a/src/assets/icons/bottom.svg b/src/assets/icons/bottom.svg new file mode 100644 index 0000000..7cbd665 --- /dev/null +++ b/src/assets/icons/bottom.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/assets/icons/customSize.svg b/src/assets/icons/customSize.svg new file mode 100644 index 0000000..28db364 --- /dev/null +++ b/src/assets/icons/customSize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/distributeHor.svg b/src/assets/icons/distributeHor.svg new file mode 100644 index 0000000..aa37a2e --- /dev/null +++ b/src/assets/icons/distributeHor.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/distributeVer.svg b/src/assets/icons/distributeVer.svg new file mode 100644 index 0000000..2ae6d03 --- /dev/null +++ b/src/assets/icons/distributeVer.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/export.svg b/src/assets/icons/export.svg new file mode 100644 index 0000000..939fc21 --- /dev/null +++ b/src/assets/icons/export.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/assets/icons/horizontal.svg b/src/assets/icons/horizontal.svg new file mode 100644 index 0000000..ba1f9f4 --- /dev/null +++ b/src/assets/icons/horizontal.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/hot.svg b/src/assets/icons/hot.svg new file mode 100644 index 0000000..cac0b13 --- /dev/null +++ b/src/assets/icons/hot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/json.svg b/src/assets/icons/json.svg new file mode 100644 index 0000000..3cb487c --- /dev/null +++ b/src/assets/icons/json.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/left.svg b/src/assets/icons/left.svg new file mode 100644 index 0000000..c7df28a --- /dev/null +++ b/src/assets/icons/left.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/assets/icons/more.svg b/src/assets/icons/more.svg new file mode 100644 index 0000000..0129da5 --- /dev/null +++ b/src/assets/icons/more.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/qq.svg b/src/assets/icons/qq.svg new file mode 100644 index 0000000..47573c7 --- /dev/null +++ b/src/assets/icons/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/recycle.svg b/src/assets/icons/recycle.svg new file mode 100644 index 0000000..19b910f --- /dev/null +++ b/src/assets/icons/recycle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/right.svg b/src/assets/icons/right.svg new file mode 100644 index 0000000..02f2c99 --- /dev/null +++ b/src/assets/icons/right.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/assets/icons/rotate.svg b/src/assets/icons/rotate.svg new file mode 100644 index 0000000..7b2bb56 --- /dev/null +++ b/src/assets/icons/rotate.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/assets/icons/save.svg b/src/assets/icons/save.svg new file mode 100644 index 0000000..228e769 --- /dev/null +++ b/src/assets/icons/save.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/top.svg b/src/assets/icons/top.svg new file mode 100644 index 0000000..302cb9f --- /dev/null +++ b/src/assets/icons/top.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/vertical.svg b/src/assets/icons/vertical.svg new file mode 100644 index 0000000..7ccbe1b --- /dev/null +++ b/src/assets/icons/vertical.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/src/assets/imgs/lockscreen.jpg b/src/assets/imgs/lockscreen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a70c3758b073ea598ec1d9642ca8dde3b3517d3a GIT binary patch literal 102506 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 O1)F}5w=M(DpZ^a-N{=uA literal 0 HcmV?d00001 diff --git a/src/assets/login-main.svg b/src/assets/login-main.svg new file mode 100644 index 0000000..e1bd0e8 --- /dev/null +++ b/src/assets/login-main.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/logo-mini.png b/src/assets/logo-mini.png new file mode 100644 index 0000000000000000000000000000000000000000..12c5d19a231d5ecc28a94cbf44c39d8fa0784bdf GIT binary patch literal 71581 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 z�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
Zz}%E~xj0mJ<@ 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgs/404.svg b/src/assets/svgs/404.svg new file mode 100644 index 0000000..8315ace --- /dev/null +++ b/src/assets/svgs/404.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/barcode.svg b/src/assets/svgs/hiprint/barcode.svg new file mode 100644 index 0000000..f92ae33 --- /dev/null +++ b/src/assets/svgs/hiprint/barcode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/emptyTable.svg b/src/assets/svgs/hiprint/emptyTable.svg new file mode 100644 index 0000000..8ac4d95 --- /dev/null +++ b/src/assets/svgs/hiprint/emptyTable.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/hline.svg b/src/assets/svgs/hiprint/hline.svg new file mode 100644 index 0000000..429be5b --- /dev/null +++ b/src/assets/svgs/hiprint/hline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/html.svg b/src/assets/svgs/hiprint/html.svg new file mode 100644 index 0000000..f4b6583 --- /dev/null +++ b/src/assets/svgs/hiprint/html.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/image.svg b/src/assets/svgs/hiprint/image.svg new file mode 100644 index 0000000..587a2bc --- /dev/null +++ b/src/assets/svgs/hiprint/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/longText.svg b/src/assets/svgs/hiprint/longText.svg new file mode 100644 index 0000000..0fdfa0e --- /dev/null +++ b/src/assets/svgs/hiprint/longText.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/oval.svg b/src/assets/svgs/hiprint/oval.svg new file mode 100644 index 0000000..569cc56 --- /dev/null +++ b/src/assets/svgs/hiprint/oval.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/qrcode.svg b/src/assets/svgs/hiprint/qrcode.svg new file mode 100644 index 0000000..b1d87f6 --- /dev/null +++ b/src/assets/svgs/hiprint/qrcode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/rect.svg b/src/assets/svgs/hiprint/rect.svg new file mode 100644 index 0000000..6a7e6ca --- /dev/null +++ b/src/assets/svgs/hiprint/rect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/table.svg b/src/assets/svgs/hiprint/table.svg new file mode 100644 index 0000000..7176245 --- /dev/null +++ b/src/assets/svgs/hiprint/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/text.svg b/src/assets/svgs/hiprint/text.svg new file mode 100644 index 0000000..1f6fefd --- /dev/null +++ b/src/assets/svgs/hiprint/text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/hiprint/vline.svg b/src/assets/svgs/hiprint/vline.svg new file mode 100644 index 0000000..7db660c --- /dev/null +++ b/src/assets/svgs/hiprint/vline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/auth/auth.vue b/src/components/auth/auth.vue new file mode 100644 index 0000000..f1127c9 --- /dev/null +++ b/src/components/auth/auth.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/auth/authAll.vue b/src/components/auth/authAll.vue new file mode 100644 index 0000000..cb7fcee --- /dev/null +++ b/src/components/auth/authAll.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/components/auth/auths.vue b/src/components/auth/auths.vue new file mode 100644 index 0000000..ea02665 --- /dev/null +++ b/src/components/auth/auths.vue @@ -0,0 +1,32 @@ + + + diff --git a/src/components/cropper/index.vue b/src/components/cropper/index.vue new file mode 100644 index 0000000..13412bc --- /dev/null +++ b/src/components/cropper/index.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/src/components/editor/index.vue b/src/components/editor/index.vue new file mode 100644 index 0000000..67f34f3 --- /dev/null +++ b/src/components/editor/index.vue @@ -0,0 +1,139 @@ + + + diff --git a/src/components/iconSelector/index.vue b/src/components/iconSelector/index.vue new file mode 100644 index 0000000..432109a --- /dev/null +++ b/src/components/iconSelector/index.vue @@ -0,0 +1,241 @@ + + + diff --git a/src/components/iconSelector/list.vue b/src/components/iconSelector/list.vue new file mode 100644 index 0000000..1fc35bc --- /dev/null +++ b/src/components/iconSelector/list.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/components/my-captcha/dialog.vue b/src/components/my-captcha/dialog.vue new file mode 100644 index 0000000..c5f9992 --- /dev/null +++ b/src/components/my-captcha/dialog.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/my-captcha/index.vue b/src/components/my-captcha/index.vue new file mode 100644 index 0000000..9bb4752 --- /dev/null +++ b/src/components/my-captcha/index.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/components/my-captcha/slide-captcha.vue b/src/components/my-captcha/slide-captcha.vue new file mode 100644 index 0000000..bc334c0 --- /dev/null +++ b/src/components/my-captcha/slide-captcha.vue @@ -0,0 +1,573 @@ + + + + + diff --git a/src/components/my-cron/day.vue b/src/components/my-cron/day.vue new file mode 100644 index 0000000..db49b1f --- /dev/null +++ b/src/components/my-cron/day.vue @@ -0,0 +1,190 @@ + + + + diff --git a/src/components/my-cron/dialog.vue b/src/components/my-cron/dialog.vue new file mode 100644 index 0000000..07f9eaa --- /dev/null +++ b/src/components/my-cron/dialog.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/components/my-cron/hour.vue b/src/components/my-cron/hour.vue new file mode 100644 index 0000000..23e4880 --- /dev/null +++ b/src/components/my-cron/hour.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/components/my-cron/index.vue b/src/components/my-cron/index.vue new file mode 100644 index 0000000..c457ad1 --- /dev/null +++ b/src/components/my-cron/index.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/src/components/my-cron/min.vue b/src/components/my-cron/min.vue new file mode 100644 index 0000000..7a218c3 --- /dev/null +++ b/src/components/my-cron/min.vue @@ -0,0 +1,144 @@ + + + + diff --git a/src/components/my-cron/month.vue b/src/components/my-cron/month.vue new file mode 100644 index 0000000..2a77e99 --- /dev/null +++ b/src/components/my-cron/month.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/components/my-cron/result.vue b/src/components/my-cron/result.vue new file mode 100644 index 0000000..2292478 --- /dev/null +++ b/src/components/my-cron/result.vue @@ -0,0 +1,561 @@ + + + diff --git a/src/components/my-cron/second.vue b/src/components/my-cron/second.vue new file mode 100644 index 0000000..45c6e8b --- /dev/null +++ b/src/components/my-cron/second.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/src/components/my-cron/week.vue b/src/components/my-cron/week.vue new file mode 100644 index 0000000..191e810 --- /dev/null +++ b/src/components/my-cron/week.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/src/components/my-cron/year.vue b/src/components/my-cron/year.vue new file mode 100644 index 0000000..0d1d6c0 --- /dev/null +++ b/src/components/my-cron/year.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/src/components/my-date-range/index.vue b/src/components/my-date-range/index.vue new file mode 100644 index 0000000..e56b751 --- /dev/null +++ b/src/components/my-date-range/index.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/components/my-dropdown-more/index.vue b/src/components/my-dropdown-more/index.vue new file mode 100644 index 0000000..f8f6427 --- /dev/null +++ b/src/components/my-dropdown-more/index.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/components/my-editor/index.vue b/src/components/my-editor/index.vue new file mode 100644 index 0000000..c4e6ca9 --- /dev/null +++ b/src/components/my-editor/index.vue @@ -0,0 +1,153 @@ + + + diff --git a/src/components/my-high-search/dialog.vue b/src/components/my-high-search/dialog.vue new file mode 100644 index 0000000..558b8b8 --- /dev/null +++ b/src/components/my-high-search/dialog.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/src/components/my-high-search/index.vue b/src/components/my-high-search/index.vue new file mode 100644 index 0000000..fb985b3 --- /dev/null +++ b/src/components/my-high-search/index.vue @@ -0,0 +1,291 @@ + + + + + diff --git a/src/components/my-icon/index.vue b/src/components/my-icon/index.vue new file mode 100644 index 0000000..b23bced --- /dev/null +++ b/src/components/my-icon/index.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/components/my-import/index.vue b/src/components/my-import/index.vue new file mode 100644 index 0000000..b701908 --- /dev/null +++ b/src/components/my-import/index.vue @@ -0,0 +1,406 @@ + + + + + diff --git a/src/components/my-input-code/index.vue b/src/components/my-input-code/index.vue new file mode 100644 index 0000000..fc2a7ea --- /dev/null +++ b/src/components/my-input-code/index.vue @@ -0,0 +1,187 @@ + + + + + + diff --git a/src/components/my-json-editor/index.vue b/src/components/my-json-editor/index.vue new file mode 100644 index 0000000..3095c23 --- /dev/null +++ b/src/components/my-json-editor/index.vue @@ -0,0 +1,127 @@ + + + + + + diff --git a/src/components/my-layout/index.vue b/src/components/my-layout/index.vue new file mode 100644 index 0000000..9fc14c2 --- /dev/null +++ b/src/components/my-layout/index.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/components/my-layout/split-panes.vue b/src/components/my-layout/split-panes.vue new file mode 100644 index 0000000..1d68c3b --- /dev/null +++ b/src/components/my-layout/split-panes.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/my-link/index.vue b/src/components/my-link/index.vue new file mode 100644 index 0000000..b1b4814 --- /dev/null +++ b/src/components/my-link/index.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/components/my-search/index.vue b/src/components/my-search/index.vue new file mode 100644 index 0000000..9050b3b --- /dev/null +++ b/src/components/my-search/index.vue @@ -0,0 +1,187 @@ + + + diff --git a/src/components/my-select-icon/icon-select.vue b/src/components/my-select-icon/icon-select.vue new file mode 100644 index 0000000..e17e0c1 --- /dev/null +++ b/src/components/my-select-icon/icon-select.vue @@ -0,0 +1,251 @@ + + + + + + + diff --git a/src/components/my-select-icon/index.vue b/src/components/my-select-icon/index.vue new file mode 100644 index 0000000..8ac4cab --- /dev/null +++ b/src/components/my-select-icon/index.vue @@ -0,0 +1,64 @@ + + + + + + + diff --git a/src/components/my-select-input/index.vue b/src/components/my-select-input/index.vue new file mode 100644 index 0000000..91bbcf7 --- /dev/null +++ b/src/components/my-select-input/index.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/components/my-select/index.vue b/src/components/my-select/index.vue new file mode 100644 index 0000000..8556059 --- /dev/null +++ b/src/components/my-select/index.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/my-upload/index.vue b/src/components/my-upload/index.vue new file mode 100644 index 0000000..41eaeef --- /dev/null +++ b/src/components/my-upload/index.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/components/noticeBar/index.vue b/src/components/noticeBar/index.vue new file mode 100644 index 0000000..f6ba976 --- /dev/null +++ b/src/components/noticeBar/index.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/src/components/svgIcon/index.vue b/src/components/svgIcon/index.vue new file mode 100644 index 0000000..a121e04 --- /dev/null +++ b/src/components/svgIcon/index.vue @@ -0,0 +1,62 @@ + + + diff --git a/src/components/table/index.vue b/src/components/table/index.vue new file mode 100644 index 0000000..4c742fe --- /dev/null +++ b/src/components/table/index.vue @@ -0,0 +1,301 @@ + + + + + diff --git a/src/directive/authDirective.ts b/src/directive/authDirective.ts new file mode 100644 index 0000000..c887d58 --- /dev/null +++ b/src/directive/authDirective.ts @@ -0,0 +1,40 @@ +import type { App } from 'vue' +import { useUserInfo } from '/@/stores/userInfo' +import { judementSameArr } from '/@/utils/arrayOperation' + +/** + * 用户权限指令 + * @directive 单个权限验证(v-auth="xxx") + * @directive 多个权限验证,满足一个则显示(v-auths="[xxx,xxx]") + * @directive 多个权限验证,全部满足则显示(v-auth-all="[xxx,xxx]") + */ +export function authDirective(app: App) { + // 单个权限验证(v-auth="xxx") + app.directive('auth', { + mounted(el, binding) { + const stores = useUserInfo() + if (!stores.userInfos.authBtnList.some((v: string) => v === binding.value)) el.parentNode.removeChild(el) + }, + }) + // 多个权限验证,满足一个则显示(v-auths="[xxx,xxx]") + app.directive('auths', { + mounted(el, binding) { + let flag = false + const stores = useUserInfo() + stores.userInfos.authBtnList.map((val: string) => { + binding.value.map((v: string) => { + if (val === v) flag = true + }) + }) + if (!flag) el.parentNode.removeChild(el) + }, + }) + // 多个权限验证,全部满足则显示(v-auth-all="[xxx,xxx]") + app.directive('auth-all', { + mounted(el, binding) { + const stores = useUserInfo() + const flag = judementSameArr(binding.value, stores.userInfos.authBtnList) + if (!flag) el.parentNode.removeChild(el) + }, + }) +} diff --git a/src/directive/customDirective.ts b/src/directive/customDirective.ts new file mode 100644 index 0000000..8abd1c2 --- /dev/null +++ b/src/directive/customDirective.ts @@ -0,0 +1,178 @@ +import type { App } from 'vue' + +/** + * 按钮波浪指令 + * @directive 默认方式:v-waves,如 `
` + * @directive 参数方式:v-waves=" |light|red|orange|purple|green|teal",如 `
` + */ +export function wavesDirective(app: App) { + app.directive('waves', { + mounted(el, binding) { + el.classList.add('waves-effect') + binding.value && el.classList.add(`waves-${binding.value}`) + function setConvertStyle(obj: { [key: string]: unknown }) { + let style: string = '' + for (let i in obj) { + if (obj.hasOwnProperty(i)) style += `${i}:${obj[i]};` + } + return style + } + function onCurrentClick(e: { [key: string]: unknown }) { + let elDiv = document.createElement('div') + elDiv.classList.add('waves-ripple') + el.appendChild(elDiv) + let styles = { + left: `${e.layerX}px`, + top: `${e.layerY}px`, + opacity: 1, + transform: `scale(${(el.clientWidth / 100) * 10})`, + 'transition-duration': `750ms`, + 'transition-timing-function': `cubic-bezier(0.250, 0.460, 0.450, 0.940)`, + } + elDiv.setAttribute('style', setConvertStyle(styles)) + setTimeout(() => { + elDiv.setAttribute( + 'style', + setConvertStyle({ + opacity: 0, + transform: styles.transform, + left: styles.left, + top: styles.top, + }) + ) + setTimeout(() => { + elDiv && el.removeChild(elDiv) + }, 750) + }, 450) + } + el.addEventListener('mousedown', onCurrentClick, false) + }, + unmounted(el) { + el.addEventListener('mousedown', () => {}) + }, + }) +} + +/** + * 自定义拖动指令 + * @description 使用方式:v-drag="[dragDom,dragHeader]",如 `
` + * @description dragDom 要拖动的元素,dragHeader 要拖动的 Header 位置 + * @link 注意:https://github.com/element-plus/element-plus/issues/522 + * @lick 参考:https://blog.csdn.net/weixin_46391323/article/details/105228020?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-10&spm=1001.2101.3001.4242 + */ +export function dragDirective(app: App) { + app.directive('drag', { + mounted(el, binding) { + if (!binding.value) return false + + const dragDom = document.querySelector(binding.value[0]) as HTMLElement + const dragHeader = document.querySelector(binding.value[1]) as HTMLElement + + dragHeader.onmouseover = () => (dragHeader.style.cursor = `move`) + + function down(e: any, type: string) { + // 鼠标按下,计算当前元素距离可视区的距离 + const disX = type === 'pc' ? e.clientX - dragHeader.offsetLeft : e.touches[0].clientX - dragHeader.offsetLeft + const disY = type === 'pc' ? e.clientY - dragHeader.offsetTop : e.touches[0].clientY - dragHeader.offsetTop + + // body当前宽度 + const screenWidth = document.body.clientWidth + // 可见区域高度(应为body高度,可某些环境下无法获取) + const screenHeight = document.documentElement.clientHeight + + // 对话框宽度 + const dragDomWidth = dragDom.offsetWidth + // 对话框高度 + const dragDomheight = dragDom.offsetHeight + + const minDragDomLeft = dragDom.offsetLeft + const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth + + const minDragDomTop = dragDom.offsetTop + const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight + + // 获取到的值带px 正则匹配替换 + let styL: any = getComputedStyle(dragDom).left + let styT: any = getComputedStyle(dragDom).top + + // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px + if (styL.includes('%')) { + styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100) + styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100) + } else { + styL = +styL.replace(/\px/g, '') + styT = +styT.replace(/\px/g, '') + } + + return { + disX, + disY, + minDragDomLeft, + maxDragDomLeft, + minDragDomTop, + maxDragDomTop, + styL, + styT, + } + } + + function move(e: any, type: string, obj: any) { + let { disX, disY, minDragDomLeft, maxDragDomLeft, minDragDomTop, maxDragDomTop, styL, styT } = obj + + // 通过事件委托,计算移动的距离 + let left = type === 'pc' ? e.clientX - disX : e.touches[0].clientX - disX + let top = type === 'pc' ? e.clientY - disY : e.touches[0].clientY - disY + + // 边界处理 + if (-left > minDragDomLeft) { + left = -minDragDomLeft + } else if (left > maxDragDomLeft) { + left = maxDragDomLeft + } + + if (-top > minDragDomTop) { + top = -minDragDomTop + } else if (top > maxDragDomTop) { + top = maxDragDomTop + } + + // 移动当前元素 + dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;` + } + + /** + * pc端 + * onmousedown 鼠标按下触发事件 + * onmousemove 鼠标按下时持续触发事件 + * onmouseup 鼠标抬起触发事件 + */ + dragHeader.onmousedown = (e) => { + const obj = down(e, 'pc') + document.onmousemove = (e) => { + move(e, 'pc', obj) + } + document.onmouseup = () => { + document.onmousemove = null + document.onmouseup = null + } + } + + /** + * 移动端 + * ontouchstart 当按下手指时,触发ontouchstart + * ontouchmove 当移动手指时,触发ontouchmove + * ontouchend 当移走手指时,触发ontouchend + */ + dragHeader.ontouchstart = (e) => { + const obj = down(e, 'app') + document.ontouchmove = (e) => { + move(e, 'app', obj) + } + document.ontouchend = () => { + document.ontouchmove = null + document.ontouchend = null + } + } + }, + }) +} diff --git a/src/directive/index.ts b/src/directive/index.ts new file mode 100644 index 0000000..c0bbee5 --- /dev/null +++ b/src/directive/index.ts @@ -0,0 +1,18 @@ +import type { App } from 'vue' +import { authDirective } from '/@/directive/authDirective' +import { wavesDirective, dragDirective } from '/@/directive/customDirective' + +/** + * 导出指令方法:v-xxx + * @methods authDirective 用户权限指令,用法:v-auth + * @methods wavesDirective 按钮波浪指令,用法:v-waves + * @methods dragDirective 自定义拖动指令,用法:v-drag + */ +export function directive(app: App) { + // 用户权限指令 + authDirective(app) + // 按钮波浪指令 + wavesDirective(app) + // 自定义拖动指令 + dragDirective(app) +} diff --git a/src/globalProperties/index.ts b/src/globalProperties/index.ts new file mode 100644 index 0000000..917e7f4 --- /dev/null +++ b/src/globalProperties/index.ts @@ -0,0 +1,6 @@ +import modal from './modal' + +export default function installGlobalProperties(app: any) { + // 模态框对象 + app.config.globalProperties.$modal = modal +} diff --git a/src/globalProperties/modal.ts b/src/globalProperties/modal.ts new file mode 100644 index 0000000..42add59 --- /dev/null +++ b/src/globalProperties/modal.ts @@ -0,0 +1,107 @@ +import { markRaw } from 'vue' +import { ElMessage, ElMessageBox, ElNotification, ElLoading, ElMessageBoxOptions } from 'element-plus' +import { Delete } from '@element-plus/icons-vue' +import { i18n } from '/@/i18n/index' + +let loadingInstance: any + +export default { + // 消息提示 + msg(content: any) { + ElMessage.info({ + message: content, + grouping: true, + }) + }, + // 错误消息 + msgError(content: any) { + ElMessage.error({ + message: content, + grouping: true, + }) + }, + // 成功消息 + msgSuccess(content: any) { + ElMessage.success({ + message: content, + grouping: true, + }) + }, + // 警告消息 + msgWarning(content: any) { + ElMessage.warning({ + message: content, + grouping: true, + }) + }, + // 弹出提示 + alert(content: any) { + ElMessageBox.alert(content, i18n.global.t('el.messagebox.title')) + }, + // 错误提示 + alertError(content: any) { + ElMessageBox.alert(content, i18n.global.t('el.messagebox.title'), { type: 'error' }) + }, + // 成功提示 + alertSuccess(content: any) { + ElMessageBox.alert(content, i18n.global.t('el.messagebox.title'), { type: 'success' }) + }, + // 警告提示 + alertWarning(content: any) { + ElMessageBox.alert(content, i18n.global.t('el.messagebox.title'), { type: 'warning' }) + }, + // 通知提示 + notify(content: any) { + ElNotification.info(content) + }, + // 错误通知 + notifyError(content: any) { + ElNotification.error(content) + }, + // 成功通知 + notifySuccess(content: any) { + ElNotification.success(content) + }, + // 警告通知 + notifyWarning(content: any) { + ElNotification.warning(content) + }, + // 确认窗体 + confirm(content: any, elMessageBoxOptions: ElMessageBoxOptions) { + return ElMessageBox.confirm(content, i18n.global.t('el.messagebox.title'), { + confirmButtonText: i18n.global.t('el.messagebox.confirm'), + cancelButtonText: i18n.global.t('el.messagebox.cancel'), + type: 'warning', + ...elMessageBoxOptions, + }) + }, + // 确认删除窗体 + confirmDelete(content: any, elMessageBoxOptions: ElMessageBoxOptions) { + return ElMessageBox.confirm(content, i18n.global.t('el.messagebox.title'), { + confirmButtonText: i18n.global.t('el.messagebox.confirm'), + cancelButtonText: i18n.global.t('el.messagebox.cancel'), + type: 'warning', + icon: markRaw(Delete), + ...elMessageBoxOptions, + }) + }, + // 提交内容 + prompt(content: any, elMessageBoxOptions: ElMessageBoxOptions) { + return ElMessageBox.prompt(content, i18n.global.t('el.messagebox.title'), { + confirmButtonText: i18n.global.t('el.messagebox.confirm'), + cancelButtonText: i18n.global.t('el.messagebox.cancel'), + type: 'warning', + ...elMessageBoxOptions, + }) + }, + // 打开遮罩层 + loading(content: any) { + loadingInstance = ElLoading.service({ + text: content, + }) + }, + // 关闭遮罩层 + closeLoading() { + loadingInstance.close() + }, +} diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..425d45c --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,68 @@ +import { createI18n } from 'vue-i18n' +import pinia from '/@/stores/index' +import { storeToRefs } from 'pinia' +import { useThemeConfig } from '/@/stores/themeConfig' + +// 定义语言国际化内容 + +/** + * 说明: + * 须在 pages 下新建文件夹(建议 `要国际化界面目录` 与 `i18n 目录` 相同,方便查找), + * 注意国际化定义的字段,不要与原有的定义字段相同。 + * 1、/src/i18n/lang 下的 ts 为框架的国际化内容 + * 2、/src/i18n/pages 下的 ts 为各界面的国际化内容 + */ + +// element plus 自带国际化 +import enLocale from 'element-plus/es/locale/lang/en' +import zhcnLocale from 'element-plus/es/locale/lang/zh-cn' +import zhtwLocale from 'element-plus/es/locale/lang/zh-tw' + +// 定义变量内容 +const messages = {} +const element = { en: enLocale, 'zh-cn': zhcnLocale, 'zh-tw': zhtwLocale } +const itemize = { en: [], 'zh-cn': [], 'zh-tw': [] } +const modules: Record = import.meta.glob('./**/*.ts', { eager: true }) + +// 对自动引入的 modules 进行分类 en、zh-cn、zh-tw +// https://vitejs.cn/vite3-cn/guide/features.html#glob-import +for (const path in modules) { + const key = path.match(/(\S+)\/(\S+).ts/) + if (itemize[key![2]]) itemize[key![2]].push(modules[path].default) + else itemize[key![2]] = modules[path] +} + +// 合并数组对象(非标准数组对象,数组中对象的每项 key、value 都不同) +function mergeArrObj(list: T, key: string) { + let obj = {} + list[key].forEach((i: EmptyObjectType) => { + obj = Object.assign({}, obj, i) + }) + return obj +} + +// 处理最终格式 +for (const key in itemize) { + messages[key] = { + name: key, + el: element[key].el, + message: mergeArrObj(itemize, key), + } +} + +// 读取 pinia 默认语言 +const stores = useThemeConfig(pinia) +const { themeConfig } = storeToRefs(stores) + +// 导出语言国际化 +// https://vue-i18n.intlify.dev/guide/essentials/fallback.html#explicit-fallback-with-one-locale +export const i18n = createI18n({ + legacy: false, + silentTranslationWarn: true, + missingWarn: false, + silentFallbackWarn: true, + fallbackWarn: false, + locale: themeConfig.value.globalI18n, + fallbackLocale: zhcnLocale.name, + messages, +}) diff --git a/src/i18n/lang/en.ts b/src/i18n/lang/en.ts new file mode 100644 index 0000000..5eeb275 --- /dev/null +++ b/src/i18n/lang/en.ts @@ -0,0 +1,193 @@ +// 定义内容 +export default { + router: { + home: 'home', + system: 'system', + systemMenu: 'systemMenu', + systemRole: 'systemRole', + systemUser: 'systemUser', + systemDept: 'systemDept', + systemDic: 'systemDic', + limits: 'limits', + limitsFrontEnd: 'FrontEnd', + limitsFrontEndPage: 'FrontEndPage', + limitsFrontEndBtn: 'FrontEndBtn', + limitsBackEnd: 'BackEnd', + limitsBackEndEndPage: 'BackEndEndPage', + menu: 'menu', + menu1: 'menu1', + menu11: 'menu11', + menu12: 'menu12', + menu121: 'menu121', + menu122: 'menu122', + menu13: 'menu13', + menu2: 'menu2', + funIndex: 'function', + funTagsView: 'funTagsView', + funCountup: 'countup', + funWangEditor: 'wangEditor', + funCropper: 'cropper', + funQrcode: 'qrcode', + funEchartsMap: 'EchartsMap', + funPrintJs: 'PrintJs', + funClipboard: 'Copy cut', + funGridLayout: 'Drag layout', + funSplitpanes: 'Pane splitter', + funDragVerify: 'Validator', + pagesIndex: 'pages', + pagesFiltering: 'Filtering', + pagesFilteringDetails: 'FilteringDetails', + pagesFilteringDetails1: 'FilteringDetails1', + pagesIocnfont: 'iconfont icon', + pagesElement: 'element icon', + pagesAwesome: 'awesome icon', + pagesFormAdapt: 'FormAdapt', + pagesTableRules: 'pagesTableRules', + pagesFormI18n: 'FormI18n', + pagesFormRules: 'Multi form validation', + pagesDynamicForm: 'Dynamic complex form', + pagesWorkflow: 'Workflow', + pagesListAdapt: 'ListAdapt', + pagesWaterfall: 'Waterfall', + pagesSteps: 'Steps', + pagesPreview: 'Large preview', + pagesWaves: 'Wave effect', + pagesTree: 'tree alter table', + pagesDrag: 'Drag command', + pagesLazyImg: 'Image lazy loading', + makeIndex: 'makeIndex', + makeSelector: 'Icon selector', + makeNoticeBar: 'notification bar', + makeSvgDemo: 'Svgicon demo', + makeTableDemo: 'table demo', + paramsIndex: 'Routing parameters', + paramsCommon: 'General routing', + paramsDynamic: 'Dynamic routing', + paramsCommonDetails: 'General routing details', + paramsDynamicDetails: 'Dynamic routing details', + chartIndex: 'chartIndex', + visualizingIndex: 'visualizingIndex', + visualizingLinkDemo1: 'visualizingLinkDemo1', + visualizingLinkDemo2: 'visualizingLinkDemo2', + personal: 'personal', + tools: 'tools', + layoutLinkView: 'LinkView', + layoutIframeViewOne: 'IframeViewOne', + layoutIframeViewTwo: 'IframeViewTwo', + }, + staticRoutes: { + signIn: 'signIn', + notFound: 'notFound', + noPower: 'noPower', + }, + user: { + title0: 'Component size', + title1: 'Language switching', + title2: 'Menu search', + title3: 'Layout configuration', + title4: 'news', + title5: 'Full screen on', + title6: 'Full screen off', + dropdownLarge: 'large', + dropdownDefault: 'default', + dropdownSmall: 'small', + dropdown1: 'home page', + dropdown2: 'Personal Center', + dropdown3: '404', + dropdown4: '401', + dropdown5: 'Log out', + dropdown6: 'Code warehouse', + searchPlaceholder: 'Menu search: support Chinese, routing path', + newTitle: 'notice', + newBtn: 'All read', + newGo: 'Go to the notification center', + newDesc: 'No notice', + logOutTitle: 'Tips', + logOutMessage: 'This operation will log out. Do you want to continue?', + logOutConfirm: 'determine', + logOutCancel: 'cancel', + logOutExit: 'Exiting', + }, + tagsView: { + refresh: 'refresh', + close: 'close', + closeOther: 'closeOther', + closeAll: 'closeAll', + fullscreen: 'fullscreen', + closeFullscreen: 'closeFullscreen', + }, + notFound: { + foundTitle: 'Wrong address input, please re-enter the address~', + foundMsg: 'You can check the web address first, and then re-enter or give us feedback.', + foundBtn: 'Back to home page', + }, + noAccess: { + accessTitle: 'You are not authorized to operate~', + accessMsg: 'Contact information: add QQ group discussion 665452019', + accessBtn: 'Reauthorization', + }, + layout: { + primary: 'Theme color', + configTitle: 'Layout configuration', + oneTitle: 'Global Themes', + twoTopTitle: 'top bar set up', + twoMenuTitle: 'Menu set up', + twoColumnsTitle: 'Columns set up', + twoTopBar: 'Top bar background', + twoTopBarColor: 'Top bar default font color', + twoIsTopBarColorGradual: 'Top bar gradient', + twoMenuBar: 'Menu background', + twoMenuBarColor: 'Menu default font color', + twoMenuBarActiveColor: 'Menu Highlight Color', + twoIsMenuBarColorGradual: 'Menu gradient', + twoColumnsMenuBar: 'Column menu background', + twoColumnsMenuBarColor: 'Default font color bar menu', + twoIsColumnsMenuBarColorGradual: 'Column gradient', + twoIsColumnsMenuHoverPreload: 'Column Menu Hover Preload', + threeTitle: 'Interface settings', + threeIsCollapse: 'Menu horizontal collapse', + threeIsUniqueOpened: 'Menu accordion', + threeIsFixedHeader: 'Fixed header', + threeIsClassicSplitMenu: 'Classic layout split menu', + threeIsLockScreen: 'Open the lock screen', + threeLockScreenTime: 'screen locking(s/s)', + fourTitle: 'Interface display', + fourIsShowLogo: 'Sidebar logo', + fourIsBreadcrumb: 'Open breadcrumb', + fourIsBreadcrumbIcon: 'Open breadcrumb icon', + fourIsTagsview: 'Open tagsview', + fourIsTagsviewIcon: 'Open tagsview Icon', + fourIsCacheTagsView: 'Enable tagsview cache', + fourIsSortableTagsView: 'Enable tagsview drag', + fourIsShareTagsView: 'Enable tagsview sharing', + fourIsFooter: 'Open footer', + fourIsGrayscale: 'Grey model', + fourIsInvert: 'Color weak mode', + fourIsDark: 'Dark Mode', + fourIsWatermark: 'Turn on watermark', + fourWatermarkText: 'Watermark copy', + fiveTitle: 'Other settings', + fiveTagsStyle: 'Tagsview style', + fiveAnimation: 'page animation', + fiveColumnsAsideStyle: 'Column style', + fiveColumnsAsideLayout: 'Column layout', + sixTitle: 'Layout switch', + sixDefaults: 'One', + sixClassic: 'Two', + sixTransverse: 'Three', + sixColumns: 'Four', + tipText: 'Click the button below to copy the layout configuration to `/src/stores/themeConfig.ts` It has been modified in.', + copyText: 'replication configuration', + resetText: 'restore default', + copyTextSuccess: 'Copy succeeded!', + copyTextError: 'Copy failed!', + }, + upgrade: { + title: 'New version', + msg: 'The new version is available, please update it now! Dont worry, the update is fast!', + desc: 'Prompt: Update will restore the default configuration', + btnOne: 'Cruel refusal', + btnTwo: 'Update now', + btnTwoLoading: 'Updating', + }, +} diff --git a/src/i18n/lang/zh-cn.ts b/src/i18n/lang/zh-cn.ts new file mode 100644 index 0000000..3f81567 --- /dev/null +++ b/src/i18n/lang/zh-cn.ts @@ -0,0 +1,193 @@ +// 定义内容 +export default { + router: { + home: '首页', + system: '系统设置', + systemMenu: '菜单管理', + systemRole: '角色管理', + systemUser: '用户管理', + systemDept: '部门管理', + systemDic: '字典管理', + limits: '权限管理', + limitsFrontEnd: '前端控制', + limitsFrontEndPage: '页面权限', + limitsFrontEndBtn: '按钮权限', + limitsBackEnd: '后端控制', + limitsBackEndEndPage: '页面权限', + menu: '菜单嵌套', + menu1: '菜单1', + menu11: '菜单11', + menu12: '菜单12', + menu121: '菜单121', + menu122: '菜单122', + menu13: '菜单13', + menu2: '菜单2', + funIndex: '功能', + funTagsView: '标签页操作', + funCountup: '数字滚动', + funWangEditor: 'Editor 编辑器', + funCropper: '图片裁剪', + funQrcode: '二维码生成', + funEchartsMap: '地理坐标/地图', + funPrintJs: '页面打印', + funClipboard: '复制剪切', + funGridLayout: '拖拽布局', + funSplitpanes: '窗格拆分器', + funDragVerify: '验证器', + pagesIndex: '页面', + pagesFiltering: '过滤筛选组件', + pagesFilteringDetails: '过滤筛选组件详情', + pagesFilteringDetails1: '过滤筛选组件详情111', + pagesIocnfont: 'ali 字体图标', + pagesElement: 'ele 字体图标', + pagesAwesome: 'awe 字体图标', + pagesFormAdapt: '表单自适应', + pagesTableRules: '表单表格验证', + pagesFormI18n: '表单国际化', + pagesFormRules: '多表单验证', + pagesDynamicForm: '动态复杂表单', + pagesWorkflow: '工作流', + pagesListAdapt: '列表自适应', + pagesWaterfall: '瀑布屏', + pagesSteps: '步骤条', + pagesPreview: '大图预览', + pagesWaves: '波浪效果', + pagesTree: '树形改表格', + pagesDrag: '拖动指令', + pagesLazyImg: '图片懒加载', + makeIndex: '组件封装', + makeSelector: '图标选择器', + makeNoticeBar: '滚动通知栏', + makeSvgDemo: 'svgIcon 演示', + makeTableDemo: '表格封装演示', + paramsIndex: '路由参数', + paramsCommon: '普通路由', + paramsDynamic: '动态路由', + paramsCommonDetails: '普通路由详情', + paramsDynamicDetails: '动态路由详情', + chartIndex: '大数据图表', + visualizingIndex: '数据可视化', + visualizingLinkDemo1: '数据可视化演示1', + visualizingLinkDemo2: '数据可视化演示2', + personal: '个人中心', + tools: '工具类集合', + layoutLinkView: '外链', + layoutIframeViewOne: '内嵌 iframe1', + layoutIframeViewTwo: '内嵌 iframe2', + }, + staticRoutes: { + signIn: '登录', + notFound: '找不到此页面', + noPower: '没有权限', + }, + user: { + title0: '组件大小', + title1: '语言切换', + title2: '菜单搜索', + title3: '布局配置', + title4: '消息', + title5: '开全屏', + title6: '关全屏', + dropdownLarge: '大型', + dropdownDefault: '默认', + dropdownSmall: '小型', + dropdown1: '首页', + dropdown2: '个人中心', + dropdown3: '404', + dropdown4: '401', + dropdown5: '退出登录', + dropdown6: '代码仓库', + searchPlaceholder: '菜单搜索:支持中文、路由路径', + newTitle: '通知', + newBtn: '全部已读', + newGo: '前往通知中心', + newDesc: '暂无通知', + logOutTitle: '提示', + logOutMessage: '此操作将退出登录, 是否继续?', + logOutConfirm: '确定', + logOutCancel: '取消', + logOutExit: '退出中', + }, + tagsView: { + refresh: '刷新', + close: '关闭', + closeOther: '关闭其它', + closeAll: '全部关闭', + fullscreen: '当前页全屏', + closeFullscreen: '关闭全屏', + }, + notFound: { + foundTitle: '地址输入错误,请重新输入地址~', + foundMsg: '您可以先检查网址,然后重新输入或给我们反馈问题。', + foundBtn: '返回首页', + }, + noAccess: { + accessTitle: '您未被授权,没有操作权限~', + accessMsg: '联系方式:加QQ群探讨 665452019', + accessBtn: '重新授权', + }, + layout: { + primary: '主题颜色', + configTitle: '布局配置', + oneTitle: '全局主题', + twoTopTitle: '顶栏设置', + twoMenuTitle: '菜单设置', + twoColumnsTitle: '分栏设置', + twoTopBar: '顶栏背景', + twoTopBarColor: '顶栏默认字体颜色', + twoIsTopBarColorGradual: '顶栏背景渐变', + twoMenuBar: '菜单背景', + twoMenuBarColor: '菜单默认字体颜色', + twoMenuBarActiveColor: '菜单高亮背景色', + twoIsMenuBarColorGradual: '菜单背景渐变', + twoColumnsMenuBar: '分栏菜单背景', + twoColumnsMenuBarColor: '分栏菜单默认字体颜色', + twoIsColumnsMenuBarColorGradual: '分栏菜单背景渐变', + twoIsColumnsMenuHoverPreload: '分栏菜单鼠标悬停预加载', + threeTitle: '界面设置', + threeIsCollapse: '菜单水平折叠', + threeIsUniqueOpened: '菜单手风琴', + threeIsFixedHeader: '固定 Header', + threeIsClassicSplitMenu: '经典布局分割菜单', + threeIsLockScreen: '开启锁屏', + threeLockScreenTime: '自动锁屏(s/秒)', + fourTitle: '界面显示', + fourIsShowLogo: '侧边栏 Logo', + fourIsBreadcrumb: '开启面包屑', + fourIsBreadcrumbIcon: '开启面包屑图标', + fourIsTagsview: '开启标签页', + fourIsTagsviewIcon: '开启标签页图标', + fourIsCacheTagsView: '开启标签页缓存', + fourIsSortableTagsView: '开启标签页拖拽', + fourIsShareTagsView: '开启标签页共用', + fourIsFooter: '开启 Footer', + fourIsGrayscale: '灰色模式', + fourIsInvert: '色弱模式', + fourIsDark: '深色模式', + fourIsWatermark: '开启水印', + fourWatermarkText: '水印文案', + fiveTitle: '其它设置', + fiveTagsStyle: '标签页风格', + fiveAnimation: '主页面切换动画', + fiveColumnsAsideStyle: '分栏高亮风格', + fiveColumnsAsideLayout: '分栏布局风格', + sixTitle: '布局切换', + sixDefaults: '默认', + sixClassic: '经典', + sixTransverse: '横向', + sixColumns: '分栏', + tipText: '点击下方按钮,复制布局配置去 `src/stores/themeConfig.ts` 中修改。', + copyText: '一键复制配置', + resetText: '一键恢复默认', + copyTextSuccess: '复制成功!', + copyTextError: '复制失败!', + }, + upgrade: { + title: '新版本升级', + msg: '新版本来啦,马上更新尝鲜吧!不用担心,更新很快的哦!', + desc: '提示:更新会还原默认配置', + btnOne: '残忍拒绝', + btnTwo: '马上更新', + btnTwoLoading: '更新中', + }, +} diff --git a/src/i18n/lang/zh-tw.ts b/src/i18n/lang/zh-tw.ts new file mode 100644 index 0000000..7493afb --- /dev/null +++ b/src/i18n/lang/zh-tw.ts @@ -0,0 +1,193 @@ +// 定义内容 +export default { + router: { + home: '首頁', + system: '系統設置', + systemMenu: '選單管理', + systemRole: '角色管理', + systemUser: '用戶管理', + systemDept: '部門管理', + systemDic: '字典管理', + limits: '許可權管理', + limitsFrontEnd: '前端控制', + limitsFrontEndPage: '頁面許可權', + limitsFrontEndBtn: '按鈕許可權', + limitsBackEnd: '後端控制', + limitsBackEndEndPage: '頁面許可權', + menu: '選單嵌套', + menu1: '選單1', + menu11: '選單11', + menu12: '選單12', + menu121: '選單121', + menu122: '選單122', + menu13: '選單13', + menu2: '選單2', + funIndex: '功能', + funTagsView: 'tagsView 操作', + funCountup: '數位滾動', + funWangEditor: 'Editor 編輯器', + funCropper: '圖片裁剪', + funQrcode: '二維碼生成', + funEchartsMap: '地理座標/地圖', + funPrintJs: '頁面列印', + funClipboard: '複製剪切', + funGridLayout: '拖拽佈局', + funSplitpanes: '窗格折開器', + funDragVerify: '驗證器', + pagesIndex: '頁面', + pagesFiltering: '過濾篩選組件', + pagesFilteringDetails: '過濾篩選組件詳情', + pagesFilteringDetails1: '過濾篩選組件詳情111', + pagesIocnfont: 'ali 字體圖標', + pagesElement: 'ele 字體圖標', + pagesAwesome: 'awe 字體圖標', + pagesFormAdapt: '表單自我調整', + pagesTableRules: '表單表格驗證', + pagesFormI18n: '表單國際化', + pagesFormRules: '多表單驗證', + pagesDynamicForm: '動態複雜表單', + pagesWorkflow: '工作流', + pagesListAdapt: '清單自我調整', + pagesWaterfall: '瀑布屏', + pagesSteps: '步驟條', + pagesPreview: '大圖預覽', + pagesWaves: '波浪效果', + pagesTree: '樹形改表格', + pagesDrag: '拖動指令', + pagesLazyImg: '圖片懶加載', + makeIndex: '組件封裝', + makeSelector: '圖標選擇器', + makeNoticeBar: '滾動通知欄', + makeSvgDemo: 'svgIcon 演示', + makeTableDemo: '表格封裝演示', + paramsIndex: '路由參數', + paramsCommon: '普通路由', + paramsDynamic: '動態路由', + paramsCommonDetails: '普通路由詳情', + paramsDynamicDetails: '動態路由詳情', + chartIndex: '大資料圖表', + visualizingIndex: '數據視覺化', + visualizingLinkDemo1: '數據視覺化演示1', + visualizingLinkDemo2: '數據視覺化演示2', + personal: '個人中心', + tools: '工具類集合', + layoutLinkView: '外鏈', + layoutIframeViewOne: '内嵌 iframe1', + layoutIframeViewTwo: '内嵌 iframe2', + }, + staticRoutes: { + signIn: '登入', + notFound: '找不到此頁面', + noPower: '沒有許可權', + }, + user: { + title0: '組件大小', + title1: '語言切換', + title2: '選單蒐索', + title3: '佈局配寘', + title4: '消息', + title5: '開全屏', + title6: '關全屏', + dropdownLarge: '大型', + dropdownDefault: '默認', + dropdownSmall: '小型', + dropdown1: '首頁', + dropdown2: '個人中心', + dropdown3: '404', + dropdown4: '401', + dropdown5: '登出', + dropdown6: '程式碼倉庫', + searchPlaceholder: '選單蒐索:支援中文、路由路徑', + newTitle: '通知', + newBtn: '全部已讀', + newGo: '前往通知中心', + newDesc: '暫無通知', + logOutTitle: '提示', + logOutMessage: '此操作將登出,是否繼續?', + logOutConfirm: '確定', + logOutCancel: '取消', + logOutExit: '退出中', + }, + tagsView: { + refresh: '重繪', + close: '關閉', + closeOther: '關閉其它', + closeAll: '全部關閉', + fullscreen: '當前頁全屏', + closeFullscreen: '關閉全屏', + }, + notFound: { + foundTitle: '地址輸入錯誤,請重新輸入地址~', + foundMsg: '您可以先檢查網址,然後重新輸入或給我們迴響問題。', + foundBtn: '返回首頁', + }, + noAccess: { + accessTitle: '您未被授權,沒有操作許可權~', + accessMsg: '聯繫方式:加QQ群探討665452019', + accessBtn: '重新授權', + }, + layout: { + primary: '主題顏色', + configTitle: '佈局配寘', + oneTitle: '全域主題', + twoTopTitle: '頂欄設定', + twoMenuTitle: '選單設定', + twoColumnsTitle: '分欄設定', + twoTopBar: '頂欄背景', + twoTopBarColor: '頂欄默認字體顏色', + twoIsTopBarColorGradual: '頂欄背景漸變', + twoMenuBar: '選單背景', + twoMenuBarColor: '選單默認字體顏色', + twoMenuBarActiveColor: '選單高亮背景色', + twoIsMenuBarColorGradual: '選單背景漸變', + twoColumnsMenuBar: '分欄選單背景', + twoColumnsMenuBarColor: '分欄選單默認字體顏色', + twoIsColumnsMenuBarColorGradual: '分欄選單背景漸變', + twoIsColumnsMenuHoverPreload: '分欄選單滑鼠懸停預加載', + threeTitle: '介面設定', + threeIsCollapse: '選單水准折疊', + threeIsUniqueOpened: '選單手風琴', + threeIsFixedHeader: '固定 Header', + threeIsClassicSplitMenu: '經典佈局分割選單', + threeIsLockScreen: '開啟鎖屏', + threeLockScreenTime: '自動鎖屏(s/秒)', + fourTitle: '介面顯示', + fourIsShowLogo: '側邊欄 Logo', + fourIsBreadcrumb: '開啟麵包屑', + fourIsBreadcrumbIcon: '開啟麵包屑圖標', + fourIsTagsview: '開啟標籤頁', + fourIsTagsviewIcon: '開啟標籤頁圖標', + fourIsCacheTagsView: '開啟標籤頁緩存', + fourIsSortableTagsView: '開啟標籤頁拖拽', + fourIsShareTagsView: '開啟標籤頁共用', + fourIsFooter: '開啟 Footer', + fourIsGrayscale: '灰色模式', + fourIsInvert: '色弱模式', + fourIsDark: '深色模式', + fourIsWatermark: '開啟浮水印', + fourWatermarkText: '浮水印文案', + fiveTitle: '其它設定', + fiveTagsStyle: 'Tagsview 風格', + fiveAnimation: '主頁面切換動畫', + fiveColumnsAsideStyle: '分欄高亮風格', + fiveColumnsAsideLayout: '分欄佈局風格', + sixTitle: '佈局切換', + sixDefaults: '默認', + sixClassic: '經典', + sixTransverse: '橫向', + sixColumns: '分欄', + tipText: '點擊下方按鈕,複製佈局配寘去`src/stores/themeConfig.ts`中修改。', + copyText: '一鍵複製配寘', + resetText: '一鍵恢復默認', + copyTextSuccess: '複製成功!', + copyTextError: '複製失敗!', + }, + upgrade: { + title: '新版本陞級', + msg: '新版本來啦,馬上更新嘗鮮吧! 不用擔心,更新很快的哦!', + desc: '提示:更新會還原默認配寘', + btnOne: '殘忍拒絕', + btnTwo: '馬上更新', + btnTwoLoading: '更新中', + }, +} diff --git a/src/i18n/pages/formI18n/en.ts b/src/i18n/pages/formI18n/en.ts new file mode 100644 index 0000000..6989758 --- /dev/null +++ b/src/i18n/pages/formI18n/en.ts @@ -0,0 +1,13 @@ +// 定义内容 +export default { + formI18nLabel: { + name: 'name', + email: 'email', + autograph: 'autograph', + }, + formI18nPlaceholder: { + name: 'Please enter your name', + email: 'Please enter the users Department', + autograph: 'Please enter the login account name', + }, +} diff --git a/src/i18n/pages/formI18n/zh-cn.ts b/src/i18n/pages/formI18n/zh-cn.ts new file mode 100644 index 0000000..1818a19 --- /dev/null +++ b/src/i18n/pages/formI18n/zh-cn.ts @@ -0,0 +1,13 @@ +// 定义内容 +export default { + formI18nLabel: { + name: '姓名', + email: '用户归属部门', + autograph: '登陆账户名', + }, + formI18nPlaceholder: { + name: '请输入姓名', + email: '请输入用户归属部门', + autograph: '请输入登陆账户名', + }, +} diff --git a/src/i18n/pages/formI18n/zh-tw.ts b/src/i18n/pages/formI18n/zh-tw.ts new file mode 100644 index 0000000..61621fc --- /dev/null +++ b/src/i18n/pages/formI18n/zh-tw.ts @@ -0,0 +1,13 @@ +// 定义内容 +export default { + formI18nLabel: { + name: '姓名', + email: '用戶歸屬部門', + autograph: '登入帳戶名', + }, + formI18nPlaceholder: { + name: '請輸入姓名', + email: '請輸入用戶歸屬部門', + autograph: '請輸入登入帳戶名', + }, +} diff --git a/src/i18n/pages/login/en.ts b/src/i18n/pages/login/en.ts new file mode 100644 index 0000000..f68e68c --- /dev/null +++ b/src/i18n/pages/login/en.ts @@ -0,0 +1,37 @@ +// 定义内容 +export default { + label: { + one1: 'Account login', + two2: 'Mobile login', + two3: 'Email login', + }, + link: { + one3: 'Third party login', + two4: 'Links', + }, + account: { + accountPlaceholder1: 'Please input account', + accountPlaceholder2: 'Please input Password', + accountBtnText: 'Sign in', + }, + mobile: { + placeholder1: 'Please input mobile phone number', + placeholder2: 'Please enter the verification code', + codeText: 'Get code', + btnText: 'Sign in', + msgText: + 'Warm tip: it is recommended to use Google, Microsoft edge, version 79.0.1072.62 and above browsers, and 360 browser, please use speed mode', + }, + email: { + placeholder1: 'Please input email adress', + placeholder2: 'Please enter the verification code', + codeText: 'Get code', + btnText: 'Sign in', + msgText: + 'Warm tip: it is recommended to use Google, Microsoft edge, version 79.0.1072.62 and above browsers, and 360 browser, please use speed mode', + }, + scan: { + text: 'Open the mobile phone to scan and quickly log in / register', + }, + signInText: 'welcome back!', +} diff --git a/src/i18n/pages/login/zh-cn.ts b/src/i18n/pages/login/zh-cn.ts new file mode 100644 index 0000000..b7491ea --- /dev/null +++ b/src/i18n/pages/login/zh-cn.ts @@ -0,0 +1,35 @@ +// 定义内容 +export default { + label: { + one1: '账号登录', + two2: '手机登录', + two3: '邮箱登录', + }, + link: { + one3: '第三方登录', + two4: '友情链接', + }, + account: { + accountPlaceholder1: '请输入账号', + accountPlaceholder2: '请输入密码', + accountBtnText: '登 录', + }, + mobile: { + placeholder1: '请输入手机号', + placeholder2: '请输入验证码', + codeText: '获取验证码', + btnText: '登 录', + msgText: '* 温馨提示:建议使用谷歌、Microsoft Edge,版本 79.0.1072.62 及以上浏览器,360浏览器请使用极速模式', + }, + email: { + placeholder1: '请输入邮箱地址', + placeholder2: '请输入验证码', + codeText: '获取验证码', + btnText: '登 录', + msgText: '* 温馨提示:建议使用谷歌、Microsoft Edge,版本 79.0.1072.62 及以上浏览器,360浏览器请使用极速模式', + }, + scan: { + text: '打开手机扫一扫,快速登录/注册', + }, + signInText: '欢迎回来!', +} diff --git a/src/i18n/pages/login/zh-tw.ts b/src/i18n/pages/login/zh-tw.ts new file mode 100644 index 0000000..8145935 --- /dev/null +++ b/src/i18n/pages/login/zh-tw.ts @@ -0,0 +1,35 @@ +// 定义内容 +export default { + label: { + one1: '賬號登錄', + two2: '手機號登錄', + two3: '郵箱登錄', + }, + link: { + one3: '協力廠商登入', + two4: '友情連結', + }, + account: { + accountPlaceholder1: '請輸入賬號', + accountPlaceholder2: '請輸入密碼', + accountBtnText: '登 錄', + }, + mobile: { + placeholder1: '請輸入手機號', + placeholder2: '請輸入驗證碼', + codeText: '獲取驗證碼', + btnText: '登 錄', + msgText: '* 溫馨提示:建議使用穀歌、Microsoft Edge,版本79.0.1072.62及以上瀏覽器,360瀏覽器請使用極速模式', + }, + email: { + placeholder1: '請輸入郵箱地址', + placeholder2: '請輸入驗證碼', + codeText: '獲取驗證碼', + btnText: '登入', + msgText: '* 溫馨提示:建議使用穀歌、Microsoft Edge,版本79.0.1072.62及以上瀏覽器,360瀏覽器請使用極速模式', + }, + scan: { + text: '打開手機掃一掃,快速登錄/注册', + }, + signInText: '歡迎回來!', +} diff --git a/src/layout/component/aside.vue b/src/layout/component/aside.vue new file mode 100644 index 0000000..919c2ca --- /dev/null +++ b/src/layout/component/aside.vue @@ -0,0 +1,167 @@ + + + diff --git a/src/layout/component/columnsAside.vue b/src/layout/component/columnsAside.vue new file mode 100644 index 0000000..d8f60e3 --- /dev/null +++ b/src/layout/component/columnsAside.vue @@ -0,0 +1,356 @@ + + + + + diff --git a/src/layout/component/header.vue b/src/layout/component/header.vue new file mode 100644 index 0000000..d54ce09 --- /dev/null +++ b/src/layout/component/header.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/layout/component/main.vue b/src/layout/component/main.vue new file mode 100644 index 0000000..208a087 --- /dev/null +++ b/src/layout/component/main.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/layout/footer/index.vue b/src/layout/footer/index.vue new file mode 100644 index 0000000..e348955 --- /dev/null +++ b/src/layout/footer/index.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..7aab785 --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,50 @@ + + + diff --git a/src/layout/lockScreen/index.vue b/src/layout/lockScreen/index.vue new file mode 100644 index 0000000..919ebbf --- /dev/null +++ b/src/layout/lockScreen/index.vue @@ -0,0 +1,353 @@ + + + + + diff --git a/src/layout/logo/index.vue b/src/layout/logo/index.vue new file mode 100644 index 0000000..cc29860 --- /dev/null +++ b/src/layout/logo/index.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/src/layout/main/classic.vue b/src/layout/main/classic.vue new file mode 100644 index 0000000..cb15c13 --- /dev/null +++ b/src/layout/main/classic.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/layout/main/columns.vue b/src/layout/main/columns.vue new file mode 100644 index 0000000..87659b9 --- /dev/null +++ b/src/layout/main/columns.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/layout/main/defaults.vue b/src/layout/main/defaults.vue new file mode 100644 index 0000000..99416c1 --- /dev/null +++ b/src/layout/main/defaults.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/layout/main/transverse.vue b/src/layout/main/transverse.vue new file mode 100644 index 0000000..76203a7 --- /dev/null +++ b/src/layout/main/transverse.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/layout/navBars/index.vue b/src/layout/navBars/index.vue new file mode 100644 index 0000000..7f3f2fd --- /dev/null +++ b/src/layout/navBars/index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/layout/navBars/tagsView/contextmenu.vue b/src/layout/navBars/tagsView/contextmenu.vue new file mode 100644 index 0000000..b1585be --- /dev/null +++ b/src/layout/navBars/tagsView/contextmenu.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/layout/navBars/tagsView/tagsView.vue b/src/layout/navBars/tagsView/tagsView.vue new file mode 100644 index 0000000..033a448 --- /dev/null +++ b/src/layout/navBars/tagsView/tagsView.vue @@ -0,0 +1,751 @@ + + + + + diff --git a/src/layout/navBars/topBar/breadcrumb.vue b/src/layout/navBars/topBar/breadcrumb.vue new file mode 100644 index 0000000..647561e --- /dev/null +++ b/src/layout/navBars/topBar/breadcrumb.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/src/layout/navBars/topBar/closeFull.vue b/src/layout/navBars/topBar/closeFull.vue new file mode 100644 index 0000000..609be66 --- /dev/null +++ b/src/layout/navBars/topBar/closeFull.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/src/layout/navBars/topBar/index.vue b/src/layout/navBars/topBar/index.vue new file mode 100644 index 0000000..7d15558 --- /dev/null +++ b/src/layout/navBars/topBar/index.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/src/layout/navBars/topBar/msg.vue b/src/layout/navBars/topBar/msg.vue new file mode 100644 index 0000000..6a91a9e --- /dev/null +++ b/src/layout/navBars/topBar/msg.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/src/layout/navBars/topBar/search.vue b/src/layout/navBars/topBar/search.vue new file mode 100644 index 0000000..c3bf958 --- /dev/null +++ b/src/layout/navBars/topBar/search.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/src/layout/navBars/topBar/setings.vue b/src/layout/navBars/topBar/setings.vue new file mode 100644 index 0000000..b21317d --- /dev/null +++ b/src/layout/navBars/topBar/setings.vue @@ -0,0 +1,948 @@ + + + + + diff --git a/src/layout/navBars/topBar/user.vue b/src/layout/navBars/topBar/user.vue new file mode 100644 index 0000000..700a7fc --- /dev/null +++ b/src/layout/navBars/topBar/user.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/src/layout/navBars/topBar/userNews.vue b/src/layout/navBars/topBar/userNews.vue new file mode 100644 index 0000000..442b674 --- /dev/null +++ b/src/layout/navBars/topBar/userNews.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/layout/navMenu/horizontal.vue b/src/layout/navMenu/horizontal.vue new file mode 100644 index 0000000..5a9a7a1 --- /dev/null +++ b/src/layout/navMenu/horizontal.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/src/layout/navMenu/subItem.vue b/src/layout/navMenu/subItem.vue new file mode 100644 index 0000000..92674e3 --- /dev/null +++ b/src/layout/navMenu/subItem.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/layout/navMenu/vertical.vue b/src/layout/navMenu/vertical.vue new file mode 100644 index 0000000..be7f428 --- /dev/null +++ b/src/layout/navMenu/vertical.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/layout/routerView/iframes.vue b/src/layout/routerView/iframes.vue new file mode 100644 index 0000000..7c6270e --- /dev/null +++ b/src/layout/routerView/iframes.vue @@ -0,0 +1,101 @@ +