From 77e9f1df5068c4de4f33204dfd87dcc68dc7a2cf Mon Sep 17 00:00:00 2001 From: alex_q <914269@qq.com> Date: Fri, 12 Jun 2026 12:31:35 +0800 Subject: [PATCH] first commit --- .editorconfig | 15 + .env.development | 11 + .env.production | 3 + .eslintignore | 14 + .eslintrc-auto-import.json | 309 +++++ .eslintrc.cjs | 88 ++ .gitignore | 18 + .hintrc | 15 + .husky/commit-msg | 1 + .husky/pre-commit | 1 + .prettierignore | 11 + .prettierrc.cjs | 46 + .stylelintignore | 11 + .stylelintrc.cjs | 51 + .vscode/extensions.json | 11 + .vscode/settings.json | 80 ++ .vscode/vue3.0.code-snippets | 23 + .vscode/vue3.2.code-snippets | 17 + .vscode/vue3.3.code-snippets | 21 + README.md | 191 +++ commitlint.config.cjs | 94 ++ index.html | 137 +++ mock/auth.mock.ts | 43 + mock/base.ts | 10 + mock/menu.mock.ts | 120 ++ mock/user.mock.ts | 44 + package.json | 118 ++ public/favicon.ico | Bin 0 -> 16958 bytes public/html/coin.html | 66 ++ public/html/contact.html | 23 + public/html/help.css | 15 + public/html/privacy.html | 156 +++ public/html/user.html | 120 ++ public/html/vip.html | 33 + src/App.vue | 24 + src/api/auth.ts | 150 +++ src/api/bank.ts | 28 + src/api/codegen.ts | 191 +++ src/api/config.ts | 104 ++ src/api/dict.ts | 192 +++ src/api/file.ts | 74 ++ src/api/helper.ts | 86 ++ src/api/integral.ts | 56 + src/api/log.ts | 122 ++ src/api/menu.ts | 209 ++++ src/api/message.ts | 57 + src/api/notice.ts | 48 + src/api/order.ts | 37 + src/api/role.ts | 139 +++ src/api/software.ts | 130 ++ src/api/statistics.ts | 48 + src/api/style.ts | 68 ++ src/api/user.ts | 612 ++++++++++ src/assets/icons/alipay-l.svg | 1 + src/assets/icons/alipay-s.svg | 1 + src/assets/icons/api.svg | 1 + src/assets/icons/backtop.svg | 1 + src/assets/icons/captcha.svg | 1 + src/assets/icons/cascader.svg | 1 + src/assets/icons/client.svg | 1 + src/assets/icons/close.svg | 1 + src/assets/icons/close_all.svg | 1 + src/assets/icons/close_left.svg | 1 + src/assets/icons/close_other.svg | 1 + src/assets/icons/close_right.svg | 1 + src/assets/icons/code.svg | 1 + src/assets/icons/collapse.svg | 1 + src/assets/icons/dict.svg | 1 + src/assets/icons/document.svg | 1 + src/assets/icons/download.svg | 1 + src/assets/icons/file.svg | 1 + src/assets/icons/finish-black.svg | 1 + src/assets/icons/finish-white.svg | 1 + src/assets/icons/fullscreen-exit.svg | 1 + src/assets/icons/fullscreen.svg | 1 + src/assets/icons/github.svg | 1 + src/assets/icons/homepage.svg | 1 + src/assets/icons/ip.svg | 1 + src/assets/icons/java.svg | 1 + src/assets/icons/language.svg | 1 + src/assets/icons/menu.svg | 1 + src/assets/icons/message.svg | 1 + src/assets/icons/monitor.svg | 1 + src/assets/icons/project.svg | 1 + src/assets/icons/pv.svg | 1 + src/assets/icons/qrcode-black.svg | 1 + src/assets/icons/qrcode-white.svg | 1 + src/assets/icons/refresh.svg | 1 + src/assets/icons/role.svg | 1 + src/assets/icons/scan-black.svg | 1 + src/assets/icons/scan-white.svg | 1 + src/assets/icons/setting.svg | 1 + src/assets/icons/size.svg | 1 + src/assets/icons/system.svg | 1 + src/assets/icons/table.svg | 1 + src/assets/icons/todo.svg | 1 + src/assets/icons/tree.svg | 1 + src/assets/icons/typescript.svg | 1 + src/assets/icons/unipay.svg | 1 + src/assets/icons/user.svg | 1 + src/assets/icons/uv.svg | 1 + src/assets/icons/vue.svg | 1 + src/assets/icons/wxpay-l.svg | 1 + src/assets/icons/wxpay-s.svg | 1 + src/assets/icons/xml.svg | 1 + src/assets/images/401.gif | Bin 0 -> 162867 bytes src/assets/images/404.png | Bin 0 -> 20613 bytes src/assets/images/404_cloud.png | Bin 0 -> 2644 bytes src/assets/images/Software/ac_one_blur.png | Bin 0 -> 16557 bytes src/assets/images/Software/ac_one_focus.png | Bin 0 -> 16967 bytes src/assets/images/Software/android_qr.png | Bin 0 -> 27829 bytes .../images/Software/icon_android_blur.png | Bin 0 -> 4049 bytes .../images/Software/icon_android_focus.png | Bin 0 -> 4755 bytes src/assets/images/Software/icon_download.png | Bin 0 -> 3125 bytes src/assets/images/Software/icon_font.png | Bin 0 -> 10226 bytes src/assets/images/Software/icon_ios_blur.png | Bin 0 -> 3835 bytes src/assets/images/Software/icon_ios_focus.png | Bin 0 -> 4182 bytes src/assets/images/Software/icon_pc_blur.png | Bin 0 -> 3665 bytes src/assets/images/Software/icon_pc_focus.png | Bin 0 -> 4017 bytes src/assets/images/Software/ios_qr2.png | Bin 0 -> 3096 bytes src/assets/images/default.jpg | Bin 0 -> 16747 bytes src/assets/images/flower.png | Bin 0 -> 1501 bytes src/assets/images/hot_bank.jpg | Bin 0 -> 51653 bytes src/assets/images/login-background-dark.jpg | Bin 0 -> 20471 bytes src/assets/images/login-background-light.jpg | Bin 0 -> 32872 bytes src/assets/images/sad.png | Bin 0 -> 982 bytes src/assets/logo.png | Bin 0 -> 8953 bytes src/assets/logo_s.png | Bin 0 -> 6418 bytes src/assets/web_logo.png | Bin 0 -> 4691 bytes src/components/AmountInput/index.vue | 70 ++ src/components/AppLink/index.vue | 38 + src/components/Breadcrumb/index.vue | 97 ++ src/components/CURD/PageContent.vue | 1023 ++++++++++++++++ src/components/CURD/PageForm.vue | 174 +++ src/components/CURD/PageModal.vue | 425 +++++++ src/components/CURD/PageSearch.vue | 245 ++++ src/components/CURD/types.ts | 272 +++++ src/components/CURD/usePage.ts | 73 ++ src/components/CopyButton/index.vue | 62 + src/components/Dictionary/index.vue | 76 ++ src/components/GithubCorner/index.vue | 62 + src/components/Hamburger/index.vue | 39 + src/components/IconSelect/index.vue | 208 ++++ src/components/IcpBar/index.vue | 52 + src/components/LangSelect/index.vue | 47 + src/components/LoginDialog/index.vue | 472 ++++++++ src/components/MenuSearch/index.vue | 143 +++ src/components/MsgTip/index.vue | 94 ++ src/components/Pagination/index.vue | 81 ++ src/components/SendCodeButton/index.vue | 147 +++ src/components/SizeSelect/index.vue | 39 + src/components/SvgIcon/index.vue | 41 + src/components/TableSelect/index.vue | 371 ++++++ src/components/TopBar/index.vue | 190 +++ src/components/Upload/FileUpload.vue | 331 ++++++ src/components/Upload/ImageUpload.vue | 280 +++++ src/components/WangEditor/index.vue | 81 ++ src/directive/index.ts | 9 + src/directive/permission/index.ts | 38 + src/enums/CacheEnum.ts | 4 + src/enums/DeviceEnum.ts | 14 + src/enums/DocumentTypeEnum.ts | 22 + src/enums/FormTypeEnum.ts | 14 + src/enums/LanguageEnum.ts | 14 + src/enums/LayoutEnum.ts | 18 + src/enums/MenuTypeEnum.ts | 22 + src/enums/MessageTypeEnum.ts | 36 + src/enums/NoticeTypeEnum.ts | 30 + src/enums/QueryTypeEnum.ts | 37 + src/enums/ResultEnum.ts | 23 + src/enums/SidebarStatusEnum.ts | 14 + src/enums/SizeEnum.ts | 19 + src/enums/SoftwareEnum.ts | 81 ++ src/enums/ThemeEnum.ts | 18 + src/lang/index.ts | 31 + src/lang/package/en.ts | 64 + src/lang/package/zh-cn.ts | 63 + src/layout/components/AppMain/index.vue | 34 + .../NavBar/components/NavbarAction.vue | 100 ++ src/layout/components/NavBar/index.vue | 30 + .../Settings/components/LayoutSelect.vue | 108 ++ .../Settings/components/ThemeColorPicker.vue | 41 + src/layout/components/Settings/index.vue | 123 ++ .../Sidebar/components/SidebarLogo.vue | 64 + .../Sidebar/components/SidebarMenu.vue | 89 ++ .../Sidebar/components/SidebarMenuItem.vue | 202 ++++ .../components/SidebarMenuItemTitle.vue | 43 + .../Sidebar/components/SidebarMixTopMenu.vue | 88 ++ src/layout/components/Sidebar/index.vue | 38 + src/layout/components/TagsView/index.vue | 433 +++++++ src/layout/index.vue | 298 +++++ src/main.ts | 18 + src/plugins/icons.ts | 9 + src/plugins/index.ts | 24 + src/plugins/permission.ts | 111 ++ src/router/index.ts | 168 +++ src/settings.ts | 26 + src/store/index.ts | 16 + src/store/modules/app.ts | 154 +++ src/store/modules/permission.ts | 88 ++ src/store/modules/settings.ts | 125 ++ src/store/modules/tagsView.ts | 253 ++++ src/store/modules/user.ts | 214 ++++ src/styles/index.scss | 33 + src/styles/login.scss | 64 + src/styles/reset.scss | 76 ++ src/styles/variables.module.scss | 12 + src/styles/variables.scss | 40 + src/types/auto-imports.d.ts | 1053 +++++++++++++++++ src/types/components.d.ts | 72 ++ src/types/env.d.ts | 40 + src/types/global.d.ts | 95 ++ src/types/router.d.ts | 54 + src/utils/baseurls.ts | 4 + src/utils/device-type.ts | 28 + src/utils/format.ts | 120 ++ src/utils/i18n.ts | 12 + src/utils/index.ts | 51 + src/utils/nprogress.ts | 18 + src/utils/request.ts | 73 ++ src/views/account/messages/index.vue | 240 ++++ src/views/account/notes/index.vue | 3 + src/views/account/notes/statement.vue | 144 +++ src/views/account/notes/trade.vue | 579 +++++++++ src/views/account/resetpwd/index.vue | 107 ++ src/views/account/security/index.vue | 506 ++++++++ src/views/account/vip/index.vue | 182 +++ src/views/autoLogin/index.vue | 50 + src/views/dashboard/index.vue | 300 +++++ src/views/demo/internal-doc.vue | 28 + .../children/children/level3-1.vue | 5 + .../children/children/level3-2.vue | 5 + .../demo/multi-level/children/level2.vue | 7 + src/views/demo/multi-level/level1.vue | 15 + src/views/demo/upload.vue | 215 ++++ src/views/demo/wang-editor.vue | 19 + src/views/error-page/401.vue | 109 ++ src/views/error-page/404.vue | 242 ++++ src/views/helper/index.vue | 373 ++++++ src/views/redirect/index.vue | 15 + src/views/resetPassword/index.vue | 330 ++++++ src/views/software/index.vue | 670 +++++++++++ src/views/system/config/index.vue | 327 +++++ src/views/system/dict/index.vue | 388 ++++++ src/views/system/log/index.vue | 123 ++ src/views/system/menu/index.vue | 632 ++++++++++ src/views/system/role/index.vue | 419 +++++++ .../system/user/components/user-import.vue | 131 ++ src/views/system/user/index.vue | 428 +++++++ src/views/website/audition/draw.vue | 209 ++++ src/views/website/audition/realname.vue | 261 ++++ src/views/website/notices/index.vue | 367 ++++++ src/views/website/question/index.vue | 477 ++++++++ src/views/website/statement/notes.vue | 162 +++ src/views/website/statement/orders.vue | 170 +++ src/views/website/statistics/index.vue | 331 ++++++ src/views/website/styles/index.vue | 405 +++++++ src/views/website/swVersions/index.vue | 619 ++++++++++ tsconfig.json | 27 + uno.config.ts | 43 + vite.config.ts | 239 ++++ 261 files changed, 24791 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .eslintignore create mode 100644 .eslintrc-auto-import.json create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 .hintrc create mode 100644 .husky/commit-msg create mode 100644 .husky/pre-commit create mode 100644 .prettierignore create mode 100644 .prettierrc.cjs create mode 100644 .stylelintignore create mode 100644 .stylelintrc.cjs create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/vue3.0.code-snippets create mode 100644 .vscode/vue3.2.code-snippets create mode 100644 .vscode/vue3.3.code-snippets create mode 100644 README.md create mode 100644 commitlint.config.cjs create mode 100644 index.html create mode 100644 mock/auth.mock.ts create mode 100644 mock/base.ts create mode 100644 mock/menu.mock.ts create mode 100644 mock/user.mock.ts create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/html/coin.html create mode 100644 public/html/contact.html create mode 100644 public/html/help.css create mode 100644 public/html/privacy.html create mode 100644 public/html/user.html create mode 100644 public/html/vip.html create mode 100644 src/App.vue create mode 100644 src/api/auth.ts create mode 100644 src/api/bank.ts create mode 100644 src/api/codegen.ts create mode 100644 src/api/config.ts create mode 100644 src/api/dict.ts create mode 100644 src/api/file.ts create mode 100644 src/api/helper.ts create mode 100644 src/api/integral.ts create mode 100644 src/api/log.ts create mode 100644 src/api/menu.ts create mode 100644 src/api/message.ts create mode 100644 src/api/notice.ts create mode 100644 src/api/order.ts create mode 100644 src/api/role.ts create mode 100644 src/api/software.ts create mode 100644 src/api/statistics.ts create mode 100644 src/api/style.ts create mode 100644 src/api/user.ts create mode 100644 src/assets/icons/alipay-l.svg create mode 100644 src/assets/icons/alipay-s.svg create mode 100644 src/assets/icons/api.svg create mode 100644 src/assets/icons/backtop.svg create mode 100644 src/assets/icons/captcha.svg create mode 100644 src/assets/icons/cascader.svg create mode 100644 src/assets/icons/client.svg create mode 100644 src/assets/icons/close.svg create mode 100644 src/assets/icons/close_all.svg create mode 100644 src/assets/icons/close_left.svg create mode 100644 src/assets/icons/close_other.svg create mode 100644 src/assets/icons/close_right.svg create mode 100644 src/assets/icons/code.svg create mode 100644 src/assets/icons/collapse.svg create mode 100644 src/assets/icons/dict.svg create mode 100644 src/assets/icons/document.svg create mode 100644 src/assets/icons/download.svg create mode 100644 src/assets/icons/file.svg create mode 100644 src/assets/icons/finish-black.svg create mode 100644 src/assets/icons/finish-white.svg create mode 100644 src/assets/icons/fullscreen-exit.svg create mode 100644 src/assets/icons/fullscreen.svg create mode 100644 src/assets/icons/github.svg create mode 100644 src/assets/icons/homepage.svg create mode 100644 src/assets/icons/ip.svg create mode 100644 src/assets/icons/java.svg create mode 100644 src/assets/icons/language.svg create mode 100644 src/assets/icons/menu.svg create mode 100644 src/assets/icons/message.svg create mode 100644 src/assets/icons/monitor.svg create mode 100644 src/assets/icons/project.svg create mode 100644 src/assets/icons/pv.svg create mode 100644 src/assets/icons/qrcode-black.svg create mode 100644 src/assets/icons/qrcode-white.svg create mode 100644 src/assets/icons/refresh.svg create mode 100644 src/assets/icons/role.svg create mode 100644 src/assets/icons/scan-black.svg create mode 100644 src/assets/icons/scan-white.svg create mode 100644 src/assets/icons/setting.svg create mode 100644 src/assets/icons/size.svg create mode 100644 src/assets/icons/system.svg create mode 100644 src/assets/icons/table.svg create mode 100644 src/assets/icons/todo.svg create mode 100644 src/assets/icons/tree.svg create mode 100644 src/assets/icons/typescript.svg create mode 100644 src/assets/icons/unipay.svg create mode 100644 src/assets/icons/user.svg create mode 100644 src/assets/icons/uv.svg create mode 100644 src/assets/icons/vue.svg create mode 100644 src/assets/icons/wxpay-l.svg create mode 100644 src/assets/icons/wxpay-s.svg create mode 100644 src/assets/icons/xml.svg create mode 100644 src/assets/images/401.gif create mode 100644 src/assets/images/404.png create mode 100644 src/assets/images/404_cloud.png create mode 100644 src/assets/images/Software/ac_one_blur.png create mode 100644 src/assets/images/Software/ac_one_focus.png create mode 100644 src/assets/images/Software/android_qr.png create mode 100644 src/assets/images/Software/icon_android_blur.png create mode 100644 src/assets/images/Software/icon_android_focus.png create mode 100644 src/assets/images/Software/icon_download.png create mode 100644 src/assets/images/Software/icon_font.png create mode 100644 src/assets/images/Software/icon_ios_blur.png create mode 100644 src/assets/images/Software/icon_ios_focus.png create mode 100644 src/assets/images/Software/icon_pc_blur.png create mode 100644 src/assets/images/Software/icon_pc_focus.png create mode 100644 src/assets/images/Software/ios_qr2.png create mode 100644 src/assets/images/default.jpg create mode 100644 src/assets/images/flower.png create mode 100644 src/assets/images/hot_bank.jpg create mode 100644 src/assets/images/login-background-dark.jpg create mode 100644 src/assets/images/login-background-light.jpg create mode 100644 src/assets/images/sad.png create mode 100644 src/assets/logo.png create mode 100644 src/assets/logo_s.png create mode 100644 src/assets/web_logo.png create mode 100644 src/components/AmountInput/index.vue create mode 100644 src/components/AppLink/index.vue create mode 100644 src/components/Breadcrumb/index.vue create mode 100644 src/components/CURD/PageContent.vue create mode 100644 src/components/CURD/PageForm.vue create mode 100644 src/components/CURD/PageModal.vue create mode 100644 src/components/CURD/PageSearch.vue create mode 100644 src/components/CURD/types.ts create mode 100644 src/components/CURD/usePage.ts create mode 100644 src/components/CopyButton/index.vue create mode 100644 src/components/Dictionary/index.vue create mode 100644 src/components/GithubCorner/index.vue create mode 100644 src/components/Hamburger/index.vue create mode 100644 src/components/IconSelect/index.vue create mode 100644 src/components/IcpBar/index.vue create mode 100644 src/components/LangSelect/index.vue create mode 100644 src/components/LoginDialog/index.vue create mode 100644 src/components/MenuSearch/index.vue create mode 100644 src/components/MsgTip/index.vue create mode 100644 src/components/Pagination/index.vue create mode 100644 src/components/SendCodeButton/index.vue create mode 100644 src/components/SizeSelect/index.vue create mode 100644 src/components/SvgIcon/index.vue create mode 100644 src/components/TableSelect/index.vue create mode 100644 src/components/TopBar/index.vue create mode 100644 src/components/Upload/FileUpload.vue create mode 100644 src/components/Upload/ImageUpload.vue create mode 100644 src/components/WangEditor/index.vue create mode 100644 src/directive/index.ts create mode 100644 src/directive/permission/index.ts create mode 100644 src/enums/CacheEnum.ts create mode 100644 src/enums/DeviceEnum.ts create mode 100644 src/enums/DocumentTypeEnum.ts create mode 100644 src/enums/FormTypeEnum.ts create mode 100644 src/enums/LanguageEnum.ts create mode 100644 src/enums/LayoutEnum.ts create mode 100644 src/enums/MenuTypeEnum.ts create mode 100644 src/enums/MessageTypeEnum.ts create mode 100644 src/enums/NoticeTypeEnum.ts create mode 100644 src/enums/QueryTypeEnum.ts create mode 100644 src/enums/ResultEnum.ts create mode 100644 src/enums/SidebarStatusEnum.ts create mode 100644 src/enums/SizeEnum.ts create mode 100644 src/enums/SoftwareEnum.ts create mode 100644 src/enums/ThemeEnum.ts create mode 100644 src/lang/index.ts create mode 100644 src/lang/package/en.ts create mode 100644 src/lang/package/zh-cn.ts create mode 100644 src/layout/components/AppMain/index.vue create mode 100644 src/layout/components/NavBar/components/NavbarAction.vue create mode 100644 src/layout/components/NavBar/index.vue create mode 100644 src/layout/components/Settings/components/LayoutSelect.vue create mode 100644 src/layout/components/Settings/components/ThemeColorPicker.vue create mode 100644 src/layout/components/Settings/index.vue create mode 100644 src/layout/components/Sidebar/components/SidebarLogo.vue create mode 100644 src/layout/components/Sidebar/components/SidebarMenu.vue create mode 100644 src/layout/components/Sidebar/components/SidebarMenuItem.vue create mode 100644 src/layout/components/Sidebar/components/SidebarMenuItemTitle.vue create mode 100644 src/layout/components/Sidebar/components/SidebarMixTopMenu.vue create mode 100644 src/layout/components/Sidebar/index.vue create mode 100644 src/layout/components/TagsView/index.vue create mode 100644 src/layout/index.vue create mode 100644 src/main.ts create mode 100644 src/plugins/icons.ts create mode 100644 src/plugins/index.ts create mode 100644 src/plugins/permission.ts create mode 100644 src/router/index.ts create mode 100644 src/settings.ts create mode 100644 src/store/index.ts create mode 100644 src/store/modules/app.ts create mode 100644 src/store/modules/permission.ts create mode 100644 src/store/modules/settings.ts create mode 100644 src/store/modules/tagsView.ts create mode 100644 src/store/modules/user.ts create mode 100644 src/styles/index.scss create mode 100644 src/styles/login.scss create mode 100644 src/styles/reset.scss create mode 100644 src/styles/variables.module.scss create mode 100644 src/styles/variables.scss create mode 100644 src/types/auto-imports.d.ts create mode 100644 src/types/components.d.ts create mode 100644 src/types/env.d.ts create mode 100644 src/types/global.d.ts create mode 100644 src/types/router.d.ts create mode 100644 src/utils/baseurls.ts create mode 100644 src/utils/device-type.ts create mode 100644 src/utils/format.ts create mode 100644 src/utils/i18n.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/nprogress.ts create mode 100644 src/utils/request.ts create mode 100644 src/views/account/messages/index.vue create mode 100644 src/views/account/notes/index.vue create mode 100644 src/views/account/notes/statement.vue create mode 100644 src/views/account/notes/trade.vue create mode 100644 src/views/account/resetpwd/index.vue create mode 100644 src/views/account/security/index.vue create mode 100644 src/views/account/vip/index.vue create mode 100644 src/views/autoLogin/index.vue create mode 100644 src/views/dashboard/index.vue create mode 100644 src/views/demo/internal-doc.vue create mode 100644 src/views/demo/multi-level/children/children/level3-1.vue create mode 100644 src/views/demo/multi-level/children/children/level3-2.vue create mode 100644 src/views/demo/multi-level/children/level2.vue create mode 100644 src/views/demo/multi-level/level1.vue create mode 100644 src/views/demo/upload.vue create mode 100644 src/views/demo/wang-editor.vue create mode 100644 src/views/error-page/401.vue create mode 100644 src/views/error-page/404.vue create mode 100644 src/views/helper/index.vue create mode 100644 src/views/redirect/index.vue create mode 100644 src/views/resetPassword/index.vue create mode 100644 src/views/software/index.vue create mode 100644 src/views/system/config/index.vue create mode 100644 src/views/system/dict/index.vue create mode 100644 src/views/system/log/index.vue create mode 100644 src/views/system/menu/index.vue create mode 100644 src/views/system/role/index.vue create mode 100644 src/views/system/user/components/user-import.vue create mode 100644 src/views/system/user/index.vue create mode 100644 src/views/website/audition/draw.vue create mode 100644 src/views/website/audition/realname.vue create mode 100644 src/views/website/notices/index.vue create mode 100644 src/views/website/question/index.vue create mode 100644 src/views/website/statement/notes.vue create mode 100644 src/views/website/statement/orders.vue create mode 100644 src/views/website/statistics/index.vue create mode 100644 src/views/website/styles/index.vue create mode 100644 src/views/website/swVersions/index.vue create mode 100644 tsconfig.json create mode 100644 uno.config.ts create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..00ee2de --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org +root = true + +# 表示所有文件适用 +[*] +charset = utf-8 # 设置文件字符集为 utf-8 +end_of_line = lf # 控制换行类型(lf | cr | crlf) +indent_style = space # 缩进风格(tab | space) +indent_size = 2 # 缩进大小 +insert_final_newline = true # 始终在文件末尾插入一个新行 + +# 表示仅 md 文件适用以下规则 +[*.md] +max_line_length = off # 关闭最大行长度限制 +trim_trailing_whitespace = false # 关闭末尾空格修剪 diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..a0be9af --- /dev/null +++ b/.env.development @@ -0,0 +1,11 @@ +# 应用端口 +VITE_APP_PORT = 3000 + +# 代理前缀 +VITE_APP_BASE_API = '/dev-api' + +# 接口地址 +VITE_APP_API_URL = http://localhost:8989 + +# 是否启用 Mock 服务 +VITE_MOCK_DEV_SERVER = false diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..74d45c1 --- /dev/null +++ b/.env.production @@ -0,0 +1,3 @@ +# 代理前缀 +VITE_APP_BASE_API = '/prod-api' + diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..43af40f --- /dev/null +++ b/.eslintignore @@ -0,0 +1,14 @@ +dist +node_modules +public +.husky +.vscode +.idea +*.sh +*.md + +src/assets + +.eslintrc.cjs +.prettierrc.cjs +.stylelintrc.cjs diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json new file mode 100644 index 0000000..adea0fa --- /dev/null +++ b/.eslintrc-auto-import.json @@ -0,0 +1,309 @@ +{ + "globals": { + "Component": true, + "ComponentPublicInstance": true, + "ComputedRef": true, + "EffectScope": true, + "ElMessage": true, + "ElMessageBox": true, + "ElNotification": true, + "InjectionKey": true, + "PropType": true, + "Ref": true, + "VNode": true, + "asyncComputed": true, + "autoResetRef": true, + "computed": true, + "computedAsync": true, + "computedEager": true, + "computedInject": true, + "computedWithControl": true, + "controlledComputed": true, + "controlledRef": true, + "createApp": true, + "createEventHook": true, + "createGlobalState": true, + "createInjectionState": true, + "createReactiveFn": true, + "createReusableTemplate": true, + "createSharedComposable": true, + "createTemplatePromise": true, + "createUnrefFn": true, + "customRef": true, + "debouncedRef": true, + "debouncedWatch": true, + "defineAsyncComponent": true, + "defineComponent": true, + "eagerComputed": true, + "effectScope": true, + "extendRef": true, + "getCurrentInstance": true, + "getCurrentScope": true, + "h": true, + "ignorableWatch": true, + "inject": true, + "isDefined": true, + "isProxy": true, + "isReactive": true, + "isReadonly": true, + "isRef": true, + "makeDestructurable": true, + "markRaw": true, + "nextTick": true, + "onActivated": true, + "onBeforeMount": true, + "onBeforeUnmount": true, + "onBeforeUpdate": true, + "onClickOutside": true, + "onDeactivated": true, + "onErrorCaptured": true, + "onKeyStroke": true, + "onLongPress": true, + "onMounted": true, + "onRenderTracked": true, + "onRenderTriggered": true, + "onScopeDispose": true, + "onServerPrefetch": true, + "onStartTyping": true, + "onUnmounted": true, + "onUpdated": true, + "pausableWatch": true, + "provide": true, + "reactify": true, + "reactifyObject": true, + "reactive": true, + "reactiveComputed": true, + "reactiveOmit": true, + "reactivePick": true, + "readonly": true, + "ref": true, + "refAutoReset": true, + "refDebounced": true, + "refDefault": true, + "refThrottled": true, + "refWithControl": true, + "resolveComponent": true, + "resolveRef": true, + "resolveUnref": true, + "shallowReactive": true, + "shallowReadonly": true, + "shallowRef": true, + "syncRef": true, + "syncRefs": true, + "templateRef": true, + "throttledRef": true, + "throttledWatch": true, + "toRaw": true, + "toReactive": true, + "toRef": true, + "toRefs": true, + "toValue": true, + "triggerRef": true, + "tryOnBeforeMount": true, + "tryOnBeforeUnmount": true, + "tryOnMounted": true, + "tryOnScopeDispose": true, + "tryOnUnmounted": true, + "unref": true, + "unrefElement": true, + "until": true, + "useActiveElement": true, + "useAnimate": true, + "useArrayDifference": true, + "useArrayEvery": true, + "useArrayFilter": true, + "useArrayFind": true, + "useArrayFindIndex": true, + "useArrayFindLast": true, + "useArrayIncludes": true, + "useArrayJoin": true, + "useArrayMap": true, + "useArrayReduce": true, + "useArraySome": true, + "useArrayUnique": true, + "useAsyncQueue": true, + "useAsyncState": true, + "useAttrs": true, + "useBase64": true, + "useBattery": true, + "useBluetooth": true, + "useBreakpoints": true, + "useBroadcastChannel": true, + "useBrowserLocation": true, + "useCached": true, + "useClipboard": true, + "useCloned": true, + "useColorMode": true, + "useConfirmDialog": true, + "useCounter": true, + "useCssModule": true, + "useCssVar": true, + "useCssVars": true, + "useCurrentElement": true, + "useCycleList": true, + "useDark": true, + "useDateFormat": true, + "useDebounce": true, + "useDebounceFn": true, + "useDebouncedRefHistory": true, + "useDeviceMotion": true, + "useDeviceOrientation": true, + "useDevicePixelRatio": true, + "useDevicesList": true, + "useDisplayMedia": true, + "useDocumentVisibility": true, + "useDraggable": true, + "useDropZone": true, + "useElementBounding": true, + "useElementByPoint": true, + "useElementHover": true, + "useElementSize": true, + "useElementVisibility": true, + "useEventBus": true, + "useEventListener": true, + "useEventSource": true, + "useEyeDropper": true, + "useFavicon": true, + "useFetch": true, + "useFileDialog": true, + "useFileSystemAccess": true, + "useFocus": true, + "useFocusWithin": true, + "useFps": true, + "useFullscreen": true, + "useGamepad": true, + "useGeolocation": true, + "useIdle": true, + "useImage": true, + "useInfiniteScroll": true, + "useIntersectionObserver": true, + "useInterval": true, + "useIntervalFn": true, + "useKeyModifier": true, + "useLastChanged": true, + "useLocalStorage": true, + "useMagicKeys": true, + "useManualRefHistory": true, + "useMediaControls": true, + "useMediaQuery": true, + "useMemoize": true, + "useMemory": true, + "useMounted": true, + "useMouse": true, + "useMouseInElement": true, + "useMousePressed": true, + "useMutationObserver": true, + "useNavigatorLanguage": true, + "useNetwork": true, + "useNow": true, + "useObjectUrl": true, + "useOffsetPagination": true, + "useOnline": true, + "usePageLeave": true, + "useParallax": true, + "useParentElement": true, + "usePerformanceObserver": true, + "usePermission": true, + "usePointer": true, + "usePointerLock": true, + "usePointerSwipe": true, + "usePreferredColorScheme": true, + "usePreferredContrast": true, + "usePreferredDark": true, + "usePreferredLanguages": true, + "usePreferredReducedMotion": true, + "usePrevious": true, + "useRafFn": true, + "useRefHistory": true, + "useResizeObserver": true, + "useScreenOrientation": true, + "useScreenSafeArea": true, + "useScriptTag": true, + "useScroll": true, + "useScrollLock": true, + "useSessionStorage": true, + "useShare": true, + "useSlots": true, + "useSorted": true, + "useSpeechRecognition": true, + "useSpeechSynthesis": true, + "useStepper": true, + "useStorage": true, + "useStorageAsync": true, + "useStyleTag": true, + "useSupported": true, + "useSwipe": true, + "useTemplateRefsList": true, + "useTextDirection": true, + "useTextSelection": true, + "useTextareaAutosize": true, + "useThrottle": true, + "useThrottleFn": true, + "useThrottledRefHistory": true, + "useTimeAgo": true, + "useTimeout": true, + "useTimeoutFn": true, + "useTimeoutPoll": true, + "useTimestamp": true, + "useTitle": true, + "useToNumber": true, + "useToString": true, + "useToggle": true, + "useTransition": true, + "useUrlSearchParams": true, + "useUserMedia": true, + "useVModel": true, + "useVModels": true, + "useVibrate": true, + "useVirtualList": true, + "useWakeLock": true, + "useWebNotification": true, + "useWebSocket": true, + "useWebWorker": true, + "useWebWorkerFn": true, + "useWindowFocus": true, + "useWindowScroll": true, + "useWindowSize": true, + "watch": true, + "watchArray": true, + "watchAtMost": true, + "watchDebounced": true, + "watchDeep": true, + "watchEffect": true, + "watchIgnorable": true, + "watchImmediate": true, + "watchOnce": true, + "watchPausable": true, + "watchPostEffect": true, + "watchSyncEffect": true, + "watchThrottled": true, + "watchTriggerable": true, + "watchWithFilter": true, + "whenever": true, + "ExtractDefaultPropTypes": true, + "ExtractPropTypes": true, + "ExtractPublicPropTypes": true, + "WritableComputedRef": true, + "acceptHMRUpdate": true, + "createPinia": true, + "defineStore": true, + "getActivePinia": true, + "injectLocal": true, + "mapActions": true, + "mapGetters": true, + "mapState": true, + "mapStores": true, + "mapWritableState": true, + "onBeforeRouteLeave": true, + "onBeforeRouteUpdate": true, + "provideLocal": true, + "setActivePinia": true, + "setMapStoreSuffix": true, + "storeToRefs": true, + "useClipboardItems": true, + "useI18n": true, + "useLink": true, + "useRoute": true, + "useRouter": true + } +} diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..8ae169a --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,88 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + }, + parser: "vue-eslint-parser", + extends: [ + // https://eslint.vuejs.org/user-guide/#usage + "plugin:vue/vue3-recommended", + "./.eslintrc-auto-import.json", + "prettier", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", + ], + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + parser: "@typescript-eslint/parser", + project: "./tsconfig.*?.json", + createDefaultProgram: false, + extraFileExtensions: [".vue"], + }, + plugins: ["vue", "@typescript-eslint"], + rules: { + // https://eslint.vuejs.org/rules/#priority-a-essential-error-prevention + "vue/multi-word-component-names": "off", + "vue/no-v-model-argument": "off", + "vue/script-setup-uses-vars": "error", + "vue/no-reserved-component-names": "off", + "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/require-default-prop": "off", + "vue/require-explicit-emits": "off", + "vue/html-self-closing": [ + "error", + { + html: { + void: "always", + normal: "never", + component: "always", + }, + svg: "always", + math: "always", + }, + ], + + "@typescript-eslint/no-empty-function": "off", // 关闭空方法检查 + "@typescript-eslint/no-explicit-any": "off", // 关闭any类型的警告 + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/ban-types": "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/no-non-null-assertion": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-unused-vars": "off", + + "prettier/prettier": [ + "error", + { + useTabs: false, // 不使用制表符 + }, + ], + }, + // eslint不能对html文件生效 + overrides: [ + { + files: ["*.html"], + processor: "vue/.vue", + }, + ], + // https://eslint.org/docs/latest/use/configure/language-options#specifying-globals + globals: { + OptionType: "readonly", + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fee6999 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local +.history + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +pnpm-lock.yaml +stats.html diff --git a/.hintrc b/.hintrc new file mode 100644 index 0000000..8cc5c90 --- /dev/null +++ b/.hintrc @@ -0,0 +1,15 @@ +{ + "extends": [ + "development" + ], + "hints": { + "compat-api/css": [ + "default", + { + "ignore": [ + "text-size-adjust" + ] + } + ] + } +} \ No newline at end of file diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..fd2bf70 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx --no-install commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..b18d041 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npm run lint:lint-staged diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..f3e9850 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +dist +node_modules +public +.husky +.vscode +.idea +*.sh +*.md + +src/assets +stats.html diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 0000000..7ce60da --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,46 @@ +module.exports = { + // (x)=>{},单个参数箭头函数是否显示小括号。(always:始终显示;avoid:省略括号。默认:always) + arrowParens: "always", + // 开始标签的右尖括号是否跟随在最后一行属性末尾,默认false + bracketSameLine: false, + // 对象字面量的括号之间打印空格 (true - Example: { foo: bar } ; false - Example: {foo:bar}) + bracketSpacing: true, + // 是否格式化一些文件中被嵌入的代码片段的风格(auto|off;默认auto) + embeddedLanguageFormatting: "auto", + // 指定 HTML 文件的空格敏感度 (css|strict|ignore;默认css) + htmlWhitespaceSensitivity: "ignore", + // 当文件已经被 Prettier 格式化之后,是否会在文件顶部插入一个特殊的 @format 标记,默认false + insertPragma: false, + // 在 JSX 中使用单引号替代双引号,默认false + jsxSingleQuote: false, + // 每行最多字符数量,超出换行(默认80) + printWidth: 120, + // 超出打印宽度 (always | never | preserve ) + proseWrap: "preserve", + // 对象属性是否使用引号(as-needed | consistent | preserve;默认as-needed:对象的属性需要加引号才添加;) + quoteProps: "as-needed", + // 是否只格式化在文件顶部包含特定注释(@prettier| @format)的文件,默认false + requirePragma: false, + // 结尾添加分号 + semi: true, + // 使用单引号 (true:单引号;false:双引号) + singleQuote: false, + // 缩进空格数,默认2个空格 + tabWidth: 2, + // 元素末尾是否加逗号,默认es5: ES5中的 objects, arrays 等会添加逗号,TypeScript 中的 type 后不加逗号 + trailingComma: "es5", + // 指定缩进方式,空格或tab,默认false,即使用空格 + useTabs: false, + // vue 文件中是否缩进 ", + "" + ], + "description": "Vue3.0" + } +} diff --git a/.vscode/vue3.2.code-snippets b/.vscode/vue3.2.code-snippets new file mode 100644 index 0000000..a083940 --- /dev/null +++ b/.vscode/vue3.2.code-snippets @@ -0,0 +1,17 @@ +{ + "Vue3.2+快速生成模板": { + "scope": "vue", + "prefix": "Vue3.2+", + "body": [ + "", + "", + "", + "", + "", + "" + ], + "description": "Vue3.2+" + } +} diff --git a/.vscode/vue3.3.code-snippets b/.vscode/vue3.3.code-snippets new file mode 100644 index 0000000..705e04f --- /dev/null +++ b/.vscode/vue3.3.code-snippets @@ -0,0 +1,21 @@ +{ + "Vue3.3+defineOptions快速生成模板": { + "scope": "vue", + "prefix": "Vue3.3+", + "body": [ + "", + "", + "", + "", + "", + "" + ], + "description": "Vue3.3+defineOptions快速生成模板" + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..98d324d --- /dev/null +++ b/README.md @@ -0,0 +1,191 @@ + +
+ vue3-element-admin +

vue3-element-admin

+ + + + + + + + +
+ +![](https://foruda.gitee.com/images/1708618984641188532/a7cca095_716974.png "rainbow.png") + + +
+ 🔍 在线预览 | 📖 阅读文档 | 🌐English +
+ + + +## 项目简介 + +[vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) 是基于 Vue3 + Vite5+ TypeScript5 + Element-Plus + Pinia 等主流技术栈构建的免费开源的中后台管理的前端模板(配套[Java 后端源码](https://gitee.com/youlaiorg/youlai-boot))。 + + +## 项目特色 + +- **简洁易用**:基于 [vue-element-admin](https://gitee.com/panjiachen/vue-element-admin) 升级的 Vue3 版本,无过渡封装 ,易上手。 + +- **数据交互**:同时支持本地 `Mock` 和线上接口,配套 [Java 后端源码](https://gitee.com/youlaiorg/youlai-boot)和[在线接口文档](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5)。 + +- **权限管理**:用户、角色、菜单、字典、部门等完善的权限系统功能。 + +- **基础设施**:动态路由、按钮权限、国际化、代码规范、Git 提交规范、常用组件封装。 + +- **持续更新**:项目持续开源更新,实时更新工具和依赖。 + + + +## 项目预览 + +![明亮模式](https://foruda.gitee.com/images/1709651876583793739/0ba1ee1c_716974.png) + +![暗黑模式](https://foruda.gitee.com/images/1709651875494206224/2a2b0b53_716974.png) + +![接口文档](https://foruda.gitee.com/images/1687755822857820115/96054330_716974.png) + +## 项目地址 + +| 项目 | Gitee | Github | +| ---- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 前端 | [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) | [vue3-element-admin](https://github.com/youlaitech/vue3-element-admin) | [vue3-element-admin](https://gitcode.net/youlai/vue3-element-admin) | +| 精简版 | [vue3-element-admin-thin](https://gitee.com/cshaptx4869/vue3-element-admin-thin) | [vue3-element-admin-thin](https://github.com/youlaitech/vue3-element-admin-thin) | +| 后端 | [youlai-boot](https://gitee.com/youlaiorg/youlai-boot) | [youlai-boot](https://github.com/haoxianrui/youlai-boot.git) | + +## 环境准备 + +| 环境 | 名称版本 | 下载地址 | +| -------------------- | :----------------------------------------------------------- | ------------------------------------------------------------ | +| **开发工具** | VSCode | [下载](https://code.visualstudio.com/Download) | +| **运行环境** | Node ≥18 (其中 20.6.0 版本不可用) | [下载](http://nodejs.cn/download) | + + +## 项目启动 + +```bash +# 克隆代码 +git clone https://gitee.com/youlaiorg/vue3-element-admin.git + +# 切换目录 +cd vue3-element-admin + +# 安装 pnpm +npm install pnpm -g + +# 设置镜像源(可忽略) +pnpm config set registry https://registry.npmmirror.com + +# 安装依赖 +pnpm install + +# 启动运行 +pnpm run dev +``` + + + +## 项目部署 + +```bash +# 项目打包 +pnpm run build + +# 上传文件至远程服务器 +将本地打包生成的 dist 目录下的所有文件拷贝至服务器的 /usr/share/nginx/html 目录。 + +# nginx.cofig 配置 +server { + listen 80; + server_name localhost; + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + # 反向代理配置 + location /prod-api/ { + # vapi.youlai.tech 替换后端API地址,注意保留后面的斜杠 / + proxy_pass http://vapi.youlai.tech/; + } +} +``` + +## 本地Mock + +项目同时支持在线和本地 Mock 接口,默认使用线上接口,如需替换为 Mock 接口,修改文件 `.env.development` 的 `VITE_MOCK_DEV_SERVER` 为 `true` **即可**。 + +## 后端接口 + +> 如果您具备Java开发基础,按照以下步骤将在线接口转为本地后端接口,创建企业级前后端分离开发环境,助您走向全栈之路。 + +1. 获取基于 `Java` 和 `SpringBoot` 开发的后端 [youlai-boot](https://gitee.com/youlaiorg/youlai-boot.git) 源码。 +2. 根据后端工程的说明文档 [README.md](https://gitee.com/youlaiorg/youlai-boot#%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C) 完成本地启动。 +3. 修改 `.env.development` 文件中的 `VITE_APP_API_URL` 的值,将其从 http://vapi.youlai.tech 更改为 http://localhost:8989。 + + +## 注意事项 + +- **自动导入插件自动生成默认关闭** + + 模板项目的组件类型声明已自动生成。如果添加和使用新的组件,请按照图示方法开启自动生成。在自动生成完成后,记得将其设置为 `false`,避免重复执行引发冲突。 + + ![](https://foruda.gitee.com/images/1687755823137387608/412ea803_716974.png) + +- **项目启动浏览器访问空白** + + 请升级浏览器尝试,低版本浏览器内核可能不支持某些新的 JavaScript 语法,比如可选链操作符 `?.`。 + +- **项目同步仓库更新升级** + + 项目同步仓库更新升级之后,建议 `pnpm install` 安装更新依赖之后启动 。 + +- **项目组件、函数和引用爆红** + + 重启 VSCode 尝试 + +- **其他问题** + + 如果有其他问题或者建议,建议 [ISSUE](https://gitee.com/youlaiorg/vue3-element-admin/issues/new) + + + +## 项目文档 + +- [基于 Vue3 + Vite + TypeScript + Element-Plus 从0到1搭建后台管理系统](https://blog.csdn.net/u013737132/article/details/130191394) + +- [ESLint+Prettier+Stylelint+EditorConfig 约束和统一前端代码规范](https://blog.csdn.net/u013737132/article/details/130190788) +- [Husky + Lint-staged + Commitlint + Commitizen + cz-git 配置 Git 提交规范](https://blog.csdn.net/u013737132/article/details/130191363) + + +## 提交规范 + +执行 `pnpm run commit` 唤起 git commit 交互,根据提示完成信息的输入和选择。 + +![](https://foruda.gitee.com/images/1687755823165218215/c1705416_716974.png) + + +## 项目统计 + +![Alt](https://repobeats.axiom.co/api/embed/aa7cca3d6fa9c308fc659fa6e09af9a1910506c3.svg "Repobeats analytics image") + + +Thanks to all the contributors! + +[![contributors](https://contrib.rocks/image?repo=youlaitech/vue3-element-admin)](https://github.com/youlaitech/vue3-element-admin/graphs/contributors) + + +## 交流群🚀 + +> **关注「有来技术」公众号,获取交流群二维码。** +> +> 如果交流群的二维码过期,请加微信(haoxianrui)并备注「前端」、「后端」或「全栈」以获取最新二维码。 +> +> 为确保交流群质量,防止营销广告人群混入,我们采取了此措施。望各位理解! + +| 公众号 | 交流群 | +|:----:|:----:| +| ![有来技术公众号二维码](https://foruda.gitee.com/images/1687689212187063809/3c69eaee_716974.png) | ![交流群二维码](https://foruda.gitee.com/images/1687689212139273561/6a65ef69_716974.png) | + diff --git a/commitlint.config.cjs b/commitlint.config.cjs new file mode 100644 index 0000000..f30d285 --- /dev/null +++ b/commitlint.config.cjs @@ -0,0 +1,94 @@ +module.exports = { + // 继承的规则 + extends: ["@commitlint/config-conventional"], + // 自定义规则 + rules: { + // @see https://commitlint.js.org/#/reference-rules + + // 提交类型枚举,git提交type必须是以下类型 + "type-enum": [ + 2, + "always", + [ + "feat", // 新增功能 + "fix", // 修复缺陷 + "docs", // 文档变更 + "style", // 代码格式(不影响功能,例如空格、分号等格式修正) + "refactor", // 代码重构(不包括 bug 修复、功能新增) + "perf", // 性能优化 + "test", // 添加疏漏测试或已有测试改动 + "build", // 构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等) + "ci", // 修改 CI 配置、脚本 + "revert", // 回滚 commit + "chore", // 对构建过程或辅助工具和库的更改(不影响源文件、测试用例) + ], + ], + "subject-case": [0], // subject大小写不做校验 + }, + + prompt: { + messages: { + type: "选择你要提交的类型 :", + scope: "选择一个提交范围(可选):", + customScope: "请输入自定义的提交范围 :", + subject: "填写简短精炼的变更描述 :\n", + body: '填写更加详细的变更描述(可选)。使用 "|" 换行 :\n', + breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行 :\n', + footerPrefixesSelect: "选择关联issue前缀(可选):", + customFooterPrefix: "输入自定义issue前缀 :", + footer: "列举关联issue (可选) 例如: #31, #I3244 :\n", + generatingByAI: "正在通过 AI 生成你的提交简短描述...", + generatedSelectByAI: "选择一个 AI 生成的简短描述:", + confirmCommit: "是否提交或修改commit ?", + }, + // prettier-ignore + types: [ + { value: "feat", name: "特性: ✨ 新增功能", emoji: ":sparkles:" }, + { value: "fix", name: "修复: 🐛 修复缺陷", emoji: ":bug:" }, + { value: "docs", name: "文档: 📝 文档变更(更新README文件,或者注释)", emoji: ":memo:" }, + { value: "style", name: "格式: 🌈 代码格式(空格、格式化、缺失的分号等)", emoji: ":lipstick:" }, + { value: "refactor", name: "重构: 🔄 代码重构(不修复错误也不添加特性的代码更改)", emoji: ":recycle:" }, + { value: "perf", name: "性能: 🚀 性能优化", emoji: ":zap:" }, + { value: "test", name: "测试: 🧪 添加疏漏测试或已有测试改动", emoji: ":white_check_mark:"}, + { value: "build", name: "构建: 📦️ 构建流程、外部依赖变更(如升级 npm 包、修改 vite 配置等)", emoji: ":package:"}, + { value: "ci", name: "集成: ⚙️ 修改 CI 配置、脚本", emoji: ":ferris_wheel:"}, + { value: "revert", name: "回退: ↩️ 回滚 commit",emoji: ":rewind:"}, + { value: "chore", name: "其他: 🛠️ 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)", emoji: ":hammer:"}, + { value: "wip", name: "开发中: 🚧 开发阶段临时提交", emoji: ":construction:"}, + ], + useEmoji: true, + emojiAlign: "center", + useAI: false, + aiNumber: 1, + themeColorCode: "", + scopes: [], + allowCustomScopes: true, + allowEmptyScopes: true, + customScopesAlign: "bottom", + customScopesAlias: "custom", + emptyScopesAlias: "empty", + upperCaseSubject: false, + markBreakingChangeMode: false, + allowBreakingChanges: ["feat", "fix"], + breaklineNumber: 100, + breaklineChar: "|", + skipQuestions: [], + issuePrefixes: [ + { value: "closed", name: "closed: ISSUES has been processed" }, + ], + customIssuePrefixAlign: "top", + emptyIssuePrefixAlias: "skip", + customIssuePrefixAlias: "custom", + allowCustomIssuePrefix: true, + allowEmptyIssuePrefix: true, + confirmColorize: true, + maxHeaderLength: Infinity, + maxSubjectLength: Infinity, + minSubjectLength: 0, + scopeOverrides: undefined, + defaultBody: "", + defaultIssues: "", + defaultScope: "", + defaultSubject: "", + }, +}; diff --git a/index.html b/index.html new file mode 100644 index 0000000..418cd2d --- /dev/null +++ b/index.html @@ -0,0 +1,137 @@ + + + + + + + + + 唱作网 + + + + + + +
+ +
+
+
+
+
+
+
+
+
+
+
+ + + + + + + diff --git a/mock/auth.mock.ts b/mock/auth.mock.ts new file mode 100644 index 0000000..90f08f7 --- /dev/null +++ b/mock/auth.mock.ts @@ -0,0 +1,43 @@ +import { defineMock } from "./base"; + +export default defineMock([ + { + url: "auth/captcha", + method: ["GET"], + body: { + code: "00000", + data: { + captchaKey: "534b8ef2b0a24121bec76391ddd159f9", + captchaBase64: + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAkCAIAAADNSmkJAAAFKUlEQVR4Xu2ZXUwcVRiGV70wMWo08V5NvPXCrDbFaGpMaZW2hqQxaoiJTRsaMBCNSYtpa2JTKiFSelFa+Q/QZcMWqEhBlh+htbEpZhMrBQrlJ0hBywLLyrJ0WZbje3bqOvPNLHPWrDvdOE9ONmfe78zkzMs335wzWJhJQrBQweS/wTQ6QWgYHdoIOcecOe05O+t2WkutO+p2ZF3Ksg/YV9ZW6FATYajR3nveg60H9327r3O8c35lHgp+r05dPdJzBL73TPSQ8SaCKIxGLsPlop+K0JHrEkPuoT31e5qGmmjARACF0agYyGVNlyVm/pzZXrN9fHGcBkz0UBid+31u93i3XFFT80vN8cvHqWqih8Lo1NpUqS5vwh3vnd223VQ10UNh9NbyrcFQUK6oCawHUipSqGqiB83oBf+CXFGDMp1mS6OqiR4Ko7FexkpOrqhpHGw82nOUqiZ6KIzGrkRuorW0dJMmOy+hOCfYGzb2RBFv6HRO0gEJw/U7y+pgL1bwmTxexN6sZ31TdEwEhdG+gA+7EqyXpUO1uZH20cWL8hMTRt1N9tBXzCJrOIRoCPJpSO2RAp4HmtCdIfZ+2JWgEBN9LbR28seTGU0Zue1tMLp+YIAMSADzfvbkKX4/eb28j4YODiGin3heqmIlLja5hAUCu+nmGY3JWKvpMAlqNGgebsauBOvlqSX+JEx7p7EbTLen53XlzfmWUioqXikrc68Y8N2juJ/fyVsNChGHEE//rBANYWaZz+TRQqpLaBgNsPfDrgSpbS21YtV87IdjrlkX9JZbt5DOma2t9ITo5F+5glN22WwL/n+yDv00mw06orKxOqQ5+J04hhViwzAXETIcJDVm8uxZqktoGx2Nj9t43Wgaul/ERQiGQvtbWnDWgZYW9CXlQFjZ/7ciyHNn+Z2MexTimIeLz59TiIln0M1e+IbPpOAaDUnEYPTi6iqKxpbycs/qKo1tCslfKcffPn9enuMiPPY1vxO/ckeFQ4h46cdGqUWoidE/y54q5tPY5WDrGzQqIXot4BgchEE57e00IMCw2/1qZSVO/7SjA78o9INzcxsbrL+fnTnDDh9mmZn8F30oG1Hm+nABv5mQMopDS/h1HxtqTzWbABMe9sxpPoe9zezeOo1GELqWhPS8t46M0IAYHbdvR1aHbaOjbjfLz2eFhez6dba4yAfgF30o0BFVE8+Mjh/wFxPI+I5mAEHU6Ls+38vhTFwOBGhMDF8gkFpbC5ffsdv/uBs6dIj19dExEtARVXv9YNbop8NFY3aZ6gRRo+tu3IBHnzmdNCBMXldXJKPfL74WzWUJRE+coDUknqsOdZXQbAJYwluVTbOZI3Qt8GFzMwxyjo3RgBiN4fr+elXVpZGRLWXl6PdOTtJBSlBDUK/lnIrjOlrtqWYTQDJaF6FrTXu9sOa1ysrVoM5HVE1GFxZQcyJ/p+xzv6K/rbr6N6+XDpUBl0tKFIrbz78qWB6YnWFMCBld4XLBms+7df75ook/GNzb0GCV7U1Qfz9p64TyQWNjYD3qe9rj4SMJtQP3MyjSDPzWIRHPjH7X4YAvfXoPuyZf9Pbi3PcuXIh4mp3NllYC6XY79C+jl2o8PBipxjnBttn4MgMNnWgfcRJGPI2OL8hTj3LloIlmRicvBhiNykvecpqoa3RSY4DRcLAwyicuOepVR1JjgNFYHWONHL04czTX0UmNAUYD7Pr+xc4wqTHGaBb2OtZvHUmNYUazcA2J6etdUmOk0f8rTKMTxF91RG0D1SwYGwAAAABJRU5ErkJggg==", + }, + msg: "一切ok", + }, + }, + + { + url: "auth/login", + method: ["POST"], + body: { + code: "00000", + data: { + accessToken: + "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImp0aSI6IjE2YWJkNTlkOTAxNzQwZDliYmI3ZjczODBhZDkyNzNhIiwidXNlcklkIjoyLCJ1c2VybmFtZSI6ImFkbWluIiwiZGVwdElkIjoxLCJkYXRhU2NvcGUiOjEsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iXSwiZXhwIjoxNjkxMTAzMzgyfQ.P4cuIfmPepl3HuguhMS7NXn5a7IUPpsLbmtA_rHOhHk", + tokenType: "Bearer", + refreshToken: null, + expires: null, + }, + msg: "一切ok", + }, + }, + + { + url: "auth/logout", + method: ["DELETE"], + body: { + code: "00000", + data: {}, + msg: "string", + }, + }, +]); diff --git a/mock/base.ts b/mock/base.ts new file mode 100644 index 0000000..438e1c1 --- /dev/null +++ b/mock/base.ts @@ -0,0 +1,10 @@ +import path from "path"; +import { createDefineMock } from "vite-plugin-mock-dev-server"; + +export const defineMock = createDefineMock((mock) => { + // 拼接url + mock.url = path.join( + import.meta.env.VITE_APP_BASE_API + "/api/v1/", + mock.url + ); +}); diff --git a/mock/menu.mock.ts b/mock/menu.mock.ts new file mode 100644 index 0000000..e8a85a2 --- /dev/null +++ b/mock/menu.mock.ts @@ -0,0 +1,120 @@ +import { defineMock } from "./base"; + +export default defineMock([ + { + url: "menus/routes", + method: ["GET"], + body: { + code: "00000", + data: [ + { + path: "/doc", + component: "Layout", + redirect: "https://juejin.cn/post/7228990409909108793", + name: "/doc", + meta: { + title: "平台文档", + icon: "document", + hidden: false, + alwaysShow: false, + params: null, + }, + children: [ + { + path: "internal-doc", + component: "demo/internal-doc", + name: "InternalDoc", + meta: { + title: "平台文档(内嵌)", + icon: "document", + hidden: false, + alwaysShow: false, + params: null, + }, + }, + { + path: "https://juejin.cn/post/7228990409909108793", + name: "Https://juejin.cn/post/7228990409909108793", + meta: { + title: "平台文档(外链)", + icon: "el-icon-Link", + hidden: false, + alwaysShow: false, + params: null, + }, + }, + ], + }, + { + path: "/multi-level", + component: "Layout", + name: "/multiLevel", + meta: { + title: "多级菜单", + icon: "cascader", + hidden: false, + alwaysShow: true, + params: null, + }, + children: [ + { + path: "multi-level1", + component: "demo/multi-level/level1", + name: "MultiLevel1", + meta: { + title: "菜单一级", + icon: "", + hidden: false, + alwaysShow: true, + params: null, + }, + children: [ + { + path: "multi-level2", + component: "demo/multi-level/children/level2", + name: "MultiLevel2", + meta: { + title: "菜单二级", + icon: "", + hidden: false, + alwaysShow: false, + params: null, + }, + children: [ + { + path: "multi-level3-1", + component: "demo/multi-level/children/children/level3-1", + name: "MultiLevel31", + meta: { + title: "菜单三级-1", + icon: "", + hidden: false, + keepAlive: true, + alwaysShow: false, + params: null, + }, + }, + { + path: "multi-level3-2", + component: "demo/multi-level/children/children/level3-2", + name: "MultiLevel32", + meta: { + title: "菜单三级-2", + icon: "", + hidden: false, + keepAlive: true, + alwaysShow: false, + params: null, + }, + }, + ], + }, + ], + }, + ], + }, + ], + msg: "一切ok", + }, + }, +]); diff --git a/mock/user.mock.ts b/mock/user.mock.ts new file mode 100644 index 0000000..639a183 --- /dev/null +++ b/mock/user.mock.ts @@ -0,0 +1,44 @@ +import { defineMock } from "./base"; + +export default defineMock([ + { + url: "users/me", + method: ["GET"], + body: { + code: "00000", + data: { + userId: 2, + nickname: "系统管理员", + username: "admin", + avatar: + "https://foruda.gitee.com/images/1723603502796844527/03cdca2a_716974.gif?imageView2/1/w/80/h/80", + roles: ["ROOT"], + perms: [ + "sys:menu:delete", + "sys:dept:edit", + "sys:dict_type:add", + "sys:dict:edit", + "sys:dict:delete", + "sys:dict_type:edit", + "sys:menu:add", + "sys:user:add", + "sys:role:edit", + "sys:dept:delete", + "sys:user:edit", + "sys:user:delete", + "sys:user:password:reset", + "sys:dept:add", + "sys:role:delete", + "sys:dict_type:delete", + "sys:menu:edit", + "sys:dict:add", + "sys:role:add", + "sys:user:query", + "sys:user:export", + "sys:user:import", + ], + }, + msg: "一切ok", + }, + }, +]); diff --git a/package.json b/package.json new file mode 100644 index 0000000..14131e5 --- /dev/null +++ b/package.json @@ -0,0 +1,118 @@ +{ + "name": "ichangzuo", + "version": "1.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit & vite build", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --noEmit", + "lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ", + "lint:prettier": "prettier --write \"**/*.{js,cjs,ts,json,tsx,css,less,scss,vue,html,md}\"", + "lint:stylelint": "stylelint \"**/*.{css,scss,vue}\" --fix", + "lint:lint-staged": "lint-staged", + "preinstall": "npx only-allow pnpm", + "prepare": "husky", + "commit": "git-cz" + }, + "config": { + "commitizen": { + "path": "node_modules/cz-git" + } + }, + "lint-staged": { + "*.{js,ts}": [ + "eslint --fix", + "prettier --write" + ], + "*.{cjs,json}": [ + "prettier --write" + ], + "*.{vue,html}": [ + "eslint --fix", + "prettier --write", + "stylelint --fix" + ], + "*.{scss,css}": [ + "stylelint --fix", + "prettier --write" + ], + "*.md": [ + "prettier --write" + ] + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "@vueuse/core": "^12.0.0", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "5.1.10", + "animate.css": "^4.1.1", + "axios": "^1.7.8", + "color": "^4.2.3", + "element-plus": "^2.9.0", + "nprogress": "^0.2.0", + "path-browserify": "^1.0.1", + "path-to-regexp": "^8.2.0", + "pinia": "^2.2.8", + "qs": "^6.13.1", + "vue": "^3.5.13", + "vue-i18n": "10.0.5", + "vue-qrcode": "^2.2.2", + "vue-router": "^4.5.0" + }, + "devDependencies": { + "@commitlint/cli": "^19.6.0", + "@commitlint/config-conventional": "^19.6.0", + "@iconify-json/ep": "^1.2.1", + "@types/color": "^4.2.0", + "@types/node": "^22.10.1", + "@types/nprogress": "^0.2.3", + "@types/path-browserify": "^1.0.3", + "@types/qs": "^6.9.17", + "@typescript-eslint/eslint-plugin": "^8.17.0", + "@typescript-eslint/parser": "^8.17.0", + "@vitejs/plugin-vue": "^5.2.1", + "@vitejs/plugin-vue-jsx": "^4.1.1", + "autoprefixer": "^10.4.20", + "commitizen": "^4.3.1", + "cz-git": "^1.11.0", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-vue": "^9.32.0", + "fast-glob": "^3.3.2", + "husky": "^9.1.7", + "lint-staged": "^15.2.10", + "postcss": "^8.4.49", + "postcss-html": "^1.7.0", + "postcss-scss": "^4.0.9", + "prettier": "^3.4.1", + "sass": "^1.82.0", + "stylelint": "^16.11.0", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recess-order": "^5.1.1", + "stylelint-config-recommended-scss": "^14.1.0", + "stylelint-config-recommended-vue": "^1.5.0", + "stylelint-config-standard": "^36.0.1", + "terser": "^5.36.0", + "typescript": "^5.7.2", + "unocss": "^0.65.0", + "unplugin-auto-import": "^0.18.6", + "unplugin-icons": "^0.21.0", + "unplugin-vue-components": "^0.27.5", + "vite": "^6.0.2", + "vite-plugin-mock-dev-server": "^1.8.0", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-vue-devtools": "^7.6.7", + "vue-tsc": "^2.1.10" + }, + "repository": "", + "author": "", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..db1eae6963fb9f2e271095c200a8df3e619a844a GIT binary patch literal 16958 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 literal 0 HcmV?d00001 diff --git a/public/html/coin.html b/public/html/coin.html new file mode 100644 index 0000000..fd3c34b --- /dev/null +++ b/public/html/coin.html @@ -0,0 +1,66 @@ + + +
+
唱作音符
+ +
+
+
+ 唱作音符是唱作网的操作度量工具,在使用唱作魔方软件时会用到唱作音符。唱作音符通常叫作“音符”。 +
+
+ +
+
音符使用:
+
+ 在唱作魔方软件中:
+ (1)保存音乐 (-1)
+ (2)保存音乐时使用扩展音色库 (-80)
+ (3)保存音乐时使用收费风格
+ (4)其它 +
+
+ +
+
用户获取:
+
+ (1)在注册用户时唱作网会赠予一定的音符
+ (2)充值兑换
+
+
+ +
+
音符充值:
+
+ 进入账户管理页,选择 "唱作音符" 下的 "充值提现"
+ 当前兑换比例:¥1元 = 100音符 +
+
+ +
+
音符提现:
+
+ 进入账户管理页,选择 "唱作音符" 下的 "充值提现"
+ 最低提现金额为100元(即10000音符);唱作网将收取按提现金额6%的音符作为平台管理费,提现后24小时内到账 +
+
+ +
+
查看明细:
+
+ 进入账户管理页,选择 "唱作音符" 下的 "音符明细" 查看
+
+
+ +
+
+ 注:音符获取细则和使用细则等请以唱作网具体规定为准

+
+
+ +
+ +
+ + + diff --git a/public/html/contact.html b/public/html/contact.html new file mode 100644 index 0000000..0593d4d --- /dev/null +++ b/public/html/contact.html @@ -0,0 +1,23 @@ + + +
+
联系我们
+ +
+
+
+
+
+ 邮箱:music@ichangzuo.com +
+
+ QQ群:271573952 +
+
+ +
+ +
+ + + diff --git a/public/html/help.css b/public/html/help.css new file mode 100644 index 0000000..2babfca --- /dev/null +++ b/public/html/help.css @@ -0,0 +1,15 @@ +@charset "utf-8"; + +/*帮助内容*/ +.helpContent_border{width:100%; margin:0 0 30px 0px;} +.helpContent_border .helpContent_title{width:100%; padding: 20px 0 10px 0; text-align:center; font-size:20px; font-weight:bold;} +.helpContent_border .content{width:100%; padding:25px 0 0 0;} +.helpContent_border .content .title{font-size:16px; font-weight:bold;padding-left: 10px;} +.helpContent_border .content .msg{padding:10px 0 0 20px; font-size:12px; line-height:24px;} +.helpContent_border .content .img_border{width:100%; padding:20px 0 20px 0; text-align:center;} +.helpContent_border .content .img_border img{max-width:850px;} +table, th, td { + border: 1px solid black; + border-collapse: collapse; + text-align: center; +} diff --git a/public/html/privacy.html b/public/html/privacy.html new file mode 100644 index 0000000..1fcee3f --- /dev/null +++ b/public/html/privacy.html @@ -0,0 +1,156 @@ + + +
+ + + diff --git a/public/html/user.html b/public/html/user.html new file mode 100644 index 0000000..dd514e1 --- /dev/null +++ b/public/html/user.html @@ -0,0 +1,120 @@ + + +
+
唱作网用户协议
+ +
+
+
+ 欢迎您使用唱作网产品及服务!
+ 为使用唱作网产品及服务(以下统称“本产品及服务”),您应当阅读并遵守《唱作网用户协议》(以下简称“本协议”),以及《唱作网隐私政策》
+ 在您注册成为唱作网用户的过程中,您需要完成我们的注册流程并通过点击同意的形式在线签署以下使用协议,请务必仔细阅读,充分理解协议中的条款后再点击同意,这些条款可能会明确您应履行的义务或对您的权利有所限制。 +
+
+ +
+
服务内容
+
+ (1)本产品及服务的具体内容由唱作网根据实际情况提供,例如账户管理、软件升级等。唱作网保留随时变更、中断或终止部分或全部产品及服务的权利。
+ (2)当您使用本产品时,您应选择与您的终端、系统等相匹配的本产品版本,否则,您可能无法正常使用本产品。 + (3)唱作网在提供产品及服务时,可能会对部分产品及服务收取一定的费用。在此情况下, 唱作网会在相关页面上做明确的提示。如用户拒绝支付该等费用,则不能使用相关产品及服务。
+ (4)唱作网仅提供相关的产品及服务,除此之外与之有关的设备(如电脑、移动设备、调制解调器及其他与接入互联网有关的装置)及所需的费用( 如为接入互联网而支付的电话费及上网费 )均应由用户自行负担。 +
+
+ +
+
使用规则
+
+ (1)当您注册成功后,唱作网将给予您一个用户帐号及相应的密码,该用户帐号和密码由您负责保管,您应当对以其用户帐号进行的所有活动和事件负法律责任。
+ (2)在您使用本产品与服务视为同意接受唱作网通过电子邮件或其它方式向用户发送的商品促销或其他相关商业信息。
+ (3)您在使用本服务过程中,必须遵循以下原则:
+         A:遵守中国有关的法律和法规;
+         B:不得为任何非法目的而使用网络服务系统;
+         C:遵守所有与本产品及服务有关的网络协议、规定和程序;
+         D:不得利用本产品及服务进行任何可能对互联网的正常运转造成不利影响的行为;
+         E:不得利用本产品及服务传播任何骚扰性的、中伤他人的、辱骂性的、恐吓性的、庸俗淫秽的或其他任何非法的信息资料;
+         F:不得利用本产品及服务进行任何不利于唱作网的行为;
+         G:如发现任何非法使用用户帐号或帐号出现安全漏洞的情况,应立即通告唱作网。 +
+
+ +
+
内容所有权
+
+ (1)唱作网提供的网络服务内容可能包括:文字、软件、声音、图片、MV、图表等。所有这些内容受版权、商标和其它财产所有权法律的保护。
+ (2)您只有在获得唱作网或其他相关权利人的授权之后才能使用这些内容,而不能擅自复制、再造这些内容、或创造与内容有关的派生产品。
+ (3)您使用本产品及服务创作或制作的歌曲,著作权仍归您所有。唱作网对您著作权部分不作任何要求。
+
+
+ +
+
隐私保护
+
+ 隐私保护相关条款以《唱作网隐私政策》内容为准。 +
+
+ +
+
免责声明
+
+ (1)您明确同意其使用本产品及服务所存在的风险将完全由其您承担,因您使用本产品及服务而产生的一切后果也由您承担, 唱作网对此不承担任何责任。
+ (2)唱作网不担保本产品及服务一定能满足您的要求,也不担保本产品及服务不会中断,对本产品及服务的及时性、安全性、准确性也都不作担保。
+
+
+ +
+
服务变更、中断或终止
+
+ (1)如因系统维护或升级的需要而需暂停网络服务, 唱作网将尽可能事先进行通告。
+ (2)如发生下列任何一种情形, 唱作网有权随时中断或终止向您提供本协议中的服务而无需通知:
+         A:您提供的个人资料不真实;
+         B:您违反本协议中规定的使用规则。
+ (3)除前款所述情形外, 唱作网同时保留在不事先通知您的情况下随时中断或终止部分或全部产品及服务的权利,对于所有服务的中断或终止而造成的任何损失, 唱作网无须承担责任。 +
+
+ +
+
违约赔偿
+
+ 您同意保障和维护唱作网及其他用户的利益,如因您违反有关法律、法规或本协议项下的任何条款而给唱作网或任何其他第三人造成损失,您同意承担由此造成的损害赔偿责任。 +
+
+ +
+
修改协议
+
+ (1)唱作网将可能不时的修改本协议的有关条款,一旦条款内容发生变动,唱作网将尽量在相关页面提示修改内容。
+ (2)如果不同意唱作网对服务条款所做的修改,您有权停止使用本产品及服务。如果您继续使用本产品及服务,则视为您接受服务条款的变动。 +
+
+ +
+
法律管辖
+
+ (1)本协议的订立、执行和解释及争议的解决均应适用中国法律。
+ (2)如双方就本协议内容或其执行发生任何争议,双方应尽量友好协商解决;协商不成时,任何一方均可向唱作网所在地的人民法院提起诉讼。 +
+
+ +
+
通知和送达
+
+ 本协议项下所有的通知均可通过重要页面公告、电子邮件或常规的信件传送等方式进行;该等通知于发送之日视为已送达收件人。 +
+
+ +
+
其他规定
+
+ (1)本协议构成双方对本协议之约定事项及其他有关事宜的完整协议,除本协议规定的之外,未赋予本协议各方其他权利。
+ (2)如本协议中的任何条款无论因何种原因完全或部分无效或不具有执行力,本协议的其余条款仍应有效并且有约束力。
+ (3)本协议中的标题仅为方便而设,在解释本协议时应被忽略。 +
+
+ +
+ +
+ + + diff --git a/public/html/vip.html b/public/html/vip.html new file mode 100644 index 0000000..488a64f --- /dev/null +++ b/public/html/vip.html @@ -0,0 +1,33 @@ + + +
+
VIP会员
+ +
+
特权:
+
+ (1)唱作魔方所有版本免收功能费;
+ (2)唱作魔方所有版本使用收费风格时享受8折优惠;
+ (3)唱作魔方所有版本可使用离线保存功能;
+
+ 更多VIP会员特权敬请期待! +
+
+ +
+
费用标准:
+
+ (1)一月:1000 音符
+ (2)半年:5500 音符
+ (3)一年:10000 音符
+ (4)两年:20000 音符
+ (5)终身:30000 音符(为庆祝唱作网首次推出VIP会员服务,限时可成为终身会员。目前已结束。) +
+
+ +
+ +
+ + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..c2ad224 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/api/auth.ts b/src/api/auth.ts new file mode 100644 index 0000000..f28b5bf --- /dev/null +++ b/src/api/auth.ts @@ -0,0 +1,150 @@ +import request from "@/utils/request"; +import { verify } from "crypto"; + +const AUTH_BASE_URL = "/api/v1/auth"; + +class AuthAPI { + /** 登录 接口*/ + static login(data: LoginData) { + const formData = new FormData(); + formData.append("username", data.username); + formData.append("password", data.password); + formData.append("captchaKey", data.captchaKey); + formData.append("captchaCode", data.captchaCode); + + return request({ + url: `${AUTH_BASE_URL}/login`, + method: "post", + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); + } + + /** 注销 接口*/ + static logout() { + return request({ + url: `${AUTH_BASE_URL}/logout`, + method: "delete", + }); + } + + /** 获取验证码 接口*/ + static getCaptcha() { + return request({ + url: `${AUTH_BASE_URL}/captcha`, + method: "get", + }); + } + + static sendCode(data: SendCodeData) { + const formData = new FormData(); + formData.append("contact", data.contact); + formData.append("captchaKey", data.captchaKey); + formData.append("captchaCode", data.captchaCode); + + return request({ + url: `${AUTH_BASE_URL}/sendRegCode`, + method: "post", + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); + } + + /** 登录 接口*/ + static register(data: RegisterData) { + const formData = new FormData(); + formData.append("username", data.username); + formData.append("password", data.password); + formData.append("verifyCode", data.verifyCode); + + return request({ + url: `${AUTH_BASE_URL}/register`, + method: "post", + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); + } + + static autoLogin(username: string, password: string) { + const formData = new FormData(); + formData.append("username", username); + formData.append("password", password); + + return request({ + url: `${AUTH_BASE_URL}/autoLogin`, + method: "post", + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); + } +} + +export default AuthAPI; + +/** 登录请求参数 */ +export interface LoginData { + /** 用户名 */ + username: string; + /** 密码 */ + password: string; + /** 验证码缓存key */ + captchaKey: string; + /** 验证码 */ + captchaCode: string; +} + +/** 登录响应 */ +export interface LoginResult { + /** 访问token */ + accessToken?: string; + /** 过期时间(单位:毫秒) */ + expires?: number; + /** 刷新token */ + refreshToken?: string; + /** token 类型 */ + tokenType?: string; +} + +/** 验证码响应 */ +export interface CaptchaResult { + /** 验证码缓存key */ + captchaKey: string; + /** 验证码图片Base64字符串 */ + captchaBase64: string; +} + +export interface CaptchaData { + /** 验证码缓存key */ + captchaKey: string; + /** 验证码 */ + captchaCode: string; +} + +export interface SendCodeData { + /** 发送验证码账号 */ + contact: string; + /** 验证码缓存key */ + captchaKey: string; + /** 验证码 */ + captchaCode: string; +} + +/** 注册请求参数 */ +export interface RegisterData { + /** 用户名 */ + username: string; + /** 密码 */ + password: string; + /** 重复输入密码 */ + repeatPassword: string; + /** 验证码 */ + verifyCode: string; +} diff --git a/src/api/bank.ts b/src/api/bank.ts new file mode 100644 index 0000000..19b2260 --- /dev/null +++ b/src/api/bank.ts @@ -0,0 +1,28 @@ +import request from "@/utils/request"; + +const BANK_BASE_URL = "/api/v1/bank"; + +class BankAPI { + static hotlist() { + return request({ + url: `${BANK_BASE_URL}/hotList`, + method: "get", + }); + } + + static bankInfo() { + return request({ + url: `${BANK_BASE_URL}/me`, + method: "get", + }); + } +} + +export default BankAPI; + +export interface BankInfo { + userId: number; + bankName?: string; + bankCardNum?: string; + bankCardName?: string; +} diff --git a/src/api/codegen.ts b/src/api/codegen.ts new file mode 100644 index 0000000..166aa22 --- /dev/null +++ b/src/api/codegen.ts @@ -0,0 +1,191 @@ +import request from "@/utils/request"; + +const GENERATOR_BASE_URL = "/api/v1/codegen"; + +class GeneratorAPI { + /** 获取数据表分页列表 */ + static getTablePage(params: TablePageQuery) { + return request>({ + url: `${GENERATOR_BASE_URL}/table/page`, + method: "get", + params: params, + }); + } + + /** 获取代码生成配置 */ + static getGenConfig(tableName: string) { + return request({ + url: `${GENERATOR_BASE_URL}/${tableName}/config`, + method: "get", + }); + } + + /** 获取代码生成配置 */ + static saveGenConfig(tableName: string, data: GenConfigForm) { + return request({ + url: `${GENERATOR_BASE_URL}/${tableName}/config`, + method: "post", + data: data, + }); + } + + /** 获取代码生成预览数据 */ + static getPreviewData(tableName: string) { + return request({ + url: `${GENERATOR_BASE_URL}/${tableName}/preview`, + method: "get", + }); + } + + /** 重置代码生成配置 */ + static resetGenConfig(tableName: string) { + return request({ + url: `${GENERATOR_BASE_URL}/${tableName}/config`, + method: "delete", + }); + } + + /** + * 下载 ZIP 文件 + * @param url + * @param fileName + */ + static download(tableName: string) { + return request({ + url: `${GENERATOR_BASE_URL}/${tableName}/download`, + method: "get", + responseType: "blob", + }).then((response) => { + const fileName = decodeURI( + response.headers["content-disposition"].split(";")[1].split("=")[1] + ); + + const blob = new Blob([response.data], { type: "application/zip" }); + const a = document.createElement("a"); + const url = window.URL.createObjectURL(blob); + a.href = url; + a.download = fileName; + a.click(); + window.URL.revokeObjectURL(url); + }); + } +} + +export default GeneratorAPI; + +/** 代码生成预览对象 */ +export interface GeneratorPreviewVO { + /** 文件生成路径 */ + path: string; + /** 文件名称 */ + fileName: string; + /** 文件内容 */ + content: string; +} + +/** 数据表分页查询参数 */ +export interface TablePageQuery extends PageQuery { + /** 关键字(表名) */ + keywords?: string; +} + +/** 数据表分页对象 */ +export interface TablePageVO { + /** 表名称 */ + tableName: string; + + /** 表描述 */ + tableComment: string; + + /** 存储引擎 */ + engine: string; + + /** 字符集排序规则 */ + tableCollation: string; + + /** 创建时间 */ + createTime: string; +} + +/** 代码生成配置表单 */ +export interface GenConfigForm { + /** 主键 */ + id?: number; + + /** 表名 */ + tableName?: string; + + /** 业务名 */ + businessName?: string; + + /** 模块名 */ + moduleName?: string; + + /** 包名 */ + packageName?: string; + + /** 实体名 */ + entityName?: string; + + /** 作者 */ + author?: string; + + /** 上级菜单 */ + parentMenuId?: number; + + /** 后端应用名 */ + backendAppName?: string; + /** 前端应用名 */ + frontendAppName?: string; + + /** 字段配置列表 */ + fieldConfigs?: FieldConfig[]; +} + +/** 字段配置 */ +export interface FieldConfig { + /** 主键 */ + id?: number; + + /** 列名 */ + columnName?: string; + + /** 列类型 */ + columnType?: string; + + /** 字段名 */ + fieldName?: string; + + /** 字段类型 */ + fieldType?: string; + + /** 字段描述 */ + fieldComment?: string; + + /** 是否在列表显示 */ + isShowInList?: number; + + /** 是否在表单显示 */ + isShowInForm?: number; + + /** 是否在查询条件显示 */ + isShowInQuery?: number; + + /** 是否必填 */ + isRequired?: number; + + /** 表单类型 */ + formType?: number; + + /** 查询类型 */ + queryType?: number; + + /** 字段长度 */ + maxLength?: number; + + /** 字段排序 */ + fieldSort?: number; + + /** 字典类型 */ + dictType?: string; +} diff --git a/src/api/config.ts b/src/api/config.ts new file mode 100644 index 0000000..72760d7 --- /dev/null +++ b/src/api/config.ts @@ -0,0 +1,104 @@ +import request from "@/utils/request"; + +const CONFIG_BASE_URL = "/api/v1/config"; + +class ConfigAPI { + /** 获取系统配置分页数据 */ + static getPage(queryParams?: ConfigPageQuery) { + return request>({ + url: `${CONFIG_BASE_URL}/page`, + method: "get", + params: queryParams, + }); + } + /** + * 获取系统配置表单数据 + * + * @param id ConfigID + * @returns Config表单数据 + */ + static getFormData(id: number) { + return request({ + url: `${CONFIG_BASE_URL}/${id}/form`, + method: "get", + }); + } + + /** 添加系统配置*/ + static add(data: ConfigForm) { + return request({ + url: `${CONFIG_BASE_URL}`, + method: "post", + data: data, + }); + } + + /** + * 更新系统配置 + * + * @param id ConfigID + * @param data Config表单数据 + */ + static update(id: number, data: ConfigForm) { + return request({ + url: `${CONFIG_BASE_URL}/${id}`, + method: "put", + data: data, + }); + } + + /** + * 删除系统配置 + * + * @param ids 系统配置ID + */ + static deleteById(id: number) { + return request({ + url: `${CONFIG_BASE_URL}/${id}`, + method: "delete", + }); + } + + static refreshCache() { + return request({ + url: `${CONFIG_BASE_URL}`, + method: "patch", + }); + } +} + +export default ConfigAPI; + +/** $系统配置分页查询参数 */ +export interface ConfigPageQuery extends PageQuery { + /** 搜索关键字 */ + keywords?: string; +} + +/** 系统配置表单对象 */ +export interface ConfigForm { + /** 主键 */ + id?: number; + /** 配置名称 */ + configName?: string; + /** 配置键 */ + configKey?: string; + /** 配置值 */ + configValue?: string; + /** 描述、备注 */ + remark?: string; +} + +/** 系统配置分页对象 */ +export interface ConfigPageVO { + /** 主键 */ + id?: number; + /** 配置名称 */ + configName?: string; + /** 配置键 */ + configKey?: string; + /** 配置值 */ + configValue?: string; + /** 描述、备注 */ + remark?: string; +} diff --git a/src/api/dict.ts b/src/api/dict.ts new file mode 100644 index 0000000..83cd675 --- /dev/null +++ b/src/api/dict.ts @@ -0,0 +1,192 @@ +import request from "@/utils/request"; + +const DICT_BASE_URL = "/api/v1/dict"; + +class DictAPI { + /** + * 获取字典分页列表 + * + * @param queryParams 查询参数 + * @returns 字典分页结果 + */ + static getPage(queryParams: DictPageQuery) { + return request>({ + url: `${DICT_BASE_URL}/page`, + method: "get", + params: queryParams, + }); + } + + /** + * 获取字典表单数据 + * + * @param id 字典ID + * @returns 字典表单数据 + */ + static getFormData(id: number) { + return request>({ + url: `${DICT_BASE_URL}/${id}/form`, + method: "get", + }); + } + + /** + * 新增字典 + * + * @param data 字典表单数据 + */ + static add(data: DictForm) { + return request({ + url: `${DICT_BASE_URL}`, + method: "post", + data: data, + }); + } + + /** + * 修改字典 + * + * @param id 字典ID + * @param data 字典表单数据 + */ + static update(id: number, data: DictForm) { + return request({ + url: `${DICT_BASE_URL}/${id}`, + method: "put", + data: data, + }); + } + + /** + * 删除字典 + * + * @param ids 字典ID,多个以英文逗号(,)分隔 + */ + static deleteByIds(ids: string) { + return request({ + url: `${DICT_BASE_URL}/${ids}`, + method: "delete", + }); + } + + /** + * 获取字典列表 + * + * @returns 字典列表 + */ + static getList() { + return request({ + url: `${DICT_BASE_URL}/list`, + method: "get", + }); + } + + /** + * 获取字典的数据项 + * + * @param typeCode 字典编码 + * @returns 字典数据项 + */ + static getOptions(code: string) { + return request({ + url: `${DICT_BASE_URL}/${code}/options`, + method: "get", + }); + } +} + +export default DictAPI; + +/** + * 字典查询参数 + */ +export interface DictPageQuery extends PageQuery { + /** + * 关键字(字典名称/编码) + */ + keywords?: string; +} + +/** + * 字典分页对象 + */ +export interface DictPageVO { + /** + * 字典ID + */ + id: number; + /** + * 字典名称 + */ + name: string; + /** + * 字典编码 + */ + code: string; + /** + * 字典状态(1-启用,0-禁用) + */ + status: number; + /** + * 字典项列表 + */ + dictItems: DictItem[]; +} + +/** + * 字典项 + */ +export interface DictItem { + /** + * 字典项ID + */ + id?: number; + /** + * 字典项名称 + */ + name?: string; + /** + * 字典项值 + */ + value?: string; + /** + * 排序 + */ + sort?: number; + /** + * 状态(1-启用,0-禁用) + */ + status?: number; +} + +// TypeScript 类型声明 + +/** + * 字典 + */ +export interface DictForm { + /** + * 字典ID + */ + id?: number; + /** + * 字典名称 + */ + name?: string; + /** + * 字典编码 + */ + code?: string; + /** + * 字典状态(1-启用,0-禁用) + */ + status?: number; + /** + * 备注 + */ + remark?: string; + /** + * 字典数据项列表 + */ + dictItems?: DictItem[]; +} diff --git a/src/api/file.ts b/src/api/file.ts new file mode 100644 index 0000000..c812520 --- /dev/null +++ b/src/api/file.ts @@ -0,0 +1,74 @@ +import request from "@/utils/request"; + +class FileAPI { + /** + * 文件上传地址 + */ + static uploadUrl = import.meta.env.VITE_APP_BASE_API + "/api/v1/files"; + + /** + * 上传文件 + * + * @param file + */ + static upload(file: File, type: string) { + const formData = new FormData(); + formData.append("file", file); + formData.append("type", type); + return request({ + url: "/api/v1/files", + method: "post", + timeout: 300000, + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); + } + + /** + * 删除文件 + * + * @param filePath 文件完整路径 + */ + static deleteByPath(filePath?: string) { + return request({ + url: "/api/v1/files", + method: "delete", + params: { filePath: filePath }, + }); + } + + /** + * 下载文件 + * @param url + * @param fileName + */ + static downloadFile(url: string, fileName?: string) { + return request({ + url: url, + method: "get", + responseType: "blob", + }).then((res) => { + const blob = new Blob([res.data]); + const a = document.createElement("a"); + const url = window.URL.createObjectURL(blob); + a.href = url; + a.download = fileName || "下载文件"; + a.click(); + window.URL.revokeObjectURL(url); + }); + } +} + +export default FileAPI; + +/** + * 文件API类型声明 + */ +export interface FileInfo { + /** 文件名 */ + name: string; + /** 文件路径 */ + url: string; +} diff --git a/src/api/helper.ts b/src/api/helper.ts new file mode 100644 index 0000000..4f74dd5 --- /dev/null +++ b/src/api/helper.ts @@ -0,0 +1,86 @@ +import request from "@/utils/request"; +import { ColoredType } from "@/enums/SoftwareEnum"; + +const HELPER_BASE_URL = "/api/v1/helper"; + +class HelpAPI { + static listQnA(id: number) { + return request({ + url: `${HELPER_BASE_URL}/listQnA/${id}`, + method: "get", + }); + } + + static getPage(queryParams: QnAPageQuery) { + return request>({ + url: `${HELPER_BASE_URL}/pageQnA`, + method: "get", + params: queryParams, + }); + } + + static setByIds(ids: string, state: number) { + return request({ + url: `${HELPER_BASE_URL}/setQnAByIds/${ids}`, + method: "put", + params: { state: state }, + }); + } + + static saveOrUpdate(data: UpdateQnA) { + return request({ + url: `${HELPER_BASE_URL}/updateQnA`, + method: "put", + data: data, + }); + } +} + +export default HelpAPI; + +export interface QnAPageQuery extends PageQuery { + userId?: number; + state?: number; + typeIds?: string; +} + +/** 问题简要信息 */ +export interface HelpQnA { + /** ID */ + helpId: number; + question: string; + answer: string; +} + +// export interface QnAType { +// color: string; +// value: string; +// label: string; +// } + +/** 问题简要信息 */ +export interface FullQnA { + /** ID */ + helpId?: number; + question?: string; + answer?: string; + helpTypeId?: string; //提问类型 + types?: ColoredType[]; + submitVersinos?: string; //提交问题的软件版本 + userId?: number; //提问用户 + userName?: string; + nickname?: string; + state?: number; //编辑状态 + editTime?: number; //提交时间 + answerTime?: number; //处理时间 +} + +/** 问题简要信息 */ +export interface UpdateQnA { + /** ID */ + helpId?: number; + question?: string; + answer?: string; + helpTypeId?: string; + state?: number; +} diff --git a/src/api/integral.ts b/src/api/integral.ts new file mode 100644 index 0000000..fe5fa9d --- /dev/null +++ b/src/api/integral.ts @@ -0,0 +1,56 @@ +import request from "@/utils/request"; + +const INTEGRAL_BASE_URL = "/api/v1/integral"; + +class IntegralAPI { + static listAdmin(query: IntegralPageQuery) { + return request>({ + url: `${INTEGRAL_BASE_URL}/pageAdmin`, + method: "get", + params: query, + }); + } + + static listUser(query: IntegralPageQuery) { + return request>({ + url: `${INTEGRAL_BASE_URL}/pageUser`, + method: "get", + params: query, + }); + } +} + +export default IntegralAPI; + +export interface IntegralPageAdminVO { + detailsId: number; + userId: number; + userName: string; + nickName?: string; + title: string; + score: number; + balance: number; + //类型规则编号(-1:订制音乐服务;-2:退订音乐服务;-3:音乐服务收入;-4:保存音频;-5:保存midi;-6:积分发放;-7:购买VIP;;-8:提现;-9:推荐音乐;-10:风格收入;-11:购买CPJ;-12:出售CPJ;-13:购买金曲票数;-14:领奖;-15:论坛金钱兑换) + ruleid: number; + ruletype: number; + addtime: number; + comment: string; +} + +export interface IntegralPageUserVO { + detailsId: number; + title: string; + score: number; + balance: number; + ruleid: number; + ruletype: number; + addtime: number; + comment: string; +} + +export interface IntegralPageQuery extends PageQuery { + userId?: number; + ruletype?: number; + /** 添加时间 */ + addtime?: [number, number]; +} diff --git a/src/api/log.ts b/src/api/log.ts new file mode 100644 index 0000000..a8c71e5 --- /dev/null +++ b/src/api/log.ts @@ -0,0 +1,122 @@ +import request from "@/utils/request"; + +const LOG_BASE_URL = "/api/v1/logs"; + +class LogAPI { + /** + * 获取日志分页列表 + * + * @param queryParams 查询参数 + */ + static getPage(queryParams: LogPageQuery) { + return request>({ + url: `${LOG_BASE_URL}/page`, + method: "get", + params: queryParams, + }); + } + + /** + * 获取访问趋势 + * + * @param queryParams + * @returns + */ + static getVisitTrend(queryParams: VisitTrendQuery) { + return request({ + url: `${LOG_BASE_URL}/visit-trend`, + method: "get", + params: queryParams, + }); + } + + /** + * 获取访问趋势 + * + * @param queryParams + * @returns + */ + static getVisitStats() { + return request({ + url: `${LOG_BASE_URL}/visit-stats`, + method: "get", + }); + } +} + +export default LogAPI; + +/** + * 日志分页查询对象 + */ +export interface LogPageQuery extends PageQuery { + /** 搜索关键字 */ + keywords?: string; + /** 操作时间 */ + createTime?: [string, string]; +} + +/** + * 系统日志分页VO + */ +export interface LogPageVO { + /** 主键 */ + id: number; + /** 日志模块 */ + module: string; + /** 日志内容 */ + content: string; + /** 请求路径 */ + requestUri: string; + /** 请求方法 */ + method: string; + /** IP 地址 */ + ip: string; + /** 地区 */ + region: string; + /** 浏览器 */ + browser: string; + /** 终端系统 */ + os: string; + /** 执行时间(毫秒) */ + executionTime: number; + /** 操作人 */ + operator: string; +} + +/** 访问趋势视图对象 */ +export interface VisitTrendVO { + /** 日期列表 */ + dates: string[]; + /** 浏览量(PV) */ + pvList: number[]; + /** 访客数(UV) */ + uvList: number[]; + /** IP数 */ + ipList: number[]; +} + +/** 访问趋势查询参数 */ +export interface VisitTrendQuery { + /** 开始日期 */ + startDate: string; + /** 结束日期 */ + endDate: string; +} + +/** 访问统计 */ +export interface VisitStatsVO { + /** 标题 */ + title: string; + /** 类型 */ + type: "pv" | "uv" | "ip"; + + /** 今日访问量 */ + todayCount: number; + /** 总访问量 */ + totalCount: number; + /** 同比增长率(相对于昨天同一时间段的增长率) */ + growthRate: number; + + totalCountOutput: number; +} diff --git a/src/api/menu.ts b/src/api/menu.ts new file mode 100644 index 0000000..b2fb9ba --- /dev/null +++ b/src/api/menu.ts @@ -0,0 +1,209 @@ +import request from "@/utils/request"; +// 菜单基础URL +const MENU_BASE_URL = "/api/v1/menus"; + +class MenuAPI { + /** + * 获取当前用户的路由列表 + *

+ * 无需传入角色,后端解析token获取角色自行判断是否拥有路由的权限 + * + * @returns 路由列表 + */ + static getRoutes() { + return request({ + url: `${MENU_BASE_URL}/routes`, + method: "get", + }); + } + + /** + * 获取菜单树形列表 + * + * @param queryParams 查询参数 + * @returns 菜单树形列表 + */ + static getList(queryParams: MenuQuery) { + return request({ + url: `${MENU_BASE_URL}`, + method: "get", + params: queryParams, + }); + } + + /** + * 获取菜单下拉数据源 + * + * @returns 菜单下拉数据源 + */ + static getOptions(onlyParent?: boolean) { + return request({ + url: `${MENU_BASE_URL}/options`, + method: "get", + params: { onlyParent: onlyParent }, + }); + } + + /** + * 获取菜单表单数据 + * + * @param id 菜单ID + */ + static getFormData(id: number) { + return request({ + url: `${MENU_BASE_URL}/${id}/form`, + method: "get", + }); + } + + /** + * 添加菜单 + * + * @param data 菜单表单数据 + * @returns 请求结果 + */ + static add(data: MenuForm) { + return request({ + url: `${MENU_BASE_URL}`, + method: "post", + data: data, + }); + } + + /** + * 修改菜单 + * + * @param id 菜单ID + * @param data 菜单表单数据 + * @returns 请求结果 + */ + static update(id: string, data: MenuForm) { + return request({ + url: `${MENU_BASE_URL}/${id}`, + method: "put", + data: data, + }); + } + + /** + * 删除菜单 + * + * @param id 菜单ID + * @returns 请求结果 + */ + static deleteById(id: number) { + return request({ + url: `${MENU_BASE_URL}/${id}`, + method: "delete", + }); + } +} + +export default MenuAPI; + +import { MenuTypeEnum } from "@/enums/MenuTypeEnum"; + +/** 菜单查询参数 */ +export interface MenuQuery { + /** 搜索关键字 */ + keywords?: string; +} + +/** 菜单视图对象 */ +export interface MenuVO { + /** 子菜单 */ + children?: MenuVO[]; + /** 组件路径 */ + component?: string; + /** ICON */ + icon?: string; + /** 菜单ID */ + id?: number; + /** 菜单名称 */ + name?: string; + /** 父菜单ID */ + parentId?: number; + /** 按钮权限标识 */ + perm?: string; + /** 跳转路径 */ + redirect?: string; + /** 路由名称 */ + routeName?: string; + /** 路由相对路径 */ + routePath?: string; + /** 菜单排序(数字越小排名越靠前) */ + sort?: number; + /** 菜单 */ + type?: MenuTypeEnum; + /** 菜单是否可见(1:显示;0:隐藏) */ + visible?: number; +} + +/** 菜单表单对象 */ +export interface MenuForm { + /** 菜单ID */ + id?: string; + /** 父菜单ID */ + parentId?: number; + /** 菜单名称 */ + name?: string; + /** 菜单是否可见(1-是 0-否) */ + visible: number; + /** ICON */ + icon?: string; + /** 排序 */ + sort?: number; + /** 路由名称 */ + routeName?: string; + /** 路由路径 */ + routePath?: string; + /** 组件路径 */ + component?: string; + /** 跳转路由路径 */ + redirect?: string; + /** 菜单 */ + type?: MenuTypeEnum; + /** 权限标识 */ + perm?: string; + /** 【菜单】是否开启页面缓存 */ + keepAlive?: number; + /** 【目录】只有一个子路由是否始终显示 */ + alwaysShow?: number; + /** 参数 */ + params?: KeyValue[]; +} + +interface KeyValue { + key: string; + value: string; +} + +/** RouteVO,路由对象 */ +export interface RouteVO { + /** 子路由列表 */ + children: RouteVO[]; + /** 组件路径 */ + component?: string; + /** 路由属性 */ + meta?: Meta; + /** 路由名称 */ + name?: string; + /** 路由路径 */ + path?: string; + /** 跳转链接 */ + redirect?: string; +} + +/** Meta,路由属性 */ +export interface Meta { + /** 【目录】只有一个子路由是否始终显示 */ + alwaysShow?: boolean; + /** 是否隐藏(true-是 false-否) */ + hidden?: boolean; + /** ICON */ + icon?: string; + /** 【菜单】是否开启页面缓存 */ + keepAlive?: boolean; + /** 路由title */ + title?: string; +} diff --git a/src/api/message.ts b/src/api/message.ts new file mode 100644 index 0000000..6b30962 --- /dev/null +++ b/src/api/message.ts @@ -0,0 +1,57 @@ +import request from "@/utils/request"; + +const MESSAGE_BASE_URL = "/api/v1/message"; + +class MessageAPI { + static getPage(queryParams: MessagePageQuery) { + return request>({ + url: `${MESSAGE_BASE_URL}/page`, + method: "get", + params: queryParams, + }); + } + static getLatest(userId: number) { + return request({ + url: `${MESSAGE_BASE_URL}/${userId}/latest`, + method: "get", + }); + } + static setByIds(ids: string, state: number) { + return request({ + url: `${MESSAGE_BASE_URL}/${ids}`, + method: "put", + params: { state: state }, + }); + } + + static save(data: WebMessage) { + return request({ + url: `${MESSAGE_BASE_URL}/save`, + method: "put", + data: data, + }); + } +} + +export default MessageAPI; + +export interface MessagePageQuery extends PageQuery { + userId?: number; + type: number; +} + +export interface WebMessage { + msgId?: number; + + userId?: number; + + title?: string; + content?: string; + + state?: number; + type?: number; + + sendTime?: number; + readTime?: number; + deleteTime?: number; +} diff --git a/src/api/notice.ts b/src/api/notice.ts new file mode 100644 index 0000000..8ad9be6 --- /dev/null +++ b/src/api/notice.ts @@ -0,0 +1,48 @@ +import request from "@/utils/request"; + +const NOTICE_BASE_URL = "/api/v1/notice"; + +class NoticeAPI { + static getPage(queryParams: NoticePageQuery) { + return request>({ + url: `${NOTICE_BASE_URL}/page`, + method: "get", + params: queryParams, + }); + } + + static save(data: WebNotice) { + return request({ + url: `${NOTICE_BASE_URL}/save`, + method: "put", + data: data, + }); + } + + static setByIds(ids: string, state: number) { + return request({ + url: `${NOTICE_BASE_URL}/${ids}`, + method: "put", + params: { state: state }, + }); + } +} + +export default NoticeAPI; + +export interface NoticePageQuery extends PageQuery { + state?: number; +} + +export interface WebNotice { + noticeId?: number; + + title?: string; + content?: string; + + state?: number; + noticeType?: number; + + releaseTime?: number; + shieldTime?: number; +} diff --git a/src/api/order.ts b/src/api/order.ts new file mode 100644 index 0000000..65482e4 --- /dev/null +++ b/src/api/order.ts @@ -0,0 +1,37 @@ +import request from "@/utils/request"; + +const ORDER_BASE_URL = "/api/v1/order"; + +class OrderAPI { + static listPage(query: OrderPageQuery) { + return request>({ + url: `${ORDER_BASE_URL}/page`, + method: "get", + params: query, + }); + } +} + +export default OrderAPI; + +export interface OrderPageVO { + orderId: number; + userId: number; + userName: string; + nickName?: string; + money: number; + orderNumber: string; + payway: string; + state: number; + paytime: number; + endtime?: number; + remark?: string; +} + +export interface OrderPageQuery extends PageQuery { + userId?: number; + state?: number; + payway?: string; + /** 添加时间 */ + paytime?: [number, number]; +} diff --git a/src/api/role.ts b/src/api/role.ts new file mode 100644 index 0000000..e33a502 --- /dev/null +++ b/src/api/role.ts @@ -0,0 +1,139 @@ +import request from "@/utils/request"; + +const ROLE_BASE_URL = "/api/v1/roles"; + +class RoleAPI { + /** 获取角色分页数据 */ + static getPage(queryParams?: RolePageQuery) { + return request>({ + url: `${ROLE_BASE_URL}/page`, + method: "get", + params: queryParams, + }); + } + + /** 获取角色下拉数据源 */ + static getOptions() { + return request({ + url: `${ROLE_BASE_URL}/options`, + method: "get", + }); + } + + /** + * 获取角色的菜单ID集合 + * + * @param roleId 角色ID + * @returns 角色的菜单ID集合 + */ + static getRoleMenuIds(roleId: number) { + return request({ + url: `${ROLE_BASE_URL}/${roleId}/menuIds`, + method: "get", + }); + } + + /** + * 分配菜单权限 + * + * @param roleId 角色ID + * @param data 菜单ID集合 + */ + static updateRoleMenus(roleId: number, data: number[]) { + return request({ + url: `${ROLE_BASE_URL}/${roleId}/menus`, + method: "put", + data: data, + }); + } + + /** + * 获取角色表单数据 + * + * @param id 角色ID + * @returns 角色表单数据 + */ + static getFormData(id: number) { + return request({ + url: `${ROLE_BASE_URL}/${id}/form`, + method: "get", + }); + } + + /** 添加角色 */ + static add(data: RoleForm) { + return request({ + url: `${ROLE_BASE_URL}`, + method: "post", + data: data, + }); + } + + /** + * 更新角色 + * + * @param id 角色ID + * @param data 角色表单数据 + */ + static update(id: number, data: RoleForm) { + return request({ + url: `${ROLE_BASE_URL}/${id}`, + method: "put", + data: data, + }); + } + + /** + * 批量删除角色,多个以英文逗号(,)分割 + * + * @param ids 角色ID字符串,多个以英文逗号(,)分割 + */ + static deleteByIds(ids: string) { + return request({ + url: `${ROLE_BASE_URL}/${ids}`, + method: "delete", + }); + } +} + +export default RoleAPI; + +/** 角色分页查询参数 */ +export interface RolePageQuery extends PageQuery { + /** 搜索关键字 */ + keywords?: string; +} + +/** 角色分页对象 */ +export interface RolePageVO { + /** 角色编码 */ + code?: string; + /** 角色ID */ + id?: number; + /** 角色名称 */ + name?: string; + /** 排序 */ + sort?: number; + /** 角色状态 */ + status?: number; + /** 创建时间 */ + createTime?: Date; + /** 修改时间 */ + updateTime?: Date; +} + +/** 角色表单对象 */ +export interface RoleForm { + /** 角色ID */ + id?: number; + /** 角色编码 */ + code: string; + /** 数据权限 */ + dataScope?: number; + /** 角色名称 */ + name: string; + /** 排序 */ + sort?: number; + /** 角色状态(1-正常;0-停用) */ + status?: number; +} diff --git a/src/api/software.ts b/src/api/software.ts new file mode 100644 index 0000000..688cc03 --- /dev/null +++ b/src/api/software.ts @@ -0,0 +1,130 @@ +import request from "@/utils/request"; + +const SOFTWARE_BASE_URL = "/api/v1/software"; + +class SoftwareAPI { + static listSoftware() { + return request({ + url: `${SOFTWARE_BASE_URL}/list`, + method: "get", + }); + } + + static listFont() { + return request({ + url: `${SOFTWARE_BASE_URL}/listFont`, + method: "get", + }); + } + + static getVersion(id: number, os: number) { + return request({ + url: `${SOFTWARE_BASE_URL}/lastVersion/${id}/${os}`, + method: "get", + }); + } + + static page(query: VersionPageQuery) { + return request>({ + url: `${SOFTWARE_BASE_URL}/page`, + method: "get", + params: query, + }); + } + + static update(data: FullVersion) { + return request({ + url: `${SOFTWARE_BASE_URL}/update`, + method: "put", + data: data, + }); + } + + static maxVersion(swId: number, innerId: number) { + return request({ + url: `${SOFTWARE_BASE_URL}/maxVersion`, + method: "get", + params: { softwareId: swId, innerId: innerId }, + }); + } + + static swDownload(swId: number, os: number) { + return request({ + url: `${SOFTWARE_BASE_URL}/swDownload`, + method: "put", + params: { softwareId: swId, os: os }, + }); + } + + static setByIds(ids: string, state: number) { + return request({ + url: `${SOFTWARE_BASE_URL}/${ids}`, + method: "put", + params: { state: state }, + }); + } +} + +export default SoftwareAPI; + +/** 软件信息 */ +export interface SoftwareInfo { + /** 软件ID */ + softwareId: number; + /** 软件名称 */ + name: string; + /** 适用系统 */ + os: number; +} + +/** 版本信息 */ +export interface VersionInfo { + softwareId: number; + os: number; + version: string; + installPath: string; + releaseDate: number; + packageSize: number; + describe?: string; + pictures?: string[]; +} + +/** 音色库信息 */ +export interface FontInfo { + fontsId: number; + name: string; + path: string; + size: number; + describe?: string; +} + +export interface VersionPageQuery extends PageQuery { + softwareId?: number; + innerId?: number; + incompatible?: number; +} + +export interface FullVersion { + versionId?: number; + softwareId?: number; + innerId?: number; + versionMajor?: number; + versionMinor?: number; + versionModify?: number; + versionBuild?: number; + incompatible?: number; + installSize?: number; + installPath?: string; + releaseTime?: number; + describeText?: string; + accessNum?: number; + downloadNum?: number; + isDeleted?: number; +} + +export interface VersionNum { + major: number; + minor: number; + modify: number; + build: number; +} diff --git a/src/api/statistics.ts b/src/api/statistics.ts new file mode 100644 index 0000000..a428d83 --- /dev/null +++ b/src/api/statistics.ts @@ -0,0 +1,48 @@ +import request from "@/utils/request"; + +const STATISTICS_BASE_URL = "/api/v1/statistics"; + +class StatisticsAPI { + static page(query: StatisticsPageQuery) { + return request>({ + url: `${STATISTICS_BASE_URL}/page`, + method: "get", + params: query, + }); + } +} + +export default StatisticsAPI; + +export interface StatisticsBO { + statisticsId?: number; + statisticsDate?: number; //统计日期 + login?: string; //登录次数 + loginUsersum?: string; //登录人数 + register?: string; //注册人数 + mofangAccess?: string; //软件使用次数 + downloadNum?: string; //软件下载次数 + accompanyUse?: string; //风格使用次数 + accompanyConsume?: string; //风格消费额 + recharge?: string; //音符充值 + consume?: string; //音符消费 +} + +export interface StatisticsVO { + statisticsId?: number; + statisticsDate?: number; //统计日期 + login?: number[]; //登录次数 + loginUsersum?: number[]; //登录人数 + register?: number[]; //注册人数 + mofangAccess?: number[]; //软件使用次数 + downloadNum?: number[]; //软件下载次数 + accompanyUse?: number[]; //风格使用次数 + accompanyConsume?: number[]; //风格消费总额 + recharge?: number[]; //音符充值 + consume?: number[]; //音符消费 +} + +export interface StatisticsPageQuery extends PageQuery { + /** 时间范围 */ + range?: [number, number]; +} diff --git a/src/api/style.ts b/src/api/style.ts new file mode 100644 index 0000000..5285514 --- /dev/null +++ b/src/api/style.ts @@ -0,0 +1,68 @@ +import request from "@/utils/request"; + +const STYLE_BASE_URL = "/api/v1/style"; + +class StyleAPI { + static statistic() { + return request({ + url: `${STYLE_BASE_URL}/statistic`, + method: "get", + }); + } + + static page(query: StylePageQuery) { + return request>({ + url: `${STYLE_BASE_URL}/page`, + method: "get", + params: query, + }); + } + + static update(data: StyleUpdate) { + return request({ + url: `${STYLE_BASE_URL}/update`, + method: "put", + data: data, + }); + } +} + +export default StyleAPI; + +export interface StyleStatistic { + ts0: number; + ts1: number; + ts2: number; + ts3: number; + temp: number; +} + +export interface StyleVO { + accompanyId: number; + + cost: number; //使用价格 + score: number; //评分 + state: number; //状态 + name: string; //风格名称 + description?: string; //风格描述 + author: number; //作者ID + authorName?: string; //作者昵称 + timesignature: number; //节拍(0:4/4;1:3/4;2:2/4;3:6/8) + tempo: number; //速度 + changeTime: number; //编辑时间 + scoreTime: number; //评分时间 + useCount: number; //使用次数 + sellCount: number; //购买次数 +} + +export interface StylePageQuery extends PageQuery { + author?: number; + ts?: number; + state?: number; +} + +export interface StyleUpdate { + accompanyId?: number; + cost?: number; //使用价格 + state?: number; //状态 +} diff --git a/src/api/user.ts b/src/api/user.ts new file mode 100644 index 0000000..93af898 --- /dev/null +++ b/src/api/user.ts @@ -0,0 +1,612 @@ +import request from "@/utils/request"; +import { SendCodeData } from "./auth"; + +const USER_BASE_URL = "/api/v1/users"; + +class UserAPI { + /** + * 获取当前登录用户信息 + * + * @returns 登录用户昵称、头像信息,包括角色和权限 + */ + static getInfo() { + return request({ + url: `${USER_BASE_URL}/me`, + method: "get", + }); + } + + /** + * 获取用户分页列表 + * + * @param queryParams 查询参数 + */ + static getPage(queryParams: UserPageQuery) { + return request>({ + url: `${USER_BASE_URL}/page`, + method: "get", + params: queryParams, + }); + } + + /** + * 获取用户表单详情 + * + * @param userId 用户ID + * @returns 用户表单详情 + */ + static getFormData(userId: number) { + return request({ + url: `${USER_BASE_URL}/${userId}/form`, + method: "get", + }); + } + + /** + * 添加用户 + * + * @param data 用户表单数据 + */ + static add(data: UserForm) { + return request({ + url: `${USER_BASE_URL}`, + method: "post", + data: data, + }); + } + + /** + * 修改用户 + * + * @param id 用户ID + * @param data 用户表单数据 + */ + static update(id: number, data: UserForm) { + return request({ + url: `${USER_BASE_URL}/${id}`, + method: "put", + data: data, + }); + } + + // /** + // * 修改用户密码 + // * + // * @param id 用户ID + // * @param password 新密码 + // */ + // static resetPassword(id: number, password: string) { + // return request({ + // url: `${USER_BASE_URL}/${id}/password/reset`, + // method: "put", + // params: { password: password }, + // }); + // } + + /** + * 批量删除用户,多个以英文逗号(,)分割 + * + * @param ids 用户ID字符串,多个以英文逗号(,)分割 + */ + static deleteByIds(ids: string) { + return request({ + url: `${USER_BASE_URL}/${ids}`, + method: "delete", + }); + } + + /** + * 批量修改用户状态,多个以英文逗号(,)分割 + * + * @param ids 用户ID字符串,多个以英文逗号(,)分割 + */ + static setStateByIds(ids: string, state: number) { + return request({ + url: `${USER_BASE_URL}/${ids}/${state}`, + method: "patch", + }); + } + + /** 下载用户导入模板 */ + static downloadTemplate() { + return request({ + url: `${USER_BASE_URL}/template`, + method: "get", + responseType: "arraybuffer", + }); + } + + /** + * 导出用户 + * + * @param queryParams 查询参数 + */ + static export(queryParams: UserPageQuery) { + return request({ + url: `${USER_BASE_URL}/export`, + method: "get", + params: queryParams, + responseType: "arraybuffer", + }); + } + + /** + * 导入用户 + * + * @param deptId 部门ID + * @param file 导入文件 + */ + static import(deptId: number, file: File) { + const formData = new FormData(); + formData.append("file", file); + return request({ + url: `${USER_BASE_URL}/import`, + method: "post", + params: { deptId: deptId }, + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); + } + + /** 获取个人中心用户信息 */ + static getProfile() { + return request({ + url: `${USER_BASE_URL}/profile`, + method: "get", + }); + } + + /** 修改个人中心用户信息 */ + static updateProfile(data: UserProfileForm) { + return request({ + url: `${USER_BASE_URL}/profile`, + method: "put", + data: data, + }); + } + + /** 修改个人中心用户密码 */ + static changePassword(data: PasswordChangeForm) { + return request({ + url: `${USER_BASE_URL}/password`, + method: "put", + data: data, + }); + } + + /** + * 发送手机/邮箱验证码 + * + * @param contact 联系方式 手机号/邮箱 + */ + static sendBindCode(data: SendCodeData) { + const formData = new FormData(); + formData.append("contact", data.contact); + formData.append("captchaKey", data.captchaKey); + formData.append("captchaCode", data.captchaCode); + + return request({ + url: `${USER_BASE_URL}/sendBindCode`, + method: "post", + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); + } + + /** 绑定个人中心用户手机 */ + static bindMobile(data: MobileBindingForm) { + return request({ + url: `${USER_BASE_URL}/mobile`, + method: "put", + data: data, + }); + } + + /** 绑定个人中心用户邮箱 */ + static bindEmail(data: EmailBindingForm) { + return request({ + url: `${USER_BASE_URL}/email`, + method: "put", + data: data, + }); + } + + /** 获取账户信息 */ + static getAccountInfo() { + return request({ + url: `${USER_BASE_URL}/account`, + method: "get", + }); + } + + /** + * 修改用户昵称 + * + * @param id 用户ID + * @param nickname 用户昵称 + */ + static updateNickname(id: number, nickname: string) { + return request({ + url: `${USER_BASE_URL}/${id}/nickname`, + method: "patch", + params: { nickname: nickname }, + }); + } + + /** + * 修改用户手机 + * + * @param id 用户ID + * @param phone 用户手机号 + */ + static updatePhone(id: number, phone: string) { + return request({ + url: `${USER_BASE_URL}/${id}/phone`, + method: "patch", + params: { phone: phone }, + }); + } + + /** 修改个人中心用户密码 */ + static resetPassword(data: ResetPasswordForm) { + return request({ + url: `${USER_BASE_URL}/resetPassword`, + method: "post", + data: data, + }); + } + + /** 获取用户实名认证信息 */ + static getRealNameInfo() { + return request({ + url: `${USER_BASE_URL}/realname`, + method: "get", + }); + } + + /** 更新用户实名认证信息 */ + static updateRealNameInfo(data: RealNameInfo) { + return request({ + url: `${USER_BASE_URL}/realname`, + method: "put", + data: data, + }); + } + + static getRealNamePage(queryParams: PageQuery) { + return request>({ + url: `${USER_BASE_URL}/realname/page`, + method: "get", + params: queryParams, + }); + } + + static verifyRealName(userId: number, reason: string) { + return request({ + url: `${USER_BASE_URL}/${userId}/realname`, + method: "post", + params: { reason: reason }, + }); + } + + static beingVIP(vipType: number) { + return request({ + url: `${USER_BASE_URL}/vip`, + method: "post", + params: { vipType: vipType }, + }); + } + + static buyNotes(payType: string, amount: string) { + return request({ + url: `${USER_BASE_URL}/buyNotes`, + method: "post", + params: { payType: payType, amount: amount }, + }); + } + + static checkOrder(order: string) { + return request({ + url: `${USER_BASE_URL}/checkOrder`, + method: "get", + params: { order: order }, + }); + } + + static draw(data: DrawForm) { + return request({ + url: `${USER_BASE_URL}/draw`, + method: "post", + data: data, + }); + } + + static drawPage(queryParams: PageQuery) { + return request>({ + url: `${USER_BASE_URL}/draw/page`, + method: "get", + params: queryParams, + }); + } + + static verifyDraw(orderId: number, reason: string) { + return request({ + url: `${USER_BASE_URL}/draw`, + method: "put", + params: { orderId: orderId, reason: reason }, + }); + } +} + +export default UserAPI; + +/** 登录用户信息 */ +export interface UserInfo { + /** 用户ID */ + userId?: number; + + /** 用户名 */ + username?: string; + + /** 昵称 */ + nickname?: string; + + /** 头像URL */ + avatar?: string; + + /** 角色 */ + roles: string[]; + + /** 权限 */ + perms: string[]; +} + +/** + * 用户分页查询对象 + */ +export interface UserPageQuery extends PageQuery { + /** 搜索关键字 */ + keywords?: string; + + /** 用户状态 */ + status?: number; + + /** 部门ID */ + // deptId?: number; + + /** 注册时间 */ + regTime?: [number, number]; +} + +/** 用户分页对象 */ +export interface UserPageVO { + /** 用户头像URL */ + avatar?: string; + /** 创建时间 */ + regTime?: number; + /** 部门名称 */ + // deptName?: string; + /** 用户邮箱 */ + email?: string; + /** 性别 */ + genderLabel?: string; + /** 用户ID */ + id?: number; + /** 手机号 */ + mobile?: string; + /** 用户昵称 */ + nickname?: string; + /** 角色名称,多个使用英文逗号(,)分割 */ + // roleNames?: string; + /** 用户状态(1:启用;0:禁用) */ + status?: number; + /** 用户名 */ + username?: string; + + name?: string; + isName?: number; + isPhone?: number; + loginTime?: number; + loginNum?: number; + deleteTime?: number; + vipTime?: number; + integral?: number; + authority?: number; +} + +/** 用户表单类型 */ +export interface UserForm { + /** 用户头像 */ + avatar?: string; + /** 部门ID */ + // deptId?: number; + /** 邮箱 */ + email?: string; + /** 性别 */ + gender?: number; + /** 用户ID */ + id?: number; + /** 手机号 */ + mobile?: string; + /** 昵称 */ + nickname?: string; + /** 角色ID集合 */ + roleIds?: number[]; + /** 用户状态(1:正常;0:禁用) */ + status?: number; + /** 用户名 */ + username?: string; +} + +/** 个人中心用户信息 */ +export interface UserProfileVO { + /** 用户ID */ + id?: number; + + /** 用户名 */ + username?: string; + + /** 昵称 */ + nickname?: string; + + /** 头像URL */ + avatar?: string; + + /** 性别 */ + gender?: number; + + /** 手机号 */ + mobile?: string; + + /** 邮箱 */ + email?: string; + + // /** 部门名称 */ + // deptName?: string; + + /** 角色名称,多个使用英文逗号(,)分割 */ + roleNames?: string; + + /** 创建时间 */ + createTime?: Date; +} + +/** 个人中心用户信息表单 */ +export interface UserProfileForm { + /** 用户ID */ + id?: number; + + /** 用户名 */ + username?: string; + + /** 昵称 */ + nickname?: string; + + /** 头像URL */ + avatar?: string; + + /** 性别 */ + gender?: number; + + /** 手机号 */ + mobile?: string; + + /** 邮箱 */ + email?: string; +} + +/** 修改密码表单 */ +export interface PasswordChangeForm { + /** 原密码 */ + oldPassword?: string; + /** 新密码 */ + newPassword?: string; + /** 确认新密码 */ + confirmPassword?: string; +} + +/** 重置密码表单 */ +export interface ResetPasswordForm { + /** 用户ID */ + userId?: number; + /** 用户名 */ + username?: string; + /** 手机或邮箱 */ + contact?: string; + /** 验证码 */ + verifyCode?: string; + /** 密码 */ + password?: string; +} + +/** 修改手机表单 */ +export interface MobileBindingForm { + /** 手机号 */ + mobile?: string; + /** 验证码 */ + code?: string; +} + +/** 修改邮箱表单 */ +export interface EmailBindingForm { + /** 邮箱 */ + email?: string; + /** 验证码 */ + code?: string; +} + +/** 账户信息 */ +export interface AccountInfo { + /** 用户ID */ + userId?: number; + /** 账户状态(0:注销;1:锁定;2:已激活;3:未激活;4:在线;5:旧版用户) */ + state?: number; + + /** 真实名称 */ + name?: string; + /** 是否实名认证(1:是;2:不是;3:正在认证) */ + isName?: number; + + /** 手机号 */ + phone?: string; + /** 是否手机认证(1:是;2:不是) */ + isPhone?: number; + + /** 邮箱 */ + email?: string; + /** 邮箱激活时间 */ + // activateTime?: number; + + /** 唱作音符数 */ + integral?: number; + + /** VIP过期时间(-1:终身, -2: 已过期, 0: 非会员) */ + vipTime?: number; + /** VIP状态 */ + // vipState?: number; + + /** 注册时间 */ + regTime?: number; +} + +export interface RealNameInfo { + /** 用户ID */ + userId?: number; + + /** 真实名称 */ + name?: string; + isName?: number; + + identityType?: number; //证件类型 + identityCard?: string; //证件号 + identityPic?: string; //证件照片 + address?: string; //联系地址 +} + +export interface RealNameInfoPageQuery extends PageQuery { + isName?: number; +} + +export interface DrawForm { + amount: number; + cardNum: string; + bankName: string; + cardName?: string; +} + +export interface DrawPageVO { + orderId: number; + userId: number; + userName: string; + money: string; + bankName: string; + cardNum: string; + cardName?: string; + takeTime: number; + makeTime?: number; + state: number; +} diff --git a/src/assets/icons/alipay-l.svg b/src/assets/icons/alipay-l.svg new file mode 100644 index 0000000..fa2515a --- /dev/null +++ b/src/assets/icons/alipay-l.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/alipay-s.svg b/src/assets/icons/alipay-s.svg new file mode 100644 index 0000000..433f98d --- /dev/null +++ b/src/assets/icons/alipay-s.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/api.svg b/src/assets/icons/api.svg new file mode 100644 index 0000000..0181bdd --- /dev/null +++ b/src/assets/icons/api.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/backtop.svg b/src/assets/icons/backtop.svg new file mode 100644 index 0000000..f8e6aa0 --- /dev/null +++ b/src/assets/icons/backtop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/captcha.svg b/src/assets/icons/captcha.svg new file mode 100644 index 0000000..8b1da30 --- /dev/null +++ b/src/assets/icons/captcha.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/cascader.svg b/src/assets/icons/cascader.svg new file mode 100644 index 0000000..57209bf --- /dev/null +++ b/src/assets/icons/cascader.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/client.svg b/src/assets/icons/client.svg new file mode 100644 index 0000000..7373b3d --- /dev/null +++ b/src/assets/icons/client.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close.svg b/src/assets/icons/close.svg new file mode 100644 index 0000000..e99c978 --- /dev/null +++ b/src/assets/icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close_all.svg b/src/assets/icons/close_all.svg new file mode 100644 index 0000000..2005198 --- /dev/null +++ b/src/assets/icons/close_all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close_left.svg b/src/assets/icons/close_left.svg new file mode 100644 index 0000000..fc5cf71 --- /dev/null +++ b/src/assets/icons/close_left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close_other.svg b/src/assets/icons/close_other.svg new file mode 100644 index 0000000..27ffc32 --- /dev/null +++ b/src/assets/icons/close_other.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/close_right.svg b/src/assets/icons/close_right.svg new file mode 100644 index 0000000..b96dc1c --- /dev/null +++ b/src/assets/icons/close_right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/code.svg b/src/assets/icons/code.svg new file mode 100644 index 0000000..d8b546c --- /dev/null +++ b/src/assets/icons/code.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/collapse.svg b/src/assets/icons/collapse.svg new file mode 100644 index 0000000..1507568 --- /dev/null +++ b/src/assets/icons/collapse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dict.svg b/src/assets/icons/dict.svg new file mode 100644 index 0000000..db60220 --- /dev/null +++ b/src/assets/icons/dict.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/document.svg b/src/assets/icons/document.svg new file mode 100644 index 0000000..aaa0574 --- /dev/null +++ b/src/assets/icons/document.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/download.svg b/src/assets/icons/download.svg new file mode 100644 index 0000000..a8077dc --- /dev/null +++ b/src/assets/icons/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/file.svg b/src/assets/icons/file.svg new file mode 100644 index 0000000..fac9bf0 --- /dev/null +++ b/src/assets/icons/file.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/finish-black.svg b/src/assets/icons/finish-black.svg new file mode 100644 index 0000000..53e6fe4 --- /dev/null +++ b/src/assets/icons/finish-black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/finish-white.svg b/src/assets/icons/finish-white.svg new file mode 100644 index 0000000..f9f87f0 --- /dev/null +++ b/src/assets/icons/finish-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fullscreen-exit.svg b/src/assets/icons/fullscreen-exit.svg new file mode 100644 index 0000000..2452f2b --- /dev/null +++ b/src/assets/icons/fullscreen-exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fullscreen.svg b/src/assets/icons/fullscreen.svg new file mode 100644 index 0000000..4b6ee11 --- /dev/null +++ b/src/assets/icons/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/github.svg b/src/assets/icons/github.svg new file mode 100644 index 0000000..1adfa4e --- /dev/null +++ b/src/assets/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/homepage.svg b/src/assets/icons/homepage.svg new file mode 100644 index 0000000..1e1feab --- /dev/null +++ b/src/assets/icons/homepage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/ip.svg b/src/assets/icons/ip.svg new file mode 100644 index 0000000..087f3bb --- /dev/null +++ b/src/assets/icons/ip.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/java.svg b/src/assets/icons/java.svg new file mode 100644 index 0000000..eaa93db --- /dev/null +++ b/src/assets/icons/java.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/language.svg b/src/assets/icons/language.svg new file mode 100644 index 0000000..e754062 --- /dev/null +++ b/src/assets/icons/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/menu.svg b/src/assets/icons/menu.svg new file mode 100644 index 0000000..f5875d3 --- /dev/null +++ b/src/assets/icons/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/message.svg b/src/assets/icons/message.svg new file mode 100644 index 0000000..deacdc3 --- /dev/null +++ b/src/assets/icons/message.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/monitor.svg b/src/assets/icons/monitor.svg new file mode 100644 index 0000000..f153b9c --- /dev/null +++ b/src/assets/icons/monitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/project.svg b/src/assets/icons/project.svg new file mode 100644 index 0000000..eaf6a12 --- /dev/null +++ b/src/assets/icons/project.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/pv.svg b/src/assets/icons/pv.svg new file mode 100644 index 0000000..cd7da06 --- /dev/null +++ b/src/assets/icons/pv.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/qrcode-black.svg b/src/assets/icons/qrcode-black.svg new file mode 100644 index 0000000..0bcd90e --- /dev/null +++ b/src/assets/icons/qrcode-black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qrcode-white.svg b/src/assets/icons/qrcode-white.svg new file mode 100644 index 0000000..d73dcb0 --- /dev/null +++ b/src/assets/icons/qrcode-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/refresh.svg b/src/assets/icons/refresh.svg new file mode 100644 index 0000000..e598ed1 --- /dev/null +++ b/src/assets/icons/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/role.svg b/src/assets/icons/role.svg new file mode 100644 index 0000000..5d25278 --- /dev/null +++ b/src/assets/icons/role.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/scan-black.svg b/src/assets/icons/scan-black.svg new file mode 100644 index 0000000..339a285 --- /dev/null +++ b/src/assets/icons/scan-black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/scan-white.svg b/src/assets/icons/scan-white.svg new file mode 100644 index 0000000..6fb00c0 --- /dev/null +++ b/src/assets/icons/scan-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/setting.svg b/src/assets/icons/setting.svg new file mode 100644 index 0000000..fbc4945 --- /dev/null +++ b/src/assets/icons/setting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/size.svg b/src/assets/icons/size.svg new file mode 100644 index 0000000..f92f852 --- /dev/null +++ b/src/assets/icons/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/system.svg b/src/assets/icons/system.svg new file mode 100644 index 0000000..2e6045b --- /dev/null +++ b/src/assets/icons/system.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/table.svg b/src/assets/icons/table.svg new file mode 100644 index 0000000..1a16abb --- /dev/null +++ b/src/assets/icons/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/todo.svg b/src/assets/icons/todo.svg new file mode 100644 index 0000000..f48e667 --- /dev/null +++ b/src/assets/icons/todo.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/tree.svg b/src/assets/icons/tree.svg new file mode 100644 index 0000000..51aea8f --- /dev/null +++ b/src/assets/icons/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/typescript.svg b/src/assets/icons/typescript.svg new file mode 100644 index 0000000..781d6f8 --- /dev/null +++ b/src/assets/icons/typescript.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/unipay.svg b/src/assets/icons/unipay.svg new file mode 100644 index 0000000..431a227 --- /dev/null +++ b/src/assets/icons/unipay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/user.svg b/src/assets/icons/user.svg new file mode 100644 index 0000000..8e693ec --- /dev/null +++ b/src/assets/icons/user.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/uv.svg b/src/assets/icons/uv.svg new file mode 100644 index 0000000..c5be7eb --- /dev/null +++ b/src/assets/icons/uv.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/vue.svg b/src/assets/icons/vue.svg new file mode 100644 index 0000000..456f876 --- /dev/null +++ b/src/assets/icons/vue.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/wxpay-l.svg b/src/assets/icons/wxpay-l.svg new file mode 100644 index 0000000..be425bd --- /dev/null +++ b/src/assets/icons/wxpay-l.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/wxpay-s.svg b/src/assets/icons/wxpay-s.svg new file mode 100644 index 0000000..c54b63d --- /dev/null +++ b/src/assets/icons/wxpay-s.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/xml.svg b/src/assets/icons/xml.svg new file mode 100644 index 0000000..f041213 --- /dev/null +++ b/src/assets/icons/xml.svg @@ -0,0 +1 @@ + diff --git a/src/assets/images/401.gif b/src/assets/images/401.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c930e72a698889a0f5666d8599652c5808cfc70 GIT binary patch literal 162867 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 z zR(SY({o-0zcRV1A?)duM9cUn~;AD4wrVX`yIdBL*S2e|^hD zQv8;sM#}57>|#!1sy-SIALld(Z=sEl-@-gIK5ub+*!=6Zn>fbRS)oXZH#jHfn<+7= z)pi=Jwh}IIE@P>ws6|xgQMgXQ-HB$0#hK{ z=O-QSnf7$NNmwSvMgzID$4!X&DowJ8MSA*_BG_>C;Cra8dVg!b4oa83M1^$D-?Vo#Tv6&TZobJXEP$bGx$fe8$clV3AL$u_GlLYz3!>i} zV)E(wt+v(*Tx3Hy^85;latiVSo@}L|64Zin{MZlZOB-|!Hc1H)Op0JAjsQbe+oNlo z&rKf+1{VSLn37H^o{+1m*-z_5Fhc#}{%RMtcSJ?5nBw4a7f&^C!&WSw{}zEP2dw_$ zEiAa+v@bNUdNb{SpZTh2+>ULdHnX%Tl3r60@B@<5be*BO$xju|LR;peJq-4b6Bn61n3^RBMdJgZr~eH2sH# zh~+A|<(D4-BahH>)!ZugO!sOO-YJ~GRNn9%cP8iTXnj$N`JprfcswTqwC0~h%vLZB zJ8?V_A^6E*|H|Z)iKtI&_y<{*+}YRX>T-&6iGbYsQrJU2{M@o)L^=R4VeymMnl@5E zWG5Hq2d({w(koV&vwYq(Efa9gK(t})v+02mN_OW!@wngI$^6 z`nv;kO$q}0T$H$GM?0rtiJJtJNI6h3d`6nAk@3LufV;rRYEb+czv3w?CD2G({)9x9 zi#UUP{WPiMe$~8N*Ss6F?w(imZ`r4e=S5gxWmkZZs37gi76*K0uqT{a27yTMZR>J^ zp0s1Jhx~o*WF7~;Oo&X_J=G3W(t#gZGn3>=Uk6p=fxlo_CgPQ9C*ABpfK>f=sDmVU z?eHK_cA6P^Pq3L&ALk%XZ#GGBFAPQh*1|vBY*h?3J@*Ec^{m$`(dP05xB#Zh@ zLH9JjeUyWK$|Mny<=xHLLEo1r9klCID%_u=EUauz8NW=o%atBP=mKnH%aV0cdfq+^ z)yA#zs@+_os34!_OqMfhwOc4%lAzxi%$WbYftE4H9I_{q`#ju&P^0Y9iv+Gp`zBc|f);kJ&Hnk2 z!t?5($ZNCz8&TW{%hoFU_Cyfo$!Q?DhxN7-B(qRQp{#sD!|p>76akv=?}o?4iwJla zzbAW^a9#3~LQ+1YXBCF#*rXN|l{*U{a;;0ROTGYv;%#tjL;LfjXxkvij{XQpja}Wq zn3RB*YY@59_>5>%cPlDwcF_&`89Oz-w8=J~(9xp?C%MKR>TEgCMoXzfpBYz%K z+v!O-&BK;hUCRww{I3wAmK%G_T|Us0-EAj|7fl#?8SZz7kE2C%$O zmj+%DkEFKbnOuTv!0N1C7pjRixlAw>KOX)6#V@DS`foule~!rM`+#lAaogr3fW#(7_UI zR2j3Hhllj`EA!sJbMgD_iW0+r*8LzizcXcA5zj>lrh9jcm!}YK zC=@7pqx3cwh{+8LlmjykpZIt&@`KEXIcITZ(7o7%j*x-izKj5V#ttQ4fvIV57|&P% zIFiMrfHg!CCe`W3i<2~u5Tlv#fk;*YD>xo`w0ESIWCPoKdU2s#VncrSrFfaOjFq_O zsEb9iS6PK?F!R3&%E_-g8ZzH%C>yM&K3fA`-k|hT%Y`|_m1D!kcC9+z`p*&v5b8Ht zDrCbqHt%MH7+Dt5MOh?yL&CWg6hbY12KoxpvY5~e*)Cg4d4)zk1>Ep@kDFj~1N+=- z+#{$6s$cTi2B{|~w3p1_tie!%ArAnE%B{k`Ek{)sU)>;r+#;!%+@*X-GUKzv!vr#k zeqLiskK|KdJ!(*Wn<)&!g5tuyLEU$KP-Q5hv2Us%=ap@KCioP^YgPb~Vu9|&pJTlBB-iC7W$!}7SUH@ z`|Ql?ve>pb`|a+&_-n@>H=X_t1IfX&DyUWJuqV`amPOy9K+561Q#{YYcN=|Rq3Fm}4g-VQutPYqOai+ueAp36Wpz`Kqz@!ZufIi{FbQp~+7+oR}3_ z(GR`Av&;yNA8de56RJK`2Y=9e^R?ojGvysHxQ~eFH*uqcLP;$b8}hyVbTJ11eJWB| zsp>7iHW);RzVEvUIFEK5hHR0ljIJf)olEwfvNR78tlU-wO=>*8G8b<&-VG<6=UEsO zUbw^g=)O0bDjpPr!|$#lfRSWS>1U#LI{Q#}6^ue3?{xeByV*+)Ws`{504^tQ8pu9Nf1`t!bWoLyg>a`tr8Dl z#>wAUx!l3^urE4TayFY&b6Y8CZ^5D$MNFw$0QLA-A%yeC91^j9$bGW@SS}NDq8pzf zN|$3%Bp+AFY=iHVRG56smU($Yy-=O1!x2*QD3|5Es^<76D!8y2#2?B9Hq;e)CoH=r z_5e9-*LaYK*~yb|Fd24;22$8R=Sh9-*QVsHO8sxizyCOE(yycBy5#r&YxV{IfkD?L zAEvcIy%*e>#(o?)bc2(e-Ov~Lzg6IRXl4M2{}0B#!ma7PZ+ja9wgF>wN_P$vNpXad zA_^iPNSB0^v^YlhK)SoTOB|gdV1S4+Qc6lnKzZkNUHAPw_w&Z_{tdt5IKSubtPg?p z|NIZNN5r7xDujPX=+m3<7dq5lkHg}z3LaEZcO5946EZSIJnYOJ zsM52FigR4@bnd~PPWIRrO%xjnBfqilTDf1iY$(vO;&YGA@0Oc65H z`Szo{IAY{o@61;jz3I@7h1F|ApO-h*w)vi8SH2%`>%EB|JN|Jng!7L%J15ugY&ECF zJ>BIRkh9;prHG+qGWM^ZKqy8+DD+uRD3_ZVeqB5}JS8tGv0>4;JdiAREz-0US!@qz zzrUYZ)mJDG+H2c?p1u<=IT~P@7d8-!7#M+fTEJ zA(vDXAvwqx8DKrP;bXcg{w6xbx0@t`bY*H)b3rDSS!nCykCrO52uq9VT$}UO*H?wg z&RSg#4{&>(kziQQLkfQQ0Eqa*2)n4=PCw{qJ)^{IH>gYeSYfVp3(ElrKH5#_jUL)3 zmGx8KocSyh4?Oc%*k66;8sBsNOZ=k-QYrB4&27;0%XTIFC3K(}ZT=iuGmVF>Cg9CN zUd2A_3ufF4x9|`)nG6Z%);?XdLg(QYBNapp%_(>i&AFljkLs2n($hXFaa^-%M7|`O zZ6Kgn3C@a4B4aNLtF(kK48F!X!ULyQ_@o>vIxfST6wQ;4NquymcrDc+Om;9$NZo;t z(Y_{cEyGlDpD(MVnaL*IbJKM(z-LXCJ=6HisL#!6Td*w3FiPTEJ~yLWK_O-i3M&*+ zudvVaG(HO>PSb%3veAl6@`vTp_mvcz zI4jUzvwpxrl{~U5DG~d0s2KN1y^X_)!=00c%nvmh8t_QH&r*SPWQ2O;f_&Vp%4BpX z9zU)OP^3}$!7V0l;Xw)GxT7+8I^EmQs2z{JMx*z%_iC)#jQf$dk=a$x5x;d-+nG#q z>=W5r{B2URVO75t`|dT0p3HmB#0CL;YBApPj7t;%5Cnj8Yh~oX;sCz2g1ArI0Gu=< zU>vCoihL@F8U+W44gy>_UDlQak>@g(l(wa)pWk8%QE0pipl)`hu<*na%A=Oh0gLj_P5E((XYWy5=s^<@H3K&X143JBLX@>3|?d;5&9a;RqcFiiih_l93YO($eFzTWT0 zLhuWJn({=mKqx7Br2-r}-mOS6ocp5r?8mp-%ik9#yM#bJc^-gN9S36GLqoLlKn%k; z61lw~L`)u-KaGZnhr^k6JPR;G|-JZ*?%j_$VzWx!*9H2C(AeQQ=m&A;j4N?-Lt3CE=3jLYsmH4`ZSEnOFK&2 zgqob?{ z-tA7Q2545u66s7^x9(#Hbh$#0Kr@8+p>kc)R$pT_}zyQj3>HPI!I%ZdI?4$Djip7#_j@ zQG3Y$yQF^w03(3>Uu>V_Uu?f>u>%a2Z3Dl>v^Jm?k$uc(Fy~jyNf{MkBu=!JK z7(+$vi!>s;2Tl~td~1)7J|`AqTWJc=dELuwQD9AF@%|DWB;ZK-kWlT8jB*!;`-YLh z!O=;{ddT}W1kiq&lA9-tq;km2&MzxBR-^DJ$*HK1ij6PMs%vO}CWdHs_fPNWwHG4~ zMTfifjTwqlb$f=ljlWmv8VbUF_^ezQl}Y(-epzTHdTwQ7mE`TWtj#^Xf!T$K{S&dc z{ZNy%07acUVGSUVFMwQEuou|mG?;X_r}AA2t6S5-n~TyUr7 z_NAEcPiV1bB8Ommz(@@5P|`JzJJ-@<&2&s@gmdPJ_De;=l!tQqT0r~I~ST5V1GgzzAgO#Uw)4%i~ zHt>#13*}6c=>Xdm8E-AJ&eEoRf;LNnHxe=A5F0z)$E&1VeYkq@lMY6kclYu(NR|!? zLfS9XG=+F``BuF2wqNQ(Y)sEIKD`-8OiXpM`nEJ)t}Ei~>{lYj|3-hf(om8A9U_0N40LT%Bkhwv0A9ApMccB*4*m4p=Qc4R(yAOmnvoU}C4dfBjuf*D zDu5w#_V7^1NBdq&?)eB%^bHR6!gzTOq-xmB;Wki$dJczmP~@$VV6ff<&;}}RTn}>ab&WRP%LTJ#(2xX1D!04S<`D@Hi-2lVc-uOM8}8pbeZqW};=0Rp6ewB4 zN|u4FE9M7_M0BLkYOD2vDtmWWiT1Q2`=dmhZb!h$3ij`EvfDui5C)R&wLsk%VP0YW zUI`AinR`E&B*-K^YPqeQkZ<`>pm2EIp-v280OMB9*n6G83qT}xy z0w`o&SzTTB?%ZePkdY!0sZpQdpQL~+F!{#zE}l<}{+u$~4H}0&eF*C1|%Q6*(+o|e!j#)93$&rBq`gL;l1vt$8nGY&-(LX*b z)q)OC3T)So-$Ah+hY#@Cp#8eI+FqWXgS>9on-k^$q1QyQ=LhFHFAjeh=f(vsFLI?F zUr3`jN0j`2KkE4iVhjPViwE8CSvcDaRfND6gZKgTB%=SH(vA`qPeFl_*;=d%lribq z!{nhUDiDC&%0)ovqzWxFAb<;50Lh=dN-I_$z~^Mi^;z=;!>EfbqnpL_G(^-r@ zt_=RE6Mpl35H`jhafNiio#sJ4%^^vik8qq-Ru8rqx#HwGq z)nduVF&st%YSQ%Xq<%c6eD!<7`JeU^dD9-Jn4ApW1i0I0^I+I_^)*Ver^7O{EV%eT zRT@%L5!HgTX)BSMx*6sPzlm%S1|tG>TD3)4m}Tcrc+<3u0cWs-%vBZ3=nd% zk*daxI~!ch;15`Xm;LOyt9doKJJ>?{6+zOEL!~RZ6C`~j*?&v=|AXznr|#G0RCp@$ z>e)2bb**bf%27a^+whO|TL%1}55ma*co3W%x?Jb~k$*(Ak>qMT2LhH{a0nLXD3?1a zaCqx4)*sSuu1R41j3<^TE~7d6mxpl+d#CSFZ6$7rYGAJ2^GjiIJ8yYkxC=Tm%F6TM zJ!a>9e4qYn?!C8G==JP4v`8S&ZqrDfcOPknRBYm>#(-F#oxwW4i`EC^3VL|cy~ zk}?nr?;YtQ8GcbcI_W{)S=Ei3nw9F08v6A0I_ACWtHg!18zfXo*qU!UJRMuq6f?VP z4NFbU#~0!Q$=j!|3J>l+z8Z8wjvD3?rNK;T!l3{tjesU>qT3Ub?{YTMD><7Isim zy7YzIzL!U{pUhz%d`~}*D3~|zgd?=Ex^58$NJMgmE9{l_h6|2|b46Z_5m@l2D!_9^ zm!GzB#R3GlXdhpT!YxDiCg{0fD#vZg*sB~G9AURp@~mMD$dTUIJJWkBko(hnh4Byg zB9&7_MG%D)SG@##lg(>5O5hXeBfT#jO6u0&&K>2LM7JE&D)iZ0Bq-6hyPh{zi9}90 zAu!IOAfG-)a3F{0fI*<(o-R@#I*dMb9Ud!`Se_mCTj@*b4b907{z8{1iXx(njF{r0 zij3i65n3b~0%gRG+g}SAWd?QhV$fAQvmabv64)SR(3@UA;jl ztk#_zzs<6s{64!yAw>9gvyJJ9GwUG6UDRY#41{hs?_wExxq_(|WBuCkSrX{ZN?W5RMW$*S@&kj}8Q^X@hxXmZT-*Y(rgAjUvZ!&oT|dVx zx(Vw|O*%gmZF3>)Y9++*qh?;KWaNQEUN_Na}263?Sk`qkyCV z7!-(Twz>)+;axQhjEvSrFIF7Hg7AUYbb5h)FC*GuGq!;$3qk}6=?OjOUh5IM&& zw17s-i)_ZSh6vC;tt(SsCO-lCw8n*%4~= zmaB~KlU70;lM?vV$M@nQK$B3gnY~SH41l)1! zE6oDp*4CYU3gwv3bVGn1A!iBl2Qhf|Ud9`5_^$WFu2f)=Z!oU#2p`2FH}LmLrU&u+AWeG#{` z29ahCWkMDYkkuhi{lP7FucLQG6e1coAv^cbgwQEOp=bdWM_{6Fgr#KWW1hwg-WL#fQK!#k(XUZzNQ6$A2RC(aY9 zvJR}2Yb;TJdA#C~f4RAT={jVD6wiNBei4T*k{+3Bv9gR7P5;b%D)c}QL(BE{a+w9; zME9$VYiFyD%0gP`?^pY1i;=dEbId9s3A&C5`9YZ`+xxb_w`y0o4GEa;{5&k&R$Tp= z5w$lWG$Qe(N)(*T+S@59D_bNb%?6X1Q(VF*k@_?vp|mDk+|w<-wmFQ1JjOMSlDy@$ zs{~bkBQ-@eZp5&@-w)$EI`s&Qe%>`bt2!Qz>Hf5!*c%b|0ly{`_2whl@V6Z076yu;eUH=cp^A|Vf9j!?;`O?gF5zG2^`{l#=^DIHCvFcG4{JsJOQ>%B>sZbr3~N>!Pit7&{U{}9@yyM-|+kv1_12{+ONTkIPZOVC}OS~crmlbNsCl{y3-Z$l&Zbl z!|!)6qwDvUHc|`t*9^!$&txM4iBUd2Fz!Cl%~j40ICbIC2Pj|mA5yI>e$#xxGcVoi z52CinyQC!JTh~CR*V$qG;c-At_Q3}N{h|K4Ws8&$@~J$^%jZ4=Ko+hvP&i+VJr_)* z2G2!F-H^8wJ@yO9O-7v*!A&n=jQboXdOExuuTaOh?1R!p@g&M-)U8nJmEbv(giH)= z5^v2%aEClNqzreo91 z*PKV+9_u=5O_j2K*KC+Bi;A5oA;(D#)|ykm$7c;iBPZ_bVG2g*Dnvn_#9maLd<{7H zezJh}7a|04$k8V(M64XRMRgd*bwEsXj|4F4p$K}28-bQxLh7;o41dgkw!CB#=x}Z; zEv(G*-89G>_JR@z)L5*5X|a`v5G#BO6#G!bi*lzSu6Jwri3ngnF-zxQC*Y#y1Tg-3 zF<^m6dw1|t84=6l;JwMnIxHe}|$J@-g-u!@GfznwICL;@ruJVeX|mes~+Xn#EK04odGq~A1Y zNkn(C_8`+W?$D?<{;R+?{_IbI?cci2x^^ic#iIk_Ys?-uS-X64s0C)D32Mz;1ExN^ zYq18%I?z}8cewxm2KP_8z}#b8Q(ymHb*@Ma0=mg?#TQ9VBP5(~e^#9}%~Xf1>UA|# zsYv_&tUBM=-p_w2!e&WOc=%Z$SoN8cxEX@NBZySL??Q>dL`8cjlRtVu?W!A-oN`kc z;biRsPfE?pR}x3~+qh8W7E~6bm)KHM!>gLARWjY{3E}=|WSfUePg(J0RdhBcdu>a4VdLHQz7qI-a$?`XPi~Tol+ClV z`A@;5$c1cEqGY-x>7tz1#HaKboy42D{gK5&V)pJ-+%ih_tX?aFyHW}_4+BEk}0vyBEl|f7!<)>7qLVs7B$I6M$MDfixJN- z=N6?MPg|x{tUy@3xLF`!O(tK1wn~s@jSP9#Bnbm~_!MGdjmOpenUt66@D2s^Ro23A3t4!@!I^WNyz0Wu=Q zB<-KP{N-9|LRg+ zY8oujr6(Ep3r0^9!eH)RT;St(bn#> zuZwxtdR6}7eg=`f3Hc~7&3Npa{4&-v>>n&{Dc{fF6E07Em((Yr@5 z0Ga}VyrK4%kxTEKv9)g??R36L^S@^*DIr+bRTs`d`e3FDa~x*UBiF*MlUV4@dGblubmPCaFyE> zV8uEviz49Xl#UBE=Q~{|JLkJNQt^wueuk$P`@{UT7YF0gyB9wu)x>`tzTa{oxCRK6 z{~^h&7-(wjZcg9kVD#(Y^}5}&U{Lg>jvRblD;97n3f}wu{l_Dv7azdel&|+lB6628 z-(Cr=#CiXE8GIRc+#yL@_vG_u!`(SG;)4hAV2UDRaAh4z^_C7??A;aO$~~nDs4gkD z$Sl+Y+e4O-7b@1Dw_^}N#Hjox%vzlj=P3|MWLzC$2U+}nT|jAT3QH`bKi9}gOH6FI z=XFJ2i8i0Kzk*i+rY1r|>5ErgaF!rGJG1PmfP`cr9^VUe_u<%#m?h#HL=Y(kSmDCF zZ(o_;#aM!|0FnO z<%*uJ27|3cV(U4NfSMpi=W$(p(SP;D>SBsT>@>!V=MGZZ##g;zV!mE@BFTapb z2l4x^TDH%^;^MUe5Y{@jROHz7jH`)BchP^+mR#a59X#@jD&tCW%*v}8{KUbvb!1e* zja}wQDxa8FeUHWAQBEHA{o@G%txw!L-n^F+rx^C`{V;#6`O_RVq2TL38}@m1lc#xd zad~U21m9D?e?UTY*h4mUvhtl{#Nn`(h0FU0Pgi8?WcG@*g8sUrz@)ZnWdGy!G3!D0 z!I+<{2R}~hQ*S3M5)_!MXNgv?lR2be0nm3vK_2ldlT{9p%E891NAwv=E4w#&|>nPDk#li zQRA4qzmgkQ3$|dB&OPfl7q`)K5nDmBBln*L@s+?v=`dq@mPGK+?ut};bwPi*@JO4>d7|DbIp2iz(*^9a}oO( zjV6Cv{%zYmv-Q~8G{z2bnQg_e#x$AAFnp``8P%tmna`q^_d>62zMFZi!e+4hYpQB0 z7eWLYj`io)w#&PuJ}J+`lM{=b4hM^H_+UJ#-KWf9w6zwdsucD zRbm>5gkO0$%v($o!A*9h1hpI?cI>qb5tQ3!qmVte=Y}bXVN{}TqVBYK zTP4Y9w-d!m4My0o>VL)YM&6Cuvq|ns^5vr-BagI|q^NO#ynNd0otqV=i(AgTz9egr zEwJqynu#vCZI>??5-A{Pg>kdbrZz+ohEs$z1=YqLSZx#!)0OuE1!#5O6%A4BQI;R2 zYetnhmW5Za0qsG6QjruyB`4JUnWK1Zg@mJdCpGnAi9^}w!#Y2O3bmRHw6S{a6V(VO zw(;I#r%UEQvC1tW4b3z4W~_`qDe>eQ6|N~1ttBi-#8FoxGT5y(TALYhE>?LEM=f4g zmGrqEc-mWp6Iw68i_;v68MwlT7~YGaDRNz10aT@~d(@jX4Z8wlc9ZoYOsO;bLu7NE zBg5mYSl8~1HZ6DrR^Oy|AdDQ*5JdcP{9xk#z40G!QKX`WldArNy?J7Qxg;Ba&@O)S zfNd{j%p0(00MzXiz`b##HOE2kzV7sdLY=DmNBMZL&EZzLXuzB_Euaw!smiwa=#fkC zMfKmI37y89)5pbTcFO2aO&DXJH_DVbBr_<|i(3n~ahi@&xa#5sR=e&eqC#k@c&+RiY48Ss2> z|K?QS$1I;?n3&*<2Z0o>kRh*jYR(osau_j@dqsFmX;|#2ic!rk03>k zqo7nDZo)r`+Y23D~%1cs501Mr+Jump339 zg^%eaR13MfpQO~X4mMPeYFz+{|G148PJ>ZCcwY*IK3(_UOR)eijDPrMI zCqi|LML8AyZw22SR6+>>u$`sV?^wDg5&&K33uNR=(32R6B%WOW7R`8ikcuO>{ST{@ zjbI-Q0|>j}gw?fwTcuAJ!9+@N!EeZ?{;^8aFcPc@1gq4{12M$A`RUYJ%^*$?@cQ#h^erTn#RGzPVjUD6W9LZj_b{B2oDhsu^`W$* zrhHBaMv930I%K;SlvfmGdSoM_DjH&|o>A8}w#N`sl!2{O$sK*qOhQ}8%KFD_n$h9C zkHqD7`AE@Kl~|GR zc2#>xzWQ_)i@B_$0^o3j{IdZ)!5$0Ud@!I!-Y4msT83O^$&*t=nZ6N8^4z``orC@( zsZL9q!VeGb)%PVP-D-TwVf=sw#3p&>^)aOF3r9zFCT!QhBp~vqRHg{Bu_tS7M~Zyr zeZFc;G3TH=+0@c-10T!%7^X~H&hvFIv7bh&8*HsSF%!ItO%9V44=(ek^Q7#%C#N1=h~>yq9XQ{R$Z z#Wu5uU!3`t6{&z_du_O+MnNDR9$dKqlw5b9cy?Phq=JaY98fX_Knhj$B)c+KFb+r2 z*94U@I$R;{8l9lNYd2(uKryfQf|`JHP}vp8R5s$j}l zfb@O+_mGqrGR^j90_Q{RX=Pf%P}&gr@UB!7`Q4K9iTlp4%V`01B13aU0J6O(OL6+k zs9qO(QpZfKo-p2kWZeBZM+v^hn*mD(Nzv}@QT}Zp& z9^v|?pf)advi%P(*TInJ?s>Mly7b$^iMTP3Bw?o-Ee~ij1VXOcOsW1d@2DGO9)rO> zYOG@f+FS~tM}<<)b^(E1i+gg_Q&d+ao;bMPVrDy*KT=th}B^abL^q*Nff!&RWmMz?m z0A)a0v|<}&=8r1@B_+~qA)t}FVy_VIqkmt}!9?y}`)tH`*$7-B3u>F3@u2LUd_%S` zU9w@7k2_mVH5)jOGq`vSNu^!u-v5L#AFsB&8{<)~nwQ5yb>F|L>Dz3zQJ5tU=U zArx~9*5itZ3P4h(mV?g~EI+z4152g!BQQ^WvJa5n{ zGlt(*MbqiJ1w7N^f_0>IipTB52r*iH$3r?L&thT~a8}<|+Ccp9@i;@hLJm?v@C{5{ zT!;dY{%Pxgs?ZcRE~bcwUqj<#d;MR-3s*LV?hu9-esoy#%72no?SMzs7p4h5YE}O% zMeQXcx%9oIPwmqc^W-XS9JANR*yFQ$nk zMma&<2qLH(D=M^Zv`p9Y{@ko8Msm9+B&ySEL6-lh8{La;>F0{9R)6v<%n&T3^_!RK z7CH#SFHWwmXGVnxj*0aYM^O4lm5(RO_U74Rs-c+$G4jrSvKIU| zp-*vd*T08=`%XI6B6 zPcKsjnLxjeWR?}WIIYbawq}#KgfDqb8*A!{JW}q2TrJX0Lg>Q^d}tUH!-SoWFPaf0 zefcoIc}VZkFr>K7 zbx5vh2c49meHms0Jc7=cc2%WV=Ih%)8_VB|sQ^zX2P!{;+~e8vitidPS;f!Q7mg*^$LU6om3oqyu16Lz zJslij4Gk{yEg?or-Y?BnJ9glI8F4*hB^x6*r(PsP%V7zmV8lJhZ{!4whsDw7l^4B^ zfQ2=u+VA{YMC*rgmW12-qTGes7BFMOfQ^oKqVB5|mA##wP4dI- zu^nzw` z?UuzBt`I)RS4xc<5p3N)7()(;G zo%il2QSWJrrs|z)#=91W<1*`4xEAlnJZgaia_^ijW7Widt|UEl`MH{ASM&4#0Lo(J zK;qddKNy6yZf}c%W3p{2i^W`;41~>=1vM_`;qYnvh%UIBmZCJ>$W3?vQ=5tlZeLLV zf4yTdP;%A?`HB*ClY-xZlB#DZRqY;IzhXSe9xux+vX1MSYj7-Zure#cdDu7MAHF8Yv9+NLf9ZW`)pU zl+?l@4~O%*AnG7$P>&y$2oKj6s3rM|$M8eY|8(>=b(7Dx|lD+!DOA z9hYHsGO~g@_}Gb;AV%qL1N5^JFmLOgB|+50{)en=@m|BXFqiz(7g(CjjHs;@GeEc62*-4n$ zm9_Jq$hZIvLXBIQmCF3ppYG6(HFnslUgm)W6=}~O>7s?PXTMB?o(kgg#zou$e0#<3 zr8*n7+W+ltra3v>Q_hZxJTM~CoCKw(=|yQA^)g8z##+aYB0M=eM>sWDJ2We|q$J<0 zsI)4%+`O{7;W-jv<7AiE*y-rn>fGMd`xpriz!vw7-f%5wqwW}+mPJxUct3eJCxxEC zP5OOa68aE1yu8l;CdzAYV^^F6v+cdOw~TzfMs|EMxAk({`bTSZN~_f*Bud!Jm69iv zm|{Ht5V6$cPW#rd%O1tv8OHKxb*o6Cs39R)^D=`rOfqjYxf9s|hQ8C2%6O~r(Ru(` z*qq(iVdF`vZ=mHtok(|s_lNPT;@cD`T)C!lNTBXbiRlg39$c07D(CY&+A2Y{z`68n zDGTK}d7GI)_h?t(z4q$$j(QI|@kg&5Ii4SlRX9&{hWuD+h?d$H#HG7Sd0n(cUl~kF zR@wmy8rxcAdYI_^FnVOqlBg9e|E4!?^9n;pozBwPv-nvZ+vPgF&n?vR@ksSOQF5Pn zA^k`_$?iT7$+uBoiML8Xm811(e+VL<#lLt%YMtk#2692MzVfaEX%?(}a(E|f#ynR! zDd4nCXg+TNbmOq_kn z;Uh1zAS2x#?8Auo$P_?0j9UsAM9=uSSe9QwETd)cX}vMxfj*cxDL|xh*o_)MKK2*g z$Zd=|b9zYB^~A}d#Oyq2n+VkdEN?O&%9|G|6*g21n|S_-B#GO2&nAr|&LJbSfKwTm zX>~A5n(eBCDGhtH<_n7o^b11Wqo0j5qkFE?$R7#Nw$+ThE`m2HI8jIQMMB3xfTGc< z!}~B&>(Qt(7qBa=*pU@q#>I-U*c2R0ZwCWN(v&wD-o4tK0X8dcZpO!bF@9NdU(Nt6 zSiQtsN!_$WT*i)|{;byMs1eO@*__QomeL$(&Qc~abao~R?Y)2BC9f-v<(**W4uJ&E zW88L(-zrO?YD+^pRl796doJ+H-mS2T40j=l*S+iV+iVcRoIn7u@5f&B(S&7PB3-K_ zuHx%0k%_L;{m*qB&OX`)BLbyW2csf?(745BJZzkYT^9g^047N%0FyB_P-2sL)yUw) zt*coe+ULrhS`gD-fLi>9Clsu0(g$P}%2o#6^N^K_6yd?SK}|}tn)v5>=Se}PedW#U z29r*Xro?Ck@U#|z;IbDq4uOSpgrT<@O+y-u9!EKa?$#|`j z6jdwZGg=iJpf!4raoYl5ob)mYqmIh=SeCsLSU0=a#Uz$}S9RZ=C>OjPxl7ny4c>AF z?8uSlN*<{n2Z}#RC)472q#}78JkhuFbLV!lrJR`1Q7UYv|-%7FZhp=`(T6mR1ijv8{si zHCG$Di(ZI)DVlUtG>8wo0FgNrWsIr=3#)#DK0^Q~N8f~MPU4qPX+#@6;}ImD^Wdkt zLA)Izp^eN}$eh|_+1cX4?!IKDyThS6{C$#G{rzVKBjlh<2XKnSG=`PxVcqRlMpML( z0xYSsPTQ|)QV}_H6+*wx%CMx|i$~KcvD{!#8=sQEMraptF^mw<_#grM4;n`SqEp6; z=8z8UH~rvVIsI8zcGWA8UOJTdE3C9cMnRxqeDWWy*^KEwAee$ch>!j!1d{*>fo@sE z@;@p?M5GdP{EB6Jzd{yOc$_*R&^^l@L*;wzA(;S=7J(3pr3IaT7iGKt$L{Ne#MS9G zL}>pZ#N1EF?>-2Cg9(J#<_W^jARsUHo~c6&A8?%3lQU^V#0x}~<4vUB2tJ_#;3^5eWRl4@#{pdR0t z9SQopx+Odrm$SVu;7FA+c5oV!aQyt|>CW-sPb-GPue^81Nm5k8G_sZ5$tlG+jRmjqJg+$0t8oGpXMG;9yC7ihc-S`4WxBE==kYUFp&nfmsCEz zYCDk+ir!I`ZOXl$8Rn|k9Qn<(s{DGR6kXJ_wsgSldOu*bB1y>E1jp zFZX4y%9nPXwm^fl9IXVRpRv1NN#EOXl#DF33$JkQj0*kQVYg4hHoxM!q!P$r_l&ij za+Wsb>P;X^g!{MYD^d*izNj5;SMoW1t1$xjxO_1+xoIYPBYJn6G}dlW@zyn1`|?aX zidYdEbN1n0E(_3Q#S99dk07~xq0AGZ6bP$8qhMS4y_jIC0$21irfJK^9E?%A7U4!Q z>wV#(A?izTasxMx=fX=rEMrzt>V*>Yvp!bhd^-_g;H$r}h4HG1VFh%w~V<5w< z+kiMnk9aaVH9@^&#sTgZ|-oPO28 zDnIOC9rK3ASgkxQ3l>q464Oy(*kH`X%Te{XU?Y{32Pq(&`nw~lvH+pATGPuMa2GHn3P?;|S4)TC>p~`hPMIM9FDh5DFQ(qQ|q=sm{lr>`R~50-@VgEf6Rxpc(=k_kT7a zCID!f5*3eq2J~pHlYVOeMm0`J-t=$7Mbc3Dyw)L;@M$1XU{hWGJ(n%MkfNotw{p{o z#r1O4(>~|>sJ*A6z&c8x&ZnhlCP;QWs7{ghtNU!s>b7-R4)3nfX}3Q|??b2p{eWI% z2kXe)pK?qc51ITofYQ6cpt0K6o`B)_$Dk8c)l0F{8N2w}Q$@qO#oraoZ`N(-=f(40 zsI=+q?SD_jEB37E<)cA|{ts8e(DLXTPa(j7)ag-_VxTCN{Fe&Lc_8miT75kFcLpB1 zHzQ7wf(s7TG$$ibzYaee3lT0eZ-GI;)S&TDVMP9GHucQbY;>ptQ9i{b?`ufTo$$lN zMF`Tc_evrv)HpbQR@eTYjTXxpW`VyqTK?Yh62C$ksYg`s!DLm1y*^tr=H6#IsvdfA zKCkLKIwoMyd(@EJ+-ty;_^J*aCuk|C9UAHGHqaidschppOa zZ>b{YUH_C|P_u6Bx*Eu6HE?2I#@qEKoyzSU9t$-iLghUi872vNLAY{B5D}1YN*85n zOON2#I6Dcd2)*azgk39T-$dJ}7X%SO$d}R~r=YA{mBi1pw4yFG!K=2u1uX%8`6Mc( z_4O0u&Mq={+>otAaZvN{LE5cf}p3EOW=A_ z%vC6R1WD!7QVJ8HCZLQ)X3XWt4Pdc1p19xe z1w>kNs%4PnVR;n1^~FSPMkNJqSf9$mr;(B#dBL{1~i#WqA(Vh%xr|XS1bHl(+STs541e;+}KWgCk z{jz!1w(@(+yw}$E)>c*|s?igG#8rL_)C9CYA;)edt><935tBIx@v`kWG^*PGu;-F6 zowE0>i`Uu#4JW=B<9>}slDp7>=g;?;sO%nzb1>Wu20VZMjna zMOz6X!jJK5GfqF=$b75%F`@8pWmomHB?|b>@0%%3f(2homeKBn0}K@)o{i`{%*KGg z!A_`A1+c4B8`!>@Xyi(&b12CErW5*;g20|c8;Jlpcz(v~26&bbO$-5P3!fjAQ=Z?r zh0i~D9{Q!S+c_K*_H^z#vtO-oJ6%k0hAf?r*~aOW*H6xW{#y2UQ}KM^tBc~mcfH4tLw6nu1%`rHgM}{U7S0rj_Z|vedT)QEzX|^Fumv76 zk5@Je{gL(SZk{Y;((@xS%R2yFHDzR7>9y#Lv?N?ujY{~{bJ7d->BYAJXe{3_@f~E?Ig}WjK;NrL3Z=(fMYbSx`t*r#bSLvq5WDpB55c>Xg?%=2Gj| zK0YPaJ&g18n*Jmf&^r=8htD1g^PpJ#<`4dYqwH8;Cy7cJ-Q6Ww4mVgk`gZU2530KT zu|a3*k|6w2b>~$zdS%;_3c7+5q_Ju+nev0Ch^IN=Se8`NBx_>pVGHgXml+D}!ZzJ8 zB9ZMpq*wXGLm98knLNO*v}QM5FgcMn@v_EWMm1!lhZo$>nK+<&E;ojoilk1wZ`vF& z|F*h{Pa9W3CsJPjwmXC3bJE0|sU?%LzZTi|40E}SoI3`3;wDmg;InL-R4sf@KkRCK z;yvV2ht8f{;6*FxvQm=iw!b84_!3Lpf$eR#;;-o=g&N*Q=J`W*)5Ut9BVLU~Ie%{O zo^(+TQrx2J|LrrsRT-q;v1e>xT3+3<@~;!Ava8)X(TI* zHIKB=lLEPB9MN)*x7ZIc8ky@O14}8*L|5oXq_-#uJt(K|-QcWz!nKi`@>`ay$dB=? zw4gAp!lue|E~@f=?fn5^LEKIrKyW|@ga$UTe!ks^`k-lfS;?dO2-Ko&*qPJv$w!N; zt!Unty=^7xKA@>3YDxITSOM-kPby5^x#Rm<=L5k0=D%1ZnBgJ>KuV5uWP!b{Tm>Fg z)bBuuWfY15R909K%H1ek37nrMdHH}+*nBVjl}u~{jBLx%ok#SWFs{x#z{!=3X@Puj z5J;$jvR%8JzcryuY22G8%uszetu6ii|IH%r0Vya`ktEwucW}T{Oe|o8(Y)*Evs}OS zGoV`~{>M9#t}3VLTckT7_&YQ?!Am5U)gd4S7H!mmwC?X(pr3rg&o`=9^HJYGEGX|w zcp=$X7)a?`bQ?n@r4xEp9>-?;+40c7aoJP=EkEqj#J0Eg7(nT|A&+=bykB$~qW~Xc z5L94zd%oq*@b0qnoTlS4%a5{!C5tcGbar=(DskYb;)~n(jrPf3sO|5-|sozcyB~( z%A2Sp2|s zs9I&C7HOFIfc6bv`E}bn7Dgtima0g$kNSNkqhzouS&JvtVr*+20a|)r7e~jY#ed_G#1(atu4SM zRHE%&ZLkudK_?^$r!+95lp{3g+)2pcrVptpEuxcC^kaRj{ajOXaz)ayndaGfrDc*C zc3EXLgxZLw8KSl&nIt$cvGvu9*pNPU*nCihF8qrIjMSdJ;It&0@ij9`uS6={_y8V>u-bE%3Hq*}!#i)2Er)kI1p+==!-(L#fk z*fmPLz8?H9!rn5j>HZBH-o_ZP;Wio(mF^S}1jGr5D2RYaNtbjg9izLuH@dsa(Fh2L zh?I1fNC<+;GcT|I^^g1c-1pnx`|t5P&*MBINjZNk9c*C6>^easoLzeZY;!&c!H3rt z)1_CvDw))vXac3FA6W@jcU7bjUO4%V)OU=Hq!v)_Yn7?)iO0V%n_+DKcxLqVg8E>x zBMy2^O41dW(97aaY?ix0Z}LD{OYxiFJHebGJ|1hfnt%aw>d>dHtIsBQ;?} zmFZoDiZN4>W36eKR3-)n!X*2BlX<^VuTW^ZH_HK=j;l5~j){QbAf4pp;MWaKT{s?t$gZk3C?Q6=M}+)>oS+ zXG|Kye#zT3Bmt}Py~x{JNvC)tYKf;jwh|Yw4be)e(7K<+vx`qX?o-X8khvo zH^FB+`%Mn6`2uwa{u-V)R|LwsYPlI0?BmI}RdIb!j4}o~Df@wdfu}dndp8MR{n+pH zNMgLzL7*x50K}54elO4df5pz5rYIl*VE6DNgvB1+W}|Kc z09dChAHTQgkMsiweeiNdK#3!TfzJ31{0&;)_f{JOyx+aFN{4G&6u-83N(CLhYd5dX zkyXCpNDAl2w-$oCJzHPc_Jem-3vTppYewl2e$nvL zldC?}z9HVx6@S02z2g~BGO?vJs&db3@t4U~trCCN(LIhB$-4K+oj((nu7w0{q@Oaj zbWEP2rJBE_SDl}q_hok-o_^LzrZ+N>I zkh8CbLoiqFIX%Mthdfsv%WanU%hU*AK~p|kq8BXzrU!YIshxls`jGen-`ED~j2)6& zOhe(a4?Z3{3vJ1PP(!42+rl4Xo#jiz(r^id>d$p9kU8gxYEyc!s>Hz8lZlnyRu7+; zdz2{a=)TJ5J8-A59((BJzh+ZMW4oy4Ux*QJ9JG=S2N|t z@SXeFsuJf}Tlc}5cHV0r4)@ZlV4!IEHp;!#P*wBHtU*Gtg@P#XcKtZuOCGEJ z<%HBwu)tu(U7J)&Oxi?hLUufIdz~$ekLyu-l%tMkss)Q6kR}i*bkWN`u`nYu6g{N}( z_RenYm>lX;c_%S@*+Cbn=+a5!1z{?QoUwVu6q+Lzti=aviI$3TzK?)~WSuM&M!i9hHH zw^{A=t1fo=6n&sm&pa+k4w*B2pc5ZHT`HkEBKPdH33YtW_Y-lHRikJ!4+iLYzW_-V z%J#-JhPSu>Gl+s0>Ngy4Q-+b`cgCpR4w^zJ0difv@T$1=^X2%IDv+z7yfD(3Xn?VI zyuXtZyYwepI;7_xssG=j;@_b6?@=+G4lgNXm1+9p%|gX?;_PK_42&DEqUZd62P>ak zVeIcUVkNsvA5rof^hjfZlTJed-W@dQJdUvTUHA=pSLqd0V2G!9E3SzQ*jbGnAsiAL zhms-n#fwbg@fn%C8p%ef@W8BstVFDFZhm1!hya;mZe@M2OuAE4OhdbahD(cWM~|sM zi9=oQ(6gqXD7)eDd;P&_vo)AamEXzaEHNm(961^VNBeCag#I_lIgw%J=56_T!1J+j+ zE`ubsxLF^>^Q690*t9Vm)_`-)w7FS+mT{L1kCmPHqObgd4>2vlMQM0fS~0W}Q(S5= zp(ht2)#UPV5}fm;h5BMJ zWqMA|?Gv^0Yq2o>-f(@9Z-P^nCQ{UFD`REMA99Db#A*)|p~6g1RoUDDSl_D&?+S_6 zp47cNN% zOY9AxZJe83=qnY}vH|3L^3s89yM+XVBxWI9Ui4wKp`NU1At4^D?z92nZ18@@Amg#3 z91_lX`3S;=li1v-pef=!2Z0gB)foAbQ-e53D$ErV-s8;~AOLlT1cbVQV-eK0C0Sx2 z(sX+k>nZ=1$U`p*b3N6F-T=p~DJQ~UP69Avi?==uDBx5|!|DRU_qHBot6aAT!Dw8i zqshsb*kZ*N^rWum6*h%ZAu#g1K+8sOEm@`?%(&oEg44hl#g*6}p4hdh3sFD_fCFe+!pRj$qM2h_3JZLj`ZseD;=irBUP#TLVVNSv)ed#<|J;Y~P3IDTys_(I?w!MdUmq2&FuU!N-0 zR1W-ThcOV*zd_HM_J@27Dlk&ngq?JnL;+9O%klWp!KMJ5NxZb`q))n9X+7wQx*-R4 zMub(Agk&f*BkkXT`mX;6=nemw^!^QcrT=qniJ|ltV~Pz{)pA@6`VD&5=^_SuALm4h zmEzl`c3au%CH7YoY+Dze5v-7^Ni3eVd7Iixj!El~-N6?a+6cnYD&&aU!7;JQf@I;U zI?-`y>Aa3)#yTz;xp~Y9HrV`0bF z(}wP3Ip`R=eO$4!(o{8G62663{na;Ud`t?2@s!h&%xywyVQiK2?Jhrm5$Zg6@~*Q; zj6~WqvJxQ?aplgwU~?c{d2H{a;)vy2v%~gaE6 za5?i?FE<7bEX$^D5u^E4TTS_3UIPXY;0nVcHh?;gfRU1IeVoZEx7@WWycCIAz6P|G zUeYI_XVo{koi#NX_3%1sMd^;2GYVLGOgj-Bdxw*SU9~Hgg++G!IqOvor7czxBG2Z~ zSdn>-^;DbdBoC4wmpp>TdnELeq?;>YarU+ij4zc9GwVAZ@?P`cl;+koGX5Bj+Ob3gw3LT!DW6#T^sR|*{C#5I4VL*synOgk0b zvsoBi^=CR<6=KR!0o5a6;K>DII8t^fVtM9pn0wQo(XkLxHs=re5LEJ&78>*7Ws}N) zWImApAr{wYe#jFz%5KXO1d_YdIi!62$*nXoXR@uX=>D@sI>Ml8R&E51NMrLn&YF?MrBZ#{ue*MAFBJ~X%MgY# zTS_3Df?HbQ1s>BEyK`_KkNpg~QIEz!0)E>g-Z8y4O4($(X2e*q`&~q*zJx5{lXz_} z*h;!~2lP$2yA<^Ey|5o7i?tUWB(odoQf=k1h|P)f|DRmRVCHtn>Qfz$LA_QJk$Wzk zCEh37AAYiJqJEulD^dk~08!$!j;IH2IuK#7FYUvmKmV& z%5y7KO_x`eO>cA|a;{E=xPHYNcXG0Zfl)(ntD6&i?2{p~)}?-GKJ~*8tZ!kBRdu$9 ztYdwT76RXzLyYV%K$ZevC*M8^9QKr*a2J-52{{vBI|;-PhSDZov@NMC2aE!SNgUe8 zqQi@RVb|=IhRy_6g(9Ma@h6g?-$I)rrUD+4qfcE42))T;wV3yvnN0?(*I4c|D96ea z?@7=JXFYXSd~hqKsi0`2C`pc-E2zE{X7;1aJq`8BSEagmfX^!EThff%>WrWJteKL3 zspIwcn-~JLU8h^gLnJIspNR~8#bR`wdYC)vvxU`4=;Zz z{%G_^1NiP6_+sd%K=`1n3ao*DvLrE#B6NK$&zw|?I0{pw_%zvJ*6mg3CI;y1b}HbnBp>C zclmv~;-&{-ck#W!yulyL^sFd7V*eE@pZ{&BTy|Uw*_Mc*dI`SO-g$eg5c3Dd=yZUB zbG`sTwA>alU!QWUB=Tk2K_Qf=&fX%pv8Ae%q-ti$il#H|yt}e*CdRyGI48!cKzCw> z2T|*-y?a^r@1yZz5chu5YLeCd|H7Cgs{k4RTutYPG>2KCKtw#+(r;#ez2Jq7(J25r z?{J`b3NNA7{($b=mbiLxa7$j!D z93prdEpS7U!=zu|p&TC{#bq4g@r`MRRG5OavhA4s&VptQ;;Dz2Fy(WXl)B+G+r8e* zM7~zYRGd;~O@YUJY<&<(**lpJw$Qh8Q?#O6A~evH$feK9vR=#!N*v0KpKY7U85b3a zM>v-iXh*&wObQo;3XM)9{FXD-_hnY$J|*ADp|AG8mpZyfpM59y7jkbw*gu=^ox@gi z$Pj9XYJ0$o72GeblzX(a!m6UrC17>w;y<7f8t$G@IiZ#xB;GFPo+MNW^J~W}EN_ZW zXodMLW+sea9q^Cg3;w&;)Mk}my@_Z}5vWruBB+fBHi z9@?`k{2s&5vcpp5a9#WuW_|zpQ!O$Ve2=u^Gao%zWNb>RXgpfQ+$s&5!;)e2Dk`@) z=KhsT1M=jOnji?g!Vq>PptjBCnT4GeyuHU7{LrnicSyx6klY`?d)~*nYZZN%Nym&{ znO#hu^w4Tu+F*Ou__lj~PCMB^)zqQ&YW6OgP$PF(~xADoo6k*fiSz3X@ zkyHpx%8?s6`yGs|$dk}1zAc`FPXXd<^(a$XO_@SVR$m+LN|I3~larD}rKdHyI7noW zbCR}bRZabqlgSDHTBofV!SqJW&m5i?=Re6c4;CLdT#=wE5bGsul%kEa;aL`>1p0WH zn8o(S=?t>*yvhBrD6~nDldk!IXX!XBUS;4vBuUIDNZwKfaHQB*F$}7)9>7Wf z8hjUnId(VXLRcycjKX;OzUhVwK-JK2{-7G82<${kcf_z_A1DlS1)a+y4NsK@$gvf# zk^qL6jr|_*r9J{FF;0gEKTBn2Wz$wNT}uk`Bw0^+N>00$V$Rl^%VRp?VipdKs9ARg z_HYKJnAfM8(dzy}vqNdw9^?yq9g1!WyYJ)seD<5;i>^5bJ=@GlP`BL5Pr>h=f8*CO z0|20Xdppnr%yLkW08*rT;2s<`wwh9VSnOA<&=S^Pf<4DsRZ1>Gc@XvR+3w00)KDT+Hu5%O?xNT?Ju57QsMbvsTET{uH~$WDIqqaCXkvT6=mBDN0Kv|EoEahAQF*J~(OUN8n<~L+oim z#wk*~M}@`a4rOuSkDkxz5-Pq+PefIKAJY1w{P(JaI?qS%wZZpySJLKf_9yu6?R{Ad zv*kV6cK-77bTOF!*V$^a-S42kH?8O0+V{$9=lHK#{Wy%aM}M8X5$5xY$^714#Q3Z_ z5K?u|x^waGcyAOW=s(H_exuXKpCjtOr>mVXIr=w$oFr}5$S64z+N)${e_CjKNc)Yk zaXdHRh0a5Jhs5tW-)Wn;j&2@LA}4v7kbZcxbt5VAYZNKoZ0&RpuBJe)>4-m~J|!g! zP*jJ9;A2Snt=*N>uf!*1WizKlzktPI3X`m(%=0sgDxJZl=IUNmjjtg7PC-o_<|(hq zAH3<+uJMMM^$kCAMR*5Qyqgdn@PRdaoaJ{zx6dtcw}cHYZ?J>MLSa`nzc7>LzTY|6 za7|eMw!9jif3aMVI0TAG7k}IhrOP-a%8<4M(~f&+@-lU~Q$}j(tO^)cM}~>JAHR-a zu8w{4_%cZ%lsp;b41Te^t)Y}Y{NhkrD#iJTk|5%}<~L8myme)LBuh!G^F;EvFuBp~ zKoRWHNO4EWOlX+MjygtH-$FNycek>-EHCYfM8w8SZctMDp5?&$T!F^wJa3Tt+iUF} z->JnZX&(^kc-h1_yrAtiWWWd!d9;~qV^Wus1cYonb`tdB+uZmrl}yeFClUg4SjbzLt`CR^$A)Dc-*X*W5h zz4i1^;7yLzHHpNsM4JCjzj1PDTgP$`|VUTmn_GA$piXc|aCEMvRBqy^&Gndwa;^ z@Xv2up^@U4rsPP>qI_l;z5B9pjE;fpP?#)RabJw{L6M2V+;!7DA1FQwJl-3CPc720 z)gp>7rd(W0F-fvulT^tnUQe@b*ji7w@8jHXAy(WX1QF6>%#!s;1q!ctm!ME-J|&AL zP>rq8%U-#qNWpasUeT;CXp9y0R4qVqMKuqc4FN3#gR$xh1!PDNY3@L5z1eLKnXlXB-rONdhU zlo{Q=-}2L29e(3xw|LJMj357!CUj`zIw^^Yw`?wPTS&X3Qkq^G=31IvNY_%HkgM%p zk_js#SZ$m9Cj{eWvio1DMJ{iGwSN>ZbVza4mh;~OEtNyuTT0w-0G!I)^=_7iNxk|D zoxaEr|K|*Zz@yC3f14$C=psJEM0WqpzvJS7lde2^oxlBRpeq4WGVE?*0^r{$v!4@X zQE7RUHfqk!n8EV$!$FfIVK{wq_<+sGm+UJ@qbJXi_~LT~w4YKyNL2KlFull_#3UAh zaGmEK$yp)FX}ZttvI{&R&h~DF7Vh zoRM5Sw7$vY1cpI$L~99eH->xwSRKltCu zZ3*EO;+x|TEGSf*U!Bf7t3kA8)l1Now)gAQXc&06%ed77}wQNm^rp#oI zJLh(4xXx3zy|_YM&1c5-33p4m_sGl5rW;-{f8xM4Ir7S<6us8drSM1vJ5QYQhj%`T zYKo*7hw62siM|I&29ewuEJqq=l?HUJ8>YS1JZs|-hL7gm<84SwbJ~e5&~GeJp6)fB zK2~1&MJdt0_ZjD3+r;2Gz4?U4nC~QhUqE&Qz_{!oIZh(arbG;WwXl z{7?d}e<;--?P&KX`m%EAT1L?RV{xgTR9;!&q1`ZGj;P1w5m-LlQ^^6!) zF2E7&6@yHX1CqJN-eiJH8DY>Y*2FnakaQ1pxG6_ejGl8!)i0}FmombJF-x;y-EMk2 z8oSX>x)S?HoyV@o3;rU^Gbd{#r53Mi+d|N$`QFm}5f1>~R1l>s0>? zFC*e5Z0P^YK>wzq{)IBhGRPRbg#o$9Q6K}b$E5%<54X}F4EBXEAZmt9?_%0fuqKDnXB_mO6p*3c?5@p8 zkMRxg2)|+XFRFvja@h-~%2(o!i8ta%9FXchdn-)}Y77n0r?>A5r&#cly^di$QocWV z*jw&DZ8;MuLueB}ErfI@`re4}zj)U(^OA{A^fNP;_vy5Oc!$e^`Qv@*MU9Sf>7{J# zd5d@X%aL3Ur?E!foEuq|O8ce%6}8iwmCi^#8yXBk*bp^6Q^uf}`r+?pG?o*gyP`g1;}>oepX; zzd!tt%vf4?7rrc;PW*L@+k-y*1XF8-C|t$XU0hm%ZFOMq+vt$cCu(*|fsSFZaiZYo z2Cyr^@#z^Xevtt|nYr;0e@hrLuQU|tX5|r6R_mnpnp~@{#k>GxUfkNLOIq33+cj{n z08L)GKt~!R5Ze{lLdWEe?`7+`N65|8y2+j^7qmni^kcvtazCEMiS@u{iADSss7`rl%ulz(_lR;>^q~O)A z*2lo-S1L+gB=G^X{4?BXk#pQL6h$@>&7-`k<?`N$ayXCYhUonuUX78RF*I_NxW#S~t9W~BHC|Z`F9TCkw^&P@A9G=$-EIz9OJ-kf z>Wkd5NtFfx?3Y+m?v}kRfD3iJ?FKr2L%qy&&A~2bx_#T)$VNlBHZcLzmYdiRwi0}J z*X`}i+!#5ot-L?`RSQdRK?r`~0f4{^T#(!wF>Dwk`j}M`+nUr8cwq|^SHcHI7A8XK z!u&zi>W={B;s;#KVI?jn3)T z6mv78*>q6FQf|s2>hFd$I~5wdv@2#WY-ykdFLW!M4#e{stm?RJ-wbCF3A7Ntd{IdO z3Lmh;9d(@Yb(nRC=ISqyYkj4G#k1S!>u}ifyOVhU`C?g<(O(hQD(OQ;o)(Nmu!vUgF<__tKYY#Dc5$)Kbh+uQ;^uILp%_=K0k3+EvBYhPfftd zOY;k|uK7Ue>OMJ@rcKs}q?)~Ryx_}s&ap2xl<&_eO-B09Kk)wSw;%(m=$i7%y~4J{ zndjAnu&oU}hB{FUHe&oPLeH|JVI^WImM^#e#Kqj*%;T?j%q=OVEEbSoRsd75grVMjeSU+}No#RvaF6dC}}O~60X$|7r&iA9!q zNrm-}-tbyPEbW^=Y5@s?TtRIf`Tn70K>|EuQ*>-$FBw;fcQoS}XGsF=+j#TN&AK#& zCdsVWJv^e629T9G-EX+Kv_RVFkcpy$LzKXNdgLOZF|lHh2z|4lxYRVJ1b_3ubZi_r z%Yw`%r`QJ)ZRLq?=1g$6d|BOSkmnp#)YPE@xl&i*^`=h>-0f7@|IW}24Rais;A=sX z!`na3aUcg@AyPiC3NJd1uWd8u`%Ld_lkR!99jwAPmR7#KJBxu`oL%)#BF5k>!DRUo zn`Mbz7NkUS+O!S^Qm>HQ%a2_LFn#*J$U`sAcCO{cvN&A6RZ!z+t#E4%YgX%hkLXRU zQoJD@N--(oa?7Kjg}5(iESE={NjI#EID? zEzJC2ijdWO*~+br*9rH+m8=ZwwmuX+E7kj{1yGyh*KrBTEC$&G<^PoY8&UjWFKs%H z4pzuqnDs{_A8f9V<*q#EySsO^J@p(hFrxeUH9cXA3^Y3Y#}{xD-1F^SCfxI$H~ zp8-j)+U<7bo7LG-7m5d;ljYE$b&!I$`EhW_rJplW(|`sbsTu4=ULdF+NZTc27(}n? zpA}GpB{K|$#BB!pvwf?=3K2&+8-@w=ajZlL;~D2jvGt;rD9LXebKy)3NTwiWca^+o zeoV+}oRsH)Nd!vj>f2aVJfa|Y^@`V$bey;F(@GHM`hQL<|JsQ%ylD;aRRVZ^Bnw{| zg91SWEZ6}uSqJ*j&T#u8*zB4)01&=j#S{TCY4*=&3nQ~Y0691@Kw|4{nL+__hHXUQ zV{;T%xvIo6SBC?@9i)P{DHTqYhXs|M-uWH~svj@3qD$$cDWWTOez;Z{@2Igw2c_Jx zu6d^XBJ&bBDHm(=s$cqoq2ejWfkD+9Z-w9{Lcbkw3kYs7OE-J_w2b&`l=fm9bKC5L zy3@m!%F4b9Wjh!F|0f%|AM+CZ<%k=*(w$5!8GLQqw;t}pb}KNrnq!e`fjtOEogHS(B~{z- z=Uxdl!0SN37s=OwckyuXkjQ?z-IY9H|8C7hNG%IZ(Q~E^@0f_y?5BL zSL@}X!RPyXqE22uSI-s#Xr$=po-*0u-SuxCu#U)&ST;siIogdYwB9 z@B+#-hG-*xOFTN1r%bZD=@2j0&A>8lN9{Dty)=;R8$NUz`BJ*Ahw$(Y2(Z`p4-B&k z)-w%{v2wA9j!jaByBd%sXR4Yxz;v?mBr=>Z`6Xhxr4^aQMUj$X_{HIHtPE!OWT)Y^S1y3Pr(`-}^2fh&1Neq0s{VzzVeyaSsU$$b&Z`x$bwonCGA zRMh~_m@Ibx-evIf#^xHS{OJ6*bGETjQJRJJ_P-dDg}=_~00_q-8cc1z=u6C2w0P-9 zdV6!xA1TMNr z!Rl_tOaav?oQ`_J5yNZ-o=XV;k^C@Mr;=kT$e|I`GegBIaG;EhAWc)fap6x$fVpD4h zW>+7&p2IA>9SCwIhrG;q#FSJ_68G4UL;sZ=S0E^idVPgPdj9IBQS_wSc22oE7FQUY z#I;kP#DxXG5~SCc;H^2RZId^L<~xST-;ldi$xGsanJMivvVYU*eRAR8{`o|`- zT4j&akX)tD)EIbO*K_)Lt5wT}_$U^Q)NK%7jS6@X{g%$Q@XR=k`!&hUv!MD7va%N) zJgy$|?MsmtpF1*vl1qOHC`o?m{Si<)7!rHX)HsDj?b4^6sQ0e{d(}U246U`ZqK2m0 zSsh-1e{kOfQGNSYJl);ke=(Z)_sNTYpI!g+KCKnRjfBW;ZT`9!-?-b3w}tS~J&he& z9>CvQWC?x?oS#7C4uAi>OL<)tC*Kcl3Tu|xwr1`&dd`P`z{mP}kJ3Ck$D54(MHB*p zLu8#p{lg=opCe79V%$^{Q`AY#VFIby$_W_TEK^jjD>z3duIN>|MP`LdVQqs%xy7wU z+h$Yp(l*_W_%53slg>W%0R!BS#XE!6v5%8ZRT=r8=4i%0tIZnMFLqlDuH^=8>A`pO zS9diw4^O_Go_#;R`0?|Xtj{kJdU>{Mow7g#m(E!aLw7LpwOB+*7bx&HS%(T($dIr; zl0hbn{!vZd+jtQ7B}V6MP5w}_fbn1ki9IVYQTYAbaPg6nbQa2Ax{af5lb1v`l1q26 zuJ}XYHs&#F!mE;xr9<^^kAydLzXm*uw^k4ih>z%Bj8Mw4n?8zQ)RgMn zeTRihRfy*&{LA8djiG>1KhUF!7CgI2flvKjq=JJ?0lv?yBeIP7Og$)+prp%X=w|tHfH@AGAdPl9Q$SkMhp)4WDHn9j+tXwvEO-~Q4>>Y@`jJP%&7a8XncG+qe4lw0O!y@_m-7i4%1KCNj9dB z_T6b?tM#Z2o09Xl%Z+Y;&@T-LiePlF{+7L5`JYK|9A@iempFHM&F#CRmE6Z znfU5I%k-Cs0b|BE+UPgGiMm621atH{K6_O&$e6Jcf2mQ;S7#a~N@!H%aD*hgssRfKbA^nc5141n$hdstYFt>>L ziho*h4r!JrnQcXSX$ZDH3hWb7*b;@T_Co~YLfm*+yTzJdw1(gJEG= zxV128?bGQV0YWm8wzI%btWsomg4~*j66A$$o?H${XpOQA1*PgK&2b2252bxKS{`n8 z+^CWG=xO_6jG;)`95F+$OLTu(H4jcJ=H<>)qEb>6QkNR`@#AELL3h}7g@&@}TJsP1 zpIbxuY@_|kV5UN2#phPnqwUW_E)0Pk|M_#%8*ZvLP9?mdV3vSirt5rq9oySPYjX!P zem|a;x~&?_(^9=X7Lh-X=UtD;e?OiLvhPnETKiX6lJBDT55*c52@(3b!Zy)w!^RV?agT$rD10U8cSwXnAK97?n_qRl&b>4&O3(1ImT9U% zgxe>xm!5a>ZrFD879_}xpRmx~TJFUrNY^}AyXMgGyfDRl@JEt!XmKd{qx`Y{uCaR0MSPsgXSjf_3zd zXmz_IdPhHsKWy_Helz)*g|sf1tZIIZr8TZ-eP=3ec4xh8dU^F=(&s4X!`!#d&G?IR zt&0tKJnki!nODH|K(qA`?7K+Bi9LCDD2|J(Erd+N-`tDI`It!cT7PT_`6ZKTuqt(j zBJjmvT(U)mY^uo7iAB(}q`??=4_i>-GddA$NgU^DsIdCm+dS!ypBV0}Psl%*mTed3 zDot_GF?O?gC2U<%t#gTpIwbei`3zSB`zFrcL22=(^{C6_hfrRC`3nIpz~6N8#p!_Vd>ZAh7woR6*Cc~neSWPGWW46hbD_ILuaJaf`FsmS z8j=w0$IRORlr}L27sbkquq_85#`&6~e5x-lzsM+zILCg87|@_$WSnim;TP7hR+LMq z_5GoAkWkX;3<;O_!_**B$W=LS*#hDKAC@pcUfexe16DBjmW6bz6v|aPPVLYjKM`Sa zhb2&F@Dn5CSx|F#BKdBUaXfCCc-fP)XR{#1bmmcEyyaw*v@4}B?P{z~1@W9AVa?cj z*3aTb(=h7A5UmiE^|v?jBpDw2g#~S&=D-ac(=d6==$21K5=gr3h^$+UoAG+*izUUe zGliDP^}kRY70rX%o%!t`2kt6v`sUKW6jcYF8qS!c9DVTPn5|3Xbh~y=O}E_OHr2`f zQjmUP)bqW1^@&28P|2tlm~2gJF22g%me{?vd9IKUz~1r>lkY9Lt}iY7rdMBbZL+aH zC^X}XsbWLC00NZER2u+oCCXI*8$ylUbV4$M+-fkrz6wh8nuq6dFQW#&(nQ|mJAc+s zoOPOogtRCJItRc3K=3o)uNlm)pNk(|B1EED31+c5oBvhw_RF&3Q*YN*md&O|fICc4zxgVukCy;m5u5W-&kS4fDlP84^PP&F z_u{*Ct@p(ro0ej5`&p%9uMloKBNBO?uu9Yy4&k4|hi@fp+dvtRsIL79A${pd7Sb<8 zA4X-OtpF2vJ-|NiYSz!M5)qYB=L6$<9^XfjmG2_<-$?ZVd-{E(E^?0Ewf{KU$-a!C zk=h}tx-x$4{uz8q>}P1S?}hZ|GX}9x5>)|;r>*~J(aX5?XeS_D1=kk=MWtO^N+I{) zOnU$gZXBS?xQq$}0Mb^)%?fYUQYWDSw`8%~K~vq=;tUie@-U-ut{^a2B}A4I2ZR97 zV2ptx_CCplSP4(3gBQfbhm=Oz5&EA|5jbf57A1Yjdt5Vo-Fbp?z*5 zF{T#|X8@MJ_q}mSjF$4Y4coJ4zW)EV$+KXh7Am z2GGh_kO(+vvH>s1F-HI&oEF%iJMvg zT$C6AtDgD5p3rhFXD3p}S8I~J=uww~7*b$h-qmT`(<{H?uRt}~Sxz}6G}hxuujFH7 zXEEq-$IGzYXtKA^6&4KCHR3kEUxK6JL8|D5Kyr#$S1dFQMPsd zUb|bgt9RZ%goT~D=T-oB%(iQVB)YKqt~X| zUdq5u_uA^Z1S=SWf1tYK`wPJ&VeHQh*>Do6-B0&^FZ0>7J;7hL&kGr;z4*ZYV7LW97pCK5ya$ zEARjJ+%rT@$});v`7@zja)Elt@CXv#yGiCSLHbwCmipD6erYBZ&WDhq*Lc^zmnJVw zqk(kSZ`XfNQES_S0AL}$9e@{1_QF-l1`amzjfnInMd$>f+&%F@)W*m_V~=orhSVK+ zh6y4G-wwc$Ze>=OU0Q>6u6RinR@;&q)8GL2YVGpzf8hmGcS*Wrk09vU}kk9UIM zsz1!$dlxY_Gq-%_W5iVF%9d#Pq&H%7`zxpah|j7U&`4|%53?=9(JTY7ewB8&ZS!$_QnyqJgh!4}SPTkScwqG&1C#ntzD>RQBBgIc)Y zZ4H%rHTS#R+$E`j)`iWy@gfzss!bPX5^sNc>|gJpu~ZKlvHtB}jUn{ZJebOjY-E*6 z2yrm!H>u*h<$2YK>RpmVdg_>QP55m)v2Z>iLq7`&FD*4_d)i3=e?H=_yzaG!JD>Qp zUl30eyj`E~VArHodf?hKQ4(v6)bnjln50A#*}coWAO?-Qh*e7E*8}F3T<-Lvq{6I# zlOJ}pN2R2qCt-_2G;(i#A(lYORoU)?iDUC#6w1FR)|o5v4}F;Ei~OxZD7kkFj`j4{U9ud!?aRFn4|wlQzLQzNoAHS=$5qee1w1HgyErEibiW7=44dIB-t9eKEs>nqE^+-z z_Glxr&g^t2V3H)9q4M6DdzsxZr^Hg0gxH1krG59K^bByclHqp!l;!MFnXx^T4?4J2 zvSAkrGTd$EF_>YlS5JZ2<(|EkAR_FUm)N&C|JBJK1E#co;PUgEQ&1;_3=Mz~&<|HU z14JkTy0_4xkS<`Uk#D(}g-%uo^{cj_{=7uS8euR!gOv+8kFujAwRLQbE|rI2VWuGe zOGin{2_2>cB{EzNl#=C%>G-1$?yopt>zG&MI=j1>Qg?=`4ba_$=(m%=SJxkW;I)0y zMYxw{xI}Dz(VCZLBUJNk+QRDO_^L`W(uKh-o0q@MtM=z9y>GaE=i(x@x9jJVc^k3i z(0-SuPmw0gO|uF{_GfF!RZZXLQ{s`gFIOCS9yZ@34DjCWE@_lf+zz(kz1WTVaQ|Wt zP2=qcDzxH7eQ725QnKI5y(s)O=GQ#v%O@s%KhSV1;2ZIKJ8cQ*n5a)X$r$Wr;o+!< z59o~R6@veGvoO2k%z#P%=izq$XvfZEc=p|&`gYO2-%FY@JfNrD`Ww41C4q3H2ca;A zxuX9bA>V=97pFzmN%l^t_P?xL_Zh^Zp=LW6;s$3lkQC?hJVuvS$g%(c;t(b1y5>WP5=?-r zY%Xku7Q)u?KAKOH5dcM_CCSGD#PTR$nya*|_TgXc0HSZ-D&gA!@C~^f4<8MxrX3~} z{ddil10^Jw3LRU=Xi9@vyjyu4{klvTHMCAMB)q>EgWY8k)Ib6Z*eFuPl>t{JEEG9W z6!9N3xbzj!qF3 z5D{rfgBCFO&e!X8&ikBm`F(!-Bc8Y2?vLB;dK0Xa3=-(e*+7GC(3P{`qDI3FgS<75 z9~cw?Zz)QTNa;odI8t|l;l`e6iZ^#Phb;{sHC`)DLkb$NJW?w#B&&Ibd}u@)`3{-T zk~7OyV(Pkg*M$Cha=2EIxm~-l$z#v7_|%6FeyE!mS5`G)FWS`N?zqu`~2vXU%_N%u!So0f<|kqtYU=uA)Vc(2Ljbud){qJz6`7Q5gK)Gkj!z`43Ezr#dYI))SQF;K z#o88?)s#WfU8urpTT&>3Ttl*3yPqP0GF-?gyLyJ7)EBr>`4o>#8B@0VcfNW(r!-dS z*EIBg8U1#_Z(wON=C7Hw0-Yg?Hz~=m^M!JT4bt1 z(9t=oDF9nibiwcJi`ngSTn|i^^qU}cd()kGpnjo#Gg3TvOiAcon7@=*>4cNSulHR{ z!qy|XGKpd->!S7&SehR`yY|y}iDLaJNt_-D+DYLI{3&D&Bm~9LYR9S%cV?!k%bzHv z#Tq7LHnq%6<>`{8I~z+-yCu{(s*7Zn1T+z_9Ij86d%Ww6uLdygXE((5Q_zd25p>TO zD%JEy_pGy}hc!O0O&Yw8;7QPK=pb(3%h7$I%UXO5u0XyxMj~D?0pV42iUw+KoP4FO z3_Z-Sls}6ape?-P;~fA!giqcRCADB>awngw5q&k9ImSr!KlvL zR6GO>0QM($8q004#W07D=4#q7l^9;*QB(pYTlpuq?gGY7Zp9C!Hd46>kCK_3l4smu z{6}r2o-Wr-deeR5EZ1^<4p7AzW|cS|oK7KhF+ur&2b3!`7inK;?kAQB7yOD2%1HJq z=X_#03)?Q1(>!&kC}5uFt&o=U709frb>XWTmp`o}UJ9=u>2+%A=Fq@hG})|gw3kJZF&m&zGKF@TmXz}&GzW*$j z++36jdGy(KvT8CwbIKlyz(W}{h1H&YF$cu&YLhu%o4Nm8UIJ#i3-S~+e<8L@%)r&? z_`xmbsrtNbKJcAgC7AVwghzhj4HBnL)`v6xoWb~|z*{EQIUJWL!WT-9zT9{px2EMg z7b|ZO_RQ(YFXc_b6hp&B+xr2{o03`iU!%4wFVlGfgqVZ$XKM}FADPLSrUF&9|*xn@aw_xvSYm3Zt-6ugc zg7ZY*7#+o=2t;foa;iH%xcd|Zy~o~3o%MH{?+>@Zy5C-xGmos77Xw1#07!G+ zl#?;$^~;3YzqU>LD5ttrk2e7#OV+MHRqXH61PEkn1&H8Nyv6hdP!+ zg($@-odksk@nvW{1nU#~+HAl!M%0OruB5RB+@Ruiux6fHw$UCBKLuWkA>wMv6QTag zS4}Wi`B2aJx$Hg;WoilWVX{I~%H~zuCk4CoQ)W{XWivBWQ7LajzN8TSgiB3{^8v8} zGQ3R4sXO!}22>Qz1#+KIy7V09%Q%ItE%>h%-XL4?aMYI|uy{wGhk!(Zr;t73cjg_r z;%4lrQn2b>V_pA^=}_sHuaJ*TdmYc4$^=rjsUn!=ODd1bL_#WW1&`@ViMC)3SQUU} zDTSgFwD&#M68&qEU}7kyic`t)m*FGzjI^Ku)-OL%b5xO{wU%lqOk<<>4={a zuhR)E8yb9VA*M^H7jnda@X zPMXWLY91Ml&(D4>DE4%#akA6+FyBGn+B%50bF7#%6WDL8Hpl>mcE-N2V%lnvcvm}( z(SK~CyW)SzAqDXEe|rnjH00|OR|oz@^q`lg_m!a^Dc+}c{hR1fW6c=1rqGv)OVEty z{j*0Tr|dfZQkac0n1z56t_l(QFn&*Iz}*`g93lWwF_$N!gan1gCwP+k2Sibm$0cTE z>-eS^P-Q&GDK3%9i!?0AEUl^KD0hBXRaDnnLg{Z$9ozE!MLdG4!rrwSKjQJoJk^d2 zGy2-IeZYgN`^|fsz8Q~bx1RY`^mLhL=3)JpsM(JG6b_3>~>Y zU>k-!#t|Gn-9Co~({=GrR&EC9?TAgJiw9x9{}@>>TSET&Lb@yrreqAgfPfi&mIYw~ z&;iJz?%whhYV|F}K(JW^E|~dX>M{xV=jMtBDlCJ@lS9I%P>?Au!I}(adRoXcZBm~H zxmu}O6w5X5&B?TK?1N3*ytcNQ5R7amO5(PGawU(;`zjC{S|jpc+%C9r8CAlQuaZTU9Xpfl$(Y6kQwVV z3f>40#SedOFmsM)v}_BN zyRpK&Nw7<%3HbA*@ycuKNW9xZ1N;F7_e zsM1R>>m*y2@-!!`cP%z9$M&+G3a5zlH-=Fc~H!Nlirv{YtGz!gTR|=Bpo9(J`y=)JEHpX*sb%)?I_Urix(^_W+21qrfgyk;p!#`+hP_n= zEV>_NbLl>eFonXaun$<0uK_4S;6gYJ1yW0~I+)++r!Q%UjikjKSBnlafpxL=^&Bi( zI(aN31%S~4r%*A96bzseuw1<$(IHy7F?P@$B^!>rfN}%~7XuqH=D9?IQB`+K`hVNN z|CU1!Mtp*5h&d2tjFHQF16X~)0f3H%O^;YQ$>}xOJBqlc^5{ z*wjX~SY?`Gp=}$KjhTu>IZdRWn%O1Cag)rQr8_#Ta>&~V5Pb#`wgc@)O5DnN{QFO^de_=-z zQ#&vb1W7h^rwSZ@IqOD|@A16v-J*R@r5jbz%+jV7^{QLc^wzgKE3Yx@ANRgXhaF-T z+D|V;7|}%Be3`NssQ$z}17F6A5QJL!14d|idjybQLxc>Pza8@(MIK_a$F7PYgI(OL zv^(JHNoiq``nh$$qN#e-k!M1=q2P8d^ti&~h<58%o+9yakwf$Qmnu@(i~a&lInx#M zYz;Pksp%tmM=739%fuXTaiqh3wD1`Yqn3tpl6g3T`TGnz+1cB}h7}*WH+!;JdFe%O z*4w4^Tq7rI$V`f6y1{0q+_3IVK;Ag}wr8#pVqM;W$L~iCUl*y_Jr<|+d^F>unCkwE zxiw{~*)d-r_JL{DLI-b?*D^KXowUlx_}uxYPqSB`Gx&(^otEZY4=a(#&P>zu zt+=4hGuZN`alUx3!nya>;Gz8m8|yjzz*7^abHU~XkNiX$uZN_3qQ zsd|ifoH00zXLUp^R(N6r9L?Fr$HgU6Ygr6u;n`kE3P$+$C-b2hxKgnrMnS}XGOH;% zNe)E}W+c`nFgmk6MX!6M6?vJ6H)=(>>SO%FS=<5b1p%%*{42hj@A+55f|5``7WR5? z85y0E{T4LxdPjee_Idfoh-6d0&D5+%MisDVzn$^|y1@6_iB$s3l@+{}^N&25k_gMG z*JVt1;Tetfg0&4=U@#9HTLXC!U_wt%Kb;txS5?`9yITJP?d+ou1TWtb!;F06 zTCPXl6mb!k`AI09(%Ljs_kp$I@aFWEdV2>_a@j7x%cZ#m>>FeZ6VHs%{^lb4MkLw- z&d^V^kGhe?fu6ag6Wan;C?diS1wnMM3kmp_HSW%Dt-eE#Zt7iM@*qtooJFO7j4XN= zfsU^QkIUP=kVH;?XNkV|R+2gCfeUE;21*3HNgYcOak2R{S!;thvy8`cfeTkVx|ppW zjv0%?_(pwkUm&LfrSJN`-1!Kmxbv-tfl6>sADVE!JDxlxL)F2{<#!;$rxU)(FO#o$ z1fv#xiky$Pl%*W|hLMG@-1F;!t##`3z_vdaKmD0ReLoBgpSt)B+poJK_iLyr=wg1e zu71!O16m*k)B2$45D7tL_G|#Vk1SFq0oyflnItmk1%=<p6^#Dage z?zlo`l%YUZzvsZ&Hb>@J-$!H+1A{OE6pn4R^ze8H(0gi z4FZw0CPM)Iw6%Nwwp)d;7v;|{1d`N&W<^ENfTS|WY@ams>Kaslhgg#f73=0C4{Ek2 zk`@<=m&FtgMjd896V{AeAmT!rmH*cw)c^A=ieb;BA!ZuB^IQ4RX>^GYkqbsPEJ=#U zI8W#S6DHF$NeX~2iR{1Akkf8Va6Os22R|Y33DSWQHnUB^t3#3SjAdD zn~Tx*TK<{3OBy<7R)XCfnxIKft`F!4_1)GFVUoiUl@ zk7&y0&EaL*;UD&Fr6v95^a*8^SF|%yA$0NLNjf0R?oN()!z-E+u`5(T zyC^kC?{mss{)Yvk#gUyun~4%GjJBfa)WClM`e}E&74(gVEPCLsu2) zavv)5&rO$X+$p?C0U@|Qtd%w$_T^}=R?tpwndx27UG5d5r=qh0Y;VRzF*F&Jr3RiiV zOxQeTW1h_PK9n~BHTmho>9!o%u2u!ZHD^;Wo=$Lu=&@IYZq4G(;K#QdOy7f5Tgp6Y zo`gpe&C`7U_p9Q;)L*ZP!O|ahXc%01qJD9)IZLa5{Nk0I*atYWez-RbCT}ZM0@zi? z7Ee09ckek9+8+OuQ~#N^UHDr%|IJDJtSYlSX;>FOIknb9^VGGrPmh{G`Et z(8_VbTs5JbngnemrR^|PLXr2+j1xF%s!$36kUFbjTi~mAv@BE}O16kcj!z>Zqi&H? zKhRe3_9ax{Q^|wwn3DNCO3TN&ATkr~NofXZ-kb;mUJQ^4Zv?tuwn zG-{^d@ci~XexrZ;1ZHF9$XsYfu#%d(uUI*3&*;@E` zD}2HaymMf%`BrbL;QE)lH=`uDEAk^v zu}&S@B`Ty66_vZZhp5>K)Bax#bDJP^fmMEDf5n#BZ1Y@k!xv6Z-UUaq&7L2&-$j~R zbY5Ol+~yCw=9ZoJd~@s zaxD$IrP;JmeIq)vsfoCQ&FzxMW6zf8oP%GNd@MPrPEUm8uAEZM1!p>X)LLUbpA!D)5sHGr==UvxDXod_hA2+6WBlmGXc)r?%i|c}yXWbIE9$%+2j$OdgL@0t z?&U#|9g^eTYl9gIk(_S!4>*qG%dv4h)e+0_6{q&#L@xAQ&ZJa6UvM%-geo{v$IzM^ zPFIfl6vHi($<1Nu7CDe+q%Ot7@Gx(x1k10}UP|wrwO1O#|5(!QvS*qLFEvY4J1@=A zvE5dI;D|{vj@weIockF($QJG=*P%-MDCv7}VH(ZrPi1s2rdUYK(EII68E;GkN;319 zl`4s%)a9#c&w(mz;Tu)Q8o`CAP3oqD%FsGRO?9REJ`Q=Oh~h^2Zd;s`EcKxa+9QAc*ko--ZW(yL?MKd!2S}OGkB_5&#MHY+dXXL07DQM0o^-K zg+e1{CGZ?z8HWREL*BkRxqE^%CyA*MLd9$kUg=-w*v)bY;-yFSfx z*bTw78<+j#r*3e2F1=L#Z~*9>vQY)>B04cd0i!p^G8D2nR59 z1izDkj~C%P5i{|7UG%T-gh+G0zt0p1UwaZiFgqM>;7|WH-7=6&ceen4Dkvjs06uxu zDD%rd;7KR+$B+A0z2?e{bf_`$>Bl9q!q%Q0LBg56p^E$*r6Zx=> zR18=$(E_TvL=)?yw413DbuYu5j-R{#hUDXDGZ}XJX6VqxWjH$01O?EI&y}b?aMw^T6W21kX17VWZlcA}H*4ep4S57Trh9<3`#usT2=FoQDeAw`n!F_^fNa=LgAu~urw-QM8a&aWJ&tf+{*EYf;g9|^*-~P0z z9*eC96Z7$?6Y0FBB;m>?X56G=sq8b4!-P>ht$<$>n4!0s4!h1>2~1>;#h<*Tsb#66 zs2K}4x;_)E{Hx5cS3R;hsU@X8pj@9J@tts^C+=FepjoF*_t~$bV5_@!TE{oX&eZhd zJXx^QlzX$B;@3^nWv$I3akBOeU~rG<6*ZE~R^@ZJv!C zxGvtxhxo#AHyXScMbnZuD9k5_GFGN%h-@x#E>8M8kmGDD;!&pYamVy~hrrxR5w{A* z4?07ypXVCfb2JxR&_1YYdPR%}aa}{j0A0y22df_Q*dElQSI8qkqhk|KmJ|O1`aF z;@3P0eG3`ydusAzR8KG=aq;ow)Zwc70oJhu=lKvp<#(5iGK1he4aoD=jSHV;men_i zR7Tj4A)YmMbn-xwt8A$PUAhK4C{x_1YKLBy- zZ0A~of5 zB*;bQEt1AG{^2#CVH7#V;JGtuAVA~wMf+O970cUiAKP{gV@cY*6+h>$=~=HZL^fq$ zRz5qelcwfppmY5Mx1_9!$}L#^?Y=H_GmtEq2WV_;c;7Kj_|0}MNGsI*{QKe<1b(!#g+Ga3Fb?tE3UxntR)!JccdBa~8~QwQIX`UD<+MM9 z3_BMSA*;kkm?q8>4}u6;Q{N2}PNP|3x)G;i9h<#wKV%_xu%#NrX<)gYs7g|SO@hE- zkxAT$%-|?)^fni(VO+vPO2g~EpHTPI8ADR60@ai=^hBPQq}v+yuB6e$j4EV0A0*hq zJxb9f44$U0Wia2z>Ab|xPBMd2TyvU35^gPhq-*^{HunaBQ#LNK zfGZ-FprOF0gfls2ikhz!02Gk7IM8D^4=2EZ^pISlVNx-(aNxIL zkOT}=YkzBu(%&jTB_|{Fr89QNHoFk!YTm<^`PS)PM#n&od?1aei&jdfe27xJ`(f>GzE$1t^Uu$}^_)q6 z6H@y5&AsCgAm&OC*kbi%JVIV*quoUN$O(yugWQ7_NtKN)f=!qy@3Onhnw^{qg%$ z%VvxwqccbG$}_1+k1?ygIM%!;_j4L5icDmCvO zz^7FLc6xu?r}m1MaRR5t%kO$O?US>&KJZgQ1ypZF9R`TeDO|ZdKcvch{1kn>tyYxP zlXs5x*QUTIQwczC!eM4LAEDs2}?JLaHKiB20hB?NLPYF)y!GyYTi zSOGY&`ajzDc~nxHOGWhUKVek-rQUsGg7$H}ImL^T_Yx4>HKwlph2oi}GAxkb(?3_& z^>+`V2cG8t(Z0H9Xu@&pcZ%UJgsZDGIfaV992vEX4&myWplzzIM}@F{MtFs^@pUpt z%ZMesLf#_xGczp6D6Op%E{`y(E~n#cEGKwnf8_hw4SK5(L){MQ4 zgH$-X_q>^2@T7c6<4Hy_@^Qm%cF>+GX7j7fQi|8qr*9|n9XoFGncsg)=jFWYZ2pqp zdubmM#c8yMQ$(Jv6G!ds7TiWQBIm7)z7-B*<{-kTxmRn7wlqW+uO02*SoI|c6g4^*Fg7u0z3)9x@)GgtcCG2!ZJtn*CqHofc)O%8$UoY_Ob(q-|HLW# z(pQ!#ukWp=lHa#hsGe12-~+&d>panQ_KPg%y4yVESD#z7KJxnVp`C%`zPZd>*k4?u z-}EOZ7QzO5B7@+kr*DNUGwwVDhZ3J=7A*ySKf^3yKzhNbi)Xqa!Is!DnGqBM&;tsv z+?rd#fncQ1iXc@KZiVu9B(NOb7s6K5{&A!yCQ--rcSA3!{;1Gy-dP@~y4@Z99 z=0iB2I5?yvTkJp!*39Yl2xp$NxD;jNCGxX+2`&!h=@)Lh5?lRnax_pj%1+0Liy9iV3ArWq}Nmt~jFn)EHks7~#>yEtSffu;4<8m;X15<1j%{f`znZzjIW(@jHPg<{&I!^z+Ph%K>O z@MQBc`J4r!82eptm*mTuGgqEolbP7^*^T5J|Z{viI|yoN*a zmjU;0X<%UP+CdrL+_#``OW+BI0ccL*zOoh?AFJFAD*QIS3_u=XZ>k$$xwt`>wx#6c z!F_pOr7Pf5q^e4lhtbW7HZrbJLDv_XpH3#5YY7^^$Tz(Th<~!av^1hWO^gQAx>pI; z^STd_2jpz2%i6(+yH}WxLxqmziOuE>$T5x8{7^xP=N-Y-*ITO0e?HP5j+#XZA!{Ce zs<`JnW|%kDQejh5Wl5?r*T;NPAE8xk%`iSUbn~Pk;c0abc>HY>&4~*sbcepb#V7~7 zEdDR;OS=9av|?5O2CM_8|J6>cRuv`0Ok;_}oNND{=yn;lC**2EZ8FVdIR0rT8t1RI zefH9)j_6GgCKP}rtag93<{3W`@($>Yc_@eIfP><7bN|;$+P%|?x9NR z4Exxi!QofQh^Ss$D(kYT_n|MwJg5ieSAr=B^Kla$t2=g(Pa9rK+q;KG>owkF@8*tv z$}fEPW*Oa8sSlUHcw1Z(97#~&2-!T6a#YXu2%_i0Ou$3`KlPTk?+si^{vUMj#0t)c+8UAtFFqEvAHx_?s`u4ohmSWt zqcT}3 zlCKR#PpdP93!aBCDqRK}s}=|`|6aaKa`~~3X1E+z1}qqion-B?XW9u zstPeTb0UJ`uIY(`;t?GYK?$zK%pEZsr*C673aPpl-1UF6r zn#GwD9v4|o7gej%OYCx@h6UmkZrWXj+V&99kO8a*uMsn2?ZLwA@8 zAkuoq6p9N3PI`Mq0nXaFE?QTCaA-R9l(RY1A=v|o2$v8UHef97^FBi@PvIqB-G&rsZ1xj ziG^Z<8cdXNY0nG{;IG^!=8I9TU#j&$gXzQq!k!Xwe7-wCcUBcl!`PNC?xPuD88mWq z`i_T+Lf_0X7Ai5LXol3WoiHwGTF%RN9ebIDMCoO>Mts5x+HQ0Yl1>QL!D zoFN2B-5u5n`&wq>dKkRe^)%eJ=1fvPBn+!&FH11HAEL}8AvUq$eGJpiVN1_)W538; zql$an8&=18nnKjpowR7XEO^!xqABM~4_o+1wQj`q5%$5sMw|U&>#mOo893|ex(^q8 z4+U&jY6hf!4#fvPp{yZu^|XloVATmLjoy=HYvz3{BinzuPA0Thush&-`>hMjgE#&P zPmilr;(whic>f2jI8Y#EH{ti0!hk;-1W^@xyh4gv6a@%@BLd=ReLN5WmPGG+O})4P zv0LPP=zT#x7wkikVEgg`3eF-K0#NK`acu@ReN?NIZ^`6KJGH2WswBWoZtr8M5+*{xCPj8Z3xj})c3jHQo1?Wp62;# z*uwQQi<)gu#cF9N-i zE^qOO-hUY|-1f1LP~6BmC$<4bh`kVo-K1j3BE33U9mF)kdUgKD)zQ}2mqmJNF_S-X z#R*=2opwY|33=e|6B-sSOHOTKCQo(kK}1q=3Wr~S^BoK}F*PsW9^w?MOGe=qf~%}T z7iK)xb1AQGZjtiOyz7!v(c1HZyzahjcJPbgRtR;w9U&Aw@;Zewrr&|8>CJpHWM!NPNq4#yu3vsl6i7{mUmNd1GJm<(>Soaez zdOjyrYEqC@AUSc0QNtPxx`>cMY&CGfg1_%w$oRBQaSh%k{Z`Gj{bsE{CXBwm+JT0X zz>e|F-ce*Wgm0CO@sCA(oHbi{d<$EjS@uIZ0Uh z&UQhp%KJ%wV~@gxAXGu6THA?8d$iwMyz`E?MKJ!Q4z)augp0=9U2mJARkdT@o4Im8zUmExqj=9i(iG_Hx1Y zKSh#04Y=>dN@zs@wDrDf4Kl?l&nFLk;RFN5Iry8k>$Fkw4kkS?Z{P3Bmp{CU{LQ2D z(?jXpdi1T%9|oG1LCjUz)!xzwRnVNWe8$Yt zZ-ro@U|bdB1cR)Dd4DIZQt_zIt%iXbBR~;X1I2rZ?Upl&1eo-!3Zde^C1LUQHd{rB zbQDt9Sj|ekAh>)b>BE#{NrFfj8xA~7|6uRXmwqEctuNKmYi{^~K3IMu)ZYkToOsZi110?PussG5c_Ne!E%0%cUB325 zv!fn}l(Df^Wjby83TxnJ4FQtg6P?GmPYcC@E+6&z5p@U}103NW)G$T(`|bCrpWo71 z78~L|F53aYJdVDxBPGmk0|Hmmt`u`O%S`rCbUUd6l>^bBN&BgZsnJx7P-v0(v%!W^ zUSuxcKeB_-s-}B^v1q#&3tr?ot?8dL7|gvY4rP2?`(B4{`E)Jem9y%4%B=#)g}GXA z+q&J8e&5aTvOTGbt>U-5KHJqm+__j$-DDKFtW)I2=jM0+##a;G?$Dl>0ek}|%UroTxD;~>m?|G@R}Bsceh5HUCiuj>D`0q3OBM2E4j zPy~42R98o=BLHh#0F%1b5)Ekk(%Gy47RFd2o5!IK0D$5!O^zro2oQl_!4MZkFeMmt zst@}7IUFxGa0Ra6R0v9t4CSNW3kN%y5n`9!@<*aj_z1^oPFw#4o8;qw?n@zzC4jU@ z>1zUptcYrIMD9u@$jdXQkmcF3WM6j!;Ga_j?#bvBLo~W7N-QzX8WYcTzw*9C&UKk? zS>?Ee(nm_UozVCMqa4EGvQg@8E)mbG)fYjz< z5TnU$l}Qn2+pAoxEGh%<-wRu4vuvPt=f)%!#M5p3xyV8yNvt~(oeBofiP{cf!>oGg zOUPoNxLwvXZ6)o!M+RKWvRe7(WLWb9YbsS$V(X-<&(v&suR0HFw0}ts=JR0@dE%{Q zK&hJtum+(?b#&f@Hsz6Zmx;Yb0AunZz^Wr3q~*548j~&+0Gle`<;v1|k~)o;lBrPN z=6yqca17a@o3T^K(eU{?pGW3i?HdcMQkomY=RjX1jeQdh)=5a;U zr5)WTH+yYsnrQwL*}@8t0^7jZf0-hlUbME5BIKWN_Pydw?c_aq10eF$X(c}gdXTT~ECDB;YdvvU!4*s`KU>}}) z@$Rz*oVI-`%m0Hf|350y59%vAV(}MQf&6R7W#i9ugfQ|L@Q{M#1=c|LG?o_Nd8vpWrCbH2DWG@iZ4J81JkP z=`-ndNo}E5+iq^faHXt0>m-jOA8d;B=Lm&lotus8sV1v#52y^hq%!2yR3HLf+ip;+S5wK?uVPj?>_7`9dfrQ;; zP6M3PA8p_FweTYXK|M^N#b++_{Ge+(x6xo?Kok!p=5kRfsxOb~1%PJL$~#cN1;a`6 z6E+3F7NTgtq|m*JJETaIlkxzKcrQ3H%mY)!2eSNp5uYj$idKC&-+-yhTC{X#CQ9DIUhRoxt6qU2b)2hOT!`IRPW(fow1teG9x~diR_U@0pMi_jn{s?)$4rmEC z*Pyquf>4xU%oG4NJUPULl_>Pu0-%^V*zk= zN99Q8O^fPP8K?_pnh&YfP7(7UPhmDYJ=5djt$(-(7SKLiZrm1X6#Zvwgu3XQL?EcsFU^Wa~I;a^Ap!k7P_DGDTP6})(QMuN;206vqF znH?q&M7%?qG~x4)=U0-e08f<{K1~_h9IJSWO9q>!5cuH}UK5 zQCMP4GvX3V?-YmwL_Z-9kt&rJL*Tt+jd8002m@I~VcDBMfF863L$&K&FpLsP1-r}|JQE)gVXD+C84@Q6a29E!7ohn^~laao4TMBr%N4=D)E)`vIy-=o|G z6wgS&k7GP63z;s$h9pE^N7^A3NyhhvidO0%&N7OSyY><^i|1ppu3s? z#K?dIY1P_IwR%&)c$-y9(P93+srZ8ALLrmwu`er)8Sk$?qzY=6>8e3zo+v&%%&9=z z^He2QyPE(hqc5Ayulf`783IFU+7|Tata(nl>%+s7ULA+Idog7)n`*E8<`45uC(7i$ zkG={#Kg+0)slEjrg=T44tpUtNuF5^r#R61^wTc1q(m|d?AGG z0pg2)Pv&s-qFp8sPJaU?zg=7-5J-F(FGmmVQ-l6Q?f>kmGW?0!vr3^zi2e{rUJ0mD zk3Zz+v=k%Yp+6XrlQzcc-(+0o_s`M!#nGNk7LdlUf>Cb~Y`v(v>J2Kb4fr&bDsvbKk3?XWt zLp^LyM%`QTZaHM=^@lM+6Wbj^z3%?8ZF}E+E!B%^ixk3_rYieOowy&D@NaQVv>iZQlpJ4W>vwH0Os@G~~<@E8q zbw1E?_l8SQK#-I3;LQ|fpCMs`mtkcqJ zW)Oh$^Yu0`ZDkV`Vzhxni5$;kCPWhFz!taL10IQonX~qhJnXcX_KoagPpF;b_qHKoM_r?L^|_=J`rYsPXo2q7fs! zejeL4Eucg#S{Yt76ao}qwGfyBJ*!-=$guMmrLPoVM^xs$;{qI+d`Tqu$oiuU1fO=4 zPCZg3UKWUG#?S73zCeL86u$VsOXC)F8Mm(b0%Pc6s6`E4S8#6sdiUl?>&(~DD!cb- z`&H^6>D}bJ_iL9QbN)OTSLgxdWz$d~6|%C?7w~G0e#&96tNNavE57SKyP5JJ^(Ib$ z3pDPI?+$y7Zd7LXXWSZf=Sx5gm1r&OPe{CTI(#X)S$#Mu^Zj1{SS1GMqt~jt9OyIHVm&j2nlPAm_xn}%;5N^MfeHEIU)SDVGd4e=0Ec|3 z{@|YMVvmzRA-2k0HiiGK2DJn{^o_3s&!Hl6ww_}2`0Nv*e|@$QlDyjfDKGrD)Wv$? zB^+N-?Dd=5!m-hDgvo0t0zJkE(Rn`M8~(NGv&W?zY5wPLCb2*p=a=^SJ_7aW<5035 z9yGdyLociNvpFA0@}cmv%J*LVpoQDVU*jLqpq4w9C%Ofk$b`IVohlyDx_t^lzPQR? z*SOSw_R$WE`Tav54NML-X(E89%WF$hIpH^0r(Ol#;2b=kM92|$)nTk8QOp7n_?(B< zPM63p?=Lfifq^|zI&#dnuSR{e=crJ~K<0%RBN}9(V|SIjfI`h4bFnQ7+&Ho%d&a25 z6vhscaJu}<+Fl8fRe+s;U=8V?lIKOchRE2kA@$0y6|#y&zSpp#cD3&a6X>bOf{hDa z^@$EK!(D&{B2$t}BVaz|246i7OZZBL1cVVEW3`TB4kb|$EyTw;W@l3cSq=kxu8)`8 z*DkReODN8}CS`OMp8$yAE(%nDXO|5?se{pmf5l{Ja{m%h9&M+#d|Fw�Q#E@9P%v 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 RAD1R`%-z%NxyyxH{|8NN4M_k1 literal 0 HcmV?d00001 diff --git a/src/assets/images/404_cloud.png b/src/assets/images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..a81d8daa2c5a025f0137a27d81ed61ce7064039f GIT binary patch literal 2644 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/Software/icon_android_blur.png b/src/assets/images/Software/icon_android_blur.png new file mode 100644 index 0000000000000000000000000000000000000000..660f83a73cd464026f1cfaacd86f9608e53e3b02 GIT binary patch literal 4049 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 DIi$W{ literal 0 HcmV?d00001 diff --git a/src/assets/images/Software/icon_android_focus.png b/src/assets/images/Software/icon_android_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..26b70f55a6515272589d4e4a71151c57106dddf7 GIT binary patch literal 4755 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/Software/icon_download.png b/src/assets/images/Software/icon_download.png new file mode 100644 index 0000000000000000000000000000000000000000..84af2bac8a28a6d0b54be55a544c93c9d432e177 GIT binary patch literal 3125 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/Software/icon_font.png b/src/assets/images/Software/icon_font.png new file mode 100644 index 0000000000000000000000000000000000000000..0c434c198ae8fb94709671f87ed520625003b9e2 GIT binary patch literal 10226 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/Software/icon_ios_blur.png b/src/assets/images/Software/icon_ios_blur.png new file mode 100644 index 0000000000000000000000000000000000000000..6aebb068ca3bf37b6ea9f5dfba563abf2339c77f GIT binary patch literal 3835 zcmV500009a7bBm000XU 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/Software/icon_pc_blur.png b/src/assets/images/Software/icon_pc_blur.png new file mode 100644 index 0000000000000000000000000000000000000000..471c4fbeb33b86e873d2aef25e1c888fa1f4ad9c GIT binary patch literal 3665 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/Software/icon_pc_focus.png b/src/assets/images/Software/icon_pc_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..53147f0dce2dd598d57a7e1b77d9b57c4d2d0aed GIT binary patch literal 4017 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 O@b?Y!;p{x}$NvDyXi@S2 literal 0 HcmV?d00001 diff --git a/src/assets/images/default.jpg b/src/assets/images/default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58f99f0bed9823d7b04c25b33e155f290a277fdc GIT binary patch literal 16747 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 DSoF{S literal 0 HcmV?d00001 diff --git a/src/assets/images/hot_bank.jpg b/src/assets/images/hot_bank.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd266b960aba5057f80a5ca84a13d912d8470db1 GIT binary patch literal 51653 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

a_Kby$Rm$F)qY6S&putti_f)B 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 Lq#jA3@c)|thDYFT literal 0 HcmV?d00001 diff --git a/src/assets/images/login-background-dark.jpg b/src/assets/images/login-background-dark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50dc817e8fca2d229f91de8f9ee4a395572ee00a GIT binary patch literal 20471 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 Vjs4wpK(~MM=0|#bu<7w%{x1-0sn`Gj literal 0 HcmV?d00001 diff --git a/src/assets/images/login-background-light.jpg b/src/assets/images/login-background-light.jpg new file mode 100644 index 0000000000000000000000000000000000000000..993b958e243926e4dd5b1a415c879965117a3419 GIT binary patch literal 32872 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ð^j-r@`P8j452yx>Y6XIGhmq$X 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 Vk3V|iuRnJ0#=E5TTkrnQ|1Z@Pvk(9P literal 0 HcmV?d00001 diff --git a/src/assets/images/sad.png b/src/assets/images/sad.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c6e402fa44919224c0a60765400b7bd3186d19 GIT binary patch literal 982 zcmV;{11bE8P)v z%wy)=^S*D+x%Zy?Jz&k&%zIN~NR0+@Sa388j>m#yRC3G+hTnqWmv+tZS^JHlDcX-i zGzMN^VSgP(}=wV-k=IPt6AExwl;%4OFV)K!tkQxy>>V zyW<7NBfSianhit`&MBsdIAhnu`{rEel-<{(oP`g;k}(( zEfcUiUNHQ0gn(Br^axlfArA>mIx>kpBfxbgv0!-eA7tR69)TvW0ZL=P6q5j{Ye@i5 z>3R?aM$KHBwhFl?t+$cCl@PP|D~7tS42xkZb>eEu4BvC*fx?(R@S&$g)V z@78Nh*Yq9zR!~->-AiK{&->KG+Z1!)85T?*D@m&~3OL@IuKZO24NQLNNp<^bwwijs z&JYOQbL&dBHYTUAUX@n|)YsmPW=M3wtVKh}(zHsQfR%NA4FG+P_oQ1c2bv4z)r)^X zRh{3cbmnG**ln7CmIa1Zy`WU{C+f>gm%wWN?Nyo<KS;3$w&x05s#6;>Y2F9krx+uPvv!n18~x`a^e_tp=<`?E*rgxO+u^D z5^Hm^&Pk5z346t~(r8U4t&(;}2mbK|+N5ajf!jt}rC_*2ikYoC=V)`~?WB=Whe(PU ziB6>3(5Z>u?9dr|>6}g1pXe|`_fSi0*j29Cn!y$O15iu-F7inm%m4rY07*qoM6N<$ Ef`Ng>#Q*>R literal 0 HcmV?d00001 diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..08f4e8d69a1ed6e709512b3b7da8a88adbacbca7 GIT binary patch literal 8953 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 z z#Yz0Fzx2q-fIt#+vq^K}$%;U0cOD3&uy*N@0A*&a1A(MPEN3^qo82xVoy&&P7+fC! z9>xw7qd_2J)387q-5=mXd;mWdhXft3u7g5Y3=-7Uzz%5_XaO);*878jJ^SsQ>HGcZ z1P0X91Y#UU6cexkJ`EDa4&d;JVI=4`UZQxsw2Xj4zCrl@B&gYvL5Q23BgBFm3_uLv zI2av;MMLleI0}a(pt0K_Xe0`cK;jW73=D}PB5_0v0rKMo6Lxj-+5hyrv=}O;#4Ei!IFeEtOn{fsm0R#YSfWzmB zv8ZKiAd}1I@|fJep};AhA%_0FeCwn!a1YxL@@}1{5PmLYZx>> z?Z1K600f<139~83eNumWefEz3}ELMm4^SX_Ng<~++mlYu1;5qFu zhuBzJ;7|k{4u*!KzR9(-Bie9yd>V%i*icANv47w!7K4a2q%i;nh5i>1SS z=mrd!FWtb9KrqDNeQ>}Z=P6uz$Wj(8o&R1C3@%;F@qhA=7%Ywepm8ufoq&b`G%N~c zh(a=8XkTALA43d|z@RO&IRvxBHAxHjGwYHnhL{nDLK^@mvG>tP1`Xze!iqnzC;|-Y zgC(F0=mabZPhZOXZ^=ZoX7R*f4*yY0dw`%HqW~7!WAg2$B%Z*QJyqn~)rtyhc;PreL zD0*#bV-dp^&@9L(GSHDw*{pN=*xe%@8&lpW9nO@|a9qu}Sp9VWcy-K7bPHjsiLF7z zr8^g8W?l}zZ2vN%cx)zXz<503)l7{mvvf%9fvjr~^`XxG=D}qAJ+7BhvF^*83hQe8 zy4Q?I7l$;JoN)s8*B@+hZ+ADH%Gojhl3TtBocp=eRYJe0v~3eF=_~HIxt!2*VMHxr zE2k%UQ6vYNI{bRA*Wu37sZS0h7BTJORLwiz;WMXmD7M?KxAlkKo6;;5)HYkH6nv=u zoT_11+?Q&fq}cOlE>v_*W&hYak6I8s?92T6ad3QMYjoCWF6lrwF=j*T7mH$RAYh+% zwbl7W;6gj|;7KVN)&7y4RN;O#hYe9i*zz|DV2kGTy$R>>8|t|uAN!7c4Q%&5sTV<& zSX~#h84(a!%&>}dyBT#pm3;l!V2KU%W=(dpbVnLWW5wgjybtkX5;0Z7t$C?+ChTGB z1^3_wR>9Rjr|oVvnrS+#0M5$+`My<50m+-zPV~K+IL&SwYyZ4|67Od>_8CQpkiL|a zDxbmV##eM^;q!mCj&oOUWVaxvN@pb>7TDH=$b$5*U25fwNnQF$j?(+iZ=X+%R1!h` z?mMFR9Zc{D*V0OIQt;gVV9e;QgOPWH8(1nbx$8HX@vz)xO&6Olq9BUzk+&@FOTA&G z=-K&8X%8QmYc6h#UbH>WI%Z!uS&fbiWx58rcZ+D(4W=5XFE-G9D93xE-i`)MMe~7? z*^10oY@?sjlRk&h_k$VNMScBqkPWS3=0QA>o6=NPpsCQLC$Ep7e1 zTj8deDjpMY_Ky~R?R;K6xl^8ycIQ#${oLD`YJD|tuNkBncQrM<8&N6pN$EY4 z_>-^iEYB3)QU|_ei~|&wB1P_nv0sxnUn7qK?iR=u5%Dt&&H_K7yXd3gTSI zIikBJT?h3%hrjm7rG*@cIFna==gXvKCFM}&EavVGH50=;{YxALJ^;sIo>sM^3e+oy zYM<3ixoohCo%F)jCy%4avpRb${au?DU}sDU4n36~ZVm{i-|q-9mm?mMsWLh-dBnQX zn(VFte2%Jh*l?v+XtTG8eRageGc+BVkkaE1cd2W`xL2gzEMajF@XX`|&D~%tc#8%n)V9THk>5CeE|BFE$Gj0d>dU^E zEz+g5L29a#KfQ2|T5T~&6A9gQZZmg09^*>Fl$p#dG~#VGCU&mxmoS%5 zs@a>i0rvC7&I%)brj~l?$s>weE=n^z`mNqB6{~=)NS&uO0=RRewr(&me z<=gih)6*N*gR9sa{dJ~(J4N+EVMa^|-t=gG#_Bh!r6EmE^n1W8 z$f@}rd`;H)>qd4~EJ)GfgFSvGXO`;Q|5D8ZI$CgnEEl(OT`rcmeaP!Z%a!PbCQI^t z&~Y*@`Z0R*cF7CMSEN`P))r2_D!a1KKy&G3OiJsQ!ILT6h{5wa%XAMf0BW!EE_8q1 z_o7oeb=;&&uNmakczfJl0vR^>DF1c*4%OL23=?ZE3C*dpH4pI4I$mtAH|e`pvh>;{ zdAGN@_uEdqR$nFfiM^m~?Jfvdb^6#oNhxruZf&ILk4la zp|{GOqAI~HU6f-lPCR#_+P=8nFzanhTsuh2*!P?Ne0Sni5wiN`)64KX8oMp2?U0h> z3O7IJ_A4F2!O^eM+WN<@VOWf^u+%g$rtU}v&jwy zBD>5lH7yWo?oRN!E!s^pff&Ncfr7P!>!bO`+N_9Ms#q(=qBN=uOmyA@ zGr^t3nasW}Mo5m9`}HtAsjnk@k92eS%;UTRx}F}NYZqKK z>}jdI6|IzTp!;y>sa8(K+2^JoUzNvrHjUNTg*M%`$9KtZN<7u&0#^@vOLDQyWj<)_ zN~vm3_SBkz@thvB$yFLKGk0*l#E8%(zM=S7^Pq#(RdV?!*;Ou`ZWq*44(Tj9?z2QF zxW@&vGMTL0Q;kBc#q5T&XQLP2&uQ2E7W4LJDn3vyNkY9|x^u93+XzUJ?&@=qt+1C5B00=7+tKSmd}5pDvDPKq@1aN-``as%JTlFCs6EIjK6p_+-y7=@U_qbt#M(u`g%(lsr#`jUW1^FjW9{}2kC94tB;x! z;KbqlYw)ltJ=e`ggS$l5&#N4a1UIJr?dEEB?k0@;7aNm5|IWIglKv*eTQhu^+o-#9 zm`{er>sry)?N&BdJ+wN(jM7WV)U}Qis))HTaAHP-!?Pj=uI?A_MO;H=R3meZTJ zHm+23vpAekvc>%1u6g063@!H8xI@_)Gx!pABrx;Lp(kX_OEFSL6Lf9*$WJkk`mlNm zX0eu|lnwdam|aX3aqlgHu40;~(HN}Z(%(KdmiCk@=G6Fq E0UXZ;MF0Q* literal 0 HcmV?d00001 diff --git a/src/components/AmountInput/index.vue b/src/components/AmountInput/index.vue new file mode 100644 index 0000000..bf0a75b --- /dev/null +++ b/src/components/AmountInput/index.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/AppLink/index.vue b/src/components/AppLink/index.vue new file mode 100644 index 0000000..43bbb30 --- /dev/null +++ b/src/components/AppLink/index.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..ea2b1af --- /dev/null +++ b/src/components/Breadcrumb/index.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/src/components/CURD/PageContent.vue b/src/components/CURD/PageContent.vue new file mode 100644 index 0000000..d36167e --- /dev/null +++ b/src/components/CURD/PageContent.vue @@ -0,0 +1,1023 @@ + + + + + diff --git a/src/components/CURD/PageForm.vue b/src/components/CURD/PageForm.vue new file mode 100644 index 0000000..0979019 --- /dev/null +++ b/src/components/CURD/PageForm.vue @@ -0,0 +1,174 @@ + + + diff --git a/src/components/CURD/PageModal.vue b/src/components/CURD/PageModal.vue new file mode 100644 index 0000000..214b28e --- /dev/null +++ b/src/components/CURD/PageModal.vue @@ -0,0 +1,425 @@ + + + + + diff --git a/src/components/CURD/PageSearch.vue b/src/components/CURD/PageSearch.vue new file mode 100644 index 0000000..f2baf1d --- /dev/null +++ b/src/components/CURD/PageSearch.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/src/components/CURD/types.ts b/src/components/CURD/types.ts new file mode 100644 index 0000000..229dc0b --- /dev/null +++ b/src/components/CURD/types.ts @@ -0,0 +1,272 @@ +import type { + DialogProps, + DrawerProps, + FormItemRule, + FormProps, + PaginationProps, + TableProps, + ColProps, +} from "element-plus"; +import PageContent from "./PageContent.vue"; +import PageForm from "./PageForm.vue"; +import PageModal from "./PageModal.vue"; +import PageSearch from "./PageSearch.vue"; + +export type PageSearchInstance = InstanceType; +export type PageContentInstance = InstanceType; +export type PageModalInstance = InstanceType; +export type PageFormInstance = InstanceType; + +export type IObject = Record; + +export interface IOperatData { + name: string; + row: IObject; + column: IObject; + $index: number; +} + +export interface ISearchConfig { + // 页面名称(参与组成权限标识,如sys:user:xxx) + pageName: string; + // 表单项 + formItems: Array<{ + // 组件类型(如input,select等) + type?: "input" | "select" | "tree-select" | "date-picker" | "input-tag"; + // 标签文本 + label: string; + // 标签提示 + tips?: string; + // 键名 + prop: string; + // 组件属性(input-tag组件支持join,btnText,size属性) + attrs?: IObject; + // 初始值 + initialValue?: any; + // 可选项(适用于select组件) + options?: { label: string; value: any }[]; + // 初始化数据函数扩展 + initFn?: (formItem: IObject) => void; + }>; + // 是否开启展开和收缩 + isExpandable?: boolean; + // 默认展示的表单项数量 + showNumber?: number; +} + +export interface IContentConfig { + // 页面名称(参与组成权限标识,如sys:user:xxx) + pageName: string; + // table组件属性 + table?: Omit, "data">; + // pagination组件属性 + pagination?: + | boolean + | Partial< + Omit< + PaginationProps, + "v-model:page-size" | "v-model:current-page" | "total" | "currentPage" + > + >; + // 列表的网络请求函数(需返回promise) + indexAction: (queryParams: T) => Promise; + // 默认的分页相关的请求参数 + request?: { + pageName: string; + limitName: string; + }; + // 数据格式解析的回调函数 + parseData?: (res: any) => { + total: number; + list: IObject[]; + [key: string]: any; + }; + // 修改属性的网络请求函数(需返回promise) + modifyAction?: (data: { + [key: string]: any; + field: string; + value: boolean | string | number; + }) => Promise; + // 删除的网络请求函数(需返回promise) + deleteAction?: (ids: string) => Promise; + // 后端导出的网络请求函数(需返回promise) + exportAction?: (queryParams: T) => Promise; + // 前端全量导出的网络请求函数(需返回promise) + exportsAction?: (queryParams: T) => Promise; + // 导入模板 + importTemplate?: string | (() => Promise); + // 后端导入的网络请求函数(需返回promise) + importAction?: (file: File) => Promise; + // 前端导入的网络请求函数(需返回promise) + importsAction?: (data: IObject[]) => Promise; + // 主键名(默认为id) + pk?: string; + // 表格工具栏(默认支持add,delete,export,也可自定义) + toolbar?: Array< + | "add" + | "delete" + | "import" + | "export" + | { + auth: string; + icon?: string; + name: string; + text: string; + type?: "primary" | "success" | "warning" | "danger" | "info"; + } + >; + // 表格工具栏右侧图标 + defaultToolbar?: Array< + | "refresh" + | "filter" + | "imports" + | "exports" + | "search" + | { + name: string; + icon: string; + title?: string; + auth?: string; + } + >; + // table组件列属性(额外的属性templet,operat,slotName) + cols: Array<{ + type?: "default" | "selection" | "index" | "expand"; + label?: string; + prop?: string; + width?: string | number; + align?: "left" | "center" | "right"; + columnKey?: string; + reserveSelection?: boolean; + // 列是否显示 + show?: boolean; + // 模板 + templet?: + | "image" + | "list" + | "url" + | "switch" + | "input" + | "price" + | "percent" + | "icon" + | "date" + | "tool" + | "custom"; + // image模板相关参数 + imageWidth?: number; + imageHeight?: number; + // list模板相关参数 + selectList?: IObject; + // switch模板相关参数 + activeValue?: boolean | string | number; + inactiveValue?: boolean | string | number; + activeText?: string; + inactiveText?: string; + // input模板相关参数 + inputType?: string; + // price模板相关参数 + priceFormat?: string; + // date模板相关参数 + dateFormat?: string; + // tool模板相关参数 + operat?: Array< + | "edit" + | "delete" + | { + auth: string; + icon?: string; + name: string; + text: string; + type?: "primary" | "success" | "warning" | "danger" | "info"; + render?: (row: IObject) => boolean; + } + >; + // filter值拼接符 + filterJoin?: string; + [key: string]: any; + // 初始化数据函数 + initFn?: (item: IObject) => void; + }>; +} + +export interface IModalConfig { + // 页面名称 + pageName?: string; + // 主键名(主要用于编辑数据,默认为id) + pk?: string; + // 组件类型 + component?: "dialog" | "drawer"; + // dialog组件属性 + dialog?: Partial>; + // drawer组件属性 + drawer?: Partial>; + // form组件属性 + form?: IForm; + // 表单项 + formItems: IFormItems; + // 提交之前处理 + beforeSubmit?: (data: T) => void; + // 提交的网络请求函数(需返回promise) + formAction: (data: T) => Promise; +} + +export type IForm = Partial>; + +// 表单项 +export type IFormItems = Array<{ + // 组件类型(如input,select,radio,custom等,默认input) + type?: + | "input" + | "select" + | "radio" + | "switch" + | "checkbox" + | "tree-select" + | "date-picker" + | "input-number" + | "text" + | "custom"; + // 组件属性 + attrs?: IObject; + // 组件可选项(适用于select,radio,checkbox组件) + options?: Array<{ + label: string; + value: any; + disabled?: boolean; + [key: string]: any; + }>; + // 插槽名(适用于组件类型为custom) + slotName?: string; + // 标签文本 + label: string; + // 标签提示 + tips?: string; + // 键名 + prop: string; + // 验证规则 + rules?: FormItemRule[]; + // 初始值 + initialValue?: any; + // 是否隐藏 + hidden?: boolean; + // layout组件Col属性 + col?: Partial; + // 监听函数 + watch?: (newValue: any, oldValue: any, data: T, items: IObject[]) => void; + // 计算属性函数 + computed?: (data: T) => any; + // 监听收集函数 + watchEffect?: (data: T) => void; + // 初始化数据函数扩展 + initFn?: (item: IObject) => void; +}>; + +export interface IPageForm { + // 主键名(主要用于编辑数据,默认为id) + pk?: string; + // form组件属性 + form?: IForm; + // 表单项 + formItems: IFormItems; +} diff --git a/src/components/CURD/usePage.ts b/src/components/CURD/usePage.ts new file mode 100644 index 0000000..4d410ce --- /dev/null +++ b/src/components/CURD/usePage.ts @@ -0,0 +1,73 @@ +import { ref } from "vue"; +import type { + IObject, + PageContentInstance, + PageModalInstance, + PageSearchInstance, +} from "./types"; + +function usePage() { + const searchRef = ref(); + const contentRef = ref(); + const addModalRef = ref(); + const editModalRef = ref(); + + // 搜索 + function handleQueryClick(queryParams: IObject) { + const filterParams = contentRef.value?.getFilterParams(); + contentRef.value?.fetchPageData({ ...queryParams, ...filterParams }, true); + } + // 重置 + function handleResetClick(queryParams: IObject) { + const filterParams = contentRef.value?.getFilterParams(); + contentRef.value?.fetchPageData({ ...queryParams, ...filterParams }, true); + } + // 新增 + function handleAddClick() { + //显示添加表单 + addModalRef.value?.setModalVisible(); + } + // 编辑 + function handleEditClick(row: IObject) { + //显示编辑表单 根据数据进行填充 + editModalRef.value?.setModalVisible(row); + } + // 表单提交 + function handleSubmitClick() { + //根据检索条件刷新列表数据 + const queryParams = searchRef.value?.getQueryParams(); + contentRef.value?.fetchPageData(queryParams, true); + } + // 导出 + function handleExportClick() { + // 根据检索条件导出数据 + const queryParams = searchRef.value?.getQueryParams(); + contentRef.value?.exportPageData(queryParams); + } + // 搜索显隐 + function handleSearchClick() { + searchRef.value?.toggleVisible(); + } + // 涮选数据 + function handleFilterChange(filterParams: IObject) { + const queryParams = searchRef.value?.getQueryParams(); + contentRef.value?.fetchPageData({ ...queryParams, ...filterParams }, true); + } + + return { + searchRef, + contentRef, + addModalRef, + editModalRef, + handleQueryClick, + handleResetClick, + handleAddClick, + handleEditClick, + handleSubmitClick, + handleExportClick, + handleSearchClick, + handleFilterChange, + }; +} + +export default usePage; diff --git a/src/components/CopyButton/index.vue b/src/components/CopyButton/index.vue new file mode 100644 index 0000000..8e88435 --- /dev/null +++ b/src/components/CopyButton/index.vue @@ -0,0 +1,62 @@ + + + + diff --git a/src/components/Dictionary/index.vue b/src/components/Dictionary/index.vue new file mode 100644 index 0000000..763c2c6 --- /dev/null +++ b/src/components/Dictionary/index.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/GithubCorner/index.vue b/src/components/GithubCorner/index.vue new file mode 100644 index 0000000..7f91959 --- /dev/null +++ b/src/components/GithubCorner/index.vue @@ -0,0 +1,62 @@ + + + diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue new file mode 100644 index 0000000..6ab2eb6 --- /dev/null +++ b/src/components/Hamburger/index.vue @@ -0,0 +1,39 @@ + + + + diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue new file mode 100644 index 0000000..e74aa44 --- /dev/null +++ b/src/components/IconSelect/index.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/src/components/IcpBar/index.vue b/src/components/IcpBar/index.vue new file mode 100644 index 0000000..a7ed859 --- /dev/null +++ b/src/components/IcpBar/index.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue new file mode 100644 index 0000000..2f35582 --- /dev/null +++ b/src/components/LangSelect/index.vue @@ -0,0 +1,47 @@ + + + diff --git a/src/components/LoginDialog/index.vue b/src/components/LoginDialog/index.vue new file mode 100644 index 0000000..1ae461e --- /dev/null +++ b/src/components/LoginDialog/index.vue @@ -0,0 +1,472 @@ + + + + + diff --git a/src/components/MenuSearch/index.vue b/src/components/MenuSearch/index.vue new file mode 100644 index 0000000..0fc8afa --- /dev/null +++ b/src/components/MenuSearch/index.vue @@ -0,0 +1,143 @@ + + + + diff --git a/src/components/MsgTip/index.vue b/src/components/MsgTip/index.vue new file mode 100644 index 0000000..db3a172 --- /dev/null +++ b/src/components/MsgTip/index.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue new file mode 100644 index 0000000..c080e60 --- /dev/null +++ b/src/components/Pagination/index.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/src/components/SendCodeButton/index.vue b/src/components/SendCodeButton/index.vue new file mode 100644 index 0000000..a266481 --- /dev/null +++ b/src/components/SendCodeButton/index.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue new file mode 100644 index 0000000..d3e83fe --- /dev/null +++ b/src/components/SizeSelect/index.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..0fdd735 --- /dev/null +++ b/src/components/SvgIcon/index.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/components/TableSelect/index.vue b/src/components/TableSelect/index.vue new file mode 100644 index 0000000..28ad4b6 --- /dev/null +++ b/src/components/TableSelect/index.vue @@ -0,0 +1,371 @@ + + + + + diff --git a/src/components/TopBar/index.vue b/src/components/TopBar/index.vue new file mode 100644 index 0000000..374a9d8 --- /dev/null +++ b/src/components/TopBar/index.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/src/components/Upload/FileUpload.vue b/src/components/Upload/FileUpload.vue new file mode 100644 index 0000000..7c8251b --- /dev/null +++ b/src/components/Upload/FileUpload.vue @@ -0,0 +1,331 @@ + + + + diff --git a/src/components/Upload/ImageUpload.vue b/src/components/Upload/ImageUpload.vue new file mode 100644 index 0000000..0c8428b --- /dev/null +++ b/src/components/Upload/ImageUpload.vue @@ -0,0 +1,280 @@ + + + + diff --git a/src/components/WangEditor/index.vue b/src/components/WangEditor/index.vue new file mode 100644 index 0000000..aae60c8 --- /dev/null +++ b/src/components/WangEditor/index.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/src/directive/index.ts b/src/directive/index.ts new file mode 100644 index 0000000..9c22eb6 --- /dev/null +++ b/src/directive/index.ts @@ -0,0 +1,9 @@ +import type { App } from "vue"; + +import { hasPerm } from "./permission"; + +// 全局注册 directive +export function setupDirective(app: App) { + // 使 v-hasPerm 在所有组件中都可用 + app.directive("hasPerm", hasPerm); +} diff --git a/src/directive/permission/index.ts b/src/directive/permission/index.ts new file mode 100644 index 0000000..7a080e3 --- /dev/null +++ b/src/directive/permission/index.ts @@ -0,0 +1,38 @@ +import { hasAuth } from "@/plugins/permission"; +import { Directive, DirectiveBinding } from "vue"; + +/** + * 按钮权限 + */ +export const hasPerm: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + // DOM绑定需要的按钮权限标识 + const { value: requiredPerms } = binding; + if (requiredPerms) { + if (!hasAuth(requiredPerms)) { + el.parentNode && el.parentNode.removeChild(el); + } + } else { + throw new Error( + "need perms! Like v-has-perm=\"['sys:user:add','sys:user:edit']\"" + ); + } + }, +}; + +/** + * 角色权限 + */ +export const hasRole: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + // DOM绑定需要的角色编码 + const { value: requiredRoles } = binding; + if (requiredRoles) { + if (!hasAuth(requiredRoles, "role")) { + el.parentNode && el.parentNode.removeChild(el); + } + } else { + throw new Error("need roles! Like v-has-role=\"['admin','test']\""); + } + }, +}; diff --git a/src/enums/CacheEnum.ts b/src/enums/CacheEnum.ts new file mode 100644 index 0000000..f3c434b --- /dev/null +++ b/src/enums/CacheEnum.ts @@ -0,0 +1,4 @@ +/** + * 令牌缓存Key + */ +export const TOKEN_KEY = "accessToken"; diff --git a/src/enums/DeviceEnum.ts b/src/enums/DeviceEnum.ts new file mode 100644 index 0000000..709bcb3 --- /dev/null +++ b/src/enums/DeviceEnum.ts @@ -0,0 +1,14 @@ +/** + * 设备枚举 + */ +export const enum DeviceEnum { + /** + * 宽屏设备 + */ + DESKTOP = "desktop", + + /** + * 窄屏设备 + */ + MOBILE = "mobile", +} diff --git a/src/enums/DocumentTypeEnum.ts b/src/enums/DocumentTypeEnum.ts new file mode 100644 index 0000000..f4df798 --- /dev/null +++ b/src/enums/DocumentTypeEnum.ts @@ -0,0 +1,22 @@ +export const DocumentType = [ + { + value: 1, + label: "身份证", + }, + { + value: 2, + label: "营业执照", + }, + { + value: 3, + label: "学生证", + }, + { + value: 4, + label: "士兵证", + }, + { + value: 5, + label: "护照", + }, +]; diff --git a/src/enums/FormTypeEnum.ts b/src/enums/FormTypeEnum.ts new file mode 100644 index 0000000..583c33a --- /dev/null +++ b/src/enums/FormTypeEnum.ts @@ -0,0 +1,14 @@ +/** + * 表单类型枚举 + */ +export const FormTypeEnum: Record = { + INPUT: { value: 1, label: "输入框" }, + SELECT: { value: 2, label: "下拉框" }, + RADIO: { value: 3, label: "单选框" }, + CHECK_BOX: { value: 4, label: "复选框" }, + INPUT_NUMBER: { value: 5, label: "数字输入框" }, + SWITCH: { value: 6, label: "开关" }, + TEXT_AREA: { value: 7, label: "文本域" }, + DATE: { value: 8, label: "日期框" }, + DATE_TIME: { value: 9, label: "日期时间框" }, +}; diff --git a/src/enums/LanguageEnum.ts b/src/enums/LanguageEnum.ts new file mode 100644 index 0000000..a50b655 --- /dev/null +++ b/src/enums/LanguageEnum.ts @@ -0,0 +1,14 @@ +/** + * 语言枚举 + */ +export const enum LanguageEnum { + /** + * 中文 + */ + ZH_CN = "zh-cn", + + /** + * 英文 + */ + EN = "en", +} diff --git a/src/enums/LayoutEnum.ts b/src/enums/LayoutEnum.ts new file mode 100644 index 0000000..68be72e --- /dev/null +++ b/src/enums/LayoutEnum.ts @@ -0,0 +1,18 @@ +/** + * 菜单布局枚举 + */ +export const enum LayoutEnum { + /** + * 左侧菜单布局 + */ + LEFT = "left", + /** + * 顶部菜单布局 + */ + TOP = "top", + + /** + * 混合菜单布局 + */ + MIX = "mix", +} diff --git a/src/enums/MenuTypeEnum.ts b/src/enums/MenuTypeEnum.ts new file mode 100644 index 0000000..b69942f --- /dev/null +++ b/src/enums/MenuTypeEnum.ts @@ -0,0 +1,22 @@ +/** + * 菜单类型枚举 + */ +export const enum MenuTypeEnum { + /** + * 目录 + */ + CATALOG = "CATALOG", + /** + * 菜单 + */ + MENU = "MENU", + + /** + * 按钮 + */ + BUTTON = "BUTTON", + /** + * 外链 + */ + EXTLINK = "EXTLINK", +} diff --git a/src/enums/MessageTypeEnum.ts b/src/enums/MessageTypeEnum.ts new file mode 100644 index 0000000..16a3c97 --- /dev/null +++ b/src/enums/MessageTypeEnum.ts @@ -0,0 +1,36 @@ +/* 消息类型枚举 */ +export const enum MessageTypeEnum { + /* 公告 */ + NOTICE = 0, + /* 通知 */ + MESSAGE = 1, +} + +export const MessageTypeLabels = { + [MessageTypeEnum.NOTICE]: "公告", + [MessageTypeEnum.MESSAGE]: "通知", +}; + +export const MessageType = [ + { + value: 0, + label: "公告", + }, + { + value: 1, + label: "通知", + }, +]; + +export const rgbFind = /rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\)/gi; +const rgbParse = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/i; +export function rgb2Hex(match: string) { + const parts = match.match(rgbParse); + if (parts?.length == 4) { + const r = parseInt(parts[1]); + const g = parseInt(parts[2]); + const b = parseInt(parts[3]); + return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); + } + return match; +} diff --git a/src/enums/NoticeTypeEnum.ts b/src/enums/NoticeTypeEnum.ts new file mode 100644 index 0000000..49c0f8e --- /dev/null +++ b/src/enums/NoticeTypeEnum.ts @@ -0,0 +1,30 @@ +/* 通知类型枚举 */ +export const enum NoticeTypeEnum { + /** 系统升级 */ + SYSTEM_UPGRADE = "SYSTEM_UPGRADE", + /** 系统维护 */ + SYSTEM_MAINTENANCE = "SYSTEM_MAINTENANCE", + /** 安全警告 */ + SECURITY_ALERT = "SECURITY_ALERT", + /** 假期通知 */ + HOLIDAY_NOTICE = "HOLIDAY_NOTICE", + /** 公司新闻 */ + COMPANY_NEWS = "COMPANY_NEWS", + /** 其他通知 */ + OTHER = "OTHER", +} + +// 定义标签映射 +const NoticeTypeLabels: Record = { + [NoticeTypeEnum.SYSTEM_UPGRADE]: "系统升级", + [NoticeTypeEnum.SYSTEM_MAINTENANCE]: "系统维护", + [NoticeTypeEnum.SECURITY_ALERT]: "安全警告", + [NoticeTypeEnum.HOLIDAY_NOTICE]: "假期通知", + [NoticeTypeEnum.COMPANY_NEWS]: "公司新闻", + [NoticeTypeEnum.OTHER]: "其他通知", +}; + +// 导出获取标签函数 +export const getNoticeLabel = (type: NoticeTypeEnum): string => { + return NoticeTypeLabels[type] || ""; +}; diff --git a/src/enums/QueryTypeEnum.ts b/src/enums/QueryTypeEnum.ts new file mode 100644 index 0000000..253efc0 --- /dev/null +++ b/src/enums/QueryTypeEnum.ts @@ -0,0 +1,37 @@ +/** + * 查询类型枚举 + */ +export const QueryTypeEnum: Record = { + /** 等于 */ + EQ: { value: 1, label: "=" }, + + /** 模糊匹配 */ + LIKE: { value: 2, label: "LIKE '%s%'" }, + + /** 包含 */ + IN: { value: 3, label: "IN" }, + + /** 范围 */ + BETWEEN: { value: 4, label: "BETWEEN" }, + + /** 大于 */ + GT: { value: 5, label: ">" }, + + /** 大于等于 */ + GE: { value: 6, label: ">=" }, + + /** 小于 */ + LT: { value: 7, label: "<" }, + + /** 小于等于 */ + LE: { value: 8, label: "<=" }, + + /** 不等于 */ + NE: { value: 9, label: "!=" }, + + /** 左模糊匹配 */ + LIKE_LEFT: { value: 10, label: "LIKE '%s'" }, + + /** 右模糊匹配 */ + LIKE_RIGHT: { value: 11, label: "LIKE 's%'" }, +}; diff --git a/src/enums/ResultEnum.ts b/src/enums/ResultEnum.ts new file mode 100644 index 0000000..6e3f931 --- /dev/null +++ b/src/enums/ResultEnum.ts @@ -0,0 +1,23 @@ +/** + * 响应码枚举 + */ +export const enum ResultEnum { + /** + * 成功 + */ + SUCCESS = "00000", + /** + * 错误 + */ + ERROR = "B0001", + + /** + * 令牌无效或过期 + */ + TOKEN_INVALID = "A0230", + + /** + * 用户已注册 + */ + USER_NAME_EXISTED = "A0206", +} diff --git a/src/enums/SidebarStatusEnum.ts b/src/enums/SidebarStatusEnum.ts new file mode 100644 index 0000000..a0d877a --- /dev/null +++ b/src/enums/SidebarStatusEnum.ts @@ -0,0 +1,14 @@ +/** + * 侧边栏状态枚举 + */ +export const enum SidebarStatusEnum { + /** + * 展开 + */ + OPENED = "opened", + + /** + * 关闭 + */ + CLOSED = "closed", +} diff --git a/src/enums/SizeEnum.ts b/src/enums/SizeEnum.ts new file mode 100644 index 0000000..e91e913 --- /dev/null +++ b/src/enums/SizeEnum.ts @@ -0,0 +1,19 @@ +/** + * 布局大小枚举 + */ +export const enum SizeEnum { + /** + * 默认 + */ + DEFAULT = "default", + + /** + * 大型 + */ + LARGE = "large", + + /** + * 小型 + */ + SMALL = "small", +} diff --git a/src/enums/SoftwareEnum.ts b/src/enums/SoftwareEnum.ts new file mode 100644 index 0000000..20fbb55 --- /dev/null +++ b/src/enums/SoftwareEnum.ts @@ -0,0 +1,81 @@ +export interface ColoredType { + color: string; + value: number; + label: string; +} + +export const softwareTypes: ColoredType[] = [ + { + color: "#6222C9", + value: 0, + label: "风格工具", + }, + { + color: "#000", + value: 1, + label: "", + }, + { + color: "#E63415", + value: 2, + label: "唱作魔方", + }, + { + color: "#1EC79D", + value: 3, + label: "唱作魔方Pro", + }, + { + color: "#4167F0", + value: 4, + label: "唱作网App", + }, +]; + +export const innerTypes: ColoredType[] = [ + { + color: "#E63415", + value: 0, + label: "ac_win", + }, + { + color: "#42A2F0", + value: 1, + label: "cz_android", + }, + { + color: "#4167F0", + value: 2, + label: "cz_iOS", + }, + { + color: "#FF6600", + value: 3, + label: "ac_android", + }, + { + color: "#F05650", + value: 4, + label: "ac_iOS", + }, + { + color: "#000", + value: 5, + label: "web", + }, + { + color: "#1EC79D", + value: 6, + label: "pro_win", + }, + { + color: "#6222C9", + value: 7, + label: "styleTool", + }, + { + color: "#14CCCC", + value: 8, + label: "proLite", + }, +]; diff --git a/src/enums/ThemeEnum.ts b/src/enums/ThemeEnum.ts new file mode 100644 index 0000000..91458e1 --- /dev/null +++ b/src/enums/ThemeEnum.ts @@ -0,0 +1,18 @@ +/** + * 主题枚举 + */ +export const enum ThemeEnum { + /** + * 明亮主题 + */ + LIGHT = "light", + /** + * 暗黑主题 + */ + DARK = "dark", + + /** + * 系统自动 + */ + AUTO = "auto", +} diff --git a/src/lang/index.ts b/src/lang/index.ts new file mode 100644 index 0000000..ec3e6cc --- /dev/null +++ b/src/lang/index.ts @@ -0,0 +1,31 @@ +import type { App } from "vue"; +import { createI18n } from "vue-i18n"; +import { useAppStoreHook } from "@/store/modules/app"; +// 本地语言包 +import enLocale from "./package/en"; +import zhCnLocale from "./package/zh-cn"; + +const appStore = useAppStoreHook(); + +const messages = { + "zh-cn": { + ...zhCnLocale, + }, + en: { + ...enLocale, + }, +}; + +const i18n = createI18n({ + legacy: false, + locale: appStore.language, + messages: messages, + globalInjection: true, +}); + +// 全局注册 i18n +export function setupI18n(app: App) { + app.use(i18n); +} + +export default i18n; diff --git a/src/lang/package/en.ts b/src/lang/package/en.ts new file mode 100644 index 0000000..c1085bd --- /dev/null +++ b/src/lang/package/en.ts @@ -0,0 +1,64 @@ +import { register } from "module"; + +export default { + // 路由国际化 + route: { + dashboard: "Dashboard", + document: "Document", + }, + // 登录页面国际化 + login: { + username: "Username", + password: "Password", + login: "Login", + register: "Register", + captchaCode: "Verify Code", + capsLock: "Caps Lock is On", + message: { + username: { + required: "Please enter Username", + }, + password: { + required: "Please enter Password", + min: "The password can not be less than 6 digits", + }, + captchaCode: { + required: "Please enter Verify Code", + }, + }, + }, + // 导航栏国际化 + navbar: { + dashboard: "Dashboard", + logout: "Logout", + document: "Document", + gitee: "Gitee", + system: "SystemAdmin", + website: "WebsiteAdmin", + }, + sizeSelect: { + tooltip: "Layout Size", + default: "Default", + large: "Large", + small: "Small", + message: { + success: "Switch Layout Size Successful!", + }, + }, + langSelect: { + message: { + success: "Switch Language Successful!", + }, + }, + settings: { + project: "Project Settings", + theme: "Theme", + interface: "Interface", + navigation: "Navigation", + themeColor: "Theme Color", + tagsView: "Tags View", + fixedHeader: "Fixed Header", + sidebarLogo: "Sidebar Logo", + watermark: "Watermark", + }, +}; diff --git a/src/lang/package/zh-cn.ts b/src/lang/package/zh-cn.ts new file mode 100644 index 0000000..1d9e4a5 --- /dev/null +++ b/src/lang/package/zh-cn.ts @@ -0,0 +1,63 @@ +export default { + // 路由国际化 + route: { + dashboard: "首页", + document: "项目文档", + }, + // 登录页面国际化 + login: { + username: "用户名", + password: "密码", + login: "登 录", + register: "注 册", + captchaCode: "验证码", + capsLock: "大写锁定已打开", + message: { + username: { + required: "请输入用户名", + }, + password: { + required: "请输入密码", + min: "密码不能少于6位", + }, + captchaCode: { + required: "请输入验证码", + }, + }, + }, + // 导航栏国际化 + navbar: { + dashboard: "首页", + logout: "退出登录", + document: "项目文档", + gitee: "项目地址", + account: "账户管理", + system: "系统管理", + website: "网站管理", + }, + sizeSelect: { + tooltip: "布局大小", + default: "默认", + large: "大型", + small: "小型", + message: { + success: "切换布局大小成功!", + }, + }, + langSelect: { + message: { + success: "切换语言成功!", + }, + }, + settings: { + project: "项目配置", + theme: "主题设置", + interface: "界面设置", + navigation: "导航设置", + themeColor: "主题颜色", + tagsView: "开启 Tags-View", + fixedHeader: "固定 Header", + sidebarLogo: "侧边栏 Logo", + watermark: "开启水印", + }, +}; diff --git a/src/layout/components/AppMain/index.vue b/src/layout/components/AppMain/index.vue new file mode 100644 index 0000000..93f4a79 --- /dev/null +++ b/src/layout/components/AppMain/index.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/layout/components/NavBar/components/NavbarAction.vue b/src/layout/components/NavBar/components/NavbarAction.vue new file mode 100644 index 0000000..0e23e27 --- /dev/null +++ b/src/layout/components/NavBar/components/NavbarAction.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/layout/components/NavBar/index.vue b/src/layout/components/NavBar/index.vue new file mode 100644 index 0000000..3759f16 --- /dev/null +++ b/src/layout/components/NavBar/index.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/layout/components/Settings/components/LayoutSelect.vue b/src/layout/components/Settings/components/LayoutSelect.vue new file mode 100644 index 0000000..0b880c1 --- /dev/null +++ b/src/layout/components/Settings/components/LayoutSelect.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/layout/components/Settings/components/ThemeColorPicker.vue b/src/layout/components/Settings/components/ThemeColorPicker.vue new file mode 100644 index 0000000..5a0d59c --- /dev/null +++ b/src/layout/components/Settings/components/ThemeColorPicker.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue new file mode 100644 index 0000000..619f3c3 --- /dev/null +++ b/src/layout/components/Settings/index.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/layout/components/Sidebar/components/SidebarLogo.vue b/src/layout/components/Sidebar/components/SidebarLogo.vue new file mode 100644 index 0000000..4da1795 --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarLogo.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/src/layout/components/Sidebar/components/SidebarMenu.vue b/src/layout/components/Sidebar/components/SidebarMenu.vue new file mode 100644 index 0000000..526a24c --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarMenu.vue @@ -0,0 +1,89 @@ + + + + diff --git a/src/layout/components/Sidebar/components/SidebarMenuItem.vue b/src/layout/components/Sidebar/components/SidebarMenuItem.vue new file mode 100644 index 0000000..e45ec8d --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarMenuItem.vue @@ -0,0 +1,202 @@ + + + + diff --git a/src/layout/components/Sidebar/components/SidebarMenuItemTitle.vue b/src/layout/components/Sidebar/components/SidebarMenuItemTitle.vue new file mode 100644 index 0000000..06bfef1 --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarMenuItemTitle.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/layout/components/Sidebar/components/SidebarMixTopMenu.vue b/src/layout/components/Sidebar/components/SidebarMixTopMenu.vue new file mode 100644 index 0000000..6c43115 --- /dev/null +++ b/src/layout/components/Sidebar/components/SidebarMixTopMenu.vue @@ -0,0 +1,88 @@ + + + + diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..59c6b6b --- /dev/null +++ b/src/layout/components/Sidebar/index.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue new file mode 100644 index 0000000..32dede7 --- /dev/null +++ b/src/layout/components/TagsView/index.vue @@ -0,0 +1,433 @@ + + + + + diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..1763da9 --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..a301662 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,18 @@ +import { createApp } from "vue"; +import App from "./App.vue"; +import setupPlugins from "@/plugins"; +import VueQrcode from "vue-qrcode"; + +// 本地SVG图标 +import "virtual:svg-icons-register"; + +// 样式 +import "uno.css"; +import "element-plus/theme-chalk/dark/css-vars.css"; +import "@/styles/index.scss"; +import "animate.css"; + +const app = createApp(App); +app.use(setupPlugins); +app.component("vue-qrcode", VueQrcode); +app.mount("#app"); diff --git a/src/plugins/icons.ts b/src/plugins/icons.ts new file mode 100644 index 0000000..fa85ba1 --- /dev/null +++ b/src/plugins/icons.ts @@ -0,0 +1,9 @@ +import type { App } from "vue"; +import * as ElementPlusIconsVue from "@element-plus/icons-vue"; + +// 注册所有图标 +export function setupElIcons(app: App) { + for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component); + } +} diff --git a/src/plugins/index.ts b/src/plugins/index.ts new file mode 100644 index 0000000..611f601 --- /dev/null +++ b/src/plugins/index.ts @@ -0,0 +1,24 @@ +import type { App } from "vue"; +import { setupDirective } from "@/directive"; +import { setupI18n } from "@/lang"; +import { setupRouter } from "@/router"; +import { setupStore } from "@/store"; +import { setupElIcons } from "./icons"; +import { setupPermission } from "./permission"; + +export default { + install(app: App) { + // 自定义指令(directive) + setupDirective(app); + // 路由(router) + setupRouter(app); + // 状态管理(store) + setupStore(app); + // 国际化 + setupI18n(app); + // Element-plus图标 + setupElIcons(app); + // 路由守卫 + setupPermission(); + }, +}; diff --git a/src/plugins/permission.ts b/src/plugins/permission.ts new file mode 100644 index 0000000..9f85a21 --- /dev/null +++ b/src/plugins/permission.ts @@ -0,0 +1,111 @@ +import { NavigationGuardNext, RouteLocationNormalized, RouteRecordRaw } from "vue-router"; + +import NProgress from "@/utils/nprogress"; +import { TOKEN_KEY } from "@/enums/CacheEnum"; +import router from "@/router"; +import { usePermissionStore, useUserStore } from "@/store"; + +export function setupPermission() { + // 白名单路由 + const whiteList = ["/software", "/helper"]; + + const allowPath = (path: string) => { + return whiteList.some((item) => { + return path == item || path.indexOf(item + "/") >= 0; + }); + }; + + router.beforeEach(async (to, from, next) => { + NProgress.start(); + + if (to.path.indexOf("/autoLogin") >= 0 || to.path.indexOf("/resetPassword") >= 0) { + next(); + return; + } + + const hasToken = localStorage.getItem(TOKEN_KEY); + if (hasToken) { + // if (to.path === "/software") { + // // 如果已登录,跳转到首页 + // next({ path: "/" }); + // NProgress.done(); + // } else { + const userStore = useUserStore(); + if (hasToken != userStore.sessionToken) { + // console.log(hasToken); + // console.log(userStore.sessionToken); + userStore.sessionToken = hasToken; + userStore.clearUser(); + } + + const hasRoles = userStore.user.roles && userStore.user.roles.length > 0; + if (hasRoles) { + // 如果未匹配到任何路由,跳转到404页面 + if (to.matched.length === 0) { + next(from.name ? { name: from.name } : "/404"); + } else { + // 如果路由参数中有 title,覆盖路由元信息中的 title + const title = (to.params.title as string) || (to.query.title as string); + if (title) { + to.meta.title = title; + } + next(); + } + } else { + const permissionStore = usePermissionStore(); + try { + await userStore.getUserInfo(); + const dynamicRoutes = await permissionStore.generateRoutes(); + dynamicRoutes.forEach((route: RouteRecordRaw) => router.addRoute(route)); + + userStore.getAccountInfo(); + userStore.getLatestMessage(); + + next({ ...to, replace: true }); + } catch (error) { + // 移除 token 并重定向到登录页,携带当前页面路由作为跳转参数 + await userStore.resetToken(); + redirectToLogin(to, next); + NProgress.done(); + } + } + // } + } else { + // 未登录 + if (allowPath(to.path)) { + // console.log("good path"); + next(); // 在白名单,直接进入 + } else { + // 不在白名单,重定向到登录页 + redirectToLogin(to, next); + NProgress.done(); + } + } + }); + + router.afterEach(() => { + NProgress.done(); + }); +} + +/** 重定向到登录页 */ +function redirectToLogin(to: RouteLocationNormalized, next: NavigationGuardNext) { + const params = new URLSearchParams(to.query as Record); + const queryString = params.toString(); + const redirect = queryString ? `${to.path}?${queryString}` : to.path; + next(`/software`); + // next(`/software?redirect=${encodeURIComponent(redirect)}`); +} + +/** 判断是否有权限 */ +export function hasAuth(value: string | string[], type: "button" | "role" = "button") { + const { roles, perms } = useUserStore().user; + + // 超级管理员 拥有所有权限 + if (type === "button" && roles.includes("ROOT")) { + return true; + } + + const auths = type === "button" ? perms : roles; + return typeof value === "string" ? auths.includes(value) : value.some((perm) => auths.includes(perm)); +} diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..94f4b3d --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,168 @@ +import path from "path"; +import type { App } from "vue"; +import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router"; + +export const Layout = () => import("@/layout/index.vue"); + +// 静态路由 +export const constantRoutes: RouteRecordRaw[] = [ + { + path: "/redirect", + component: Layout, + meta: { hidden: true }, + children: [ + { + path: "/redirect/:path(.*)", + component: () => import("@/views/redirect/index.vue"), + }, + ], + }, + { + path: "/autoLogin", + name: "AutoLogin", + component: () => import("@/views/autoLogin/index.vue"), + meta: { hidden: true }, + }, + { + path: "/software", + name: "Software", + component: () => import("@/views/software/index.vue"), + meta: { hidden: true }, + children: [ + { + path: "id/:id/os/:os", + component: () => import("@/views/software/index.vue"), + children: [{ path: "fonts/:fonts", component: () => import("@/views/software/index.vue") }], + }, + ], + }, + { + path: "/helper", + name: "Helper", + component: () => import("@/views/helper/index.vue"), + meta: { hidden: true }, + children: [ + { + path: "id/:id", + component: () => import("@/views/helper/index.vue"), + }, + { + path: "page/:page", + component: () => import("@/views/helper/index.vue"), + }, + ], + }, + { + path: "/resetPassword", + name: "ResetPassword", + component: () => import("@/views/resetPassword/index.vue"), + meta: { hidden: true }, + }, + { + path: "/", + name: "/", + component: Layout, + redirect: "/software", + children: [ + { + path: "dashboard", + component: () => import("@/views/dashboard/index.vue"), + // 用于 keep-alive 功能,需要与 SFC 中自动推导或显式声明的组件名称一致 + // 参考文档: https://cn.vuejs.org/guide/built-ins/keep-alive.html#include-exclude + name: "Dashboard", + meta: { + title: "账号信息", + icon: "homepage", + affix: true, + keepAlive: true, + }, + }, + { + path: "401", + component: () => import("@/views/error-page/401.vue"), + meta: { hidden: true }, + }, + { + path: "404", + component: () => import("@/views/error-page/404.vue"), + meta: { hidden: true }, + }, + ], + }, + + // 外部链接 + // { + // path: "/external-link", + // component: Layout, + // children: [ { + // component: () => import("@/views/external-link/index.vue"), + // path: "https://www.cnblogs.com/haoxianrui/", + // meta: { title: "外部链接", icon: "link" }, + // }, + // ], + // }, + // 多级嵌套路由 + /* { + path: '/nested', + component: Layout, + redirect: '/nested/level1/level2', + name: 'Nested', + meta: {title: '多级菜单', icon: 'nested'}, + children: [ + { + path: 'level1', + component: () => import('@/views/nested/level1/index.vue'), + name: 'Level1', + meta: {title: '菜单一级'}, + redirect: '/nested/level1/level2', + children: [ + { + path: 'level2', + component: () => import('@/views/nested/level1/level2/index.vue'), + name: 'Level2', + meta: {title: '菜单二级'}, + redirect: '/nested/level1/level2/level3', + children: [ + { + path: 'level3-1', + component: () => import('@/views/nested/level1/level2/level3/index1.vue'), + name: 'Level3-1', + meta: {title: '菜单三级-1'} + }, + { + path: 'level3-2', + component: () => import('@/views/nested/level1/level2/level3/index2.vue'), + name: 'Level3-2', + meta: {title: '菜单三级-2'} + } + ] + } + ] + }, + ] + }*/ +]; + +/** + * 创建路由 + */ +const router = createRouter({ + history: createWebHistory(), // createWebHashHistory(), + routes: constantRoutes, + // 刷新时,滚动条位置还原 + scrollBehavior: () => ({ left: 0, top: 0 }), +}); + +// 全局注册 router +export function setupRouter(app: App) { + app.use(router); +} + +/** + * 重置路由 + */ +export function resetRouter() { + router.replace({ path: "/index" }); +} + +export default router; diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..f6b4d30 --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,26 @@ +import { SizeEnum } from "./enums/SizeEnum"; +import { LayoutEnum } from "./enums/LayoutEnum"; +import { ThemeEnum } from "./enums/ThemeEnum"; +import { LanguageEnum } from "./enums/LanguageEnum"; + +const { pkg } = __APP_INFO__; + +const mediaQueryList = window.matchMedia("(prefers-color-scheme: dark)"); + +const defaultSettings: AppSettings = { + title: "唱作网", + version: pkg.version, + showSettings: true, + tagsView: true, + fixedHeader: true, + sidebarLogo: true, + layout: LayoutEnum.LEFT, + theme: mediaQueryList.matches ? ThemeEnum.DARK : ThemeEnum.LIGHT, + size: SizeEnum.DEFAULT, + language: LanguageEnum.ZH_CN, + themeColor: "#409EFF", + watermarkEnabled: false, + watermarkContent: pkg.name, +}; + +export default defaultSettings; diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..8dd6ea9 --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,16 @@ +import type { App } from "vue"; +import { createPinia } from "pinia"; + +const store = createPinia(); + +// 全局注册 store +export function setupStore(app: App) { + app.use(store); +} + +export * from "./modules/app"; +export * from "./modules/permission"; +export * from "./modules/settings"; +export * from "./modules/tagsView"; +export * from "./modules/user"; +export { store }; diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts new file mode 100644 index 0000000..04447f2 --- /dev/null +++ b/src/store/modules/app.ts @@ -0,0 +1,154 @@ +import defaultSettings from "@/settings"; + +// 导入 Element Plus 中英文语言包 +import zhCn from "element-plus/es/locale/lang/zh-cn"; +import en from "element-plus/es/locale/lang/en"; +import { store } from "@/store"; +import { DeviceEnum } from "@/enums/DeviceEnum"; +import { SidebarStatusEnum } from "@/enums/SidebarStatusEnum"; + +export const useAppStore = defineStore("app", () => { + // 设备类型 + const device = useStorage("device", DeviceEnum.DESKTOP); + // 布局大小 + const size = useStorage("size", defaultSettings.size); + // 语言 + const language = useStorage("language", defaultSettings.language); + // 侧边栏状态 + const sidebarStatus = useStorage("sidebarStatus", SidebarStatusEnum.CLOSED); + const sidebar = reactive({ + opened: sidebarStatus.value === SidebarStatusEnum.OPENED, + withoutAnimation: false, + }); + + // 顶部菜单激活路径 + const activeTopMenuPath = useStorage("activeTopMenuPath", ""); + + /*********************************************************************** + * 全局验证码发送倒计时 + */ + const SEND_CODE_EXPIRE = 120; // 注册验证码发送间隔 + let sendCodeTimer: any = null; // 定时器 + const sendCodeDuration = ref(0); //倒计时 + const sendCodeTime = useStorage("scTime", 0); //发送时间 + /** 启动初始化 */ + if (sendCodeTime.value > 0) { + const duration = Math.floor(Date.now() / 1000) - sendCodeTime.value; + // console.log(duration); + if (duration > 0 && duration < SEND_CODE_EXPIRE) { + sendCodeDuration.value = SEND_CODE_EXPIRE - duration; + sendCodeTimer = setInterval(fnCountdown(), 1000); + } + } + /** 定时器函数 */ + function fnCountdown() { + if (sendCodeDuration.value-- <= 0) { + // 清除掉定时器 + clearInterval(sendCodeTimer); + sendCodeTimer = null; + } + return fnCountdown; + } + /** 启动倒计时 */ + function startSendCodeCountdown() { + sendCodeTimer && clearInterval(sendCodeTimer); //保证计时器唯一 + + sendCodeTime.value = Math.floor(Date.now() / 1000); //倒计时起始时间 + sendCodeDuration.value = SEND_CODE_EXPIRE; + + sendCodeTimer = setInterval(fnCountdown(), 1000); + } + /** 停止倒计时 */ + function stopSendCodeCountdown() { + sendCodeTimer && clearInterval(sendCodeTimer); + + sendCodeTime.value = 0; // 清空倒计时时间 + sendCodeDuration.value = 0; + } + /****************************************************** */ + + /** + * 根据语言标识读取对应的语言包 + */ + const locale = computed(() => { + if (language?.value == "en") { + return en; + } else { + return zhCn; + } + }); + + // 切换侧边栏 + function toggleSidebar() { + sidebar.opened = !sidebar.opened; + sidebarStatus.value = sidebar.opened ? SidebarStatusEnum.OPENED : SidebarStatusEnum.CLOSED; + } + + // 关闭侧边栏 + function closeSideBar() { + sidebar.opened = false; + sidebarStatus.value = SidebarStatusEnum.CLOSED; + } + + // 打开侧边栏 + function openSideBar() { + sidebar.opened = true; + sidebarStatus.value = SidebarStatusEnum.OPENED; + } + + // 切换设备 + function toggleDevice(val: string) { + device.value = val; + } + + /** + * 改变布局大小 + * + * @param val 布局大小 default | small | large + */ + function changeSize(val: string) { + size.value = val; + } + /** + * 切换语言 + * + * @param val + */ + function changeLanguage(val: string) { + language.value = val; + } + /** + * 混合模式顶部切换 + */ + function activeTopMenu(val: string) { + activeTopMenuPath.value = val; + } + + return { + device, + sidebar, + language, + locale, + size, + activeTopMenu, + toggleDevice, + changeSize, + changeLanguage, + toggleSidebar, + closeSideBar, + openSideBar, + activeTopMenuPath, + sendCodeDuration, + startSendCodeCountdown, + stopSendCodeCountdown, + }; +}); + +/** + * 用于在组件外部(如在Pinia Store 中)使用 Pinia 提供的 store 实例。 + * 官方文档解释了如何在组件外部使用 Pinia Store: + * https://pinia.vuejs.org/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component + */ +export function useAppStoreHook() { + return useAppStore(store); +} diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts new file mode 100644 index 0000000..737803f --- /dev/null +++ b/src/store/modules/permission.ts @@ -0,0 +1,88 @@ +import { RouteRecordRaw } from "vue-router"; +import { constantRoutes } from "@/router"; +import { store } from "@/store"; +import MenuAPI, { RouteVO } from "@/api/menu"; + +const modules = import.meta.glob("../../views/**/**.vue"); +const Layout = () => import("@/layout/index.vue"); + +export const usePermissionStore = defineStore("permission", () => { + /** 所有路由,包括静态和动态路由 */ + const routes = ref([]); + /** 混合模式左侧菜单 */ + const mixLeftMenus = ref([]); + + /** + * 生成动态路由 + */ + function generateRoutes() { + return new Promise((resolve, reject) => { + MenuAPI.getRoutes() + .then((data) => { + const dynamicRoutes = transformRoutes(data); + routes.value = constantRoutes.concat(dynamicRoutes); + resolve(dynamicRoutes); + }) + .catch((error) => { + reject(error); + }); + }); + } + + /** + * 混合模式菜单下根据顶部菜单路径设置左侧菜单 + * + * @param topMenuPath - 顶部菜单路径 + */ + const setMixLeftMenus = (topMenuPath: string) => { + const matchedItem = routes.value.find((item) => item.path === topMenuPath); + if (matchedItem && matchedItem.children) { + mixLeftMenus.value = matchedItem.children; + } + }; + + return { + routes, + generateRoutes, + mixLeftMenus, + setMixLeftMenus, + }; +}); + +/** + * 转换路由数据为组件 + */ +const transformRoutes = (routes: RouteVO[]) => { + const asyncRoutes: RouteRecordRaw[] = []; + routes.forEach((route) => { + const tmpRoute = { ...route } as RouteRecordRaw; + // 顶级目录,替换为 Layout 组件 + if (tmpRoute.component?.toString() == "Layout") { + tmpRoute.component = Layout; + } else { + // 其他菜单,根据组件路径动态加载组件 + const component = modules[`../../views/${tmpRoute.component}.vue`]; + if (component) { + tmpRoute.component = component; + } else { + tmpRoute.component = modules[`../../views/error-page/404.vue`]; + } + } + + if (tmpRoute.children) { + tmpRoute.children = transformRoutes(route.children); + } + + asyncRoutes.push(tmpRoute); + }); + + return asyncRoutes; +}; + +/** + * 在组件外使用 Pinia store 实例 + * @see https://pinia.vuejs.org/core-concepts/outside-component-usage.html + */ +export function usePermissionStoreHook() { + return usePermissionStore(store); +} diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts new file mode 100644 index 0000000..a581e90 --- /dev/null +++ b/src/store/modules/settings.ts @@ -0,0 +1,125 @@ +import defaultSettings from "@/settings"; +import { ThemeEnum } from "@/enums/ThemeEnum"; +import Color from "color"; + +type SettingsValue = boolean | string; + +export const useSettingsStore = defineStore("setting", () => { + // 是否显示设置 + const settingsVisible = ref(false); + // 是否显示标签视图 + const tagsView = useStorage("tagsView", defaultSettings.tagsView); + // 是否显示侧边栏logo + const sidebarLogo = useStorage( + "sidebarLogo", + defaultSettings.sidebarLogo + ); + // 是否固定头部 + const fixedHeader = useStorage( + "fixedHeader", + defaultSettings.fixedHeader + ); + // 布局模式:left-左侧模式(默认) top-顶部模式 mix-混合模式 + const layout = useStorage("layout", defaultSettings.layout); + // 主题颜色 + const themeColor = useStorage( + "themeColor", + defaultSettings.themeColor + ); + // 主题:light-亮色(默认) dark-暗色 + const theme = useStorage("theme", defaultSettings.theme); + // 是否开启水印 + const watermarkEnabled = useStorage( + "watermarkEnabled", + defaultSettings.watermarkEnabled + ); + + watch( + [theme, themeColor], + ([newTheme, newThemeColor], [oldTheme, oldThemeColor]) => { + if (newTheme !== oldTheme) { + if (newTheme === ThemeEnum.DARK) { + document.documentElement.classList.add("dark"); + } else { + document.documentElement.classList.remove("dark"); + } + } + + if (newThemeColor !== oldThemeColor) { + const rootStyle = document.documentElement.style; + rootStyle.setProperty(`--el-color-primary`, newThemeColor); + rootStyle.setProperty(`--el-color-primary-dark-2`, newThemeColor); + + for (let i = 1; i < 10; i++) { + rootStyle.setProperty( + `--el-color-primary-light-${i}`, + `${Color(newThemeColor).alpha(1 - i * 0.1)}` + ); + } + } + }, + { + immediate: true, // 立即执行,确保在侦听器创建时执行一次 + } + ); + + const settingsMap: Record> = { + fixedHeader, + tagsView, + sidebarLogo, + layout, + watermarkEnabled, + }; + + function changeSetting({ + key, + value, + }: { + key: string; + value: SettingsValue; + }) { + const setting = settingsMap[key]; + if (setting) { + setting.value = value; + } + } + + /** + * 切换主题 + */ + function changeTheme(val: string) { + theme.value = val; + } + + /** + * 切换主题颜色 + * + * @param color 主题颜色 + * + */ + function changeThemeColor(color: string) { + themeColor.value = color; + } + + /** + * 切换布局 + */ + function changeLayout(val: string) { + layout.value = val; + } + + return { + settingsVisible, + tagsView, + fixedHeader, + sidebarLogo, + layout, + themeColor, + theme, + watermarkEnabled, + changeSetting, + changeTheme, + changeThemeColor, + changeLayout, + }; +}); diff --git a/src/store/modules/tagsView.ts b/src/store/modules/tagsView.ts new file mode 100644 index 0000000..67137f1 --- /dev/null +++ b/src/store/modules/tagsView.ts @@ -0,0 +1,253 @@ +export const useTagsViewStore = defineStore("tagsView", () => { + const visitedViews = ref([]); + const cachedViews = ref([]); + const router = useRouter(); + const route = useRoute(); + + /** + * 添加已访问视图到已访问视图列表中 + */ + function addVisitedView(view: TagView) { + // 如果已经存在于已访问的视图列表中,则不再添加 + if (visitedViews.value.some((v) => v.path === view.path)) { + return; + } + // 如果视图是固定的(affix),则在已访问的视图列表的开头添加 + if (view.affix) { + visitedViews.value.unshift(view); + } else { + // 如果视图不是固定的,则在已访问的视图列表的末尾添加 + visitedViews.value.push(view); + } + } + + /** + * 添加缓存视图到缓存视图列表中 + */ + function addCachedView(view: TagView) { + const viewName = view.name; + // 如果缓存视图名称已经存在于缓存视图列表中,则不再添加 + if (cachedViews.value.includes(viewName)) { + return; + } + + // 如果视图需要缓存(keepAlive),则将其路由名称添加到缓存视图列表中 + if (view.keepAlive) { + cachedViews.value.push(viewName); + } + } + + /** + * 从已访问视图列表中删除指定的视图 + */ + function delVisitedView(view: TagView) { + return new Promise((resolve) => { + for (const [i, v] of visitedViews.value.entries()) { + // 找到与指定视图路径匹配的视图,在已访问视图列表中删除该视图 + if (v.path === view.path) { + visitedViews.value.splice(i, 1); + break; + } + } + resolve([...visitedViews.value]); + }); + } + + function delCachedView(view: TagView) { + const viewName = view.name; + return new Promise((resolve) => { + const index = cachedViews.value.indexOf(viewName); + index > -1 && cachedViews.value.splice(index, 1); + resolve([...cachedViews.value]); + }); + } + + function delOtherVisitedViews(view: TagView) { + return new Promise((resolve) => { + visitedViews.value = visitedViews.value.filter((v) => { + return v?.affix || v.path === view.path; + }); + resolve([...visitedViews.value]); + }); + } + + function delOtherCachedViews(view: TagView) { + const viewName = view.name as string; + return new Promise((resolve) => { + const index = cachedViews.value.indexOf(viewName); + if (index > -1) { + cachedViews.value = cachedViews.value.slice(index, index + 1); + } else { + // if index = -1, there is no cached tags + cachedViews.value = []; + } + resolve([...cachedViews.value]); + }); + } + + function updateVisitedView(view: TagView) { + for (let v of visitedViews.value) { + if (v.path === view.path) { + v = Object.assign(v, view); + break; + } + } + } + + function addView(view: TagView) { + addVisitedView(view); + addCachedView(view); + } + + function delView(view: TagView) { + return new Promise((resolve) => { + delVisitedView(view); + delCachedView(view); + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value], + }); + }); + } + + function delOtherViews(view: TagView) { + return new Promise((resolve) => { + delOtherVisitedViews(view); + delOtherCachedViews(view); + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value], + }); + }); + } + + function delLeftViews(view: TagView) { + return new Promise((resolve) => { + const currIndex = visitedViews.value.findIndex((v) => v.path === view.path); + if (currIndex === -1) { + return; + } + visitedViews.value = visitedViews.value.filter((item, index) => { + if (index >= currIndex || item?.affix) { + return true; + } + + const cacheIndex = cachedViews.value.indexOf(item.name); + if (cacheIndex > -1) { + cachedViews.value.splice(cacheIndex, 1); + } + return false; + }); + resolve({ + visitedViews: [...visitedViews.value], + }); + }); + } + + function delRightViews(view: TagView) { + return new Promise((resolve) => { + const currIndex = visitedViews.value.findIndex((v) => v.path === view.path); + if (currIndex === -1) { + return; + } + visitedViews.value = visitedViews.value.filter((item, index) => { + if (index <= currIndex || item?.affix) { + return true; + } + }); + resolve({ + visitedViews: [...visitedViews.value], + }); + }); + } + + function delAllViews() { + return new Promise((resolve) => { + const affixTags = visitedViews.value.filter((tag) => tag?.affix); + visitedViews.value = affixTags; + cachedViews.value = []; + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value], + }); + }); + } + + function delAllVisitedViews() { + return new Promise((resolve) => { + const affixTags = visitedViews.value.filter((tag) => tag?.affix); + visitedViews.value = affixTags; + resolve([...visitedViews.value]); + }); + } + + function delAllCachedViews() { + return new Promise((resolve) => { + cachedViews.value = []; + resolve([...cachedViews.value]); + }); + } + + /** + * 关闭当前tagView + */ + function closeCurrentView() { + const tags: TagView = { + name: route.name as string, + title: route.meta.title as string, + path: route.path, + fullPath: route.fullPath, + affix: route.meta?.affix, + keepAlive: route.meta?.keepAlive, + query: route.query, + }; + delView(tags).then((res: any) => { + if (isActive(tags)) { + toLastView(res.visitedViews, tags); + } + }); + } + + function isActive(tag: TagView) { + return tag.path === route.path; + } + + function toLastView(visitedViews: TagView[], view?: TagView) { + const latestView = visitedViews.slice(-1)[0]; + if (latestView && latestView.fullPath) { + router.push(latestView.fullPath); + } else { + // now the default is to redirect to the home page if there is no tags-view, + // you can adjust it according to your needs. + if (view?.name === "Dashboard") { + // to reload home page + router.replace("/redirect" + view.fullPath); + } else { + router.push("/"); + } + } + } + + return { + visitedViews, + cachedViews, + addVisitedView, + addCachedView, + delVisitedView, + delCachedView, + delOtherVisitedViews, + delOtherCachedViews, + updateVisitedView, + addView, + delView, + delOtherViews, + delLeftViews, + delRightViews, + delAllViews, + delAllVisitedViews, + delAllCachedViews, + closeCurrentView, + isActive, + toLastView, + }; +}); diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts new file mode 100644 index 0000000..96ae229 --- /dev/null +++ b/src/store/modules/user.ts @@ -0,0 +1,214 @@ +import AuthAPI, { type LoginData, type RegisterData } from "@/api/auth"; +import UserAPI, { type UserInfo, AccountInfo } from "@/api/user"; +import MessageAPI from "@/api/message"; +import { resetRouter } from "@/router"; +import { store } from "@/store"; +import { TOKEN_KEY } from "@/enums/CacheEnum"; +import { WebMessage } from "@/api/message"; + +export const useUserStore = defineStore("user", () => { + const sessionToken = ref(); + const user = ref({ + roles: [], + perms: [], + }); + const account = ref({}); + const msgLatest = ref([]); + + function clearUser() { + // user.value.avatar = undefined; + user.value = { roles: [], perms: [] }; + account.value = {}; + msgLatest.value = []; + } + /** + * 登录 + * + * @param {LoginData} + * @returns + */ + function login(loginData: LoginData) { + return new Promise((resolve, reject) => { + AuthAPI.login(loginData) + .then((data) => { + const { tokenType, accessToken } = data; + const newToken = tokenType + " " + accessToken; + localStorage.setItem(TOKEN_KEY, newToken); + sessionToken.value = newToken; + + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + } + + /** + * 注册 + * @returns + */ + function autoLogin(username: string, password: string) { + return new Promise((resolve, reject) => { + AuthAPI.autoLogin(username, password) + .then((data) => { + const { tokenType, accessToken } = data; + const newToken = tokenType + " " + accessToken; + localStorage.setItem(TOKEN_KEY, newToken); + sessionToken.value = newToken; + + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + } + + /** + * 注册 + * @returns + */ + function register(regData: RegisterData) { + return new Promise((resolve, reject) => { + AuthAPI.register(regData) + .then((data) => { + const { tokenType, accessToken } = data; + localStorage.setItem(TOKEN_KEY, tokenType + " " + accessToken); // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + } + + // 获取信息(用户昵称、头像、角色集合、权限集合) + function getUserInfo() { + return new Promise((resolve, reject) => { + UserAPI.getInfo() + .then((data) => { + if (!data) { + reject("Verification failed, please Login again."); + return; + } + if (!data.roles || data.roles.length <= 0) { + reject("getUserInfo: roles must be a non-null array!"); + return; + } + Object.assign(user.value, { ...data }); + resolve(data); + }) + .catch((error) => { + reject(error); + }); + }); + } + + let timerAccount: any = null; + + // 获取账户信息(实名认证、唱作音符、VIP等) + function getAccountInfo() { + function fn() { + UserAPI.getAccountInfo().then((data) => { + if (data) { + Object.assign(account.value, { ...data }); + } + }); + + return fn; + } + + timerMessage = setInterval(fn(), 600000); //10分钟刷新账户信息 + } + + let timerMessage: any = null; + + function getLatestMessage() { + function fn() { + MessageAPI.getLatest(user.value.userId!).then((data) => { + if (data) { + Object.assign(msgLatest.value, data); + // console.log(msgLatest.value); + } + }); + + return fn; + } + + timerMessage = setInterval(fn(), 900000); //15分钟刷新通知消息 + } + + function setMessageState(ids: number[], state: number, callApi: boolean) { + for (let i = msgLatest.value.length - 1; i >= 0; i--) { + const msg = msgLatest.value[i]; + if (ids.includes(msg.msgId!)) { + if (state == 1) msg.state = 1; + else msgLatest.value.splice(i, 1); + } + } + + if (callApi) { + const idsStr = ids.join(","); + MessageAPI.setByIds(idsStr, state); + } + } + + // user logout + function logout() { + return new Promise((resolve, reject) => { + AuthAPI.logout() + .then(() => { + if (timerMessage != null) { + clearInterval(timerMessage); + timerMessage = null; + } + clearUser(); + + localStorage.setItem(TOKEN_KEY, ""); + location.reload(); // 清空路由 + + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + } + + // remove token + function resetToken() { + // console.log("resetToken"); + return new Promise((resolve) => { + localStorage.setItem(TOKEN_KEY, ""); + resetRouter(); + resolve(); + }); + } + + return { + sessionToken, + user, + account, + msgLatest, + login, + register, + autoLogin, + getUserInfo, + getAccountInfo, + getLatestMessage, + setMessageState, + logout, + clearUser, + resetToken, + }; +}); + +/** + * 用于在组件外部(如在Pinia Store 中)使用 Pinia 提供的 store 实例。 + * 官方文档解释了如何在组件外部使用 Pinia Store: + * https://pinia.vuejs.org/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component + */ +export function useUserStoreHook() { + return useUserStore(store); +} diff --git a/src/styles/index.scss b/src/styles/index.scss new file mode 100644 index 0000000..bf0b25b --- /dev/null +++ b/src/styles/index.scss @@ -0,0 +1,33 @@ +@use "./reset"; + +.app-container { + // padding: 15px; + min-width: 430px; + height: 100%; + margin: 0; + padding: 0; + overflow: auto; +} + +.search-container { + padding: 18px 0 0 20px; + margin-bottom: 10px; + background-color: var(--el-bg-color-overlay); + border: 1px solid var(--el-border-color-light); + border-radius: 4px; + box-shadow: var(--el-box-shadow-light); +} + +.table-container > .el-card__header { + padding: calc(var(--el-card-padding) - 8px) var(--el-card-padding); +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32 160 255); + } +} diff --git a/src/styles/login.scss b/src/styles/login.scss new file mode 100644 index 0000000..1d5a873 --- /dev/null +++ b/src/styles/login.scss @@ -0,0 +1,64 @@ +.login-container { + display: flex; + align-items: center; + justify-content: center; + overflow-y: auto; + + .login-card { + width: 400px; + background: transparent; + border: none; + border-radius: 4%; + + @media (width <= 640px) { + width: 340px; + } + + .input-wrapper { + display: flex; + align-items: center; + width: 100%; + } + + .tips-wrapper { + display: flex; + justify-content: space-between; + width: 100%; + + a { + text-decoration: underline; + } + } + + .captcha-image { + height: 48px; + cursor: pointer; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + } + } + + .el-form-item { + background: var(--el-input-bg-color); + border: 1px solid var(--el-border-color); + border-radius: 5px; + } + + .el-input { + .el-input__wrapper { + padding: 0; + background-color: transparent; + box-shadow: none; + + &.is-focus, + &:hover { + box-shadow: none !important; + } + + input:-webkit-autofill { + /* 通过延时渲染背景色变相去除背景颜色 */ + transition: background-color 1000s ease-in-out 0s; + } + } + } +} diff --git a/src/styles/reset.scss b/src/styles/reset.scss new file mode 100644 index 0000000..58233b5 --- /dev/null +++ b/src/styles/reset.scss @@ -0,0 +1,76 @@ +*, +::before, +::after { + box-sizing: border-box; + border-color: currentcolor; + border-style: solid; + border-width: 0; +} + +#app { + width: 100%; + height: 100%; +} + +html { + box-sizing: border-box; + width: 100%; + height: 100%; + line-height: 1.5; + tab-size: 4; + text-size-adjust: 100%; +} + +body { + width: 100%; + height: 100%; + margin: 0; + font-family: "Microsoft YaHei", "微软雅黑", "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", Arial, + sans-serif; + line-height: inherit; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizelegibility; +} + +a { + color: inherit; + text-decoration: inherit; +} + +img, +svg { + display: inline-block; +} + +svg { + // 因icon大小被设置为和字体大小一致,而span等标签的下边缘会和字体的基线对齐,故需设置一个往下的偏移比例,来纠正视觉上的未对齐效果 + vertical-align: -0.15em; +} + +ul, +li { + padding: 0; + margin: 0; + list-style: none; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +a, +a:focus, +a:hover { + color: inherit; + text-decoration: none; + cursor: pointer; +} + +a:focus, +a:active, +div:focus { + outline: none; +} diff --git a/src/styles/variables.module.scss b/src/styles/variables.module.scss new file mode 100644 index 0000000..b3f2d52 --- /dev/null +++ b/src/styles/variables.module.scss @@ -0,0 +1,12 @@ +/* stylelint-disable property-no-unknown */ +:export { + sidebar-width: $sidebar-width; + navbar-height: $navbar-height; + tags-view-height: $tags-view-height; + menu-background: $menu-background; + menu-text: $menu-text; + menu-active-text: $menu-active-text; + menu-hover: $menu-hover; + text-high-color: $text-high-color; +} +/* stylelint-enable property-no-unknown */ diff --git a/src/styles/variables.scss b/src/styles/variables.scss new file mode 100644 index 0000000..c569c67 --- /dev/null +++ b/src/styles/variables.scss @@ -0,0 +1,40 @@ +/** 全局SCSS变量 */ + +:root { + --menu-background: #304156; + --menu-text: #bfcbd9; + --menu-active-text: var(--el-menu-active-color); + --menu-hover: #263445; + --sidebar-logo-background: #2d3748; + --text-high-color: #000; // 修复表格 fixed 列被选中后由于透明色导致叠字的 bug + .el-table { + --el-table-current-row-bg-color: rgb(235 243 250); + } +} + +/** 暗黑主题 */ +html.dark { + --menu-background: var(--el-bg-color-overlay); + --menu-text: #fff; + --menu-active-text: var(--el-menu-active-color); + --menu-hover: rgb(0 0 0 / 20%); + --sidebar-logo-background: rgb(0 0 0 / 20%); + --text-high-color: #fff; + + //wangEditer + --w-e-textarea-bg-color: #333; + --w-e-textarea-color: #fff; +} + +$menu-background: var(--menu-background); // 菜单背景色 +$menu-text: var(--menu-text); // 菜单文字颜色 +$menu-active-text: var(--menu-active-text); // 菜单激活文字颜色 +$menu-hover: var(--menu-hover); // 菜单悬停背景色 +$sidebar-logo-background: var(--sidebar-logo-background); // 侧边栏 Logo 背景色 + +$sidebar-width: 210px; // 侧边栏宽度 +$sidebar-width-collapsed: 54px; // 侧边栏收缩宽度 +$navbar-height: 50px; // 导航栏高度 +$tags-view-height: 34px; // TagsView 高度 + +$text-high-color: var(--text-high-color); diff --git a/src/types/auto-imports.d.ts b/src/types/auto-imports.d.ts new file mode 100644 index 0000000..5ecce34 --- /dev/null +++ b/src/types/auto-imports.d.ts @@ -0,0 +1,1053 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +export {} +declare global { + const EffectScope: (typeof import("vue"))["EffectScope"]; + const ElMessage: (typeof import("element-plus/es"))["ElMessage"]; + const ElMessageBox: (typeof import("element-plus/es"))["ElMessageBox"]; + const ElNotification: (typeof import("element-plus/es"))["ElNotification"]; + const acceptHMRUpdate: (typeof import("pinia"))["acceptHMRUpdate"]; + const asyncComputed: (typeof import("@vueuse/core"))["asyncComputed"]; + const autoResetRef: (typeof import("@vueuse/core"))["autoResetRef"]; + const computed: (typeof import("vue"))["computed"]; + const computedAsync: (typeof import("@vueuse/core"))["computedAsync"]; + const computedEager: (typeof import("@vueuse/core"))["computedEager"]; + const computedInject: (typeof import("@vueuse/core"))["computedInject"]; + const computedWithControl: (typeof import("@vueuse/core"))["computedWithControl"]; + const controlledComputed: (typeof import("@vueuse/core"))["controlledComputed"]; + const controlledRef: (typeof import("@vueuse/core"))["controlledRef"]; + const createApp: (typeof import("vue"))["createApp"]; + const createEventHook: (typeof import("@vueuse/core"))["createEventHook"]; + const createGlobalState: (typeof import("@vueuse/core"))["createGlobalState"]; + const createInjectionState: (typeof import("@vueuse/core"))["createInjectionState"]; + const createPinia: (typeof import("pinia"))["createPinia"]; + const createReactiveFn: (typeof import("@vueuse/core"))["createReactiveFn"]; + const createReusableTemplate: (typeof import("@vueuse/core"))["createReusableTemplate"]; + const createSharedComposable: (typeof import("@vueuse/core"))["createSharedComposable"]; + const createTemplatePromise: (typeof import("@vueuse/core"))["createTemplatePromise"]; + const createUnrefFn: (typeof import("@vueuse/core"))["createUnrefFn"]; + const customRef: (typeof import("vue"))["customRef"]; + const debouncedRef: (typeof import("@vueuse/core"))["debouncedRef"]; + const debouncedWatch: (typeof import("@vueuse/core"))["debouncedWatch"]; + const defineAsyncComponent: (typeof import("vue"))["defineAsyncComponent"]; + const defineComponent: (typeof import("vue"))["defineComponent"]; + const defineStore: (typeof import("pinia"))["defineStore"]; + const eagerComputed: (typeof import("@vueuse/core"))["eagerComputed"]; + const effectScope: (typeof import("vue"))["effectScope"]; + const extendRef: (typeof import("@vueuse/core"))["extendRef"]; + const getActivePinia: (typeof import("pinia"))["getActivePinia"]; + const getCurrentInstance: (typeof import("vue"))["getCurrentInstance"]; + const getCurrentScope: (typeof import("vue"))["getCurrentScope"]; + const h: (typeof import("vue"))["h"]; + const ignorableWatch: (typeof import("@vueuse/core"))["ignorableWatch"]; + const inject: (typeof import("vue"))["inject"]; + const injectLocal: (typeof import("@vueuse/core"))["injectLocal"]; + const isDefined: (typeof import("@vueuse/core"))["isDefined"]; + const isProxy: (typeof import("vue"))["isProxy"]; + const isReactive: (typeof import("vue"))["isReactive"]; + const isReadonly: (typeof import("vue"))["isReadonly"]; + const isRef: (typeof import("vue"))["isRef"]; + const makeDestructurable: (typeof import("@vueuse/core"))["makeDestructurable"]; + const mapActions: (typeof import("pinia"))["mapActions"]; + const mapGetters: (typeof import("pinia"))["mapGetters"]; + const mapState: (typeof import("pinia"))["mapState"]; + const mapStores: (typeof import("pinia"))["mapStores"]; + const mapWritableState: (typeof import("pinia"))["mapWritableState"]; + const markRaw: (typeof import("vue"))["markRaw"]; + const nextTick: (typeof import("vue"))["nextTick"]; + const onActivated: (typeof import("vue"))["onActivated"]; + const onBeforeMount: (typeof import("vue"))["onBeforeMount"]; + const onBeforeRouteLeave: (typeof import("vue-router"))["onBeforeRouteLeave"]; + const onBeforeRouteUpdate: (typeof import("vue-router"))["onBeforeRouteUpdate"]; + const onBeforeUnmount: (typeof import("vue"))["onBeforeUnmount"]; + const onBeforeUpdate: (typeof import("vue"))["onBeforeUpdate"]; + const onClickOutside: (typeof import("@vueuse/core"))["onClickOutside"]; + const onDeactivated: (typeof import("vue"))["onDeactivated"]; + const onErrorCaptured: (typeof import("vue"))["onErrorCaptured"]; + const onKeyStroke: (typeof import("@vueuse/core"))["onKeyStroke"]; + const onLongPress: (typeof import("@vueuse/core"))["onLongPress"]; + const onMounted: (typeof import("vue"))["onMounted"]; + const onRenderTracked: (typeof import("vue"))["onRenderTracked"]; + const onRenderTriggered: (typeof import("vue"))["onRenderTriggered"]; + const onScopeDispose: (typeof import("vue"))["onScopeDispose"]; + const onServerPrefetch: (typeof import("vue"))["onServerPrefetch"]; + const onStartTyping: (typeof import("@vueuse/core"))["onStartTyping"]; + const onUnmounted: (typeof import("vue"))["onUnmounted"]; + const onUpdated: (typeof import("vue"))["onUpdated"]; + const pausableWatch: (typeof import("@vueuse/core"))["pausableWatch"]; + const provide: (typeof import("vue"))["provide"]; + const provideLocal: (typeof import("@vueuse/core"))["provideLocal"]; + const reactify: (typeof import("@vueuse/core"))["reactify"]; + const reactifyObject: (typeof import("@vueuse/core"))["reactifyObject"]; + const reactive: (typeof import("vue"))["reactive"]; + const reactiveComputed: (typeof import("@vueuse/core"))["reactiveComputed"]; + const reactiveOmit: (typeof import("@vueuse/core"))["reactiveOmit"]; + const reactivePick: (typeof import("@vueuse/core"))["reactivePick"]; + const readonly: (typeof import("vue"))["readonly"]; + const ref: (typeof import("vue"))["ref"]; + const refAutoReset: (typeof import("@vueuse/core"))["refAutoReset"]; + const refDebounced: (typeof import("@vueuse/core"))["refDebounced"]; + const refDefault: (typeof import("@vueuse/core"))["refDefault"]; + const refThrottled: (typeof import("@vueuse/core"))["refThrottled"]; + const refWithControl: (typeof import("@vueuse/core"))["refWithControl"]; + const resolveComponent: (typeof import("vue"))["resolveComponent"]; + const resolveRef: (typeof import("@vueuse/core"))["resolveRef"]; + const resolveUnref: (typeof import("@vueuse/core"))["resolveUnref"]; + const setActivePinia: (typeof import("pinia"))["setActivePinia"]; + const setMapStoreSuffix: (typeof import("pinia"))["setMapStoreSuffix"]; + const shallowReactive: (typeof import("vue"))["shallowReactive"]; + const shallowReadonly: (typeof import("vue"))["shallowReadonly"]; + const shallowRef: (typeof import("vue"))["shallowRef"]; + const storeToRefs: (typeof import("pinia"))["storeToRefs"]; + const syncRef: (typeof import("@vueuse/core"))["syncRef"]; + const syncRefs: (typeof import("@vueuse/core"))["syncRefs"]; + const templateRef: (typeof import("@vueuse/core"))["templateRef"]; + const throttledRef: (typeof import("@vueuse/core"))["throttledRef"]; + const throttledWatch: (typeof import("@vueuse/core"))["throttledWatch"]; + const toRaw: (typeof import("vue"))["toRaw"]; + const toReactive: (typeof import("@vueuse/core"))["toReactive"]; + const toRef: (typeof import("vue"))["toRef"]; + const toRefs: (typeof import("vue"))["toRefs"]; + const toValue: (typeof import("vue"))["toValue"]; + const triggerRef: (typeof import("vue"))["triggerRef"]; + const tryOnBeforeMount: (typeof import("@vueuse/core"))["tryOnBeforeMount"]; + const tryOnBeforeUnmount: (typeof import("@vueuse/core"))["tryOnBeforeUnmount"]; + const tryOnMounted: (typeof import("@vueuse/core"))["tryOnMounted"]; + const tryOnScopeDispose: (typeof import("@vueuse/core"))["tryOnScopeDispose"]; + const tryOnUnmounted: (typeof import("@vueuse/core"))["tryOnUnmounted"]; + const unref: (typeof import("vue"))["unref"]; + const unrefElement: (typeof import("@vueuse/core"))["unrefElement"]; + const until: (typeof import("@vueuse/core"))["until"]; + const useActiveElement: (typeof import("@vueuse/core"))["useActiveElement"]; + const useAnimate: (typeof import("@vueuse/core"))["useAnimate"]; + const useArrayDifference: (typeof import("@vueuse/core"))["useArrayDifference"]; + const useArrayEvery: (typeof import("@vueuse/core"))["useArrayEvery"]; + const useArrayFilter: (typeof import("@vueuse/core"))["useArrayFilter"]; + const useArrayFind: (typeof import("@vueuse/core"))["useArrayFind"]; + const useArrayFindIndex: (typeof import("@vueuse/core"))["useArrayFindIndex"]; + const useArrayFindLast: (typeof import("@vueuse/core"))["useArrayFindLast"]; + const useArrayIncludes: (typeof import("@vueuse/core"))["useArrayIncludes"]; + const useArrayJoin: (typeof import("@vueuse/core"))["useArrayJoin"]; + const useArrayMap: (typeof import("@vueuse/core"))["useArrayMap"]; + const useArrayReduce: (typeof import("@vueuse/core"))["useArrayReduce"]; + const useArraySome: (typeof import("@vueuse/core"))["useArraySome"]; + const useArrayUnique: (typeof import("@vueuse/core"))["useArrayUnique"]; + const useAsyncQueue: (typeof import("@vueuse/core"))["useAsyncQueue"]; + const useAsyncState: (typeof import("@vueuse/core"))["useAsyncState"]; + const useAttrs: (typeof import("vue"))["useAttrs"]; + const useBase64: (typeof import("@vueuse/core"))["useBase64"]; + const useBattery: (typeof import("@vueuse/core"))["useBattery"]; + const useBluetooth: (typeof import("@vueuse/core"))["useBluetooth"]; + const useBreakpoints: (typeof import("@vueuse/core"))["useBreakpoints"]; + const useBroadcastChannel: (typeof import("@vueuse/core"))["useBroadcastChannel"]; + const useBrowserLocation: (typeof import("@vueuse/core"))["useBrowserLocation"]; + const useCached: (typeof import("@vueuse/core"))["useCached"]; + const useClipboard: (typeof import("@vueuse/core"))["useClipboard"]; + const useClipboardItems: (typeof import("@vueuse/core"))["useClipboardItems"]; + const useCloned: (typeof import("@vueuse/core"))["useCloned"]; + const useColorMode: (typeof import("@vueuse/core"))["useColorMode"]; + const useConfirmDialog: (typeof import("@vueuse/core"))["useConfirmDialog"]; + const useCounter: (typeof import("@vueuse/core"))["useCounter"]; + const useCssModule: (typeof import("vue"))["useCssModule"]; + const useCssVar: (typeof import("@vueuse/core"))["useCssVar"]; + const useCssVars: (typeof import("vue"))["useCssVars"]; + const useCurrentElement: (typeof import("@vueuse/core"))["useCurrentElement"]; + const useCycleList: (typeof import("@vueuse/core"))["useCycleList"]; + const useDark: (typeof import("@vueuse/core"))["useDark"]; + const useDateFormat: (typeof import("@vueuse/core"))["useDateFormat"]; + const useDebounce: (typeof import("@vueuse/core"))["useDebounce"]; + const useDebounceFn: (typeof import("@vueuse/core"))["useDebounceFn"]; + const useDebouncedRefHistory: (typeof import("@vueuse/core"))["useDebouncedRefHistory"]; + const useDeviceMotion: (typeof import("@vueuse/core"))["useDeviceMotion"]; + const useDeviceOrientation: (typeof import("@vueuse/core"))["useDeviceOrientation"]; + const useDevicePixelRatio: (typeof import("@vueuse/core"))["useDevicePixelRatio"]; + const useDevicesList: (typeof import("@vueuse/core"))["useDevicesList"]; + const useDisplayMedia: (typeof import("@vueuse/core"))["useDisplayMedia"]; + const useDocumentVisibility: (typeof import("@vueuse/core"))["useDocumentVisibility"]; + const useDraggable: (typeof import("@vueuse/core"))["useDraggable"]; + const useDropZone: (typeof import("@vueuse/core"))["useDropZone"]; + const useElementBounding: (typeof import("@vueuse/core"))["useElementBounding"]; + const useElementByPoint: (typeof import("@vueuse/core"))["useElementByPoint"]; + const useElementHover: (typeof import("@vueuse/core"))["useElementHover"]; + const useElementSize: (typeof import("@vueuse/core"))["useElementSize"]; + const useElementVisibility: (typeof import("@vueuse/core"))["useElementVisibility"]; + const useEventBus: (typeof import("@vueuse/core"))["useEventBus"]; + const useEventListener: (typeof import("@vueuse/core"))["useEventListener"]; + const useEventSource: (typeof import("@vueuse/core"))["useEventSource"]; + const useEyeDropper: (typeof import("@vueuse/core"))["useEyeDropper"]; + const useFavicon: (typeof import("@vueuse/core"))["useFavicon"]; + const useFetch: (typeof import("@vueuse/core"))["useFetch"]; + const useFileDialog: (typeof import("@vueuse/core"))["useFileDialog"]; + const useFileSystemAccess: (typeof import("@vueuse/core"))["useFileSystemAccess"]; + const useFocus: (typeof import("@vueuse/core"))["useFocus"]; + const useFocusWithin: (typeof import("@vueuse/core"))["useFocusWithin"]; + const useFps: (typeof import("@vueuse/core"))["useFps"]; + const useFullscreen: (typeof import("@vueuse/core"))["useFullscreen"]; + const useGamepad: (typeof import("@vueuse/core"))["useGamepad"]; + const useGeolocation: (typeof import("@vueuse/core"))["useGeolocation"]; + const useI18n: (typeof import("vue-i18n"))["useI18n"]; + const useIdle: (typeof import("@vueuse/core"))["useIdle"]; + const useImage: (typeof import("@vueuse/core"))["useImage"]; + const useInfiniteScroll: (typeof import("@vueuse/core"))["useInfiniteScroll"]; + const useIntersectionObserver: (typeof import("@vueuse/core"))["useIntersectionObserver"]; + const useInterval: (typeof import("@vueuse/core"))["useInterval"]; + const useIntervalFn: (typeof import("@vueuse/core"))["useIntervalFn"]; + const useKeyModifier: (typeof import("@vueuse/core"))["useKeyModifier"]; + const useLastChanged: (typeof import("@vueuse/core"))["useLastChanged"]; + const useLink: (typeof import("vue-router"))["useLink"]; + const useLocalStorage: (typeof import("@vueuse/core"))["useLocalStorage"]; + const useMagicKeys: (typeof import("@vueuse/core"))["useMagicKeys"]; + const useManualRefHistory: (typeof import("@vueuse/core"))["useManualRefHistory"]; + const useMediaControls: (typeof import("@vueuse/core"))["useMediaControls"]; + const useMediaQuery: (typeof import("@vueuse/core"))["useMediaQuery"]; + const useMemoize: (typeof import("@vueuse/core"))["useMemoize"]; + const useMemory: (typeof import("@vueuse/core"))["useMemory"]; + const useMounted: (typeof import("@vueuse/core"))["useMounted"]; + const useMouse: (typeof import("@vueuse/core"))["useMouse"]; + const useMouseInElement: (typeof import("@vueuse/core"))["useMouseInElement"]; + const useMousePressed: (typeof import("@vueuse/core"))["useMousePressed"]; + const useMutationObserver: (typeof import("@vueuse/core"))["useMutationObserver"]; + const useNavigatorLanguage: (typeof import("@vueuse/core"))["useNavigatorLanguage"]; + const useNetwork: (typeof import("@vueuse/core"))["useNetwork"]; + const useNow: (typeof import("@vueuse/core"))["useNow"]; + const useObjectUrl: (typeof import("@vueuse/core"))["useObjectUrl"]; + const useOffsetPagination: (typeof import("@vueuse/core"))["useOffsetPagination"]; + const useOnline: (typeof import("@vueuse/core"))["useOnline"]; + const usePageLeave: (typeof import("@vueuse/core"))["usePageLeave"]; + const useParallax: (typeof import("@vueuse/core"))["useParallax"]; + const useParentElement: (typeof import("@vueuse/core"))["useParentElement"]; + const usePerformanceObserver: (typeof import("@vueuse/core"))["usePerformanceObserver"]; + const usePermission: (typeof import("@vueuse/core"))["usePermission"]; + const usePointer: (typeof import("@vueuse/core"))["usePointer"]; + const usePointerLock: (typeof import("@vueuse/core"))["usePointerLock"]; + const usePointerSwipe: (typeof import("@vueuse/core"))["usePointerSwipe"]; + const usePreferredColorScheme: (typeof import("@vueuse/core"))["usePreferredColorScheme"]; + const usePreferredContrast: (typeof import("@vueuse/core"))["usePreferredContrast"]; + const usePreferredDark: (typeof import("@vueuse/core"))["usePreferredDark"]; + const usePreferredLanguages: (typeof import("@vueuse/core"))["usePreferredLanguages"]; + const usePreferredReducedMotion: (typeof import("@vueuse/core"))["usePreferredReducedMotion"]; + const usePrevious: (typeof import("@vueuse/core"))["usePrevious"]; + const useRafFn: (typeof import("@vueuse/core"))["useRafFn"]; + const useRefHistory: (typeof import("@vueuse/core"))["useRefHistory"]; + const useResizeObserver: (typeof import("@vueuse/core"))["useResizeObserver"]; + const useRoute: (typeof import("vue-router"))["useRoute"]; + const useRouter: (typeof import("vue-router"))["useRouter"]; + const useScreenOrientation: (typeof import("@vueuse/core"))["useScreenOrientation"]; + const useScreenSafeArea: (typeof import("@vueuse/core"))["useScreenSafeArea"]; + const useScriptTag: (typeof import("@vueuse/core"))["useScriptTag"]; + const useScroll: (typeof import("@vueuse/core"))["useScroll"]; + const useScrollLock: (typeof import("@vueuse/core"))["useScrollLock"]; + const useSessionStorage: (typeof import("@vueuse/core"))["useSessionStorage"]; + const useShare: (typeof import("@vueuse/core"))["useShare"]; + const useSlots: (typeof import("vue"))["useSlots"]; + const useSorted: (typeof import("@vueuse/core"))["useSorted"]; + const useSpeechRecognition: (typeof import("@vueuse/core"))["useSpeechRecognition"]; + const useSpeechSynthesis: (typeof import("@vueuse/core"))["useSpeechSynthesis"]; + const useStepper: (typeof import("@vueuse/core"))["useStepper"]; + const useStorage: (typeof import("@vueuse/core"))["useStorage"]; + const useStorageAsync: (typeof import("@vueuse/core"))["useStorageAsync"]; + const useStyleTag: (typeof import("@vueuse/core"))["useStyleTag"]; + const useSupported: (typeof import("@vueuse/core"))["useSupported"]; + const useSwipe: (typeof import("@vueuse/core"))["useSwipe"]; + const useTemplateRefsList: (typeof import("@vueuse/core"))["useTemplateRefsList"]; + const useTextDirection: (typeof import("@vueuse/core"))["useTextDirection"]; + const useTextSelection: (typeof import("@vueuse/core"))["useTextSelection"]; + const useTextareaAutosize: (typeof import("@vueuse/core"))["useTextareaAutosize"]; + const useThrottle: (typeof import("@vueuse/core"))["useThrottle"]; + const useThrottleFn: (typeof import("@vueuse/core"))["useThrottleFn"]; + const useThrottledRefHistory: (typeof import("@vueuse/core"))["useThrottledRefHistory"]; + const useTimeAgo: (typeof import("@vueuse/core"))["useTimeAgo"]; + const useTimeout: (typeof import("@vueuse/core"))["useTimeout"]; + const useTimeoutFn: (typeof import("@vueuse/core"))["useTimeoutFn"]; + const useTimeoutPoll: (typeof import("@vueuse/core"))["useTimeoutPoll"]; + const useTimestamp: (typeof import("@vueuse/core"))["useTimestamp"]; + const useTitle: (typeof import("@vueuse/core"))["useTitle"]; + const useToNumber: (typeof import("@vueuse/core"))["useToNumber"]; + const useToString: (typeof import("@vueuse/core"))["useToString"]; + const useToggle: (typeof import("@vueuse/core"))["useToggle"]; + const useTransition: (typeof import("@vueuse/core"))["useTransition"]; + const useUrlSearchParams: (typeof import("@vueuse/core"))["useUrlSearchParams"]; + const useUserMedia: (typeof import("@vueuse/core"))["useUserMedia"]; + const useVModel: (typeof import("@vueuse/core"))["useVModel"]; + const useVModels: (typeof import("@vueuse/core"))["useVModels"]; + const useVibrate: (typeof import("@vueuse/core"))["useVibrate"]; + const useVirtualList: (typeof import("@vueuse/core"))["useVirtualList"]; + const useWakeLock: (typeof import("@vueuse/core"))["useWakeLock"]; + const useWebNotification: (typeof import("@vueuse/core"))["useWebNotification"]; + const useWebSocket: (typeof import("@vueuse/core"))["useWebSocket"]; + const useWebWorker: (typeof import("@vueuse/core"))["useWebWorker"]; + const useWebWorkerFn: (typeof import("@vueuse/core"))["useWebWorkerFn"]; + const useWindowFocus: (typeof import("@vueuse/core"))["useWindowFocus"]; + const useWindowScroll: (typeof import("@vueuse/core"))["useWindowScroll"]; + const useWindowSize: (typeof import("@vueuse/core"))["useWindowSize"]; + const watch: (typeof import("vue"))["watch"]; + const watchArray: (typeof import("@vueuse/core"))["watchArray"]; + const watchAtMost: (typeof import("@vueuse/core"))["watchAtMost"]; + const watchDebounced: (typeof import("@vueuse/core"))["watchDebounced"]; + const watchDeep: (typeof import("@vueuse/core"))["watchDeep"]; + const watchEffect: (typeof import("vue"))["watchEffect"]; + const watchIgnorable: (typeof import("@vueuse/core"))["watchIgnorable"]; + const watchImmediate: (typeof import("@vueuse/core"))["watchImmediate"]; + const watchOnce: (typeof import("@vueuse/core"))["watchOnce"]; + const watchPausable: (typeof import("@vueuse/core"))["watchPausable"]; + const watchPostEffect: (typeof import("vue"))["watchPostEffect"]; + const watchSyncEffect: (typeof import("vue"))["watchSyncEffect"]; + const watchThrottled: (typeof import("@vueuse/core"))["watchThrottled"]; + const watchTriggerable: (typeof import("@vueuse/core"))["watchTriggerable"]; + const watchWithFilter: (typeof import("@vueuse/core"))["watchWithFilter"]; + const whenever: (typeof import("@vueuse/core"))["whenever"]; +} +// for type re-export +declare global { + // @ts-ignore + export type { + Component, + ComponentPublicInstance, + ComputedRef, + ExtractDefaultPropTypes, + ExtractPropTypes, + ExtractPublicPropTypes, + InjectionKey, + PropType, + Ref, + VNode, + WritableComputedRef, + } from "vue"; + import("vue"); +} +// for vue template auto import +import { UnwrapRef } from "vue"; +declare module "vue" { + interface GlobalComponents {} + interface ComponentCustomProperties { + readonly EffectScope: UnwrapRef<(typeof import("vue"))["EffectScope"]>; + readonly ElMessage: UnwrapRef< + (typeof import("element-plus/es"))["ElMessage"] + >; + readonly ElMessageBox: UnwrapRef< + (typeof import("element-plus/es"))["ElMessageBox"] + >; + readonly ElNotification: UnwrapRef< + (typeof import("element-plus/es"))["ElNotification"] + >; + readonly acceptHMRUpdate: UnwrapRef< + (typeof import("pinia"))["acceptHMRUpdate"] + >; + readonly asyncComputed: UnwrapRef< + (typeof import("@vueuse/core"))["asyncComputed"] + >; + readonly autoResetRef: UnwrapRef< + (typeof import("@vueuse/core"))["autoResetRef"] + >; + readonly computed: UnwrapRef<(typeof import("vue"))["computed"]>; + readonly computedAsync: UnwrapRef< + (typeof import("@vueuse/core"))["computedAsync"] + >; + readonly computedEager: UnwrapRef< + (typeof import("@vueuse/core"))["computedEager"] + >; + readonly computedInject: UnwrapRef< + (typeof import("@vueuse/core"))["computedInject"] + >; + readonly computedWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["computedWithControl"] + >; + readonly controlledComputed: UnwrapRef< + (typeof import("@vueuse/core"))["controlledComputed"] + >; + readonly controlledRef: UnwrapRef< + (typeof import("@vueuse/core"))["controlledRef"] + >; + readonly createApp: UnwrapRef<(typeof import("vue"))["createApp"]>; + readonly createEventHook: UnwrapRef< + (typeof import("@vueuse/core"))["createEventHook"] + >; + readonly createGlobalState: UnwrapRef< + (typeof import("@vueuse/core"))["createGlobalState"] + >; + readonly createInjectionState: UnwrapRef< + (typeof import("@vueuse/core"))["createInjectionState"] + >; + readonly createPinia: UnwrapRef<(typeof import("pinia"))["createPinia"]>; + readonly createReactiveFn: UnwrapRef< + (typeof import("@vueuse/core"))["createReactiveFn"] + >; + readonly createReusableTemplate: UnwrapRef< + (typeof import("@vueuse/core"))["createReusableTemplate"] + >; + readonly createSharedComposable: UnwrapRef< + (typeof import("@vueuse/core"))["createSharedComposable"] + >; + readonly createTemplatePromise: UnwrapRef< + (typeof import("@vueuse/core"))["createTemplatePromise"] + >; + readonly createUnrefFn: UnwrapRef< + (typeof import("@vueuse/core"))["createUnrefFn"] + >; + readonly customRef: UnwrapRef<(typeof import("vue"))["customRef"]>; + readonly debouncedRef: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedRef"] + >; + readonly debouncedWatch: UnwrapRef< + (typeof import("@vueuse/core"))["debouncedWatch"] + >; + readonly defineAsyncComponent: UnwrapRef< + (typeof import("vue"))["defineAsyncComponent"] + >; + readonly defineComponent: UnwrapRef< + (typeof import("vue"))["defineComponent"] + >; + readonly defineStore: UnwrapRef<(typeof import("pinia"))["defineStore"]>; + readonly eagerComputed: UnwrapRef< + (typeof import("@vueuse/core"))["eagerComputed"] + >; + readonly effectScope: UnwrapRef<(typeof import("vue"))["effectScope"]>; + readonly extendRef: UnwrapRef<(typeof import("@vueuse/core"))["extendRef"]>; + readonly getActivePinia: UnwrapRef< + (typeof import("pinia"))["getActivePinia"] + >; + readonly getCurrentInstance: UnwrapRef< + (typeof import("vue"))["getCurrentInstance"] + >; + readonly getCurrentScope: UnwrapRef< + (typeof import("vue"))["getCurrentScope"] + >; + readonly h: UnwrapRef<(typeof import("vue"))["h"]>; + readonly ignorableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["ignorableWatch"] + >; + readonly inject: UnwrapRef<(typeof import("vue"))["inject"]>; + readonly injectLocal: UnwrapRef< + (typeof import("@vueuse/core"))["injectLocal"] + >; + readonly isDefined: UnwrapRef<(typeof import("@vueuse/core"))["isDefined"]>; + readonly isProxy: UnwrapRef<(typeof import("vue"))["isProxy"]>; + readonly isReactive: UnwrapRef<(typeof import("vue"))["isReactive"]>; + readonly isReadonly: UnwrapRef<(typeof import("vue"))["isReadonly"]>; + readonly isRef: UnwrapRef<(typeof import("vue"))["isRef"]>; + readonly makeDestructurable: UnwrapRef< + (typeof import("@vueuse/core"))["makeDestructurable"] + >; + readonly mapActions: UnwrapRef<(typeof import("pinia"))["mapActions"]>; + readonly mapGetters: UnwrapRef<(typeof import("pinia"))["mapGetters"]>; + readonly mapState: UnwrapRef<(typeof import("pinia"))["mapState"]>; + readonly mapStores: UnwrapRef<(typeof import("pinia"))["mapStores"]>; + readonly mapWritableState: UnwrapRef< + (typeof import("pinia"))["mapWritableState"] + >; + readonly markRaw: UnwrapRef<(typeof import("vue"))["markRaw"]>; + readonly nextTick: UnwrapRef<(typeof import("vue"))["nextTick"]>; + readonly onActivated: UnwrapRef<(typeof import("vue"))["onActivated"]>; + readonly onBeforeMount: UnwrapRef<(typeof import("vue"))["onBeforeMount"]>; + readonly onBeforeRouteLeave: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteLeave"] + >; + readonly onBeforeRouteUpdate: UnwrapRef< + (typeof import("vue-router"))["onBeforeRouteUpdate"] + >; + readonly onBeforeUnmount: UnwrapRef< + (typeof import("vue"))["onBeforeUnmount"] + >; + readonly onBeforeUpdate: UnwrapRef< + (typeof import("vue"))["onBeforeUpdate"] + >; + readonly onClickOutside: UnwrapRef< + (typeof import("@vueuse/core"))["onClickOutside"] + >; + readonly onDeactivated: UnwrapRef<(typeof import("vue"))["onDeactivated"]>; + readonly onErrorCaptured: UnwrapRef< + (typeof import("vue"))["onErrorCaptured"] + >; + readonly onKeyStroke: UnwrapRef< + (typeof import("@vueuse/core"))["onKeyStroke"] + >; + readonly onLongPress: UnwrapRef< + (typeof import("@vueuse/core"))["onLongPress"] + >; + readonly onMounted: UnwrapRef<(typeof import("vue"))["onMounted"]>; + readonly onRenderTracked: UnwrapRef< + (typeof import("vue"))["onRenderTracked"] + >; + readonly onRenderTriggered: UnwrapRef< + (typeof import("vue"))["onRenderTriggered"] + >; + readonly onScopeDispose: UnwrapRef< + (typeof import("vue"))["onScopeDispose"] + >; + readonly onServerPrefetch: UnwrapRef< + (typeof import("vue"))["onServerPrefetch"] + >; + readonly onStartTyping: UnwrapRef< + (typeof import("@vueuse/core"))["onStartTyping"] + >; + readonly onUnmounted: UnwrapRef<(typeof import("vue"))["onUnmounted"]>; + readonly onUpdated: UnwrapRef<(typeof import("vue"))["onUpdated"]>; + readonly pausableWatch: UnwrapRef< + (typeof import("@vueuse/core"))["pausableWatch"] + >; + readonly provide: UnwrapRef<(typeof import("vue"))["provide"]>; + readonly provideLocal: UnwrapRef< + (typeof import("@vueuse/core"))["provideLocal"] + >; + readonly reactify: UnwrapRef<(typeof import("@vueuse/core"))["reactify"]>; + readonly reactifyObject: UnwrapRef< + (typeof import("@vueuse/core"))["reactifyObject"] + >; + readonly reactive: UnwrapRef<(typeof import("vue"))["reactive"]>; + readonly reactiveComputed: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveComputed"] + >; + readonly reactiveOmit: UnwrapRef< + (typeof import("@vueuse/core"))["reactiveOmit"] + >; + readonly reactivePick: UnwrapRef< + (typeof import("@vueuse/core"))["reactivePick"] + >; + readonly readonly: UnwrapRef<(typeof import("vue"))["readonly"]>; + readonly ref: UnwrapRef<(typeof import("vue"))["ref"]>; + readonly refAutoReset: UnwrapRef< + (typeof import("@vueuse/core"))["refAutoReset"] + >; + readonly refDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["refDebounced"] + >; + readonly refDefault: UnwrapRef< + (typeof import("@vueuse/core"))["refDefault"] + >; + readonly refThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["refThrottled"] + >; + readonly refWithControl: UnwrapRef< + (typeof import("@vueuse/core"))["refWithControl"] + >; + readonly resolveComponent: UnwrapRef< + (typeof import("vue"))["resolveComponent"] + >; + readonly resolveRef: UnwrapRef< + (typeof import("@vueuse/core"))["resolveRef"] + >; + readonly resolveUnref: UnwrapRef< + (typeof import("@vueuse/core"))["resolveUnref"] + >; + readonly setActivePinia: UnwrapRef< + (typeof import("pinia"))["setActivePinia"] + >; + readonly setMapStoreSuffix: UnwrapRef< + (typeof import("pinia"))["setMapStoreSuffix"] + >; + readonly shallowReactive: UnwrapRef< + (typeof import("vue"))["shallowReactive"] + >; + readonly shallowReadonly: UnwrapRef< + (typeof import("vue"))["shallowReadonly"] + >; + readonly shallowRef: UnwrapRef<(typeof import("vue"))["shallowRef"]>; + readonly storeToRefs: UnwrapRef<(typeof import("pinia"))["storeToRefs"]>; + readonly syncRef: UnwrapRef<(typeof import("@vueuse/core"))["syncRef"]>; + readonly syncRefs: UnwrapRef<(typeof import("@vueuse/core"))["syncRefs"]>; + readonly templateRef: UnwrapRef< + (typeof import("@vueuse/core"))["templateRef"] + >; + readonly throttledRef: UnwrapRef< + (typeof import("@vueuse/core"))["throttledRef"] + >; + readonly throttledWatch: UnwrapRef< + (typeof import("@vueuse/core"))["throttledWatch"] + >; + readonly toRaw: UnwrapRef<(typeof import("vue"))["toRaw"]>; + readonly toReactive: UnwrapRef< + (typeof import("@vueuse/core"))["toReactive"] + >; + readonly toRef: UnwrapRef<(typeof import("vue"))["toRef"]>; + readonly toRefs: UnwrapRef<(typeof import("vue"))["toRefs"]>; + readonly toValue: UnwrapRef<(typeof import("vue"))["toValue"]>; + readonly triggerRef: UnwrapRef<(typeof import("vue"))["triggerRef"]>; + readonly tryOnBeforeMount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeMount"] + >; + readonly tryOnBeforeUnmount: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnBeforeUnmount"] + >; + readonly tryOnMounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnMounted"] + >; + readonly tryOnScopeDispose: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnScopeDispose"] + >; + readonly tryOnUnmounted: UnwrapRef< + (typeof import("@vueuse/core"))["tryOnUnmounted"] + >; + readonly unref: UnwrapRef<(typeof import("vue"))["unref"]>; + readonly unrefElement: UnwrapRef< + (typeof import("@vueuse/core"))["unrefElement"] + >; + readonly until: UnwrapRef<(typeof import("@vueuse/core"))["until"]>; + readonly useActiveElement: UnwrapRef< + (typeof import("@vueuse/core"))["useActiveElement"] + >; + readonly useAnimate: UnwrapRef< + (typeof import("@vueuse/core"))["useAnimate"] + >; + readonly useArrayDifference: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayDifference"] + >; + readonly useArrayEvery: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayEvery"] + >; + readonly useArrayFilter: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFilter"] + >; + readonly useArrayFind: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFind"] + >; + readonly useArrayFindIndex: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindIndex"] + >; + readonly useArrayFindLast: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayFindLast"] + >; + readonly useArrayIncludes: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayIncludes"] + >; + readonly useArrayJoin: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayJoin"] + >; + readonly useArrayMap: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayMap"] + >; + readonly useArrayReduce: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayReduce"] + >; + readonly useArraySome: UnwrapRef< + (typeof import("@vueuse/core"))["useArraySome"] + >; + readonly useArrayUnique: UnwrapRef< + (typeof import("@vueuse/core"))["useArrayUnique"] + >; + readonly useAsyncQueue: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncQueue"] + >; + readonly useAsyncState: UnwrapRef< + (typeof import("@vueuse/core"))["useAsyncState"] + >; + readonly useAttrs: UnwrapRef<(typeof import("vue"))["useAttrs"]>; + readonly useBase64: UnwrapRef<(typeof import("@vueuse/core"))["useBase64"]>; + readonly useBattery: UnwrapRef< + (typeof import("@vueuse/core"))["useBattery"] + >; + readonly useBluetooth: UnwrapRef< + (typeof import("@vueuse/core"))["useBluetooth"] + >; + readonly useBreakpoints: UnwrapRef< + (typeof import("@vueuse/core"))["useBreakpoints"] + >; + readonly useBroadcastChannel: UnwrapRef< + (typeof import("@vueuse/core"))["useBroadcastChannel"] + >; + readonly useBrowserLocation: UnwrapRef< + (typeof import("@vueuse/core"))["useBrowserLocation"] + >; + readonly useCached: UnwrapRef<(typeof import("@vueuse/core"))["useCached"]>; + readonly useClipboard: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboard"] + >; + readonly useClipboardItems: UnwrapRef< + (typeof import("@vueuse/core"))["useClipboardItems"] + >; + readonly useCloned: UnwrapRef<(typeof import("@vueuse/core"))["useCloned"]>; + readonly useColorMode: UnwrapRef< + (typeof import("@vueuse/core"))["useColorMode"] + >; + readonly useConfirmDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useConfirmDialog"] + >; + readonly useCounter: UnwrapRef< + (typeof import("@vueuse/core"))["useCounter"] + >; + readonly useCssModule: UnwrapRef<(typeof import("vue"))["useCssModule"]>; + readonly useCssVar: UnwrapRef<(typeof import("@vueuse/core"))["useCssVar"]>; + readonly useCssVars: UnwrapRef<(typeof import("vue"))["useCssVars"]>; + readonly useCurrentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useCurrentElement"] + >; + readonly useCycleList: UnwrapRef< + (typeof import("@vueuse/core"))["useCycleList"] + >; + readonly useDark: UnwrapRef<(typeof import("@vueuse/core"))["useDark"]>; + readonly useDateFormat: UnwrapRef< + (typeof import("@vueuse/core"))["useDateFormat"] + >; + readonly useDebounce: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounce"] + >; + readonly useDebounceFn: UnwrapRef< + (typeof import("@vueuse/core"))["useDebounceFn"] + >; + readonly useDebouncedRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useDebouncedRefHistory"] + >; + readonly useDeviceMotion: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceMotion"] + >; + readonly useDeviceOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useDeviceOrientation"] + >; + readonly useDevicePixelRatio: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicePixelRatio"] + >; + readonly useDevicesList: UnwrapRef< + (typeof import("@vueuse/core"))["useDevicesList"] + >; + readonly useDisplayMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useDisplayMedia"] + >; + readonly useDocumentVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useDocumentVisibility"] + >; + readonly useDraggable: UnwrapRef< + (typeof import("@vueuse/core"))["useDraggable"] + >; + readonly useDropZone: UnwrapRef< + (typeof import("@vueuse/core"))["useDropZone"] + >; + readonly useElementBounding: UnwrapRef< + (typeof import("@vueuse/core"))["useElementBounding"] + >; + readonly useElementByPoint: UnwrapRef< + (typeof import("@vueuse/core"))["useElementByPoint"] + >; + readonly useElementHover: UnwrapRef< + (typeof import("@vueuse/core"))["useElementHover"] + >; + readonly useElementSize: UnwrapRef< + (typeof import("@vueuse/core"))["useElementSize"] + >; + readonly useElementVisibility: UnwrapRef< + (typeof import("@vueuse/core"))["useElementVisibility"] + >; + readonly useEventBus: UnwrapRef< + (typeof import("@vueuse/core"))["useEventBus"] + >; + readonly useEventListener: UnwrapRef< + (typeof import("@vueuse/core"))["useEventListener"] + >; + readonly useEventSource: UnwrapRef< + (typeof import("@vueuse/core"))["useEventSource"] + >; + readonly useEyeDropper: UnwrapRef< + (typeof import("@vueuse/core"))["useEyeDropper"] + >; + readonly useFavicon: UnwrapRef< + (typeof import("@vueuse/core"))["useFavicon"] + >; + readonly useFetch: UnwrapRef<(typeof import("@vueuse/core"))["useFetch"]>; + readonly useFileDialog: UnwrapRef< + (typeof import("@vueuse/core"))["useFileDialog"] + >; + readonly useFileSystemAccess: UnwrapRef< + (typeof import("@vueuse/core"))["useFileSystemAccess"] + >; + readonly useFocus: UnwrapRef<(typeof import("@vueuse/core"))["useFocus"]>; + readonly useFocusWithin: UnwrapRef< + (typeof import("@vueuse/core"))["useFocusWithin"] + >; + readonly useFps: UnwrapRef<(typeof import("@vueuse/core"))["useFps"]>; + readonly useFullscreen: UnwrapRef< + (typeof import("@vueuse/core"))["useFullscreen"] + >; + readonly useGamepad: UnwrapRef< + (typeof import("@vueuse/core"))["useGamepad"] + >; + readonly useGeolocation: UnwrapRef< + (typeof import("@vueuse/core"))["useGeolocation"] + >; + readonly useI18n: UnwrapRef<(typeof import("vue-i18n"))["useI18n"]>; + readonly useIdle: UnwrapRef<(typeof import("@vueuse/core"))["useIdle"]>; + readonly useImage: UnwrapRef<(typeof import("@vueuse/core"))["useImage"]>; + readonly useInfiniteScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useInfiniteScroll"] + >; + readonly useIntersectionObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useIntersectionObserver"] + >; + readonly useInterval: UnwrapRef< + (typeof import("@vueuse/core"))["useInterval"] + >; + readonly useIntervalFn: UnwrapRef< + (typeof import("@vueuse/core"))["useIntervalFn"] + >; + readonly useKeyModifier: UnwrapRef< + (typeof import("@vueuse/core"))["useKeyModifier"] + >; + readonly useLastChanged: UnwrapRef< + (typeof import("@vueuse/core"))["useLastChanged"] + >; + readonly useLink: UnwrapRef<(typeof import("vue-router"))["useLink"]>; + readonly useLocalStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useLocalStorage"] + >; + readonly useMagicKeys: UnwrapRef< + (typeof import("@vueuse/core"))["useMagicKeys"] + >; + readonly useManualRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useManualRefHistory"] + >; + readonly useMediaControls: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaControls"] + >; + readonly useMediaQuery: UnwrapRef< + (typeof import("@vueuse/core"))["useMediaQuery"] + >; + readonly useMemoize: UnwrapRef< + (typeof import("@vueuse/core"))["useMemoize"] + >; + readonly useMemory: UnwrapRef<(typeof import("@vueuse/core"))["useMemory"]>; + readonly useMounted: UnwrapRef< + (typeof import("@vueuse/core"))["useMounted"] + >; + readonly useMouse: UnwrapRef<(typeof import("@vueuse/core"))["useMouse"]>; + readonly useMouseInElement: UnwrapRef< + (typeof import("@vueuse/core"))["useMouseInElement"] + >; + readonly useMousePressed: UnwrapRef< + (typeof import("@vueuse/core"))["useMousePressed"] + >; + readonly useMutationObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useMutationObserver"] + >; + readonly useNavigatorLanguage: UnwrapRef< + (typeof import("@vueuse/core"))["useNavigatorLanguage"] + >; + readonly useNetwork: UnwrapRef< + (typeof import("@vueuse/core"))["useNetwork"] + >; + readonly useNow: UnwrapRef<(typeof import("@vueuse/core"))["useNow"]>; + readonly useObjectUrl: UnwrapRef< + (typeof import("@vueuse/core"))["useObjectUrl"] + >; + readonly useOffsetPagination: UnwrapRef< + (typeof import("@vueuse/core"))["useOffsetPagination"] + >; + readonly useOnline: UnwrapRef<(typeof import("@vueuse/core"))["useOnline"]>; + readonly usePageLeave: UnwrapRef< + (typeof import("@vueuse/core"))["usePageLeave"] + >; + readonly useParallax: UnwrapRef< + (typeof import("@vueuse/core"))["useParallax"] + >; + readonly useParentElement: UnwrapRef< + (typeof import("@vueuse/core"))["useParentElement"] + >; + readonly usePerformanceObserver: UnwrapRef< + (typeof import("@vueuse/core"))["usePerformanceObserver"] + >; + readonly usePermission: UnwrapRef< + (typeof import("@vueuse/core"))["usePermission"] + >; + readonly usePointer: UnwrapRef< + (typeof import("@vueuse/core"))["usePointer"] + >; + readonly usePointerLock: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerLock"] + >; + readonly usePointerSwipe: UnwrapRef< + (typeof import("@vueuse/core"))["usePointerSwipe"] + >; + readonly usePreferredColorScheme: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredColorScheme"] + >; + readonly usePreferredContrast: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredContrast"] + >; + readonly usePreferredDark: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredDark"] + >; + readonly usePreferredLanguages: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredLanguages"] + >; + readonly usePreferredReducedMotion: UnwrapRef< + (typeof import("@vueuse/core"))["usePreferredReducedMotion"] + >; + readonly usePrevious: UnwrapRef< + (typeof import("@vueuse/core"))["usePrevious"] + >; + readonly useRafFn: UnwrapRef<(typeof import("@vueuse/core"))["useRafFn"]>; + readonly useRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useRefHistory"] + >; + readonly useResizeObserver: UnwrapRef< + (typeof import("@vueuse/core"))["useResizeObserver"] + >; + readonly useRoute: UnwrapRef<(typeof import("vue-router"))["useRoute"]>; + readonly useRouter: UnwrapRef<(typeof import("vue-router"))["useRouter"]>; + readonly useScreenOrientation: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenOrientation"] + >; + readonly useScreenSafeArea: UnwrapRef< + (typeof import("@vueuse/core"))["useScreenSafeArea"] + >; + readonly useScriptTag: UnwrapRef< + (typeof import("@vueuse/core"))["useScriptTag"] + >; + readonly useScroll: UnwrapRef<(typeof import("@vueuse/core"))["useScroll"]>; + readonly useScrollLock: UnwrapRef< + (typeof import("@vueuse/core"))["useScrollLock"] + >; + readonly useSessionStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useSessionStorage"] + >; + readonly useShare: UnwrapRef<(typeof import("@vueuse/core"))["useShare"]>; + readonly useSlots: UnwrapRef<(typeof import("vue"))["useSlots"]>; + readonly useSorted: UnwrapRef<(typeof import("@vueuse/core"))["useSorted"]>; + readonly useSpeechRecognition: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechRecognition"] + >; + readonly useSpeechSynthesis: UnwrapRef< + (typeof import("@vueuse/core"))["useSpeechSynthesis"] + >; + readonly useStepper: UnwrapRef< + (typeof import("@vueuse/core"))["useStepper"] + >; + readonly useStorage: UnwrapRef< + (typeof import("@vueuse/core"))["useStorage"] + >; + readonly useStorageAsync: UnwrapRef< + (typeof import("@vueuse/core"))["useStorageAsync"] + >; + readonly useStyleTag: UnwrapRef< + (typeof import("@vueuse/core"))["useStyleTag"] + >; + readonly useSupported: UnwrapRef< + (typeof import("@vueuse/core"))["useSupported"] + >; + readonly useSwipe: UnwrapRef<(typeof import("@vueuse/core"))["useSwipe"]>; + readonly useTemplateRefsList: UnwrapRef< + (typeof import("@vueuse/core"))["useTemplateRefsList"] + >; + readonly useTextDirection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextDirection"] + >; + readonly useTextSelection: UnwrapRef< + (typeof import("@vueuse/core"))["useTextSelection"] + >; + readonly useTextareaAutosize: UnwrapRef< + (typeof import("@vueuse/core"))["useTextareaAutosize"] + >; + readonly useThrottle: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottle"] + >; + readonly useThrottleFn: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottleFn"] + >; + readonly useThrottledRefHistory: UnwrapRef< + (typeof import("@vueuse/core"))["useThrottledRefHistory"] + >; + readonly useTimeAgo: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeAgo"] + >; + readonly useTimeout: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeout"] + >; + readonly useTimeoutFn: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutFn"] + >; + readonly useTimeoutPoll: UnwrapRef< + (typeof import("@vueuse/core"))["useTimeoutPoll"] + >; + readonly useTimestamp: UnwrapRef< + (typeof import("@vueuse/core"))["useTimestamp"] + >; + readonly useTitle: UnwrapRef<(typeof import("@vueuse/core"))["useTitle"]>; + readonly useToNumber: UnwrapRef< + (typeof import("@vueuse/core"))["useToNumber"] + >; + readonly useToString: UnwrapRef< + (typeof import("@vueuse/core"))["useToString"] + >; + readonly useToggle: UnwrapRef<(typeof import("@vueuse/core"))["useToggle"]>; + readonly useTransition: UnwrapRef< + (typeof import("@vueuse/core"))["useTransition"] + >; + readonly useUrlSearchParams: UnwrapRef< + (typeof import("@vueuse/core"))["useUrlSearchParams"] + >; + readonly useUserMedia: UnwrapRef< + (typeof import("@vueuse/core"))["useUserMedia"] + >; + readonly useVModel: UnwrapRef<(typeof import("@vueuse/core"))["useVModel"]>; + readonly useVModels: UnwrapRef< + (typeof import("@vueuse/core"))["useVModels"] + >; + readonly useVibrate: UnwrapRef< + (typeof import("@vueuse/core"))["useVibrate"] + >; + readonly useVirtualList: UnwrapRef< + (typeof import("@vueuse/core"))["useVirtualList"] + >; + readonly useWakeLock: UnwrapRef< + (typeof import("@vueuse/core"))["useWakeLock"] + >; + readonly useWebNotification: UnwrapRef< + (typeof import("@vueuse/core"))["useWebNotification"] + >; + readonly useWebSocket: UnwrapRef< + (typeof import("@vueuse/core"))["useWebSocket"] + >; + readonly useWebWorker: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorker"] + >; + readonly useWebWorkerFn: UnwrapRef< + (typeof import("@vueuse/core"))["useWebWorkerFn"] + >; + readonly useWindowFocus: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowFocus"] + >; + readonly useWindowScroll: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowScroll"] + >; + readonly useWindowSize: UnwrapRef< + (typeof import("@vueuse/core"))["useWindowSize"] + >; + readonly watch: UnwrapRef<(typeof import("vue"))["watch"]>; + readonly watchArray: UnwrapRef< + (typeof import("@vueuse/core"))["watchArray"] + >; + readonly watchAtMost: UnwrapRef< + (typeof import("@vueuse/core"))["watchAtMost"] + >; + readonly watchDebounced: UnwrapRef< + (typeof import("@vueuse/core"))["watchDebounced"] + >; + readonly watchDeep: UnwrapRef<(typeof import("@vueuse/core"))["watchDeep"]>; + readonly watchEffect: UnwrapRef<(typeof import("vue"))["watchEffect"]>; + readonly watchIgnorable: UnwrapRef< + (typeof import("@vueuse/core"))["watchIgnorable"] + >; + readonly watchImmediate: UnwrapRef< + (typeof import("@vueuse/core"))["watchImmediate"] + >; + readonly watchOnce: UnwrapRef<(typeof import("@vueuse/core"))["watchOnce"]>; + readonly watchPausable: UnwrapRef< + (typeof import("@vueuse/core"))["watchPausable"] + >; + readonly watchPostEffect: UnwrapRef< + (typeof import("vue"))["watchPostEffect"] + >; + readonly watchSyncEffect: UnwrapRef< + (typeof import("vue"))["watchSyncEffect"] + >; + readonly watchThrottled: UnwrapRef< + (typeof import("@vueuse/core"))["watchThrottled"] + >; + readonly watchTriggerable: UnwrapRef< + (typeof import("@vueuse/core"))["watchTriggerable"] + >; + readonly watchWithFilter: UnwrapRef< + (typeof import("@vueuse/core"))["watchWithFilter"] + >; + readonly whenever: UnwrapRef<(typeof import("@vueuse/core"))["whenever"]>; + } +} diff --git a/src/types/components.d.ts b/src/types/components.d.ts new file mode 100644 index 0000000..452916d --- /dev/null +++ b/src/types/components.d.ts @@ -0,0 +1,72 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +declare module "vue" { + export interface GlobalComponents { + AppLink: (typeof import("./../components/AppLink/index.vue"))["default"]; + AppMain: (typeof import("./../layout/components/AppMain/index.vue"))["default"]; + Breadcrumb: (typeof import("./../components/Breadcrumb/index.vue"))["default"]; + ElAlert: (typeof import("element-plus/es"))["ElAlert"]; + ElBacktop: (typeof import("element-plus/es"))["ElBacktop"]; + ElBadge: (typeof import("element-plus/es"))["ElBadge"]; + ElBreadcrumb: (typeof import("element-plus/es"))["ElBreadcrumb"]; + ElBreadcrumbItem: (typeof import("element-plus/es"))["ElBreadcrumbItem"]; + ElButton: (typeof import("element-plus/es"))["ElButton"]; + ElCard: (typeof import("element-plus/es"))["ElCard"]; + ElCol: (typeof import("element-plus/es"))["ElCol"]; + ElColorPicker: (typeof import("element-plus/es"))["ElColorPicker"]; + ElConfigProvider: (typeof import("element-plus/es"))["ElConfigProvider"]; + ElDialog: (typeof import("element-plus/es"))["ElDialog"]; + ElDivider: (typeof import("element-plus/es"))["ElDivider"]; + ElDrawer: (typeof import("element-plus/es"))["ElDrawer"]; + ElDropdown: (typeof import("element-plus/es"))["ElDropdown"]; + ElDropdownItem: (typeof import("element-plus/es"))["ElDropdownItem"]; + ElDropdownMenu: (typeof import("element-plus/es"))["ElDropdownMenu"]; + ElForm: (typeof import("element-plus/es"))["ElForm"]; + ElFormItem: (typeof import("element-plus/es"))["ElFormItem"]; + ElIcon: (typeof import("element-plus/es"))["ElIcon"]; + ElImage: (typeof import("element-plus/es"))["ElImage"]; + ElInput: (typeof import("element-plus/es"))["ElInput"]; + ElLink: (typeof import("element-plus/es"))["ElLink"]; + ElMenu: (typeof import("element-plus/es"))["ElMenu"]; + ElMenuItem: (typeof import("element-plus/es"))["ElMenuItem"]; + ElRow: (typeof import("element-plus/es"))["ElRow"]; + ElScrollbar: (typeof import("element-plus/es"))["ElScrollbar"]; + ElSubMenu: (typeof import("element-plus/es"))["ElSubMenu"]; + ElSwitch: (typeof import("element-plus/es"))["ElSwitch"]; + ElTabPane: (typeof import("element-plus/es"))["ElTabPane"]; + ElTabs: (typeof import("element-plus/es"))["ElTabs"]; + ElTag: (typeof import("element-plus/es"))["ElTag"]; + ElText: (typeof import("element-plus/es"))["ElText"]; + ElTooltip: (typeof import("element-plus/es"))["ElTooltip"]; + ElWatermark: (typeof import("element-plus/es"))["ElWatermark"]; + Hamburger: (typeof import("./../components/Hamburger/index.vue"))["default"]; + IEpBell: (typeof import("~icons/ep/bell"))["default"]; + IEpClose: (typeof import("~icons/ep/close"))["default"]; + IEpLock: (typeof import("~icons/ep/lock"))["default"]; + IEpUser: (typeof import("~icons/ep/user"))["default"]; + LangSelect: (typeof import("./../components/LangSelect/index.vue"))["default"]; + LayoutSelect: (typeof import("./../layout/components/Settings/components/LayoutSelect.vue"))["default"]; + NavBar: (typeof import("./../layout/components/NavBar/index.vue"))["default"]; + NavbarAction: (typeof import("./../layout/components/NavBar/components/NavbarAction.vue"))["default"]; + NavbarLeft: (typeof import("./../layout/components/NavBar/components/NavbarLeft.vue"))["default"]; + NavbarRight: (typeof import("./../layout/components/NavBar/components/NavbarRight.vue"))["default"]; + RouterLink: (typeof import("vue-router"))["RouterLink"]; + RouterView: (typeof import("vue-router"))["RouterView"]; + Settings: (typeof import("./../layout/components/Settings/index.vue"))["default"]; + Sidebar: (typeof import("./../layout/components/Sidebar/index.vue"))["default"]; + SidebarLogo: (typeof import("./../layout/components/Sidebar/components/SidebarLogo.vue"))["default"]; + SidebarMenu: (typeof import("./../layout/components/Sidebar/components/SidebarMenu.vue"))["default"]; + SidebarMenuItem: (typeof import("./../layout/components/Sidebar/components/SidebarMenuItem.vue"))["default"]; + SidebarMenuItemTitle: (typeof import("./../layout/components/Sidebar/components/SidebarMenuItemTitle.vue"))["default"]; + SidebarMixTopMenu: (typeof import("./../layout/components/Sidebar/components/SidebarMixTopMenu.vue"))["default"]; + SizeSelect: (typeof import("./../components/SizeSelect/index.vue"))["default"]; + SvgIcon: (typeof import("./../components/SvgIcon/index.vue"))["default"]; + TagsView: (typeof import("./../layout/components/TagsView/index.vue"))["default"]; + ThemeColorPicker: (typeof import("./../layout/components/Settings/components/ThemeColorPicker.vue"))["default"]; + } +} diff --git a/src/types/env.d.ts b/src/types/env.d.ts new file mode 100644 index 0000000..7ed1377 --- /dev/null +++ b/src/types/env.d.ts @@ -0,0 +1,40 @@ +// https://cn.vitejs.dev/guide/env-and-mode + +declare module "*.vue" { + import { DefineComponent } from "vue"; + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any>; + export default component; +} + +// TypeScript 类型提示都为 string: https://github.com/vitejs/vite/issues/6930 +interface ImportMetaEnv { + /** 应用端口 */ + VITE_APP_PORT: number; + /** API 基础路径(代理前缀) */ + VITE_APP_BASE_API: string; + /** API 地址 */ + VITE_APP_API_URL: string; + /** 是否开启 Mock 服务 */ + VITE_MOCK_DEV_SERVER: boolean; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} + +/** + * 平台的名称、版本、运行所需的`node`版本、依赖、构建时间的类型提示 + */ +declare const __APP_INFO__: { + pkg: { + name: string; + version: string; + engines: { + node: string; + }; + dependencies: Record; + devDependencies: Record; + }; + buildTimestamp: number; +}; diff --git a/src/types/global.d.ts b/src/types/global.d.ts new file mode 100644 index 0000000..146d5bf --- /dev/null +++ b/src/types/global.d.ts @@ -0,0 +1,95 @@ +declare global { + /** + * 响应数据 + */ + interface ResponseData { + code: string; + data: T; + msg: string; + } + + /** + * 分页查询参数 + */ + interface PageQuery { + pageNum: number; + pageSize: number; + } + + /** + * 分页响应对象 + */ + interface PageResult { + /** 数据列表 */ + list: T; + /** 总数 */ + total: number; + } + + /** + * 页签对象 + */ + interface TagView { + /** 页签名称 */ + name: string; + /** 页签标题 */ + title: string; + /** 页签路由路径 */ + path: string; + /** 页签路由完整路径 */ + fullPath: string; + /** 页签图标 */ + icon?: string; + /** 是否固定页签 */ + affix?: boolean; + /** 是否开启缓存 */ + keepAlive?: boolean; + /** 路由查询参数 */ + query?: any; + } + + /** + * 系统设置 + */ + interface AppSettings { + /** 系统标题 */ + title: string; + /** 系统版本 */ + version: string; + /** 是否显示设置 */ + showSettings: boolean; + /** 是否固定头部 */ + fixedHeader: boolean; + /** 是否显示多标签导航 */ + tagsView: boolean; + /** 是否显示侧边栏Logo */ + sidebarLogo: boolean; + /** 导航栏布局(left|top|mix) */ + layout: string; + /** 主题颜色 */ + themeColor: string; + /** 主题模式(dark|light) */ + theme: string; + /** 布局大小(default |large |small) */ + size: string; + /** 语言( zh-cn| en) */ + language: string; + /** 是否开启水印 */ + watermarkEnabled: boolean; + /** 水印内容 */ + watermarkContent: string; + } + + /** + * 组件数据源 + */ + interface OptionType { + /** 值 */ + value: string | number; + /** 文本 */ + label: string; + /** 子列表 */ + children?: OptionType[]; + } +} +export {}; diff --git a/src/types/router.d.ts b/src/types/router.d.ts new file mode 100644 index 0000000..a175ea1 --- /dev/null +++ b/src/types/router.d.ts @@ -0,0 +1,54 @@ +import "vue-router"; + +declare module "vue-router" { + // https://router.vuejs.org/zh/guide/advanced/meta.html#typescript + // 可以通过扩展 RouteMeta 接口来输入 meta 字段 + interface RouteMeta { + /** + * 菜单名称 + * @example 'Dashboard' + */ + title?: string; + + /** + * 菜单图标 + * @example 'el-icon-edit' + */ + icon?: string; + + /** + * 是否隐藏菜单项 + * true 隐藏, false 显示 + * @default false + */ + hidden?: boolean; + + /** + * 始终显示父级菜单,即使只有一个子菜单 + * true 显示父级菜单, false 隐藏父级菜单,显示唯一子节点 + * @default false + */ + alwaysShow?: boolean; + + /** + * 是否固定在页签上 + * true 固定, false 不固定 + * @default false + */ + affix?: boolean; + + /** + * 是否缓存页面 + * true 缓存, false 不缓存 + * @default false + */ + keepAlive?: boolean; + + /** + * 是否在面包屑导航中隐藏 + * true 隐藏, false 显示 + * @default false + */ + breadcrumb?: boolean; + } +} diff --git a/src/utils/baseurls.ts b/src/utils/baseurls.ts new file mode 100644 index 0000000..6f590f6 --- /dev/null +++ b/src/utils/baseurls.ts @@ -0,0 +1,4 @@ +export const BASE_NAME_URL = "/File/User/Name/"; +export const BASE_AVATAR_URL = "/File/User/Portrait/"; +export const BASE_SOFTWARE_URL = "/File/Software/App/"; +export const BASE_FONT_URL = "/File/Fonts/Install/"; diff --git a/src/utils/device-type.ts b/src/utils/device-type.ts new file mode 100644 index 0000000..d50903a --- /dev/null +++ b/src/utils/device-type.ts @@ -0,0 +1,28 @@ +// 判断机型 安卓 or ios +export function isMobile_pc() { + const flag = navigator.userAgent.match( + /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i + ); + return flag; +} +// 判断是在安卓还是ios打开 +export function is_andriod_ios() { + const u = navigator.userAgent; + return { + //移动终端浏览器版本信息 + trident: u.indexOf("Trident") > -1, //IE内核 + presto: u.indexOf("Presto") > -1, //opera内核 + webKit: u.indexOf("AppleWebKit") > -1, //苹果、谷歌内核 + gecko: u.indexOf("Gecko") > -1 && u.indexOf("KHTML") == -1, //火狐内核 + mobile: + !!u.match(/AppleWebKit.*Mobile/i) || + !!u.match( + /MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/ + ), //是否为移动终端 + ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 + android: u.indexOf("Android") > -1 || u.indexOf("Linux") > -1, //android终端或者uc浏览器 + iPhone: u.indexOf("iPhone") > -1 || u.indexOf("Mac") > -1, //是否为iPhone或者QQHD浏览器 + iPad: u.indexOf("iPad") > -1, //是否iPad + webApp: u.indexOf("Safari") == -1, //是否web应该程序,没有头部与底部 + }; +} diff --git a/src/utils/format.ts b/src/utils/format.ts new file mode 100644 index 0000000..0ce14b9 --- /dev/null +++ b/src/utils/format.ts @@ -0,0 +1,120 @@ +/** + * 标准日期显示 + * @param {number} timestamp + * @returns {string} + */ +export function formatDate(timestamp: number | undefined): string { + if (!timestamp) return ""; + + const date = new Date(timestamp * 1000); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + + return `${year}-${month}-${day}`; +} + +/** + * 中文日期显示 + * @param timestamp + * @returns + */ + +export function formatDateCN(timestamp: number | undefined) { + if (!timestamp) return ""; + + const date = new Date(timestamp * 1000); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + + return `${year}年${month}月${day}日`; +} + +/** + * 标准时间显示(到分钟) + * @param {number} timestamp + * @returns {string} + */ +export function formatTimeToMinutes(timestamp: number | undefined): string { + if (!timestamp) return ""; + + const date = new Date(timestamp * 1000); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + const hour = String(date.getHours()).padStart(2, "0"); + const min = String(date.getMinutes()).padStart(2, "0"); + + return `${year}-${month}-${day} ${hour}:${min}`; +} + +/** + * 标准时间显示(到秒) + * @param {number} timestamp + * @returns {string} + */ +export function formatTimeToSeconds(timestamp: number | undefined): string { + if (!timestamp) return ""; + + const date = new Date(timestamp * 1000); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + const hour = String(date.getHours()).padStart(2, "0"); + const min = String(date.getMinutes()).padStart(2, "0"); + const sec = String(date.getSeconds()).padStart(2, "0"); + + return `${year}-${month}-${day} ${hour}:${min}:${sec}`; +} + +/** + * 日期转yyyymmdd形式的数字 + * @param date + * @returns + */ +export function dateToNumber(date: Date): number { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + const str = `${year}${month}${day}`; + + return Number(str); +} + +const week: { [key: number]: string } = { + 0: "日", + 1: "一", + 2: "二", + 3: "三", + 4: "四", + 5: "五", + 6: "六", +}; +export function dayToWeek(day: number) { + return week[day]; +} + +/** + * 金额格式化 + * @param amount 金额String||Number + * @param precision 小数位数Number(0-20) + * @param unit 是否带单位Boolean + * @returns {string} + */ +export function amountFormat(amount: string | number, precision: number, unit: boolean): string { + if (amount == "") amount = "0"; + precision = precision > 0 && precision <= 20 ? precision : 2; + amount = parseFloat((amount + "").replace(/[^\d\.-]/g, "")).toFixed(precision) + ""; + let l = amount.split(".")[0].split("").reverse(); + let r = amount.split(".")[1]; + let t = ""; + for (let i = 0; i < l.length; i++) { + t += l[i] + ((i + 1) % 3 == 0 && i + 1 != l.length ? "," : ""); + } + if (unit) { + return t.split("").reverse().join("") + "." + r + "元"; + } else { + return t.split("").reverse().join("") + "." + r; + } +} diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts new file mode 100644 index 0000000..17ed904 --- /dev/null +++ b/src/utils/i18n.ts @@ -0,0 +1,12 @@ +// translate router.meta.title, be used in breadcrumb sidebar tagsview +import i18n from "@/lang/index"; + +export function translateRouteTitle(title: any) { + // 判断是否存在国际化配置,如果没有原生返回 + const hasKey = i18n.global.te("route." + title); + if (hasKey) { + const translatedTitle = i18n.global.t("route." + title); + return translatedTitle; + } + return title; +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..fe4ffde --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,51 @@ +/** + * Check if an element has a class + * @param {HTMLElement} ele + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele: HTMLElement, cls: string) { + return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)")); +} + +/** + * Add class to element + * @param {HTMLElement} ele + * @param {string} cls + */ +export function addClass(ele: HTMLElement, cls: string) { + if (!hasClass(ele, cls)) ele.className += " " + cls; +} + +/** + * Remove class from element + * @param {HTMLElement} ele + * @param {string} cls + */ +export function removeClass(ele: HTMLElement, cls: string) { + if (hasClass(ele, cls)) { + const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)"); + ele.className = ele.className.replace(reg, " "); + } +} + +/** + * 判断是否是外部链接 + * + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path: string) { + const isExternal = /^(https?:|http?:|mailto:|tel:)/.test(path); + return isExternal; +} + +// 验证邮箱 +export function isEmail(addr: string): boolean { + return /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/.test(addr); +} + +// 验证手机 +export function isPhone(tel: string): boolean { + return /^$|^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/.test(tel); // //^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(tel); +} diff --git a/src/utils/nprogress.ts b/src/utils/nprogress.ts new file mode 100644 index 0000000..c1d5f23 --- /dev/null +++ b/src/utils/nprogress.ts @@ -0,0 +1,18 @@ +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; + +// 进度条 +NProgress.configure({ + // 动画方式 + easing: "ease", + // 递增进度条的速度 + speed: 500, + // 是否显示加载ico + showSpinner: false, + // 自动递增间隔 + trickleSpeed: 200, + // 初始化时的最小百分比 + minimum: 0.3, +}); + +export default NProgress; diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000..bdec5b9 --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,73 @@ +import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios"; +import { useUserStoreHook } from "@/store/modules/user"; +import { useAppStoreHook } from "@/store/modules/app"; +import { ResultEnum } from "@/enums/ResultEnum"; +import { TOKEN_KEY } from "@/enums/CacheEnum"; +import qs from "qs"; + +// 创建 axios 实例 +const service = axios.create({ + baseURL: import.meta.env.VITE_APP_BASE_API, + timeout: 50000, + headers: { "Content-Type": "application/json;charset=utf-8" }, + paramsSerializer: (params) => { + return qs.stringify(params); + }, +}); + +// 请求拦截器 +service.interceptors.request.use( + (config: InternalAxiosRequestConfig) => { + const accessToken = localStorage.getItem(TOKEN_KEY); + if (accessToken) { + config.headers.Authorization = accessToken; + } + return config; + }, + (error: any) => { + return Promise.reject(error); + } +); + +// 响应拦截器 +service.interceptors.response.use( + (response: AxiosResponse) => { + // 检查配置的响应类型是否为二进制类型('blob' 或 'arraybuffer'), 如果是,直接返回响应对象 + if (response.config.responseType === "blob" || response.config.responseType === "arraybuffer") { + return response; + } + + const { code, data, msg } = response.data; + if (code === ResultEnum.SUCCESS) { + return data; + } else if (code === ResultEnum.USER_NAME_EXISTED) { + useAppStoreHook().stopSendCodeCountdown(); + } + ElMessage.error(msg || "系统出错"); + return Promise.reject(new Error(msg || "Error")); + }, + (error: any) => { + // 异常处理 + if (error.response.data) { + const { code, msg } = error.response.data; + if (code === ResultEnum.TOKEN_INVALID) { + ElNotification({ + title: "提示", + message: "您的会话已过期,请重新登录", + type: "info", + }); + useUserStoreHook() + .resetToken() + .then(() => { + location.reload(); + }); + } else { + ElMessage.error(msg || "系统出错"); + } + } + return Promise.reject(error.message); + } +); + +// 导出 axios 实例 +export default service; diff --git a/src/views/account/messages/index.vue b/src/views/account/messages/index.vue new file mode 100644 index 0000000..1851716 --- /dev/null +++ b/src/views/account/messages/index.vue @@ -0,0 +1,240 @@ + + + + diff --git a/src/views/account/notes/index.vue b/src/views/account/notes/index.vue new file mode 100644 index 0000000..98240ae --- /dev/null +++ b/src/views/account/notes/index.vue @@ -0,0 +1,3 @@ + diff --git a/src/views/account/notes/statement.vue b/src/views/account/notes/statement.vue new file mode 100644 index 0000000..b80e4da --- /dev/null +++ b/src/views/account/notes/statement.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/views/account/notes/trade.vue b/src/views/account/notes/trade.vue new file mode 100644 index 0000000..00cf9c7 --- /dev/null +++ b/src/views/account/notes/trade.vue @@ -0,0 +1,579 @@ + + + + + diff --git a/src/views/account/resetpwd/index.vue b/src/views/account/resetpwd/index.vue new file mode 100644 index 0000000..73ea1ed --- /dev/null +++ b/src/views/account/resetpwd/index.vue @@ -0,0 +1,107 @@ + + + diff --git a/src/views/account/security/index.vue b/src/views/account/security/index.vue new file mode 100644 index 0000000..2cac059 --- /dev/null +++ b/src/views/account/security/index.vue @@ -0,0 +1,506 @@ + + + + + diff --git a/src/views/account/vip/index.vue b/src/views/account/vip/index.vue new file mode 100644 index 0000000..bd32c72 --- /dev/null +++ b/src/views/account/vip/index.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/src/views/autoLogin/index.vue b/src/views/autoLogin/index.vue new file mode 100644 index 0000000..7f20894 --- /dev/null +++ b/src/views/autoLogin/index.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue new file mode 100644 index 0000000..3aa3846 --- /dev/null +++ b/src/views/dashboard/index.vue @@ -0,0 +1,300 @@ + + + + + diff --git a/src/views/demo/internal-doc.vue b/src/views/demo/internal-doc.vue new file mode 100644 index 0000000..df51bac --- /dev/null +++ b/src/views/demo/internal-doc.vue @@ -0,0 +1,28 @@ + + diff --git a/src/views/demo/multi-level/children/children/level3-1.vue b/src/views/demo/multi-level/children/children/level3-1.vue new file mode 100644 index 0000000..888f58e --- /dev/null +++ b/src/views/demo/multi-level/children/children/level3-1.vue @@ -0,0 +1,5 @@ + diff --git a/src/views/demo/multi-level/children/children/level3-2.vue b/src/views/demo/multi-level/children/children/level3-2.vue new file mode 100644 index 0000000..a99c98e --- /dev/null +++ b/src/views/demo/multi-level/children/children/level3-2.vue @@ -0,0 +1,5 @@ + diff --git a/src/views/demo/multi-level/children/level2.vue b/src/views/demo/multi-level/children/level2.vue new file mode 100644 index 0000000..abcc3a7 --- /dev/null +++ b/src/views/demo/multi-level/children/level2.vue @@ -0,0 +1,7 @@ + diff --git a/src/views/demo/multi-level/level1.vue b/src/views/demo/multi-level/level1.vue new file mode 100644 index 0000000..b26146d --- /dev/null +++ b/src/views/demo/multi-level/level1.vue @@ -0,0 +1,15 @@ + diff --git a/src/views/demo/upload.vue b/src/views/demo/upload.vue new file mode 100644 index 0000000..501cb08 --- /dev/null +++ b/src/views/demo/upload.vue @@ -0,0 +1,215 @@ + + + diff --git a/src/views/demo/wang-editor.vue b/src/views/demo/wang-editor.vue new file mode 100644 index 0000000..d7ff4bb --- /dev/null +++ b/src/views/demo/wang-editor.vue @@ -0,0 +1,19 @@ + + + + diff --git a/src/views/error-page/401.vue b/src/views/error-page/401.vue new file mode 100644 index 0000000..afb3e59 --- /dev/null +++ b/src/views/error-page/401.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/views/error-page/404.vue b/src/views/error-page/404.vue new file mode 100644 index 0000000..8223c72 --- /dev/null +++ b/src/views/error-page/404.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/src/views/helper/index.vue b/src/views/helper/index.vue new file mode 100644 index 0000000..7b2adf1 --- /dev/null +++ b/src/views/helper/index.vue @@ -0,0 +1,373 @@ + + + + + diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue new file mode 100644 index 0000000..4215bf6 --- /dev/null +++ b/src/views/redirect/index.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/views/resetPassword/index.vue b/src/views/resetPassword/index.vue new file mode 100644 index 0000000..06bddbe --- /dev/null +++ b/src/views/resetPassword/index.vue @@ -0,0 +1,330 @@ + + + + + diff --git a/src/views/software/index.vue b/src/views/software/index.vue new file mode 100644 index 0000000..9110292 --- /dev/null +++ b/src/views/software/index.vue @@ -0,0 +1,670 @@ + + + + + diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue new file mode 100644 index 0000000..d5daf75 --- /dev/null +++ b/src/views/system/config/index.vue @@ -0,0 +1,327 @@ + + + + diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue new file mode 100644 index 0000000..60d3225 --- /dev/null +++ b/src/views/system/dict/index.vue @@ -0,0 +1,388 @@ + + + + diff --git a/src/views/system/log/index.vue b/src/views/system/log/index.vue new file mode 100644 index 0000000..d234135 --- /dev/null +++ b/src/views/system/log/index.vue @@ -0,0 +1,123 @@ + + + diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue new file mode 100644 index 0000000..7c9aedb --- /dev/null +++ b/src/views/system/menu/index.vue @@ -0,0 +1,632 @@ + + + diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue new file mode 100644 index 0000000..0b792e2 --- /dev/null +++ b/src/views/system/role/index.vue @@ -0,0 +1,419 @@ + + + diff --git a/src/views/system/user/components/user-import.vue b/src/views/system/user/components/user-import.vue new file mode 100644 index 0000000..a79996f --- /dev/null +++ b/src/views/system/user/components/user-import.vue @@ -0,0 +1,131 @@ + + + diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue new file mode 100644 index 0000000..094ad94 --- /dev/null +++ b/src/views/system/user/index.vue @@ -0,0 +1,428 @@ + + + + diff --git a/src/views/website/audition/draw.vue b/src/views/website/audition/draw.vue new file mode 100644 index 0000000..00eff94 --- /dev/null +++ b/src/views/website/audition/draw.vue @@ -0,0 +1,209 @@ + + + diff --git a/src/views/website/audition/realname.vue b/src/views/website/audition/realname.vue new file mode 100644 index 0000000..09187a3 --- /dev/null +++ b/src/views/website/audition/realname.vue @@ -0,0 +1,261 @@ + + + diff --git a/src/views/website/notices/index.vue b/src/views/website/notices/index.vue new file mode 100644 index 0000000..c58ef59 --- /dev/null +++ b/src/views/website/notices/index.vue @@ -0,0 +1,367 @@ + + + + diff --git a/src/views/website/question/index.vue b/src/views/website/question/index.vue new file mode 100644 index 0000000..b275044 --- /dev/null +++ b/src/views/website/question/index.vue @@ -0,0 +1,477 @@ + + + diff --git a/src/views/website/statement/notes.vue b/src/views/website/statement/notes.vue new file mode 100644 index 0000000..c2cb231 --- /dev/null +++ b/src/views/website/statement/notes.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/views/website/statement/orders.vue b/src/views/website/statement/orders.vue new file mode 100644 index 0000000..7f678e5 --- /dev/null +++ b/src/views/website/statement/orders.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/src/views/website/statistics/index.vue b/src/views/website/statistics/index.vue new file mode 100644 index 0000000..fc4918a --- /dev/null +++ b/src/views/website/statistics/index.vue @@ -0,0 +1,331 @@ + + + + + diff --git a/src/views/website/styles/index.vue b/src/views/website/styles/index.vue new file mode 100644 index 0000000..3627d8b --- /dev/null +++ b/src/views/website/styles/index.vue @@ -0,0 +1,405 @@ + + + + + diff --git a/src/views/website/swVersions/index.vue b/src/views/website/swVersions/index.vue new file mode 100644 index 0000000..f5cdc0a --- /dev/null +++ b/src/views/website/swVersions/index.vue @@ -0,0 +1,619 @@ + + + + + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f08abc3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "node16", + "moduleResolution": "node16", + "strict": true, + "noLib": false, + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["esnext", "dom"], + "allowJs": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "jsx": "preserve", + "jsxFactory": "h", + "jsxFragmentFactory": "Fragment", + "paths": { + "@/*": ["./src/*"] + }, + "types": ["vite/client", "unplugin-icons/types/vue", "element-plus/global"] + }, + "include": ["mock/**/*.ts", "src/**/*.ts", "src/**/*.vue", "vite.config.ts"], + "exclude": ["node_modules", "dist", "**/*.js"] +} diff --git a/uno.config.ts b/uno.config.ts new file mode 100644 index 0000000..b952fe4 --- /dev/null +++ b/uno.config.ts @@ -0,0 +1,43 @@ +// uno.config.ts +import { + defineConfig, + presetAttributify, + presetIcons, + presetTypography, + presetUno, + presetWebFonts, + transformerDirectives, + transformerVariantGroup, +} from "unocss"; + +export default defineConfig({ + shortcuts: { + "flex-center": "flex justify-center items-center", + "flex-x-center": "flex justify-center", + "flex-y-center": "flex items-center", + "wh-full": "w-full h-full", + "flex-x-between": "flex items-center justify-between", + "flex-x-end": "flex items-center justify-end", + "absolute-lt": "absolute left-0 top-0", + "absolute-rt": "absolute right-0 top-0 ", + "fixed-lt": "fixed left-0 top-0", + }, + theme: { + colors: { + primary: "var(--el-color-primary)", + primary_dark: "var(--el-color-primary-light-5)", + }, + }, + presets: [ + presetUno(), + presetAttributify(), + presetIcons(), + presetTypography(), + presetWebFonts({ + fonts: { + // ... + }, + }), + ], + transformers: [transformerDirectives(), transformerVariantGroup()], +}); diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..69207a8 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,239 @@ +import vue from "@vitejs/plugin-vue"; +import vueJsx from "@vitejs/plugin-vue-jsx"; +import { UserConfig, ConfigEnv, loadEnv, defineConfig } from "vite"; + +import AutoImport from "unplugin-auto-import/vite"; +import Components from "unplugin-vue-components/vite"; +import { ElementPlusResolver } from "unplugin-vue-components/resolvers"; +import Icons from "unplugin-icons/vite"; +import IconsResolver from "unplugin-icons/resolver"; + +import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; + +import UnoCSS from "unocss/vite"; +import { resolve } from "path"; +import { name, version, engines, dependencies, devDependencies } from "./package.json"; + +/** @see https://devtools-next.vuejs.org */ +// import VueDevTools from "vite-plugin-vue-devtools"; + +/** 平台的名称、版本、运行所需的`node`版本、依赖、构建时间的类型提示 */ +const __APP_INFO__ = { + pkg: { name, version, engines, dependencies, devDependencies }, + buildTimestamp: Date.now(), +}; + +const pathSrc = resolve(__dirname, "src"); +/** Vite配置 @see https://cn.vitejs.dev/config */ +export default defineConfig(({ mode }: ConfigEnv): UserConfig => { + const env = loadEnv(mode, process.cwd()); + return { + base: "/", + resolve: { + alias: { + "@": pathSrc, + }, + }, + css: { + // CSS 预处理器 + preprocessorOptions: { + // 定义全局 SCSS 变量 + scss: { + // javascriptEnabled: true, + additionalData: ` + @use "@/styles/variables.scss" as *; + `, + }, + }, + }, + server: { + // 允许IP访问 + host: "0.0.0.0", + // 应用端口 (默认:3000) + port: Number(env.VITE_APP_PORT), + // 运行是否自动打开浏览器 + open: true, + proxy: { + /** 代理前缀为 /dev-api 的请求 */ + [env.VITE_APP_BASE_API]: { + changeOrigin: true, + // 接口地址 例如:http://vapi.youlai.tech + target: env.VITE_APP_API_URL, + rewrite: (path) => path.replace(new RegExp("^" + env.VITE_APP_BASE_API), ""), + }, + }, + }, + plugins: [ + vue(), + // jsx、tsx语法支持 + vueJsx(), + // MOCK 服务 + // env.VITE_MOCK_DEV_SERVER === "true" ? mockDevServerPlugin() : null, + UnoCSS({ + hmrTopLevelAwait: false, + }), + /** 自动导入配置 @see https://github.com/sxzz/element-plus-best-practices/blob/main/vite.config.ts */ + AutoImport({ + // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等 + imports: ["vue", "@vueuse/core", "pinia", "vue-router", "vue-i18n"], + resolvers: [ + // 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式) + ElementPlusResolver(), + // 自动导入图标组件 + IconsResolver({}), + ], + eslintrc: { + // 是否自动生成 eslint 规则,建议生成之后设置 false + enabled: false, + // 指定自动导入函数 eslint 规则的文件 + filepath: "./.eslintrc-auto-import.json", + globalsPropValue: true, + }, + // 是否在 vue 模板中自动导入 + vueTemplate: true, + // 指定自动导入函数TS类型声明文件路径 (false:关闭自动生成) + dts: false, + // dts: "src/types/auto-imports.d.ts", + }), + Components({ + resolvers: [ + // 自动导入 Element Plus 组件 + ElementPlusResolver(), + // 自动注册图标组件 + IconsResolver({ + // element-plus图标库,其他图标库 https://icon-sets.iconify.design/ + enabledCollections: ["ep"], + }), + ], + // 指定自定义组件位置(默认:src/components) + dirs: ["src/components", "src/**/components"], + // 指定自动导入组件TS类型声明文件路径 (false:关闭自动生成) + dts: false, + // dts: "src/types/components.d.ts", + }), + Icons({ + // 自动安装图标库 + autoInstall: true, + }), + createSvgIconsPlugin({ + // 指定需要缓存的图标文件夹 + iconDirs: [resolve(pathSrc, "assets/icons")], + // 指定symbolId格式 + symbolId: "icon-[dir]-[name]", + }), + ], + // 预加载项目必需的组件 + optimizeDeps: { + include: [ + "vue", + "vue-router", + "pinia", + "axios", + "@vueuse/core", + "path-to-regexp", + "vue-i18n", + "path-browserify", + "element-plus/es/components/form/style/css", + "element-plus/es/components/form-item/style/css", + "element-plus/es/components/button/style/css", + "element-plus/es/components/input/style/css", + "element-plus/es/components/input-number/style/css", + "element-plus/es/components/switch/style/css", + "element-plus/es/components/upload/style/css", + "element-plus/es/components/menu/style/css", + "element-plus/es/components/col/style/css", + "element-plus/es/components/icon/style/css", + "element-plus/es/components/row/style/css", + "element-plus/es/components/tag/style/css", + "element-plus/es/components/dialog/style/css", + "element-plus/es/components/loading/style/css", + "element-plus/es/components/radio/style/css", + "element-plus/es/components/radio-group/style/css", + "element-plus/es/components/popover/style/css", + "element-plus/es/components/scrollbar/style/css", + "element-plus/es/components/tooltip/style/css", + "element-plus/es/components/dropdown/style/css", + "element-plus/es/components/dropdown-menu/style/css", + "element-plus/es/components/dropdown-item/style/css", + "element-plus/es/components/sub-menu/style/css", + "element-plus/es/components/menu-item/style/css", + "element-plus/es/components/divider/style/css", + "element-plus/es/components/card/style/css", + "element-plus/es/components/link/style/css", + "element-plus/es/components/breadcrumb/style/css", + "element-plus/es/components/breadcrumb-item/style/css", + "element-plus/es/components/table/style/css", + "element-plus/es/components/tree-select/style/css", + "element-plus/es/components/table-column/style/css", + "element-plus/es/components/select/style/css", + "element-plus/es/components/option/style/css", + "element-plus/es/components/pagination/style/css", + "element-plus/es/components/tree/style/css", + "element-plus/es/components/alert/style/css", + "element-plus/es/components/radio-button/style/css", + "element-plus/es/components/checkbox-group/style/css", + "element-plus/es/components/checkbox/style/css", + "element-plus/es/components/tabs/style/css", + "element-plus/es/components/tab-pane/style/css", + "element-plus/es/components/rate/style/css", + "element-plus/es/components/date-picker/style/css", + "element-plus/es/components/notification/style/css", + "element-plus/es/components/image/style/css", + "element-plus/es/components/statistic/style/css", + "element-plus/es/components/watermark/style/css", + "element-plus/es/components/config-provider/style/css", + "element-plus/es/components/text/style/css", + "element-plus/es/components/drawer/style/css", + "element-plus/es/components/color-picker/style/css", + "element-plus/es/components/backtop/style/css", + "element-plus/es/components/message-box/style/css", + "element-plus/es/components/badge/style/css", + ], + }, + // 构建配置 + build: { + chunkSizeWarningLimit: 2000, // 消除打包大小超过500kb警告 + minify: "terser", // Vite 2.6.x 以上需要配置 minify: "terser", terserOptions 才能生效 + terserOptions: { + compress: { + keep_infinity: true, // 防止 Infinity 被压缩成 1/0,这可能会导致 Chrome 上的性能问题 + drop_console: true, // 生产环境去除 console + drop_debugger: true, // 生产环境去除 debugger + }, + format: { + comments: false, // 删除注释 + }, + }, + rollupOptions: { + output: { + manualChunks: { + vue: ["vue", "vue-router", "pinia"], + "vue-i18n": ["vue-i18n"], + "element-plus": ["element-plus"], + }, + // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值 + entryFileNames: "js/[name].[hash].js", + // 用于命名代码拆分时创建的共享块的输出命名 + chunkFileNames: "js/[name].[hash].js", + // 用于输出静态资源的命名,[ext]表示文件扩展名 + assetFileNames: (assetInfo: any) => { + const info = assetInfo.name.split("."); + let extType = info[info.length - 1]; + // console.log('文件信息', assetInfo.name) + if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)) { + extType = "media"; + } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)) { + extType = "img"; + } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) { + extType = "fonts"; + } + return `${extType}/[name].[hash].[ext]`; + }, + }, + }, + }, + define: { + __APP_INFO__: JSON.stringify(__APP_INFO__), + }, + }; +});

+
唱作网隐私政策
+ +
+
+
+
+ +
+
一、 我们如何收集和使用您的个人信息
+
+

1、完成注册

+ 注册账号时,我们会要求您提供相应的个人信息,包括您的账号、密码、邮箱、手机号码等。
+

2、使用产品

+ (1)我们会收集您在使用我们的产品和服务时设备的相关信息,例如设备类型、操作系统类型及版本、浏览器类型和版本、屏幕分辨率、IP地址等,以及因产品而异的其他技术信息。
+ (2)在您使用我们的产品或服务,以及与我们互动时由您直接提交给我们的信息,包括您输入的信息或您为了获得客服支持而提供的问题或信息等。
+ (3)当您使用我们的产品和服务时,我们会自动收集并存储必要的日志信息,如服务的每次访问时间、访问的页面路径、客户端 IP地址、事件信息(如错误、崩溃、重启、升级)等。 +

3、实名认证

+ 当您使用我们的部分产品与/或服务时,根据相关法律法规要求,需要您进行实名认证。实名认证需要上传实名认证信息。不同的实名认证主体类型会要求不同实名认证信息,这些信息包括:姓名、证件号码、公司名称、公司统一信用代码、学生证信息、身份证信息等。
+ 上述信息将仅在您使用我们的产品与/或服务期间持续授权我们保存使用。在您主动注销账号时,我们将根据适用法律法规的要求尽快使其匿名或删除您的个人信息。 +

4、充值提现

+ (1)您可以通过微信支付、支付宝支付等进行充值。支付功能本身并不收集您的个人信息,但我们需要将您的订单号与交易金额信息与这些支付机构共享以实现其确认您的支付指令并完成支付。
+ (2)为充分保障您的合法权益,我们允许您将账户余额提现。在此过程中,您至少需要向我们提供微信账号、支付宝账号、或汇款银行名称、汇款账号、汇款账户名、汇款金额等信息。 +
+
+ +
+
二、设备权限调用
+
+ 在您使用我们的产品及服务过程中,我们需要在必要范围内向您申请获取设备权限。请您知悉,我们不会默认开启您设备的权限,仅在您主动确认开启的情况下,我们才有可能通过设备权限收集您的信息。
+ 我们的产品及服务调用的权限、调用权限的目的,以及调用权限前向您询问的情况请见下表: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
设备权限调用权限的目的是否询问可否关闭
网络访问网络
外部存储存储应用运行所需文件不可
麦克风录音
系统设置设置铃音
+
+
+ +
+
三、我们如何使用您的个人信息
+
+ (1)我们会根据本政策的约定并为实现我们的服务的目的对所收集的个人信息进行使用。
+ (2)请您注意,您在使用我们提供的服务时所提供的所有个人信息,除非您删除或通过系统设置拒绝我们收集,否则将在您使用我们的服务期间持续授权我们使用。在您注销账号时,我们将停止使用并删除您的个人信息。
+ (3)我们会对我们提供的服务使用情况进行统计,并可能会与公众或第三方共享这些统计信息,以用于产品开发、服务优化、安全保障的目的。但这些统计信息不包含您的任何身份识别信息。
+ (4)当我们要将您的个人信息用于本政策未载明的其它用途时,或基于特定目的收集而来的信息用于其他目的时,会通过您主动做出勾选的形式事先征求您的同意。 +
+
+ +
+
四、我们如何使用Cookie和同类技术
+
+ (1)为确保网站正常运转,我们有时会在计算机或移动设备上存储名为 Cookie 的小数据文件。
+ (2)我们启用Cookie的目的与大多数网站的目的一样,即改善用户体验。借助于 Cookie,网站能够记住用户的单次访问(使用会话 Cookie)或多次访问(使用永久 Cookie)。
+         借助于 Cookie,网站能够保存设置,例如计算机或移动设备的语言、字体大小和其他浏览偏好。这意味着,用户无需在每次访问时重新配置用户偏好设置。
+         如果某个网站不使用 Cookie,那么在用户每一次打开网页时,该网站都会将其视为新访客。例如,如果您登录某个网站后转到另一个网页,该网站就不会识别出您,而您会被再次注销。
+ (3)我们不会将 Cookie 用于本政策所述目的之外的任何用途。
+ (4)您可根据自己的偏好管理或删除 Cookie。您可以清除计算机上保存的所有 Cookie,大部分网络浏览器都设有阻止 Cookie 的功能。但如果您这么做,则需要在每一次访问我们的网站时亲自更改用户设置。 +
+
+ +
+
五、我们如何披露您的个人信息
+
+ 通常我们不会对外披露您的个人信息,但以下场景除外:
+ (1)在某些服务由我们的授权合作伙伴提供的情况下,我们会如本政策描述与该合作伙伴共享您的个人信息。例如,委托合作伙伴代表我们处理热线、发送电子邮件、提供技术支持等,我们会要求合作伙伴仅能将您的个人信息用于代表我们向您提供服务。
+ (2)在适用的法律要求或响应法律程序的情况下,我们也可能会向相关的执法机关或者其他政府机关披露您的个人信息。在某些管辖区,如果我们牵涉到重组、合并或破产和清理诉讼,那么您的个人信息还可能会被披露给交易方。
+ (3)我们还会在合理的情况下披露您的数据,例如出于执行合同以及我们认为为阻止身体损害或财产损失或调查可能的或实际的非法行为有必要披露且披露是适当的。 +
+
+ +
+
六、我们如何保护和留存您的个人信息
+
+ (1)我们重视个人信息的安全,采用适当的物理、管理和技术保障措施来保护您的个人信息不被未经授权访问、披露、使用、修改、损坏或丢失。
+         例如,我们会使用加密技术确保数据的机密性;我们会使用保护机制防止数据遭到恶意攻击;我们会部署访问控制机制,确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
+         我们会尽力保护您的个人信息,但是请注意任何安全措施都无法做到无懈可击。
+ (2)我们将会在达成本政策所述目的所需的期限内保留您的个人信息,除非按照法律要求或许可需要延长保留期或受到法律的允许。因为基于不同的场景和产品及服务的不同,数据的存储期可能会有所不同。
+         我们用于确定存留期的标准包括:完成该业务目的需要留存个人信息的时间,包括提供产品和服务,维护相应的交易及业务记录,管控并提升产品与服务性能与质量,保证产品和服务的安全,应对可能的用户查询或投诉,问题定位等;用户是否同意更长的留存期间;法律、合同等是否有保留数据的特殊要求等。
+         只要您的账户是为您提供服务必须,我们都将保留您的注册信息。您也可以选择注销您的账号,在您注销账号后,我们会停止基于该账号提供产品和服务,并在无特殊法律要求的情况下,删除您相应的个人信息或对其进行匿名化处理。 +
+
+ +
+
七、我们如何保护儿童的个人信息
+
+ (1)我们的产品和服务主要面向成人。如果没有父母或监护人的同意,(未满14周岁的未成年人)不得创建自己的用户帐户。
+ (2)对于经父母同意而收集儿童个人信息的情况,我们只会在受到法律允许、父母或监护人明确同意或者保护儿童所必要的情况下使用或披露此数据。
+ (3)如果我们发现在未事先获得可证实的父母同意的情况下收集了儿童的个人信息,则会设法尽快删除相关数据。 +
+
+ +
+
八、本政策如何更新
+
+ 我们保留不时更新或修改本政策的权利。如果我们的隐私政策变更,我们会将最新版隐私政策发布在这里。
+ 如果我们对隐私政策做出了重大变更,我们还可能会通过不同渠道向您发送变更通知,例如,在我们的网站上发布通知或者向您发布单独的通知。 +
+
+ +
+
九、其他
+
+ (1)本政策的订立、执行和解释及争议的解决均应适用中国法律。
+ (2)如双方就本协议内容或其执行发生任何争议,双方应尽量友好协商解决;协商不成时,任何一方均可向唱作网所在地的人民法院提起诉讼。 +
+
+ +
+ +