From 0f40b8ff4fa2323b5a9880abd4fca8af875829a6 Mon Sep 17 00:00:00 2001 From: wuyy Date: Mon, 8 Jun 2026 17:44:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BE=93=E8=A1=80=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 8 + .env.production | 11 + .env.staging | 11 + .gitignore | 23 + LICENSE | 20 + README.md | 125 +++ auto-imports.d.ts | 90 ++ bin/build.bat | 12 + bin/package.bat | 12 + bin/run-web.bat | 12 + eslint.config.js | 82 ++ html/ie.html | 46 + index.html | 215 ++++ package.json | 66 ++ public/favicon.ico | Bin 0 -> 137750 bytes src/App.vue | 15 + src/api/liswork/dict/ComDict.ts | 47 + src/api/liswork/dict/LabInstr.ts | 19 + src/api/liswork/work/LisWork.ts | 12 + src/api/liswork/xtwh/configdictApi.ts | 46 + src/api/liswork/xtwh/localconfigApi.ts | 45 + src/api/login.ts | 83 ++ src/api/menu.ts | 10 + src/api/monitor/cache.ts | 58 ++ src/api/monitor/job.ts | 71 ++ src/api/monitor/jobLog.ts | 28 + src/api/monitor/logininfor.ts | 35 + src/api/monitor/online.ts | 19 + src/api/monitor/operlog.ts | 27 + src/api/monitor/server.ts | 10 + src/api/regional/dict/diagnosis.ts | 44 + src/api/regional/dict/hospital.ts | 44 + src/api/regional/dict/itemclass.ts | 44 + src/api/regional/dict/regdict.ts | 59 ++ src/api/regional/index.ts | 108 ++ src/api/system/config.ts | 61 ++ src/api/system/dept.ts | 53 + src/api/system/dict/data.ts | 53 + src/api/system/dict/type.ts | 61 ++ src/api/system/menu.ts | 61 ++ src/api/system/notice.ts | 45 + src/api/system/post.ts | 45 + src/api/system/role.ts | 120 +++ src/api/system/user.ts | 137 +++ src/api/tool/gen.ts | 88 ++ src/assets/401_images/401.gif | Bin 0 -> 164227 bytes src/assets/404_images/404.png | Bin 0 -> 98071 bytes src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes src/assets/icons/svg/404.svg | 1 + src/assets/icons/svg/bug.svg | 1 + src/assets/icons/svg/build.svg | 1 + src/assets/icons/svg/button.svg | 1 + src/assets/icons/svg/cascader.svg | 1 + src/assets/icons/svg/chart.svg | 1 + src/assets/icons/svg/checkbox.svg | 1 + src/assets/icons/svg/clipboard.svg | 1 + src/assets/icons/svg/code.svg | 1 + src/assets/icons/svg/color.svg | 1 + src/assets/icons/svg/component.svg | 1 + src/assets/icons/svg/dashboard.svg | 1 + src/assets/icons/svg/date-range.svg | 1 + src/assets/icons/svg/date.svg | 1 + src/assets/icons/svg/dict.svg | 1 + src/assets/icons/svg/documentation.svg | 1 + src/assets/icons/svg/download.svg | 1 + src/assets/icons/svg/drag.svg | 1 + src/assets/icons/svg/druid.svg | 1 + src/assets/icons/svg/edit.svg | 1 + src/assets/icons/svg/education.svg | 1 + src/assets/icons/svg/email.svg | 1 + src/assets/icons/svg/enter.svg | 1 + src/assets/icons/svg/example.svg | 1 + src/assets/icons/svg/excel.svg | 1 + src/assets/icons/svg/exit-fullscreen.svg | 1 + src/assets/icons/svg/eye-open.svg | 1 + src/assets/icons/svg/eye.svg | 1 + src/assets/icons/svg/form.svg | 1 + src/assets/icons/svg/fullscreen.svg | 1 + src/assets/icons/svg/github.svg | 1 + src/assets/icons/svg/guide.svg | 1 + src/assets/icons/svg/hongcha.svg | 1 + src/assets/icons/svg/icon.svg | 1 + src/assets/icons/svg/input.svg | 1 + src/assets/icons/svg/international.svg | 1 + src/assets/icons/svg/job.svg | 1 + src/assets/icons/svg/language.svg | 1 + src/assets/icons/svg/link.svg | 1 + src/assets/icons/svg/list.svg | 1 + src/assets/icons/svg/lock.svg | 1 + src/assets/icons/svg/log.svg | 1 + src/assets/icons/svg/logininfor.svg | 1 + src/assets/icons/svg/lvgou.svg | 1 + src/assets/icons/svg/message.svg | 1 + src/assets/icons/svg/money.svg | 1 + src/assets/icons/svg/monitor.svg | 2 + src/assets/icons/svg/moon.svg | 1 + src/assets/icons/svg/more-up.svg | 1 + src/assets/icons/svg/nested.svg | 1 + src/assets/icons/svg/number.svg | 1 + src/assets/icons/svg/online.svg | 1 + src/assets/icons/svg/password.svg | 1 + src/assets/icons/svg/pdf.svg | 1 + src/assets/icons/svg/people.svg | 1 + src/assets/icons/svg/peoples.svg | 1 + src/assets/icons/svg/phone.svg | 1 + src/assets/icons/svg/post.svg | 1 + src/assets/icons/svg/qq.svg | 1 + src/assets/icons/svg/question.svg | 1 + src/assets/icons/svg/radio.svg | 1 + src/assets/icons/svg/rate.svg | 1 + src/assets/icons/svg/redis-list.svg | 2 + src/assets/icons/svg/redis.svg | 1 + src/assets/icons/svg/row.svg | 1 + src/assets/icons/svg/search.svg | 1 + src/assets/icons/svg/select.svg | 1 + src/assets/icons/svg/server.svg | 1 + src/assets/icons/svg/shopping.svg | 1 + src/assets/icons/svg/size.svg | 1 + src/assets/icons/svg/skill.svg | 1 + src/assets/icons/svg/slider.svg | 1 + src/assets/icons/svg/star.svg | 1 + src/assets/icons/svg/sunny.svg | 1 + src/assets/icons/svg/swagger.svg | 1 + src/assets/icons/svg/switch.svg | 1 + src/assets/icons/svg/system.svg | 2 + src/assets/icons/svg/tab.svg | 1 + src/assets/icons/svg/table.svg | 1 + src/assets/icons/svg/textarea.svg | 1 + src/assets/icons/svg/theme.svg | 1 + src/assets/icons/svg/time-range.svg | 1 + src/assets/icons/svg/time.svg | 1 + src/assets/icons/svg/tool.svg | 1 + src/assets/icons/svg/tree-table.svg | 1 + src/assets/icons/svg/tree.svg | 1 + src/assets/icons/svg/upload.svg | 1 + src/assets/icons/svg/user.svg | 1 + src/assets/icons/svg/validCode.svg | 1 + src/assets/icons/svg/wechat.svg | 1 + src/assets/icons/svg/zip.svg | 1 + src/assets/images/blood_zero.png | Bin 0 -> 32292 bytes src/assets/images/dark.svg | 39 + src/assets/images/light.svg | 39 + src/assets/images/login-background.jpg | Bin 0 -> 179896 bytes src/assets/images/login_left.png | Bin 0 -> 85471 bytes src/assets/images/logo_new.png | Bin 0 -> 12411 bytes src/assets/images/profile.jpg | Bin 0 -> 6832 bytes src/assets/images/xjt.png | Bin 0 -> 1767 bytes src/assets/images/yjt.png | Bin 0 -> 1135 bytes src/assets/logo/logo.png | Bin 0 -> 137750 bytes src/assets/styles/btn.scss | 99 ++ src/assets/styles/element-ui.scss | 96 ++ src/assets/styles/index.scss | 716 ++++++++++++++ src/assets/styles/mixin.scss | 66 ++ src/assets/styles/ruoyi.scss | 344 +++++++ src/assets/styles/sidebar.scss | 238 +++++ src/assets/styles/transition.scss | 80 ++ src/assets/styles/variables.module.scss | 280 ++++++ src/components/Breadcrumb/index.vue | 97 ++ src/components/Crontab/day.vue | 174 ++++ src/components/Crontab/hour.vue | 133 +++ src/components/Crontab/index.vue | 314 ++++++ src/components/Crontab/min.vue | 126 +++ src/components/Crontab/month.vue | 141 +++ src/components/Crontab/result.vue | 543 +++++++++++ src/components/Crontab/second.vue | 129 +++ src/components/Crontab/week.vue | 197 ++++ src/components/Crontab/year.vue | 143 +++ src/components/DictTag/index.vue | 89 ++ src/components/Editor/index.vue | 277 ++++++ src/components/FileUpload/index.vue | 265 +++++ src/components/Hamburger/index.vue | 42 + src/components/HeaderSearch/index.vue | 252 +++++ src/components/IconSelect/index.vue | 111 +++ src/components/IconSelect/requireIcons.ts | 8 + src/components/ImagePreview/index.vue | 93 ++ src/components/ImageUpload/index.vue | 269 +++++ src/components/Pagination/index.vue | 105 ++ src/components/ParentView/index.vue | 3 + src/components/RightToolbar/index.vue | 186 ++++ src/components/RuoYi/Doc/index.vue | 13 + src/components/RuoYi/Git/index.vue | 13 + src/components/Screenfull/index.vue | 22 + .../SelectTable/YQSelectTable/index.vue | 77 ++ src/components/SelectTable/index.vue | 402 ++++++++ src/components/SizeSelect/index.vue | 50 + src/components/SvgIcon/index.vue | 53 + src/components/SvgIcon/svgicon.ts | 11 + src/components/TopNav/index.vue | 215 ++++ src/components/elTable/index.vue | 484 +++++++++ src/components/iFrame/index.vue | 31 + src/components/vxeTable/index.vue | 282 ++++++ src/directive/common/copyText.ts | 65 ++ src/directive/index.ts | 10 + src/directive/permission/hasPermi.ts | 27 + src/directive/permission/hasRole.ts | 27 + src/hooks/index.ts | 1 + src/hooks/lisData/dictData.ts | 51 + src/hooks/messageBox.ts | 53 + src/layout/components/AppMain.vue | 111 +++ src/layout/components/Copyright/index.vue | 31 + src/layout/components/IframeToggle/index.vue | 25 + src/layout/components/InnerLink/index.vue | 35 + src/layout/components/Navbar.vue | 291 ++++++ src/layout/components/Settings/index.vue | 304 ++++++ src/layout/components/Sidebar/Link.vue | 40 + src/layout/components/Sidebar/Logo.vue | 102 ++ src/layout/components/Sidebar/SidebarItem.vue | 100 ++ src/layout/components/Sidebar/index.vue | 93 ++ src/layout/components/TagsView/ScrollPane.vue | 110 +++ src/layout/components/TagsView/index.vue | 408 ++++++++ src/layout/components/TopBar/index.vue | 99 ++ src/layout/components/index.ts | 4 + src/layout/components/tabViews/index.vue | 189 ++++ src/layout/index.vue | 116 +++ src/main.ts | 105 ++ src/permission.ts | 69 ++ src/plugins/auth.ts | 60 ++ src/plugins/cache.ts | 88 ++ src/plugins/download.ts | 93 ++ src/plugins/index.ts | 19 + src/plugins/modal.ts | 82 ++ src/plugins/tab.ts | 71 ++ src/router/index.ts | 175 ++++ src/settings.ts | 57 ++ src/store/index.ts | 5 + src/store/modules/app.ts | 59 ++ src/store/modules/commonStore.ts | 28 + src/store/modules/dict.ts | 67 ++ src/store/modules/permission.ts | 127 +++ src/store/modules/printStore.ts | 36 + src/store/modules/settings.ts | 67 ++ src/store/modules/tagsView.ts | 219 +++++ src/store/modules/user.ts | 135 +++ src/types/Object.d.ts | 212 ++++ src/types/SelectTable.d.ts | 32 + src/types/api/common.ts | 85 ++ src/types/api/index.ts | 29 + src/types/api/login.ts | 50 + src/types/api/menu.ts | 33 + src/types/api/monitor/cache.ts | 11 + src/types/api/monitor/job.ts | 33 + src/types/api/monitor/jobLog.ts | 34 + src/types/api/monitor/logininfor.ts | 38 + src/types/api/monitor/online.ts | 27 + src/types/api/monitor/operlog.ts | 58 ++ src/types/api/system/config.ts | 30 + src/types/api/system/dept.ts | 31 + src/types/api/system/dict.ts | 60 ++ src/types/api/system/menu.ts | 50 + src/types/api/system/notice.ts | 25 + src/types/api/system/post.ts | 25 + src/types/api/system/role.ts | 71 ++ src/types/api/system/user.ts | 109 +++ src/types/api/tool/gen.ts | 112 +++ src/types/components.d.ts | 11 + src/types/global.d.ts | 134 +++ src/types/index.ts | 7 + src/utils/auth.ts | 15 + src/utils/classCom.ts | 163 ++++ src/utils/dict.ts | 101 ++ src/utils/dynamicTitle.ts | 14 + src/utils/errorCode.ts | 8 + src/utils/generator/config.js | 452 +++++++++ src/utils/generator/css.js | 18 + src/utils/generator/drawingDefault.js | 37 + src/utils/generator/html.js | 359 +++++++ src/utils/generator/icon.json | 1 + src/utils/generator/js.js | 370 +++++++ src/utils/generator/render.js | 156 +++ src/utils/groupHelper.ts | 145 +++ src/utils/index.ts | 348 +++++++ src/utils/jsencrypt.ts | 29 + src/utils/mitt.ts | 30 + src/utils/permission.ts | 76 ++ src/utils/pinyin.ts | 60 ++ src/utils/polyfills.ts | 21 + src/utils/printHelper.ts | 47 + src/utils/rem.ts | 22 + src/utils/request.ts | 175 ++++ src/utils/ruoyi.ts | 230 +++++ src/utils/scroll-to.ts | 64 ++ src/utils/theme.ts | 49 + src/utils/validate.ts | 114 +++ src/utils/webSocket.ts | 103 ++ .../bloodTransfusionApplication.vue | 645 ++++++++++++ .../components/bloodTransfusionAssessment.vue | 550 +++++++++++ src/views/blood/deptPatient/index.vue | 669 +++++++++++++ src/views/blood/reactionRegist/index.vue | 308 ++++++ src/views/blood/receiveBlood/index.vue | 336 +++++++ src/views/blood/record/index.vue | 358 +++++++ src/views/blood/review/index.vue | 164 ++++ src/views/error/401.vue | 82 ++ src/views/error/404.vue | 227 +++++ src/views/index.vue | 11 + src/views/login.vue | 439 +++++++++ src/views/monitor/cache/index.vue | 132 +++ src/views/monitor/cache/list.vue | 259 +++++ src/views/monitor/druid/index.vue | 11 + src/views/monitor/job/index.vue | 450 +++++++++ src/views/monitor/job/log.vue | 285 ++++++ src/views/monitor/logininfor/index.vue | 234 +++++ src/views/monitor/online/index.vue | 98 ++ src/views/monitor/operlog/index.vue | 311 ++++++ src/views/monitor/server/index.vue | 187 ++++ src/views/redirect/index.vue | 14 + src/views/register.vue | 223 +++++ src/views/system/config/index.vue | 262 +++++ src/views/system/dept/index.vue | 254 +++++ src/views/system/dict/data.vue | 368 +++++++ src/views/system/dict/index.vue | 265 +++++ src/views/system/menu/index.vue | 387 ++++++++ src/views/system/notice/index.vue | 246 +++++ src/views/system/post/index.vue | 245 +++++ src/views/system/role/authUser.vue | 180 ++++ src/views/system/role/index.vue | 516 ++++++++++ src/views/system/role/selectUser.vue | 145 +++ src/views/system/user/authRole.vue | 130 +++ src/views/system/user/index.vue | 596 +++++++++++ src/views/system/user/profile/index.vue | 109 +++ src/views/system/user/profile/resetPwd.vue | 68 ++ src/views/system/user/profile/userAvatar.vue | 180 ++++ src/views/system/user/profile/userInfo.vue | 70 ++ src/views/tool/build/CodeTypeDialog.vue | 71 ++ src/views/tool/build/DraggableItem.vue | 68 ++ src/views/tool/build/IconsDialog.vue | 116 +++ src/views/tool/build/RightPanel.vue | 923 ++++++++++++++++++ src/views/tool/build/TreeNodeDialog.vue | 95 ++ src/views/tool/build/index.vue | 663 +++++++++++++ src/views/tool/gen/basicInfoForm.vue | 48 + src/views/tool/gen/createTable.vue | 46 + src/views/tool/gen/editTable.vue | 216 ++++ src/views/tool/gen/genInfoForm.vue | 309 ++++++ src/views/tool/gen/importTable.vue | 127 +++ src/views/tool/gen/index.vue | 309 ++++++ src/views/tool/swagger/index.vue | 9 + tsconfig.json | 37 + vite.config.ts | 80 ++ vite/plugins/auto-import.ts | 13 + vite/plugins/compression.ts | 29 + vite/plugins/index.ts | 16 + vite/plugins/setup-extend.ts | 5 + vite/plugins/svg-icon.ts | 10 + 342 files changed, 31294 insertions(+) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.staging create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 auto-imports.d.ts create mode 100644 bin/build.bat create mode 100644 bin/package.bat create mode 100644 bin/run-web.bat create mode 100644 eslint.config.js create mode 100644 html/ie.html create mode 100644 index.html create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 src/App.vue create mode 100644 src/api/liswork/dict/ComDict.ts create mode 100644 src/api/liswork/dict/LabInstr.ts create mode 100644 src/api/liswork/work/LisWork.ts create mode 100644 src/api/liswork/xtwh/configdictApi.ts create mode 100644 src/api/liswork/xtwh/localconfigApi.ts create mode 100644 src/api/login.ts create mode 100644 src/api/menu.ts create mode 100644 src/api/monitor/cache.ts create mode 100644 src/api/monitor/job.ts create mode 100644 src/api/monitor/jobLog.ts create mode 100644 src/api/monitor/logininfor.ts create mode 100644 src/api/monitor/online.ts create mode 100644 src/api/monitor/operlog.ts create mode 100644 src/api/monitor/server.ts create mode 100644 src/api/regional/dict/diagnosis.ts create mode 100644 src/api/regional/dict/hospital.ts create mode 100644 src/api/regional/dict/itemclass.ts create mode 100644 src/api/regional/dict/regdict.ts create mode 100644 src/api/regional/index.ts create mode 100644 src/api/system/config.ts create mode 100644 src/api/system/dept.ts create mode 100644 src/api/system/dict/data.ts create mode 100644 src/api/system/dict/type.ts create mode 100644 src/api/system/menu.ts create mode 100644 src/api/system/notice.ts create mode 100644 src/api/system/post.ts create mode 100644 src/api/system/role.ts create mode 100644 src/api/system/user.ts create mode 100644 src/api/tool/gen.ts create mode 100644 src/assets/401_images/401.gif create mode 100644 src/assets/404_images/404.png create mode 100644 src/assets/404_images/404_cloud.png create mode 100644 src/assets/icons/svg/404.svg create mode 100644 src/assets/icons/svg/bug.svg create mode 100644 src/assets/icons/svg/build.svg create mode 100644 src/assets/icons/svg/button.svg create mode 100644 src/assets/icons/svg/cascader.svg create mode 100644 src/assets/icons/svg/chart.svg create mode 100644 src/assets/icons/svg/checkbox.svg create mode 100644 src/assets/icons/svg/clipboard.svg create mode 100644 src/assets/icons/svg/code.svg create mode 100644 src/assets/icons/svg/color.svg create mode 100644 src/assets/icons/svg/component.svg create mode 100644 src/assets/icons/svg/dashboard.svg create mode 100644 src/assets/icons/svg/date-range.svg create mode 100644 src/assets/icons/svg/date.svg create mode 100644 src/assets/icons/svg/dict.svg create mode 100644 src/assets/icons/svg/documentation.svg create mode 100644 src/assets/icons/svg/download.svg create mode 100644 src/assets/icons/svg/drag.svg create mode 100644 src/assets/icons/svg/druid.svg create mode 100644 src/assets/icons/svg/edit.svg create mode 100644 src/assets/icons/svg/education.svg create mode 100644 src/assets/icons/svg/email.svg create mode 100644 src/assets/icons/svg/enter.svg create mode 100644 src/assets/icons/svg/example.svg create mode 100644 src/assets/icons/svg/excel.svg create mode 100644 src/assets/icons/svg/exit-fullscreen.svg create mode 100644 src/assets/icons/svg/eye-open.svg create mode 100644 src/assets/icons/svg/eye.svg create mode 100644 src/assets/icons/svg/form.svg create mode 100644 src/assets/icons/svg/fullscreen.svg create mode 100644 src/assets/icons/svg/github.svg create mode 100644 src/assets/icons/svg/guide.svg create mode 100644 src/assets/icons/svg/hongcha.svg create mode 100644 src/assets/icons/svg/icon.svg create mode 100644 src/assets/icons/svg/input.svg create mode 100644 src/assets/icons/svg/international.svg create mode 100644 src/assets/icons/svg/job.svg create mode 100644 src/assets/icons/svg/language.svg create mode 100644 src/assets/icons/svg/link.svg create mode 100644 src/assets/icons/svg/list.svg create mode 100644 src/assets/icons/svg/lock.svg create mode 100644 src/assets/icons/svg/log.svg create mode 100644 src/assets/icons/svg/logininfor.svg create mode 100644 src/assets/icons/svg/lvgou.svg create mode 100644 src/assets/icons/svg/message.svg create mode 100644 src/assets/icons/svg/money.svg create mode 100644 src/assets/icons/svg/monitor.svg create mode 100644 src/assets/icons/svg/moon.svg create mode 100644 src/assets/icons/svg/more-up.svg create mode 100644 src/assets/icons/svg/nested.svg create mode 100644 src/assets/icons/svg/number.svg create mode 100644 src/assets/icons/svg/online.svg create mode 100644 src/assets/icons/svg/password.svg create mode 100644 src/assets/icons/svg/pdf.svg create mode 100644 src/assets/icons/svg/people.svg create mode 100644 src/assets/icons/svg/peoples.svg create mode 100644 src/assets/icons/svg/phone.svg create mode 100644 src/assets/icons/svg/post.svg create mode 100644 src/assets/icons/svg/qq.svg create mode 100644 src/assets/icons/svg/question.svg create mode 100644 src/assets/icons/svg/radio.svg create mode 100644 src/assets/icons/svg/rate.svg create mode 100644 src/assets/icons/svg/redis-list.svg create mode 100644 src/assets/icons/svg/redis.svg create mode 100644 src/assets/icons/svg/row.svg create mode 100644 src/assets/icons/svg/search.svg create mode 100644 src/assets/icons/svg/select.svg create mode 100644 src/assets/icons/svg/server.svg create mode 100644 src/assets/icons/svg/shopping.svg create mode 100644 src/assets/icons/svg/size.svg create mode 100644 src/assets/icons/svg/skill.svg create mode 100644 src/assets/icons/svg/slider.svg create mode 100644 src/assets/icons/svg/star.svg create mode 100644 src/assets/icons/svg/sunny.svg create mode 100644 src/assets/icons/svg/swagger.svg create mode 100644 src/assets/icons/svg/switch.svg create mode 100644 src/assets/icons/svg/system.svg create mode 100644 src/assets/icons/svg/tab.svg create mode 100644 src/assets/icons/svg/table.svg create mode 100644 src/assets/icons/svg/textarea.svg create mode 100644 src/assets/icons/svg/theme.svg create mode 100644 src/assets/icons/svg/time-range.svg create mode 100644 src/assets/icons/svg/time.svg create mode 100644 src/assets/icons/svg/tool.svg create mode 100644 src/assets/icons/svg/tree-table.svg create mode 100644 src/assets/icons/svg/tree.svg create mode 100644 src/assets/icons/svg/upload.svg create mode 100644 src/assets/icons/svg/user.svg create mode 100644 src/assets/icons/svg/validCode.svg create mode 100644 src/assets/icons/svg/wechat.svg create mode 100644 src/assets/icons/svg/zip.svg create mode 100644 src/assets/images/blood_zero.png create mode 100644 src/assets/images/dark.svg create mode 100644 src/assets/images/light.svg create mode 100644 src/assets/images/login-background.jpg create mode 100644 src/assets/images/login_left.png create mode 100644 src/assets/images/logo_new.png create mode 100644 src/assets/images/profile.jpg create mode 100644 src/assets/images/xjt.png create mode 100644 src/assets/images/yjt.png create mode 100644 src/assets/logo/logo.png create mode 100644 src/assets/styles/btn.scss create mode 100644 src/assets/styles/element-ui.scss create mode 100644 src/assets/styles/index.scss create mode 100644 src/assets/styles/mixin.scss create mode 100644 src/assets/styles/ruoyi.scss create mode 100644 src/assets/styles/sidebar.scss create mode 100644 src/assets/styles/transition.scss create mode 100644 src/assets/styles/variables.module.scss create mode 100644 src/components/Breadcrumb/index.vue create mode 100644 src/components/Crontab/day.vue create mode 100644 src/components/Crontab/hour.vue create mode 100644 src/components/Crontab/index.vue create mode 100644 src/components/Crontab/min.vue create mode 100644 src/components/Crontab/month.vue create mode 100644 src/components/Crontab/result.vue create mode 100644 src/components/Crontab/second.vue create mode 100644 src/components/Crontab/week.vue create mode 100644 src/components/Crontab/year.vue create mode 100644 src/components/DictTag/index.vue create mode 100644 src/components/Editor/index.vue create mode 100644 src/components/FileUpload/index.vue create mode 100644 src/components/Hamburger/index.vue create mode 100644 src/components/HeaderSearch/index.vue create mode 100644 src/components/IconSelect/index.vue create mode 100644 src/components/IconSelect/requireIcons.ts create mode 100644 src/components/ImagePreview/index.vue create mode 100644 src/components/ImageUpload/index.vue create mode 100644 src/components/Pagination/index.vue create mode 100644 src/components/ParentView/index.vue create mode 100644 src/components/RightToolbar/index.vue create mode 100644 src/components/RuoYi/Doc/index.vue create mode 100644 src/components/RuoYi/Git/index.vue create mode 100644 src/components/Screenfull/index.vue create mode 100644 src/components/SelectTable/YQSelectTable/index.vue create mode 100644 src/components/SelectTable/index.vue create mode 100644 src/components/SizeSelect/index.vue create mode 100644 src/components/SvgIcon/index.vue create mode 100644 src/components/SvgIcon/svgicon.ts create mode 100644 src/components/TopNav/index.vue create mode 100644 src/components/elTable/index.vue create mode 100644 src/components/iFrame/index.vue create mode 100644 src/components/vxeTable/index.vue create mode 100644 src/directive/common/copyText.ts create mode 100644 src/directive/index.ts create mode 100644 src/directive/permission/hasPermi.ts create mode 100644 src/directive/permission/hasRole.ts create mode 100644 src/hooks/index.ts create mode 100644 src/hooks/lisData/dictData.ts create mode 100644 src/hooks/messageBox.ts create mode 100644 src/layout/components/AppMain.vue create mode 100644 src/layout/components/Copyright/index.vue create mode 100644 src/layout/components/IframeToggle/index.vue create mode 100644 src/layout/components/InnerLink/index.vue create mode 100644 src/layout/components/Navbar.vue create mode 100644 src/layout/components/Settings/index.vue create mode 100644 src/layout/components/Sidebar/Link.vue create mode 100644 src/layout/components/Sidebar/Logo.vue create mode 100644 src/layout/components/Sidebar/SidebarItem.vue create mode 100644 src/layout/components/Sidebar/index.vue create mode 100644 src/layout/components/TagsView/ScrollPane.vue create mode 100644 src/layout/components/TagsView/index.vue create mode 100644 src/layout/components/TopBar/index.vue create mode 100644 src/layout/components/index.ts create mode 100644 src/layout/components/tabViews/index.vue create mode 100644 src/layout/index.vue create mode 100644 src/main.ts create mode 100644 src/permission.ts create mode 100644 src/plugins/auth.ts create mode 100644 src/plugins/cache.ts create mode 100644 src/plugins/download.ts create mode 100644 src/plugins/index.ts create mode 100644 src/plugins/modal.ts create mode 100644 src/plugins/tab.ts create mode 100644 src/router/index.ts create mode 100644 src/settings.ts create mode 100644 src/store/index.ts create mode 100644 src/store/modules/app.ts create mode 100644 src/store/modules/commonStore.ts create mode 100644 src/store/modules/dict.ts create mode 100644 src/store/modules/permission.ts create mode 100644 src/store/modules/printStore.ts create mode 100644 src/store/modules/settings.ts create mode 100644 src/store/modules/tagsView.ts create mode 100644 src/store/modules/user.ts create mode 100644 src/types/Object.d.ts create mode 100644 src/types/SelectTable.d.ts create mode 100644 src/types/api/common.ts create mode 100644 src/types/api/index.ts create mode 100644 src/types/api/login.ts create mode 100644 src/types/api/menu.ts create mode 100644 src/types/api/monitor/cache.ts create mode 100644 src/types/api/monitor/job.ts create mode 100644 src/types/api/monitor/jobLog.ts create mode 100644 src/types/api/monitor/logininfor.ts create mode 100644 src/types/api/monitor/online.ts create mode 100644 src/types/api/monitor/operlog.ts create mode 100644 src/types/api/system/config.ts create mode 100644 src/types/api/system/dept.ts create mode 100644 src/types/api/system/dict.ts create mode 100644 src/types/api/system/menu.ts create mode 100644 src/types/api/system/notice.ts create mode 100644 src/types/api/system/post.ts create mode 100644 src/types/api/system/role.ts create mode 100644 src/types/api/system/user.ts create mode 100644 src/types/api/tool/gen.ts create mode 100644 src/types/components.d.ts create mode 100644 src/types/global.d.ts create mode 100644 src/types/index.ts create mode 100644 src/utils/auth.ts create mode 100644 src/utils/classCom.ts create mode 100644 src/utils/dict.ts create mode 100644 src/utils/dynamicTitle.ts create mode 100644 src/utils/errorCode.ts create mode 100644 src/utils/generator/config.js create mode 100644 src/utils/generator/css.js create mode 100644 src/utils/generator/drawingDefault.js create mode 100644 src/utils/generator/html.js create mode 100644 src/utils/generator/icon.json create mode 100644 src/utils/generator/js.js create mode 100644 src/utils/generator/render.js create mode 100644 src/utils/groupHelper.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/jsencrypt.ts create mode 100644 src/utils/mitt.ts create mode 100644 src/utils/permission.ts create mode 100644 src/utils/pinyin.ts create mode 100644 src/utils/polyfills.ts create mode 100644 src/utils/printHelper.ts create mode 100644 src/utils/rem.ts create mode 100644 src/utils/request.ts create mode 100644 src/utils/ruoyi.ts create mode 100644 src/utils/scroll-to.ts create mode 100644 src/utils/theme.ts create mode 100644 src/utils/validate.ts create mode 100644 src/utils/webSocket.ts create mode 100644 src/views/blood/deptPatient/components/bloodTransfusionApplication.vue create mode 100644 src/views/blood/deptPatient/components/bloodTransfusionAssessment.vue create mode 100644 src/views/blood/deptPatient/index.vue create mode 100644 src/views/blood/reactionRegist/index.vue create mode 100644 src/views/blood/receiveBlood/index.vue create mode 100644 src/views/blood/record/index.vue create mode 100644 src/views/blood/review/index.vue create mode 100644 src/views/error/401.vue create mode 100644 src/views/error/404.vue create mode 100644 src/views/index.vue create mode 100644 src/views/login.vue create mode 100644 src/views/monitor/cache/index.vue create mode 100644 src/views/monitor/cache/list.vue create mode 100644 src/views/monitor/druid/index.vue create mode 100644 src/views/monitor/job/index.vue create mode 100644 src/views/monitor/job/log.vue create mode 100644 src/views/monitor/logininfor/index.vue create mode 100644 src/views/monitor/online/index.vue create mode 100644 src/views/monitor/operlog/index.vue create mode 100644 src/views/monitor/server/index.vue create mode 100644 src/views/redirect/index.vue create mode 100644 src/views/register.vue create mode 100644 src/views/system/config/index.vue create mode 100644 src/views/system/dept/index.vue create mode 100644 src/views/system/dict/data.vue create mode 100644 src/views/system/dict/index.vue create mode 100644 src/views/system/menu/index.vue create mode 100644 src/views/system/notice/index.vue create mode 100644 src/views/system/post/index.vue create mode 100644 src/views/system/role/authUser.vue create mode 100644 src/views/system/role/index.vue create mode 100644 src/views/system/role/selectUser.vue create mode 100644 src/views/system/user/authRole.vue create mode 100644 src/views/system/user/index.vue create mode 100644 src/views/system/user/profile/index.vue create mode 100644 src/views/system/user/profile/resetPwd.vue create mode 100644 src/views/system/user/profile/userAvatar.vue create mode 100644 src/views/system/user/profile/userInfo.vue create mode 100644 src/views/tool/build/CodeTypeDialog.vue create mode 100644 src/views/tool/build/DraggableItem.vue create mode 100644 src/views/tool/build/IconsDialog.vue create mode 100644 src/views/tool/build/RightPanel.vue create mode 100644 src/views/tool/build/TreeNodeDialog.vue create mode 100644 src/views/tool/build/index.vue create mode 100644 src/views/tool/gen/basicInfoForm.vue create mode 100644 src/views/tool/gen/createTable.vue create mode 100644 src/views/tool/gen/editTable.vue create mode 100644 src/views/tool/gen/genInfoForm.vue create mode 100644 src/views/tool/gen/importTable.vue create mode 100644 src/views/tool/gen/index.vue create mode 100644 src/views/tool/swagger/index.vue create mode 100644 tsconfig.json create mode 100644 vite.config.ts create mode 100644 vite/plugins/auto-import.ts create mode 100644 vite/plugins/compression.ts create mode 100644 vite/plugins/index.ts create mode 100644 vite/plugins/setup-extend.ts create mode 100644 vite/plugins/svg-icon.ts diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..92b5028 --- /dev/null +++ b/.env.development @@ -0,0 +1,8 @@ +# 页面标题 +VITE_APP_TITLE = 输血系统 + +# 开发环境配置 +VITE_APP_ENV = 'development' + +# 输血系统/开发环境 +VITE_APP_BASE_API = '/dev-api' diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..1e3157a --- /dev/null +++ b/.env.production @@ -0,0 +1,11 @@ +# 页面标题 +VITE_APP_TITLE = 输血系统 + +# 生产环境配置 +VITE_APP_ENV = 'production' + +# 输血系统/生产环境 +VITE_APP_BASE_API = '/prod-api' + +# 是否在打包时开启压缩,支持 gzip 和 brotli +VITE_BUILD_COMPRESS = gzip \ No newline at end of file diff --git a/.env.staging b/.env.staging new file mode 100644 index 0000000..99eb71b --- /dev/null +++ b/.env.staging @@ -0,0 +1,11 @@ +# 页面标题 +VITE_APP_TITLE = 输血系统 + +# 生产环境配置 +VITE_APP_ENV = 'staging' + +# 输血系统/生产环境 +VITE_APP_BASE_API = '/stage-api' + +# 是否在打包时开启压缩,支持 gzip 和 brotli +VITE_BUILD_COMPRESS = gzip \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78a752d --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8564f29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 RuoYi + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8fc3cbb --- /dev/null +++ b/README.md @@ -0,0 +1,125 @@ +

+ logo +

+

RuoYi v3.9.1

+

基于SpringBoot+Vue3前后端分离的Java快速开发框架

+

+ + + +

+ +## 平台简介 + +* 本仓库为前端技术栈 [TypeScript](https://www.typescriptlang.org) + [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。 +* 配套后端代码仓库地址[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) 或 [RuoYi-Vue-fast](https://gitcode.com/yangzongzhuan/RuoYi-Vue-fast) 版本。 +* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)   + +# 版本对比 + +RuoYi-Vue 前端项目的三个主要演进版本,方便你直观对比其技术栈差异(并行开发维护)。 + +| 项目名称 | **RuoYi-Vue** | **RuoYi-Vue3** | **RuoYi-Vue3-TypeScript** | +| :--- | :--- | :--- | :--- | +| **前端框架** | Vue 2 | Vue 3 | Vue 3 | +| **脚本语言** | JavaScript | JavaScript | TypeScript | +| **构建工具** | Vue CLI | Vite | Vite | +| **UI 组件库** | Element UI | Element Plus | Element Plus | +| **状态管理** | Vuex | Pinia | Pinia | +| **路由管理** | Vue Router 3 | Vue Router 4 | Vue Router 4 | +| **核心特点** | 1. 技术栈经典稳定
2. 社区资料丰富
3. 当前维护重心已转移 | 1. 现代前端技术栈
2. 开发体验与性能更优
3. 官方主推的活跃版本 | 1. 类型加持,减少沟通成本
2. 开发时有提示,效率更高
3. 多人协作企业级开发项目 | +| **仓库地址** | [RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) | [RuoYi-Vue3](https://gitcode.com/yangzongzhuan/RuoYi-Vue3) | [RuoYi-Vue3-TypeScript](https://gitcode.com/yangzongzhuan/RuoYi-Vue3/tree/typescript) | + +## 前端运行 + +```bash +# 克隆项目 +git clone https://gitcode.com/yangzongzhuan/RuoYi-Vue3.git + +# 切换typescript分支 +git checkout typescript + +# 进入项目目录 +cd RuoYi-Vue3 + +# 安装依赖 +yarn --registry=https://registry.npmmirror.com + +# 启动服务 +yarn dev + +# 构建测试环境 yarn build:stage +# 构建生产环境 yarn build:prod +# 前端访问地址 http://localhost:80 +``` + +## 内置功能 + +1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 +2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 +3. 岗位管理:配置系统用户所属担任职务。 +4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 +5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 +6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 +7. 参数管理:对系统动态配置常用参数。 +8. 通知公告:系统通知公告信息发布维护。 +9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 +10. 登录日志:系统登录日志记录查询包含登录异常。 +11. 在线用户:当前系统中活跃用户状态监控。 +12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 +13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 +14. 系统接口:根据业务代码自动生成相关的api接口文档。 +15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 +16. 缓存监控:对系统的缓存信息查询,命令统计等。 +17. 在线构建器:拖动表单元素生成相应的HTML代码。 +18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 + +## 在线体验 + +- admin/admin123 +- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 + +演示地址:http://vue.ruoyi.vip +文档地址:http://doc.ruoyi.vip + +## 演示图 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +## 若依前后端分离交流群 + +QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/已满-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![加入QQ群](https://img.shields.io/badge/已满-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![加入QQ群](https://img.shields.io/badge/已满-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![加入QQ群](https://img.shields.io/badge/已满-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![加入QQ群](https://img.shields.io/badge/已满-138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [![加入QQ群](https://img.shields.io/badge/已满-151450850-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [![加入QQ群](https://img.shields.io/badge/已满-224622315-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [![加入QQ群](https://img.shields.io/badge/已满-287842588-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [![加入QQ群](https://img.shields.io/badge/已满-187944233-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [![加入QQ群](https://img.shields.io/badge/已满-228578329-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) [![加入QQ群](https://img.shields.io/badge/已满-191164766-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=GsOo-OLz53J8y_9TPoO6XXSGNRTgbFxA&authKey=R7Uy%2Feq%2BZsoKNqHvRKhiXpypW7DAogoWapOawUGHokJSBIBIre2%2FoiAZeZBSLuBc&noverify=0&group_code=191164766) [![加入QQ群](https://img.shields.io/badge/已满-174569686-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=PmYavuzsOthVqfdAPbo4uAeIbu7Ttjgc&authKey=p52l8%2FXa4PS1JcEmS3VccKSwOPJUZ1ZfQ69MEKzbrooNUljRtlKjvsXf04bxNp3G&noverify=0&group_code=174569686) [![加入QQ群](https://img.shields.io/badge/127358632-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=M9y5NjAl44lAL_Vh2crmEehZU_PMU6KS&authKey=ZSDz8hEREWSaPuxQV3gEwqGIaGjfRNnkB4rJjf0IvXhrSUGSGwQFmBA%2Boe8HFxyl&noverify=0&group_code=127358632) 点击按钮入群。 \ No newline at end of file diff --git a/auto-imports.d.ts b/auto-imports.d.ts new file mode 100644 index 0000000..ab12676 --- /dev/null +++ b/auto-imports.d.ts @@ -0,0 +1,90 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const EffectScope: typeof import('vue')['EffectScope'] + const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] + const computed: typeof import('vue')['computed'] + const createApp: typeof import('vue')['createApp'] + const createPinia: typeof import('pinia')['createPinia'] + const customRef: typeof import('vue')['customRef'] + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] + const defineComponent: typeof import('vue')['defineComponent'] + const defineEmits: typeof import('vue')['defineEmits'] + const defineProps: typeof import('vue')['defineProps'] + const defineStore: typeof import('pinia')['defineStore'] + const effectScope: typeof import('vue')['effectScope'] + 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 inject: typeof import('vue')['inject'] + 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 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 onDeactivated: typeof import('vue')['onDeactivated'] + const onErrorCaptured: typeof import('vue')['onErrorCaptured'] + 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 onUnmounted: typeof import('vue')['onUnmounted'] + const onUpdated: typeof import('vue')['onUpdated'] + const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] + const provide: typeof import('vue')['provide'] + const reactive: typeof import('vue')['reactive'] + const readonly: typeof import('vue')['readonly'] + const ref: typeof import('vue')['ref'] + const resolveComponent: typeof import('vue')['resolveComponent'] + 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 toRaw: typeof import('vue')['toRaw'] + 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 unref: typeof import('vue')['unref'] + const useAttrs: typeof import('vue')['useAttrs'] + const useCssModule: typeof import('vue')['useCssModule'] + const useCssVars: typeof import('vue')['useCssVars'] + const useId: typeof import('vue')['useId'] + const useLink: typeof import('vue-router')['useLink'] + const useModel: typeof import('vue')['useModel'] + const useRoute: typeof import('vue-router')['useRoute'] + const useRouter: typeof import('vue-router')['useRouter'] + const useSlots: typeof import('vue')['useSlots'] + const useTemplateRef: typeof import('vue')['useTemplateRef'] + const watch: typeof import('vue')['watch'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') +} diff --git a/bin/build.bat b/bin/build.bat new file mode 100644 index 0000000..ecbb454 --- /dev/null +++ b/bin/build.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [ÐÅϢ] ´ò°üWeb¹¤³̣¬Éú³ÉdistÎļþ¡£ +echo. + +%~d0 +cd %~dp0 + +cd .. +yarn build:prod + +pause \ No newline at end of file diff --git a/bin/package.bat b/bin/package.bat new file mode 100644 index 0000000..f5b24e0 --- /dev/null +++ b/bin/package.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [ÐÅϢ] °²װWeb¹¤³̣¬Éú³Énode_modulesÎļþ¡£ +echo. + +%~d0 +cd %~dp0 + +cd .. +yarn --registry=https://registry.npmmirror.com + +pause \ No newline at end of file diff --git a/bin/run-web.bat b/bin/run-web.bat new file mode 100644 index 0000000..d2fe397 --- /dev/null +++ b/bin/run-web.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [ÐÅϢ] ʹÓà Vite ÃüÁîÔËÐÐ Web ¹¤³̡£ +echo. + +%~d0 +cd %~dp0 + +cd .. +yarn dev + +pause \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..06c1998 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,82 @@ +import js from "@eslint/js"; +import globals from "globals"; +import pluginVue from "eslint-plugin-vue"; +import { defineConfig } from "eslint/config"; +// 引入 TypeScript ESLint 插件和解析器 +import tsParser from "@typescript-eslint/parser"; +import tsPlugin from "@typescript-eslint/eslint-plugin"; + +export default defineConfig([ + // 1. 基础 JS 规则(适用于 JS/Vue 文件) + { + files: ["**/*.{js,mjs,cjs,vue}"], + plugins: { js }, + extends: ["js/recommended"] + }, + // 2. 浏览器环境全局变量(适用于 JS/Vue/TS 文件) + { + files: ["**/*.{js,mjs,cjs,vue,ts,tsx}"], + languageOptions: { + globals: globals.browser + } + }, + // 3. Vue 基础规则 + pluginVue.configs["flat/essential"], + // 4. Auto-import 插件配置(保持不变) + { + plugins: { + 'auto-import': { + extensions: ['.js', '.mjs', '.jsx', '.vue', '.ts', '.tsx'], // 增加 TS 扩展名 + }, + }, + }, + // 5. TypeScript 专属配置(核心) + { + // 仅对 TS/TSX 文件生效 + files: ["**/*.{ts,tsx}"], + // 指定 TS 解析器 + languageOptions: { + parser: tsParser, + // 解析器选项(需与 tsconfig.json 匹配) + parserOptions: { + ecmaVersion: "latest", // 支持最新 ES 语法 + sourceType: "module", // 模块类型(ESM) + project: "./tsconfig.json", // 指向项目的 tsconfig.json(启用类型检查) + tsconfigRootDir: process.cwd(), // 确保找到 tsconfig.json 的根目录 + }, + }, + // 引入 TS 插件 + plugins: { + "@typescript-eslint": tsPlugin, + }, + // 继承 TS 推荐规则(可选,按需调整) + extends: [ + "plugin:@typescript-eslint/recommended", // 基础推荐规则 + "plugin:@typescript-eslint/recommended-requiring-type-checking" // 依赖类型检查的规则(需 project 配置) + ], + // TS 专属规则(可自定义) + rules: { + // 示例:禁用某些严格规则(根据需求调整) + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-explicit-any": "warn" + } + }, + // 6. 全局规则(覆盖所有文件) + { + rules: { + // 可在此处添加适用于所有文件的规则 + // 例如关闭不必要的规则 + "no-undef": "off" // TS 已有类型检查,可关闭 JS 的 undef 检查 + }, + }, + // 7. Auto-import 配置(增加 TS 支持) + { + settings: { + 'auto-import': { + imports: ['vue', 'vue-router'], // 自动导入的模块 + // 增加 TS 扩展名 + extensions: ['.js', '.mjs', '.jsx', '.vue', '.ts', '.tsx'], + }, + }, + }, +]); \ No newline at end of file diff --git a/html/ie.html b/html/ie.html new file mode 100644 index 0000000..052ffcd --- /dev/null +++ b/html/ie.html @@ -0,0 +1,46 @@ + + + + + + 请升级您的浏览器 + + + + + + +

请升级您的浏览器,以便我们更好的为您提供服务!

+

您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。

+
+

请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束

+

自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明 。

+
+

您可以选择更先进的浏览器

+

推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。

+ +
+ + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..d1d824e --- /dev/null +++ b/index.html @@ -0,0 +1,215 @@ + + + + + + + + + + %VITE_APP_TITLE% + + + + + +
+
+
+
+
+
正在加载系统资源,请耐心等待
+
+
+ + + + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..ae14030 --- /dev/null +++ b/package.json @@ -0,0 +1,66 @@ +{ + "name": "blood", + "version": "1.0", + "description": "输血管理系统", + "author": "若依", + "license": "MIT", + "type": "module", + "scripts": { + "dev": "vite", + "build:prod": "vite build", + "build:stage": "vite build --mode staging", + "preview": "vite preview" + }, + "repository": { + "type": "git", + "url": "https://gitee.com/y_project/RuoYi-Vue.git" + }, + "dependencies": { + "@element-plus/icons-vue": "2.3.2", + "@vueup/vue-quill": "1.2.0", + "@vueuse/core": "14.1.0", + "axios": "1.13.2", + "clipboard": "2.0.11", + "dayjs": "^1.11.19", + "echarts": "5.6.0", + "element-plus": "2.13.1", + "file-saver": "2.0.5", + "fuse.js": "7.1.0", + "js-beautify": "1.15.4", + "js-cookie": "3.0.5", + "jsencrypt": "3.3.2", + "mitt": "^3.0.1", + "nprogress": "0.2.0", + "pinia": "3.0.4", + "pinia-plugin-persistedstate": "^4.7.1", + "pinyin-pro": "^3.28.0", + "sortablejs": "^1.15.7", + "splitpanes": "4.0.4", + "vue": "^3.5.26", + "vue-cropper": "1.1.1", + "vue-router": "4.6.4", + "vuedraggable": "4.1.0", + "vxe-pc-ui": "^4.3.2", + "vxe-table": "^4.9.4" + }, + "devDependencies": { + "@types/node": "^25.3.5", + "@types/sortablejs": "^1.15.9", + "@vitejs/plugin-vue": "5.2.4", + "@vue/tsconfig": "^0.5.1", + "sass-embedded": "1.97.2", + "typescript": "5.6.3", + "unplugin-auto-import": "0.18.6", + "unplugin-vue-setup-extend-plus": "1.0.1", + "vite": "^6.4.1", + "vite-plugin-compression": "0.5.1", + "vite-plugin-svg-icons": "2.0.1", + "vue-tsc": "2.1.10" + }, + "overrides": { + "quill": "2.0.2" + }, + "resolutions": { + "quill": "2.0.2" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ebcd63dc13e137e55917821a274a6fa37b956c18 GIT binary patch literal 137750 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 uhsG&Ga?r?YuaLUk%==ioTdATs + + + + diff --git a/src/api/liswork/dict/ComDict.ts b/src/api/liswork/dict/ComDict.ts new file mode 100644 index 0000000..ace0db9 --- /dev/null +++ b/src/api/liswork/dict/ComDict.ts @@ -0,0 +1,47 @@ +// @ts-ignore +import request from '@/utils/request' + +// 查询字典数据列表 +export function queryComDictListService(query?: Object) { + return request({ + url: '/comdict/query', + method: 'get', + params: query + }) +} +//增加字典数据 +export function addComDictService(data?: Object) { + return request({ + url: '/comdict/add', + method: 'post', + data + }) +} + +//修改字典数据 +export function updateComDictService(data?: Object) { + return request({ + url: '/comdict/update', + method: 'post', + data + }) + +} +//删除字典数据 +export function delComDictService(data?: Object) { + return request({ + url: '/comdict/del', + method: 'delete', + data + }) + +} + +// 根据字典类型查询字典数据信息 +export function getComDicts(dict_type?: Object) { + return request({ + url: '/transitdict/regdict/getInfoOne', + method: 'get', + params: dict_type + }) +} \ No newline at end of file diff --git a/src/api/liswork/dict/LabInstr.ts b/src/api/liswork/dict/LabInstr.ts new file mode 100644 index 0000000..a31d3b5 --- /dev/null +++ b/src/api/liswork/dict/LabInstr.ts @@ -0,0 +1,19 @@ +// @ts-ignore +import request from '@/utils/request' + +// 查询字典数据列表 +export function querylabInstrList(query?: Object) { + return request({ + url: '/instr/query', + method: 'get', + params: query + }) +} +// 查询字典数据列表 +export function querylabInstrListByLisgroup(query?: Object) { + return request({ + url: '/instr/querybylisgroup', + method: 'get', + params: query + }) +} \ No newline at end of file diff --git a/src/api/liswork/work/LisWork.ts b/src/api/liswork/work/LisWork.ts new file mode 100644 index 0000000..0ead2b9 --- /dev/null +++ b/src/api/liswork/work/LisWork.ts @@ -0,0 +1,12 @@ +import request from '@/utils/request' +import { ElLoading, ElMessage } from 'element-plus' + + +// 仪器组可操作仪器查询 +export function getGroupInstrdList(query?: Object) { + return request({ + url: '/liswork/getGroupInstrdList', + method: 'get', + params: query + }) +} diff --git a/src/api/liswork/xtwh/configdictApi.ts b/src/api/liswork/xtwh/configdictApi.ts new file mode 100644 index 0000000..1c87a87 --- /dev/null +++ b/src/api/liswork/xtwh/configdictApi.ts @@ -0,0 +1,46 @@ +//参数设置字典 +// @ts-ignore +import request from '@/utils/request' + +// 查询字典列表 +export function listconfigdict(params:any) { + return request({ + url: '/configdict/list', + method: 'get', + params + }) +} + +// 查询字典详细 +export function getconfigdict(id:number) { + return request({ + url: `/configdict/${id}`, + method: 'get' + }) +} + +// 新增字典 +export function addconfigdict(params:any) { + return request({ + url: '/configdict', + method: 'post', + data:params + }) +} + +// 修改字典 +export function updateconfigdict(params:any) { + return request({ + url: '/configdict', + method: 'put', + data:params + }) +} + +// 删除字典 +export function delconfigdict(id:any) { + return request({ + url: `/configdict/${id}`, + method: 'delete' + }) +} diff --git a/src/api/liswork/xtwh/localconfigApi.ts b/src/api/liswork/xtwh/localconfigApi.ts new file mode 100644 index 0000000..139878b --- /dev/null +++ b/src/api/liswork/xtwh/localconfigApi.ts @@ -0,0 +1,45 @@ +//本地参数设置 +// @ts-ignore +import request from '@/utils/request' + +// 查询字典列表 +export function listlocalconfig(params:any) { + return request({ + url: '/localconfig/list', + method: 'get', + params + }) +} +export function getLocalConfigDefault(params:any) { + return request({ + url: '/localconfig/resetdef', + method: 'get', + params + }) +} + +// 查询字典下拉框内容 +export function getoptionselect(params:any) { + return request({ + url: '/localconfig/optionselect', + method: 'get', + params + }) +} +// 修改字典 +export function updatelocalconfig(params:any) { + return request({ + url: '/localconfig', + method: 'put', + data:params + }) +} +// 批量保存所有结果 +export function savelocalconfig(params:any) { + return request({ + url: '/localconfig/editall', + method: 'put', + data:params + }) +} + diff --git a/src/api/login.ts b/src/api/login.ts new file mode 100644 index 0000000..517f72d --- /dev/null +++ b/src/api/login.ts @@ -0,0 +1,83 @@ +import request from '@/utils/request' +import type { SysRegister, LoginInfoResult, UserInfoResult, CaptchaInfoResult, AjaxResult } from '@/types' + +// 登录方法 +export function login(username: string, password: string, code: string, uuid: string, loginParam?: Object): Promise { + const data = { + username, + password, + code, + uuid, + loginParam + } + return request({ + url: '/login', + headers: { + isToken: false, + repeatSubmit: false + }, + method: 'post', + data: data + }) +} + +// 单点登录 +export function loginAnonymous(data: { username: string; yljg: string }): Promise { + return request({ + url: '/loginAnonymous', + method: 'post', + data: data + }) +} + +// 注册方法 +export function register(data: SysRegister): Promise { + return request({ + url: '/register', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +export function getLocalconfig(data: object) { + return request({ + url: '/getLocalconfig', + headers: { + isToken: false + }, + method: 'get', + params: data, + timeout: 20000 + }) +} + +// 获取用户详细信息 +export function getInfo(): Promise { + return request({ + url: '/getInfo', + method: 'get' + }) +} + +// 退出方法 +export function logout() { + return request({ + url: '/logout', + method: 'post' + }) +} + +// 获取验证码 +export function getCodeImg(): Promise { + return request({ + url: '/captchaImage', + headers: { + isToken: false + }, + method: 'get', + timeout: 20000 + }) +} diff --git a/src/api/menu.ts b/src/api/menu.ts new file mode 100644 index 0000000..092ceb9 --- /dev/null +++ b/src/api/menu.ts @@ -0,0 +1,10 @@ +import request from '@/utils/request' +import type { RouterVo, AjaxResult } from '@/types' + +// 获取路由 +export const getRouters = (): Promise> => { + return request({ + url: '/getRouters', + method: 'get' + }) +} diff --git a/src/api/monitor/cache.ts b/src/api/monitor/cache.ts new file mode 100644 index 0000000..93a4537 --- /dev/null +++ b/src/api/monitor/cache.ts @@ -0,0 +1,58 @@ +import request from '@/utils/request' +import type { SysCache, AjaxResult } from '@/types' + +// 查询缓存详细 +export function getCache(): Promise> { + return request({ + url: '/monitor/cache', + method: 'get' + }) +} + +// 查询缓存名称列表 +export function listCacheName(): Promise> { + return request({ + url: '/monitor/cache/getNames', + method: 'get' + }) +} + +// 查询缓存键名列表 +export function listCacheKey(cacheName: string): Promise> { + return request({ + url: '/monitor/cache/getKeys/' + cacheName, + method: 'get' + }) +} + +// 查询缓存内容 +export function getCacheValue(cacheName: string, cacheKey: string): Promise> { + return request({ + url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, + method: 'get' + }) +} + +// 清理指定名称缓存 +export function clearCacheName(cacheName: string): Promise { + return request({ + url: '/monitor/cache/clearCacheName/' + cacheName, + method: 'delete' + }) +} + +// 清理指定键名缓存 +export function clearCacheKey(cacheKey: string): Promise { + return request({ + url: '/monitor/cache/clearCacheKey/' + cacheKey, + method: 'delete' + }) +} + +// 清理全部缓存 +export function clearCacheAll(): Promise { + return request({ + url: '/monitor/cache/clearCacheAll', + method: 'delete' + }) +} diff --git a/src/api/monitor/job.ts b/src/api/monitor/job.ts new file mode 100644 index 0000000..28057b0 --- /dev/null +++ b/src/api/monitor/job.ts @@ -0,0 +1,71 @@ +import request from '@/utils/request' +import type { JobQueryParams, SysJob, AjaxResult, TableDataInfo } from '@/types' + +// 查询定时任务调度列表 +export function listJob(query: JobQueryParams): Promise> { + return request({ + url: '/monitor/job/list', + method: 'get', + params: query + }) +} + +// 查询定时任务调度详细 +export function getJob(jobId: number): Promise> { + return request({ + url: '/monitor/job/' + jobId, + method: 'get' + }) +} + +// 新增定时任务调度 +export function addJob(data: SysJob): Promise { + return request({ + url: '/monitor/job', + method: 'post', + data: data + }) +} + +// 修改定时任务调度 +export function updateJob(data: SysJob): Promise { + return request({ + url: '/monitor/job', + method: 'put', + data: data + }) +} + +// 删除定时任务调度 +export function delJob(jobId: number | number[]): Promise { + return request({ + url: '/monitor/job/' + jobId, + method: 'delete' + }) +} + +// 任务状态修改 +export function changeJobStatus(jobId: number, status: string): Promise { + const data = { + jobId, + status + } + return request({ + url: '/monitor/job/changeStatus', + method: 'put', + data: data + }) +} + +// 定时任务立即执行一次 +export function runJob(jobId: number, jobGroup: string): Promise { + const data = { + jobId, + jobGroup + } + return request({ + url: '/monitor/job/run', + method: 'put', + data: data + }) +} diff --git a/src/api/monitor/jobLog.ts b/src/api/monitor/jobLog.ts new file mode 100644 index 0000000..7ef73a5 --- /dev/null +++ b/src/api/monitor/jobLog.ts @@ -0,0 +1,28 @@ +import request from '@/utils/request' +import type { JobLogQueryParams, SysJobLog, AjaxResult, TableDataInfo } from '@/types' + +// 查询调度日志列表 +export function listJobLog(query: JobLogQueryParams): Promise> { + return request({ + url: '/monitor/jobLog/list', + method: 'get', + params: query + }) +} + +// 删除调度日志 +export function delJobLog(jobLogId: number | number[]): Promise { + return request({ + url: '/monitor/jobLog/' + jobLogId, + method: 'delete' + }) +} + +// 清空调度日志 +export function cleanJobLog(): Promise { + return request({ + url: '/monitor/jobLog/clean', + method: 'delete' + }) +} + diff --git a/src/api/monitor/logininfor.ts b/src/api/monitor/logininfor.ts new file mode 100644 index 0000000..438e8b3 --- /dev/null +++ b/src/api/monitor/logininfor.ts @@ -0,0 +1,35 @@ +import request from '@/utils/request' +import type { LogininforQueryParams, SysLogininfor, AjaxResult, TableDataInfo } from '@/types' + +// 查询登录日志列表 +export function list(query: LogininforQueryParams): Promise> { + return request({ + url: '/monitor/logininfor/list', + method: 'get', + params: query + }) +} + +// 删除登录日志 +export function delLogininfor(infoId: number | number[]): Promise { + return request({ + url: '/monitor/logininfor/' + infoId, + method: 'delete' + }) +} + +// 解锁用户登录状态 +export function unlockLogininfor(userName: string): Promise { + return request({ + url: '/monitor/logininfor/unlock/' + userName, + method: 'get' + }) +} + +// 清空登录日志 +export function cleanLogininfor(): Promise { + return request({ + url: '/monitor/logininfor/clean', + method: 'delete' + }) +} diff --git a/src/api/monitor/online.ts b/src/api/monitor/online.ts new file mode 100644 index 0000000..080d186 --- /dev/null +++ b/src/api/monitor/online.ts @@ -0,0 +1,19 @@ +import request from '@/utils/request' +import type { OnlineQueryParams, SysUserOnline, AjaxResult, TableDataInfo } from '@/types' + +// 查询在线用户列表 +export function list(query: OnlineQueryParams): Promise> { + return request({ + url: '/monitor/online/list', + method: 'get', + params: query + }) +} + +// 强退用户 +export function forceLogout(tokenId: string): Promise { + return request({ + url: '/monitor/online/' + tokenId, + method: 'delete' + }) +} diff --git a/src/api/monitor/operlog.ts b/src/api/monitor/operlog.ts new file mode 100644 index 0000000..c4a6b24 --- /dev/null +++ b/src/api/monitor/operlog.ts @@ -0,0 +1,27 @@ +import request from '@/utils/request' +import type { OperlogQueryParams, SysOperLog, AjaxResult, TableDataInfo } from '@/types' + +// 查询操作日志列表 +export function list(query: OperlogQueryParams): Promise> { + return request({ + url: '/monitor/operlog/list', + method: 'get', + params: query + }) +} + +// 删除操作日志 +export function delOperlog(operId: number | number[]): Promise { + return request({ + url: '/monitor/operlog/' + operId, + method: 'delete' + }) +} + +// 清空操作日志 +export function cleanOperlog(): Promise { + return request({ + url: '/monitor/operlog/clean', + method: 'delete' + }) +} diff --git a/src/api/monitor/server.ts b/src/api/monitor/server.ts new file mode 100644 index 0000000..9690d42 --- /dev/null +++ b/src/api/monitor/server.ts @@ -0,0 +1,10 @@ +import request from '@/utils/request' +import type { AjaxResult } from '@/types' + +// 获取服务信息 +export function getServer(): Promise> { + return request({ + url: '/monitor/server', + method: 'get' + }) +} diff --git a/src/api/regional/dict/diagnosis.ts b/src/api/regional/dict/diagnosis.ts new file mode 100644 index 0000000..34a886d --- /dev/null +++ b/src/api/regional/dict/diagnosis.ts @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询诊断列表 +export function listdiagnosis(query: Object) { + return request({ + url: '/transitdict/diagnosis/list', + method: 'get', + params: query + }) +} + +// 查询诊断详细 +export function getdiagnosis(diagnosisId: number) { + return request({ + url: '/transitdict/diagnosis/' + diagnosisId, + method: 'get' + }) +} + +// 新增诊断 +export function adddiagnosis(data: Object) { + return request({ + url: '/transitdict/diagnosis', + method: 'post', + data: data + }) +} + +// 修改诊断 +export function updatediagnosis(data: Object) { + return request({ + url: '/transitdict/diagnosis', + method: 'put', + data: data + }) +} + +// 删除诊断 +export function deldiagnosis(diagnosisId: number) { + return request({ + url: '/transitdict/diagnosis/' + diagnosisId, + method: 'delete' + }) +} diff --git a/src/api/regional/dict/hospital.ts b/src/api/regional/dict/hospital.ts new file mode 100644 index 0000000..68c5b4d --- /dev/null +++ b/src/api/regional/dict/hospital.ts @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询医疗机构列表 +export function listhospital(query?: Object) { + return request({ + url: '/transitdict/hospital/list', + method: 'get', + params: query + }) +} + +// 查询医疗机构详细 +export function gethospital(hospitalId: number) { + return request({ + url: '/transitdict/hospital/' + hospitalId, + method: 'get' + }) +} + +// 新增医疗机构 +export function addhospital(data: Object) { + return request({ + url: '/transitdict/hospital', + method: 'post', + data: data + }) +} + +// 修改医疗机构 +export function updatehospital(data: Object) { + return request({ + url: '/transitdict/hospital', + method: 'put', + data: data + }) +} + +// 删除医疗机构 +export function delhospital(hospitalId: number) { + return request({ + url: '/transitdict/hospital/' + hospitalId, + method: 'delete' + }) +} diff --git a/src/api/regional/dict/itemclass.ts b/src/api/regional/dict/itemclass.ts new file mode 100644 index 0000000..8bf6c9c --- /dev/null +++ b/src/api/regional/dict/itemclass.ts @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询诊断列表 +export function listitemclass(query: Object) { + return request({ + url: '/transitdict/itemclass/list', + method: 'get', + params: query + }) +} + +// 查询诊断详细 +export function getitemclass(itemclassId: number) { + return request({ + url: '/transitdict/itemclass/' + itemclassId, + method: 'get' + }) +} + +// 新增诊断 +export function additemclass(data: Object) { + return request({ + url: '/transitdict/itemclass', + method: 'post', + data: data + }) +} + +// 修改诊断 +export function updateitemclass(data: Object) { + return request({ + url: '/transitdict/itemclass', + method: 'put', + data: data + }) +} + +// 删除诊断 +export function delitemclass(itemclassId: number) { + return request({ + url: '/transitdict/itemclass/' + itemclassId, + method: 'delete' + }) +} diff --git a/src/api/regional/dict/regdict.ts b/src/api/regional/dict/regdict.ts new file mode 100644 index 0000000..33cbd26 --- /dev/null +++ b/src/api/regional/dict/regdict.ts @@ -0,0 +1,59 @@ +import request from '@/utils/request' + +// 查询字典列表 +export function listregdict(query: Object) { + return request({ + url: '/transitdict/regdict/list', + method: 'get', + params: query + }) +} +// 获取字典最大编码 +export function getMaxDictCode(query: Object) { + return request({ + url: '/transitdict/regdict/getMaxDictCode', + method: 'get', + params: query + }) +} + +// 查询字典详细 +export function getregdict(regdictId: number) { + return request({ + url: '/transitdict/regdict/' + regdictId, + method: 'get' + }) +} + +// 新增字典 +export function addregdict(data: Object) { + return request({ + url: '/transitdict/regdict', + method: 'post', + data: data + }) +} + +// 修改字典 +export function updateregdict(data: Object) { + return request({ + url: '/transitdict/regdict', + method: 'put', + data: data + }) +} + +// 删除字典 +export function delregdict(regdictId: number) { + return request({ + url: '/transitdict/regdict/' + regdictId, + method: 'delete' + }) +} +// 清空缓存 +export function clearCache() { + return request({ + url: '/transitdict/regdict/clearCache', + method: 'get' + }) +} diff --git a/src/api/regional/index.ts b/src/api/regional/index.ts new file mode 100644 index 0000000..6ef11ab --- /dev/null +++ b/src/api/regional/index.ts @@ -0,0 +1,108 @@ +// @ts-ignore +import request from '@/utils/request' + +// 获取流转数据 +export function querySample(query?: Object) { + return request({ + url: '/transit/querySample', + method: 'get', + params: query + }) +} +// 获取未签收的标本 +export function querySampleSign(query?: Object) { + return request({ + url: '/transit/querySampleSign', + method: 'get', + params: query + }) +} +// 签收标本 +export function sampleSign(query?: Object) { + return request({ + url: '/transit/sampleSign', + method: 'post', + data: query + }) +} +// 退回的标本 +export function querySampleSignBack(query?: Object) { + return request({ + url: '/transit/querySampleSignBack', + method: 'get', + params: query + }) +} +// 标本数量统计 +export function querySampleTypeCount(query?: Object) { + return request({ + url: '/transitReport/sampleTypeCount', + method: 'get', + params: query + }) +} +// 标本报表 +export function sampleTypeCount(query?: Object) { + return request({ + url: '/transitReport/sampleTypeCount', + method: 'get', + params: query + }) +} +// 标本报表费用 +export function sampleitemCount(query?: Object) { + return request({ + url: '/transitReport/itemCount', + method: 'get', + params: query + }) +} +// 标本报表费用 +export function getallcount(query?: Object) { + return request({ + url: '/transitstat/getallcount', + method: 'get', + params: query + }) +} +// 获取流转项目列表 +export function getXmList(query?: Object) { + return request({ + url: '/item/getList', + method: 'get', + params: query + }) +} +// 新增项目 +export function addXmInfo(query?: Object) { + return request({ + url: '/item/add', + method: 'post', + data: query + }) +} +// 修改项目 +export function updateXmInfo(query?: Object) { + return request({ + url: '/item/update', + method: 'post', + data: query + }) +} +// 删除项目 +export function deleteXmInfo(query?: Object) { + return request({ + url: '/item/delete', + method: 'post', + data: query + }) +} +// 获取已打印的条码数据 +export function sampleCollect(query?: Object) { + return request({ + url: '/transit/sampleCollect', + method: 'get', + params: query + }) +} + diff --git a/src/api/system/config.ts b/src/api/system/config.ts new file mode 100644 index 0000000..ddbd63e --- /dev/null +++ b/src/api/system/config.ts @@ -0,0 +1,61 @@ +import request from '@/utils/request' +import type { ConfigQueryParams, SysConfig, AjaxResult, TableDataInfo } from '@/types' + +// 查询参数列表 +export function listConfig(query: ConfigQueryParams): Promise> { + return request({ + url: '/system/config/list', + method: 'get', + params: query + }) +} + +// 查询参数详细 +export function getConfig(configId: number): Promise> { + return request({ + url: '/system/config/' + configId, + method: 'get' + }) +} + +// 根据参数键名查询参数值 +export function getConfigKey(configKey: string): Promise { + return request({ + url: '/system/config/configKey/' + configKey, + method: 'get' + }) +} + +// 新增参数配置 +export function addConfig(data: SysConfig): Promise { + return request({ + url: '/system/config', + method: 'post', + data: data + }) +} + +// 修改参数配置 +export function updateConfig(data: SysConfig): Promise { + return request({ + url: '/system/config', + method: 'put', + data: data + }) +} + +// 删除参数配置 +export function delConfig(configId: number | number[]): Promise { + return request({ + url: '/system/config/' + configId, + method: 'delete' + }) +} + +// 刷新参数缓存 +export function refreshCache(): Promise { + return request({ + url: '/system/config/refreshCache', + method: 'delete' + }) +} diff --git a/src/api/system/dept.ts b/src/api/system/dept.ts new file mode 100644 index 0000000..17d4807 --- /dev/null +++ b/src/api/system/dept.ts @@ -0,0 +1,53 @@ +import request from '@/utils/request' +import type { DeptQueryParams, SysDept, AjaxResult } from '@/types' + +// 查询部门列表 +export function listDept(query?: DeptQueryParams): Promise> { + return request({ + url: '/system/dept/list', + method: 'get', + params: query + }) +} + +// 查询部门列表(排除节点) +export function listDeptExcludeChild(deptId: number): Promise> { + return request({ + url: '/system/dept/list/exclude/' + deptId, + method: 'get' + }) +} + +// 查询部门详细 +export function getDept(deptId: number): Promise> { + return request({ + url: '/system/dept/' + deptId, + method: 'get' + }) +} + +// 新增部门 +export function addDept(data: SysDept): Promise { + return request({ + url: '/system/dept', + method: 'post', + data: data + }) +} + +// 修改部门 +export function updateDept(data: SysDept): Promise { + return request({ + url: '/system/dept', + method: 'put', + data: data + }) +} + +// 删除部门 +export function delDept(deptId: number): Promise { + return request({ + url: '/system/dept/' + deptId, + method: 'delete' + }) +} diff --git a/src/api/system/dict/data.ts b/src/api/system/dict/data.ts new file mode 100644 index 0000000..9185ce6 --- /dev/null +++ b/src/api/system/dict/data.ts @@ -0,0 +1,53 @@ +import request from '@/utils/request' +import type { DictDataQueryParams, SysDictData, AjaxResult, TableDataInfo } from '@/types' + +// 查询字典数据列表 +export function listData(query: DictDataQueryParams): Promise> { + return request({ + url: '/system/dict/data/list', + method: 'get', + params: query + }) +} + +// 查询字典数据详细 +export function getData(dictCode: number): Promise> { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'get' + }) +} + +// 根据字典类型查询字典数据信息 +export function getDicts(dictType: string): Promise> { + return request({ + url: '/system/dict/data/type/' + dictType, + method: 'get' + }) +} + +// 新增字典数据 +export function addData(data: SysDictData): Promise { + return request({ + url: '/system/dict/data', + method: 'post', + data: data + }) +} + +// 修改字典数据 +export function updateData(data: SysDictData): Promise { + return request({ + url: '/system/dict/data', + method: 'put', + data: data + }) +} + +// 删除字典数据 +export function delData(dictCode: number | number[]): Promise { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'delete' + }) +} diff --git a/src/api/system/dict/type.ts b/src/api/system/dict/type.ts new file mode 100644 index 0000000..ee7dcf9 --- /dev/null +++ b/src/api/system/dict/type.ts @@ -0,0 +1,61 @@ +import request from '@/utils/request' +import type { DictTypeQueryParams, SysDictType, AjaxResult, TableDataInfo } from '@/types' + +// 查询字典类型列表 +export function listType(query: DictTypeQueryParams): Promise> { + return request({ + url: '/system/dict/type/list', + method: 'get', + params: query + }) +} + +// 查询字典类型详细 +export function getType(dictId: number): Promise> { + return request({ + url: '/system/dict/type/' + dictId, + method: 'get' + }) +} + +// 新增字典类型 +export function addType(data: SysDictType): Promise { + return request({ + url: '/system/dict/type', + method: 'post', + data: data + }) +} + +// 修改字典类型 +export function updateType(data: SysDictType): Promise { + return request({ + url: '/system/dict/type', + method: 'put', + data: data + }) +} + +// 删除字典类型 +export function delType(dictId: number | number[]): Promise { + return request({ + url: '/system/dict/type/' + dictId, + method: 'delete' + }) +} + +// 刷新字典缓存 +export function refreshCache(): Promise { + return request({ + url: '/system/dict/type/refreshCache', + method: 'delete' + }) +} + +// 获取字典选择框列表 +export function optionselect(): Promise> { + return request({ + url: '/system/dict/type/optionselect', + method: 'get' + }) +} diff --git a/src/api/system/menu.ts b/src/api/system/menu.ts new file mode 100644 index 0000000..a6d0dc5 --- /dev/null +++ b/src/api/system/menu.ts @@ -0,0 +1,61 @@ +import request from '@/utils/request' +import type { MenuQueryParams, SysMenu, TreeSelect, AjaxResult, RoleMenuTreeselectResult } from '@/types' + +// 查询菜单列表 +export function listMenu(query?: MenuQueryParams): Promise> { + return request({ + url: '/system/menu/list', + method: 'get', + params: query + }) +} + +// 查询菜单详细 +export function getMenu(menuId: number): Promise> { + return request({ + url: '/system/menu/' + menuId, + method: 'get' + }) +} + +// 查询菜单下拉树结构 +export function treeselect(): Promise> { + return request({ + url: '/system/menu/treeselect', + method: 'get' + }) +} + +// 根据角色ID查询菜单下拉树结构 +export function roleMenuTreeselect(roleId: number): Promise { + return request({ + url: '/system/menu/roleMenuTreeselect/' + roleId, + method: 'get' + }) +} + +// 新增菜单 +export function addMenu(data: SysMenu): Promise { + return request({ + url: '/system/menu', + method: 'post', + data: data + }) +} + +// 修改菜单 +export function updateMenu(data: SysMenu): Promise { + return request({ + url: '/system/menu', + method: 'put', + data: data + }) +} + +// 删除菜单 +export function delMenu(menuId: number): Promise { + return request({ + url: '/system/menu/' + menuId, + method: 'delete' + }) +} diff --git a/src/api/system/notice.ts b/src/api/system/notice.ts new file mode 100644 index 0000000..e6ba17f --- /dev/null +++ b/src/api/system/notice.ts @@ -0,0 +1,45 @@ +import request from '@/utils/request' +import type { NoticeQueryParams, SysNotice, AjaxResult, TableDataInfo } from '@/types' + +// 查询公告列表 +export function listNotice(query: NoticeQueryParams): Promise> { + return request({ + url: '/system/notice/list', + method: 'get', + params: query + }) +} + +// 查询公告详细 +export function getNotice(noticeId: number): Promise> { + return request({ + url: '/system/notice/' + noticeId, + method: 'get' + }) +} + +// 新增公告 +export function addNotice(data: SysNotice): Promise { + return request({ + url: '/system/notice', + method: 'post', + data: data + }) +} + +// 修改公告 +export function updateNotice(data: SysNotice): Promise { + return request({ + url: '/system/notice', + method: 'put', + data: data + }) +} + +// 删除公告 +export function delNotice(noticeId: number | number[]): Promise { + return request({ + url: '/system/notice/' + noticeId, + method: 'delete' + }) +} diff --git a/src/api/system/post.ts b/src/api/system/post.ts new file mode 100644 index 0000000..c56c3eb --- /dev/null +++ b/src/api/system/post.ts @@ -0,0 +1,45 @@ +import request from '@/utils/request' +import type { PostQueryParams, SysPost, AjaxResult, TableDataInfo } from '@/types' + +// 查询岗位列表 +export function listPost(query: PostQueryParams): Promise> { + return request({ + url: '/system/post/list', + method: 'get', + params: query + }) +} + +// 查询岗位详细 +export function getPost(postId: number): Promise> { + return request({ + url: '/system/post/' + postId, + method: 'get' + }) +} + +// 新增岗位 +export function addPost(data: SysPost): Promise { + return request({ + url: '/system/post', + method: 'post', + data: data + }) +} + +// 修改岗位 +export function updatePost(data: SysPost): Promise { + return request({ + url: '/system/post', + method: 'put', + data: data + }) +} + +// 删除岗位 +export function delPost(postId: number | number[]): Promise { + return request({ + url: '/system/post/' + postId, + method: 'delete' + }) +} diff --git a/src/api/system/role.ts b/src/api/system/role.ts new file mode 100644 index 0000000..b1bd92d --- /dev/null +++ b/src/api/system/role.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request' +import type { RoleQueryParams, AuthUserQueryParams, SysRole, SysUser, SysUserRole, AuthUserSelectParams, AjaxResult, RoleDeptTreeResult, TableDataInfo } from '@/types' + +// 查询角色列表 +export function listRole(query: RoleQueryParams): Promise> { + return request({ + url: '/system/role/list', + method: 'get', + params: query + }) +} + +// 查询角色详细 +export function getRole(roleId: number): Promise> { + return request({ + url: '/system/role/' + roleId, + method: 'get' + }) +} + +// 新增角色 +export function addRole(data: SysRole): Promise { + return request({ + url: '/system/role', + method: 'post', + data: data + }) +} + +// 修改角色 +export function updateRole(data: SysRole): Promise { + return request({ + url: '/system/role', + method: 'put', + data: data + }) +} + +// 角色数据权限 +export function dataScope(data: SysRole): Promise { + return request({ + url: '/system/role/dataScope', + method: 'put', + data: data + }) +} + +// 角色状态修改 +export function changeRoleStatus(roleId: number, status: string): Promise { + const data = { + roleId, + status + } + return request({ + url: '/system/role/changeStatus', + method: 'put', + data: data + }) +} + +// 删除角色 +export function delRole(roleId: number | number[]): Promise { + return request({ + url: '/system/role/' + roleId, + method: 'delete' + }) +} + +// 查询角色已授权用户列表 +export function allocatedUserList(query: AuthUserQueryParams): Promise> { + return request({ + url: '/system/role/authUser/allocatedList', + method: 'get', + params: query + }) +} + +// 查询角色未授权用户列表 +export function unallocatedUserList(query: AuthUserQueryParams): Promise> { + return request({ + url: '/system/role/authUser/unallocatedList', + method: 'get', + params: query + }) +} + +// 取消用户授权角色 +export function authUserCancel(data: SysUserRole): Promise { + return request({ + url: '/system/role/authUser/cancel', + method: 'put', + data: data + }) +} + +// 批量取消用户授权角色 +export function authUserCancelAll(data: AuthUserSelectParams): Promise { + return request({ + url: '/system/role/authUser/cancelAll', + method: 'put', + params: data + }) +} + +// 授权用户选择 +export function authUserSelectAll(data: AuthUserSelectParams): Promise { + return request({ + url: '/system/role/authUser/selectAll', + method: 'put', + params: data + }) +} + +// 根据角色ID查询部门树结构 +export function deptTreeSelect(roleId: number): Promise { + return request({ + url: '/system/role/deptTree/' + roleId, + method: 'get' + }) +} diff --git a/src/api/system/user.ts b/src/api/system/user.ts new file mode 100644 index 0000000..0ae8852 --- /dev/null +++ b/src/api/system/user.ts @@ -0,0 +1,137 @@ +import request from '@/utils/request' +import { parseStrEmpty } from "@/utils/ruoyi" +import type { UserQueryParams, UserFormDataResult, UserProfileResult, UserAuthRoleResult, UserProfileAvatarResult, SysUser, SysUserRole, SysUserRoles, AjaxResult, TableDataInfo, TreeSelect } from '@/types' + +// 查询用户列表 +export function listUser(query: UserQueryParams): Promise> { + return request({ + url: '/system/user/list', + method: 'get', + params: query + }) +} + +// 查询用户详细 +export function getUser(userId?: number): Promise { + return request({ + url: '/system/user/' + parseStrEmpty(userId), + method: 'get' + }) +} + +// 新增用户 +export function addUser(data: SysUser): Promise { + return request({ + url: '/system/user', + method: 'post', + data: data + }) +} + +// 修改用户 +export function updateUser(data: SysUser): Promise { + return request({ + url: '/system/user', + method: 'put', + data: data + }) +} + +// 删除用户 +export function delUser(userId: number | number[]): Promise { + return request({ + url: '/system/user/' + userId, + method: 'delete' + }) +} + +// 用户密码重置 +export function resetUserPwd(userId: number, password: string): Promise { + const data = { + userId, + password + } + return request({ + url: '/system/user/resetPwd', + method: 'put', + data: data + }) +} + +// 用户状态修改 +export function changeUserStatus(userId: number, status: string): Promise { + const data = { + userId, + status + } + return request({ + url: '/system/user/changeStatus', + method: 'put', + data: data + }) +} + +// 查询用户个人信息 +export function getUserProfile(): Promise { + return request({ + url: '/system/user/profile', + method: 'get' + }) +} + +// 修改用户个人信息 +export function updateUserProfile(data: SysUser): Promise { + return request({ + url: '/system/user/profile', + method: 'put', + data: data + }) +} + +// 用户密码重置 +export function updateUserPwd(oldPassword: string, newPassword: string): Promise { + const data = { + oldPassword, + newPassword + } + return request({ + url: '/system/user/profile/updatePwd', + method: 'put', + data: data + }) +} + +// 用户头像上传 +export function uploadAvatar(file: FormData | File): Promise { + return request({ + url: '/system/user/profile/avatar', + method: 'post', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + data: file + }) +} + +// 查询授权角色 +export function getAuthRole(userId: number): Promise { + return request({ + url: '/system/user/authRole/' + userId, + method: 'get' + }) +} + +// 保存授权角色 +export function updateAuthRole(data: SysUserRoles): Promise { + return request({ + url: '/system/user/authRole', + method: 'put', + params: data + }) +} + +// 查询部门下拉树结构 +export function deptTreeSelect(): Promise> { + return request({ + url: '/system/user/deptTree', + method: 'get' + }) +} diff --git a/src/api/tool/gen.ts b/src/api/tool/gen.ts new file mode 100644 index 0000000..44d74a9 --- /dev/null +++ b/src/api/tool/gen.ts @@ -0,0 +1,88 @@ +import request from '@/utils/request' +import type { GenQueryParams, GenTable, GenTableInfoResult, AjaxResult, TableDataInfo } from '@/types' + +// 查询生成表数据 +export function listTable(query: GenQueryParams): Promise> { + return request({ + url: '/tool/gen/list', + method: 'get', + params: query + }) +} + +// 查询db数据库列表 +export function listDbTable(query: GenQueryParams): Promise> { + return request({ + url: '/tool/gen/db/list', + method: 'get', + params: query + }) +} + +// 查询表详细信息 +export function getGenTable(tableId: number): Promise> { + return request({ + url: '/tool/gen/' + tableId, + method: 'get' + }) +} + +// 修改代码生成信息 +export function updateGenTable(data: GenTable): Promise { + return request({ + url: '/tool/gen', + method: 'put', + data: data + }) +} + +// 导入表 +export function importTable(data: any): Promise { + return request({ + url: '/tool/gen/importTable', + method: 'post', + params: data + }) +} + +// 创建表 +export function createTable(data: any): Promise { + return request({ + url: '/tool/gen/createTable', + method: 'post', + params: data + }) +} + +// 预览生成代码 +export function previewTable(tableId: number): Promise> { + return request({ + url: '/tool/gen/preview/' + tableId, + method: 'get' + }) +} + +// 删除表数据 +export function delTable(tableId: number | number[]): Promise { + return request({ + url: '/tool/gen/' + tableId, + method: 'delete' + }) +} + +// 生成代码(自定义路径) +export function genCode(tableName: string): Promise { + return request({ + url: '/tool/gen/genCode/' + tableName, + method: 'get' + }) +} + +// 同步数据库 +export function synchDb(tableName: string): Promise { + return request({ + url: '/tool/gen/synchDb/' + tableName, + method: 'get' + }) +} + diff --git a/src/assets/401_images/401.gif b/src/assets/401_images/401.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd6e0d9433421b3f29d0ec0c40f755e354728000 GIT binary patch literal 164227 zcmeFZWmH>j*Dkt}AW4u?O0nV^CJJ??B{WLN%@&ckY+J4b9iZvx<3D_n2&|&Z&h4vq*>(t`hn@MF%=w~&6z}y zqP(U8LV`?U5=a3N2|;mT9wtG40Z~4FVLkx~UI8K0^+%YW=^qEn^=Qs!7AS2+rGJcd zeI?Ce>FVl;;^T97cSpJlAsw7wUAL8x;NutM6BOjVuEFc#Y42*{!E5ir`p+H|&0S2L ztsGsg9PF9?>e1w-!)sS*mg|}ReF=7s|LWG>1^Kt-AWa?Y_&iJ;`2>*se=X^s6*V;e z->cf${j0W%tG4-n&G&!o*yV|*qdA|pxr@VVXH)a*>a2ea<%m*nHaBr~aDL+8VEfOz zsAcKk>fmDO;K-z)@Yh`vL5eUTG)zpb?Efm}`dd2<4U~$#i>ryfskw@xG|P2QNGmHd zl!SnSh`fT5khrj-kbuB_QF#SHMF}|}5d{S$1u-QFrGK_nbTEBwXKwHM&$ed&)mHdF zw*3ndc8=F0E1El7xtW_OIXl=f{cY(etN%O~f&bXwKiZo8=ebjScm6 zwKdgMmG3Ib%Sua%iwX^&K2DM^%sxR|Jju#lhtKOd5p=PoxFf|G-tjg^I&iIIVx?hY*t zH5KJ;id*D2$!?I65EH>+P(lKHJO~&B0L+(o_z-{*-~q0Wzw8o#kIUhVHnYmIEUUEL z>2%~7cePvas66mKz+rP7m3cl>P=r9bpJ-F`m$<6F(|e{Ih=<+t0+IKfs3OzHH{*M1 zNSYT8#i>kGz8+lsvLgxoiE{v;T3$iHA@1Jj2sA+YIy5#eUJg!49+`?JH%-XO&OzFw zq!l`o2IiKPXNMP6`MFlq)dy8pH~V86+Bh3h@(M9LZkB{V|mw?>p%0QGnHXw(N zY&W=islbdV0OY7VIe`tGo`3qyBN!|l*}U&WXQjlfYz|e%m9^I%upwc0O*Q>Crzq4@ z#lt2lO08awWy`u9o2}j|nWUEw5k(CPKhQ4p2^Y=eUg3HoE>>#&cJg>Tui`~-8UNPn zN2)cJk34wVl+EUv*ko!+PH))jl|SpAd#mQQpHBSd-0<`cfbPdywvGJ=nb{Zb0TGKf zmd}*84MiVi;W5z&=@U99k{;VWlQYjsR(Un{^|^??nQCea=}2(#?rgota{6I%ywPw8+ZNrUMfmMG0Dd(DLv)qSymlC zNkBb{VvN(m=<|z{9U~(T;om9Mdz_2t%lBXAd@1~t7IFT>t(dN z$fY8eJ=W>1%33TESv4o*QXGQ`(HSmTkBT$hk5xNg6uiMO9Rr2vi6YE&o)&p`!!{ISv$d06>ay_BeL5+FPHCjZk_G$V&!#>`CD3bO89yR zguEzwWysR4D{mi!AbYmm?qI#CzsPpGN090BhRm{jvl(z~d?85ES4J#Q$t)yZ^MPLY z>%pMVhGT7v*v9bEfYi@2{x-Rl94B{Cg^UybL=KIkDUjuyE1Y!Th21;jUj4-}opT6%CyY^G5hl}1ZwL%9# zMy|{F@BO!;`yP9$_6~n`+T91eVcjvhe|}!PpuOkUIc|sxem0y9G^}+n@H+Tlcj%`G z24%M!2A$x>03I;_BIq+$2zt&05lgB3-LgS{+ZYWZ#-fSP5g?f3b1=_E$8C_YI$dP$ zH&QG;oJJ8uwwMa44`zlW@Pc>)9}<`#dRg@B!NQS@_|Cebw+MzqeACes#p3r_^#pvi zD{f2AuXK`%$Ep!Gvy4LlQJjDtsVyEq>$pb>y~zF!aAqw_`+ZXo-1jKpr7%Ffm4cA$ zuK{^0&M>Y~4=Osr!d(Mb7&mm4@6Fd>3X zB=^V+(L=ZWP{0{i`{dRr$M|XKBU_&*x&)&|_XoJNlWT-@rfjY9$hoH#+0i*#s$0S; zdegT>H9)BQMKU&CQ|~}e3utazfx}Va-kL6jv+7tiLU)bWp1Ok8KCWK>?bbp~ts;um zvYkdxl>73HWah$kjR%;|=T8AY7P9hhh6;59nHh% z$fb0gY|KHVydSWI*6+aePxTdFsDY>V%d3$HJNv?908-tEPc?Jb;SvA0u17i~w`?mv zg%g1?uH1}pDQk8wVv^A-J+dIGlpGMb?EG<>dmve}>`QzbnO3A2{#R)R>pjPhXB=nl zN7C~y#fN&6@6S582Oaip)d=X;54wQ;3Lr`?XbLIb&A)koE>{bjC3Wl~L&~Y+H$OSp z&HFRAbXpu z&V2$J!aE$bo66p1cl4hX$=cV7W~q-}s-_YW=m_>8yv>;dbw9}L)!wB0rcDr$3TMeE z0u_0!bLr>2$M7K2zj_BjdoIJ@n`7T@@!(Vbq;90h5XxqC0>S>YK-A39;e^se(-z5- z<&HSvf(Ygo1dYm#|)bu^7x~5>u4l9 z#?JE2PckM3W-qF@d2nN6@V9-p#&iSa*X3Wq_50nAp20Q2DKrWoj3)-fTE0aU{sB@5$EFHtjC(<5xetF&*)v&r1y;=_LN zC3CBZF%TgVmz%@NK1d~fFm4FUMlAm5X5?J%)&4a{#dJCIP!g!P_m&#CcNO8F{zK09 z_ij4l`q!$CQ4`?pVZ`HK{d~B~4cx(LfY0yl*S;G!h5me)#^JUte1k%KalD6buQs$I zUs3)3@&=eePjH~U9-w)coC!Cz%&4e|Jlt+?py@2V$(zA@&-@@*-~J}Q6GDJQ3&1z_ zKYiux-|xe+sl}%Ih9~9ihX+o8r8lV+@Oqul{oWUAiJZWz(}2e}1MhJL%{&Vv7YiJG5XAK=NE{t>y6R2W9rVWC$E?}u z^gNjSRj?SD|84ProQ`iUyeM;zO=iw8MaEeKRq;rNX)w{@AhB=k^;hMst5pUc!eXN^RF+ zNqR)!`>AyH(&CE4Lqu+}^Nr{bCsf*h2 z2)i+%Cbi;u7XY2=3J1=Fv-!n*uZsaL+)-?AsQ59bh;S1>3{t@pp8D3AHAWPOU72~i zi4ddoj2%jj9UF+fACHcbi-q2b6V>IT6Mr`L1;hapASfm0ZsFqz^A6?5*Zw&jf@UQ8GOV_w`$><~;$eCDCz z`R412H#{e?MevScD#Dn{!`m{^c_o$)o#gHu?N*aSKau2po^;wI?YsqcRbfwnCOV(^ zI*TWj4q%Y)A+ljfdQd8lOJ5LK5Uw}{YMMO%AQ_=T8*7y^(u8sDP2^_6SY9SOOr~bh zMC3ddrF{;$QJSa#OAVSugV4_Shk+!Psa=J^me1oQYLc!HaqGqDKYP+OY0_&;qkANL z`$~C>B>XhF=&>ysBU}2BGzodBl+!Ai8|Py0R3HRo39~hs-@;;LN+Hj!;$p(6ZAz2Z ztX#wEvTDua(!=iTU1qJ*q)8dajfX|u56hOm6vL@MhtNIGKD*2Y!o8EGv$-ZxRyNZg zIAz1i-q7TT>svq;+2c2e! zE}vH#cWa*i29Oq{$Kh`(lV(be2Qo@ToX*^ZsHW%yQ!ZCi$$4_x$r6o1sFCJEcL;z54IKUF_NJ&qe#iN&@vtf~~y?`N1LmMP&K%&uOU*B|ssl(geNIWHGP?N;axY z9-WpUr0`Ji|DUPartv)m0qPC=1Qw^!n38BI*_uewDMNHvKp`Z zb;G4xX~NBA<$b8K_PKJMC%pC642BXB@2@HvUg>s*^NewB#v> zSm&z*yqnXj{8eNusQ9i6AGE|>DWy=kUiPl`zPY&zPuG2UvSA9t+0Y}}s?;xFmim%8 zZNtqU??mq#?9rB}^j7`WtHfP_mqg`-IP8}>3Pk$#oBa*h6RMunRFV9wnY6?&P+=cb zp<^JbMU;bX>{z%9a&o5EGM3B8S93I!CFwxw5a}g4)f|4cRUany}?u;WLbU%yQzx^dj7|YKzC|1y4V?FHM_0qRDt+<7#)-VDiD;G(E;V z-R)I6#_Gjun-{TmJB_a>6B%in=nfn2S~basG>Mls@eedFTJr1KNWQkQpP{f{t9pn`G|JlEr@tFWH~wCR z_;9C6!%g>)wj&AE;rqDbvs&rQU9q{gj*z(y^OKIn7bSsT^~OI`ue~U}n{J}gFSOm( z89&!aw*HLhZr6L&E;5dnM-g2?WnDPfStoR*t8crNpTi){#;KIZ7+k>%Yj1hh|MbQ$ z2cit)UXkv7oo-l?wsA!F2R92uJs3l~834~*{Mj+Ze zkf+}76)^9gNR{Y}yq8#f&tLuiB{81aFR+DozYL}yS>10N`91*k-kiAK>07@`#d|mJ z0cTrp*NXl(BLk?#eqLa}-y0G*0uJ^b6u}JMtsab&f<#wuD`$LnWE`}$uzO7 zKEYu;@jY^aJ!fKOWP)vRVw!l8m1%NJeUim^awu|=A!qXauhEhAv9riACi+np>8WtN zsn6b1h&>S9-sEw`)Yp+I#P2C#=_yf?ab69u1h3f9uVHBe(R=TPlo756MSelgnRThRWfsGpKc2E_7jqKdd++K=kBNN_D|0YKIsmBGRXYIq48PL z?(>}Br`X-kLxG>2GZBuXgRj4X+}{p*c6{;w_Jx(VU;uxH0sX=uZG`1qgAsq`HlY6H zVi%QasWHAJHOoLYJ0|5HBn?pF%|MJ*@wDo+DrOn@=d3bg4|bF@I-qUf8D1?l;QIC2PPW&j^l#XGod=TKp;iOXjftY%UJYdWyY z&vpzon`^dz1aQZ7R8EpLK>lChM$?$mMlU!*!{w zmBW5IO2-YqtPRU789y0rbk?R#<*NE0%8;=YOx9+^7~*a8#u%6&nPF4aa8tu+Gn;fP zHJS^T{%3t>d8;sMBlpiOI2q_2=@$1qTWRMy+-0ZEex1m%6Uw~P#<007#C>#gvw@T? zhGDl|W@8E19nRVqU|=&^bpL3$=X1WxYrpsTPs^Jz{Xrf=vk&3pYtZCd zH9m(#j7Q`#2OaYi%GE2kvacCqw+cy_gxNt{+U%pAB(8j2X{f-a9ihI^oJKLm25%_Gf&$Kki_m3e4m z1QOr-VU&Rh1eQwu%@q%~O>%57OLFXElwgJBd($d=WafhxX&M z^?E_>>>n1+Md@h?P*{Y=TSt<+ddnrG8!%8LzXqUb8HMhYIc@+=K~bd$0~{KbTGc4X zMH){Y+tg`85fmQM^_~@88s5;~$w1oEMlsSkSX4J%H8znjG?T&bJ-v0lu)C^nHGv_z z60^0vba1R(^6|uf{OlZk*+lshJu`bnSRIXhhDTJ^vi^{nJ{Ure{H6n!l@EJ`aIOs% zi0ap%lXRweMU<(``@;~2PyM=fEfiogV3BBkls3X6Ac4>CIjt=6nE&?aNL+5_Xzl}T zdp#}+t~g>)Qmc#VL-~&?>ZKOBjv|v|`Fb%-n{Wh>U9E?SEi|QMnJduQtGByyv(Xo^ zV4rwrBZi&hakaMS*dHpbd^w63OXuW|y7$(YB_81#AEjqh@>a(aK=_U8Aw~mXnQ%e6?)N zj@BPLGj%o#V;ybh2aCNCj1N28FHbh7%ZE@CwargPg|3SkOHEQhisSuTemib|Hl zc^aXH0my#DN~G}T&t8s_ z$}g_u+5QL4*vfSiR(?`MybQWa8#8F8UbxB3Mviucqgm)E6P-WodEMuZV1;8;*h%-? zNA1&7QW2Hg)U5{|h2bpsbhsEi{R0Hmq2@0DC_FGK+L*!HhWvR^39 zloFf)NAGgnc`bS8>f7>^Hjt*!u_|QEYo#5p*<@L}8N4x7!kPQ>so>L>)9;KbZ^9iZ zc+$(=2UW>leU7N9mwMm$`#6c@xwp$#1YnW;Dzn||#@4CxIp1O`K;ZDm=HgHt79M-Z zv*uA@R+|{5lqKipViA^N;(GQgb#ZgLK&{+xw6)>?Pn;=JFGizN*|C(U+v17l&E*LGzvIkuB}#nV(m&|F7BxKtMZi^Xlb+aWHCDNQ z&^YWq$JT1R76aa@1D3W)Nw)uqcQ$jZ`zol9Uzkql{L(}j_7;?n@)KUB^-}FN)arkbfexg`?@ZqCaiMmNGVMY zx2h`?x&IkGf^iwy!ixzKW^P&lL1dUh`bxZB)P>PVv{76gP#(0iG1cOFv{nm8J z1ELe~<6X%W!4$Mf>CN&0hwSdxcs6032yRk_xU&9b&sQ=ZRI8zfryytlZ9 zYs-@~abv5$;M#IO-iLsDGbfPJdNVhaqii!TQgnMWAKMMvDoA*l_sYeC<>tTnX>lMb*z@XI%-RU4 zo)-+S_8L7?mHBo6gxM&|X=Mtm$^7FUTCMADp;T8}Psp?JYtc8wBNEG(=F#<@# zld`f?Vhz(Xvx_24Q>_b%-vuBs?f^w)gGY6UJBYlnvD1Kovc&@w-!<^CI?oQE92{3? zaP)7R_>3~`_X5>@nHTBq_4~B2##J5pZESs)tu!iq@0hXs!`J1Ld1QUm_T}2<)%%~t z4?$qnZ}m65MF|#i075D~8{M!B#bEeul#9pYXX>bP)Jwe7fjng+#=AIYDbMhi_d(Bu+XqGr0Pn z;vBe9+~s`g3%#cGxTjN=79@Q~TC2pSta7I{Ujx`-R4N-)dvlAxhJyqK&qx(a?#RC%;s zTG(9}?e=zGRgTZ$R-(zo)fT$FvZ;)=?x6ELnV zC|AFQzeD7-Z1@BOI}ik6n;NQ#?&DL*9{P1!Jk`JTlcx?2VEBFkX|B_TW=?~tjt zhjx0BF>St~T3B)kmn)CO;zvCJTo~>}XbIoZ@Rh|*8}m;n56M5!IG|O)sr;ZKh#Von zdeY_m_+sR$QO^Vs>JehFRtrC)dPU?c%&I12*YnK?p#ome`qrU5Z;sOln`Kp(4qXgr zr>~pNY9{ociX@VEYvQW!fPPL<;5nmJb&vMPeTpJOwn7tc^mxues%2dm-c{vX(3?EY zLvI<7kx3H8pH#Q)x)*c~;xoO;l_WtkR`nimk8~=HQBW=5pKu-i_JWO7$x6e&l;^f^ zMsIXV!)DvEo$ z@CzRgdKL-M$$K+%g8#cht`(QdgjPy74oG;_tn)EieOO^(%N7F=S27#Z^E2BLV}rhy zVw}luf$$8QX(+GBJo{o1>Zr_05S;^NufPL6#K_a$#^6cO1(Irz_1&hA#e*xeFc6&e z-4qs3oOmopVKoTmuFL`JSE%Ec>4I?~L9uu+G8&o(Iq17nmZ3ry$#)Vl=+JjJ4X1ui zl0To|hm6D$yw+c&ckt++B6h@ZmH=DF;@}jyMer{n5E&6H9WV0e7EdzaiqUlkD4LKXxAm1(>_qnPgYUSycx*wvy-eoTukEtVxI(+W}js7l$8O(|Wbojm-p2=$}%l8Ng{vFfKXy&q+|qh&fx z!=Ea>ev})Nl zC?R{vp+xq?_0}tA&p=X`F+PTk_hYq(`ucO;S>DQWp0_XbH? zWge+f-|pbz?g<2T^qE#b-xOuPA9;lQFhtWf`cYB`I|NL8`j*Dj^I-1yP>ZPI|3onQr>+xSj4CXkx%PO zCLpMAVu`Y=Vu1qXM{FQmmTeMwTx;Tpo`2wT;{5(7VNcJ&P4ZV`&&f49QwL5swTR@^ z=!MIsS!LbS6=n-Ig}7Cp1k>pivOkVNmAsHsky50v)m1lGDN*py*;Q<)8ENe3+g{N! zcWKd9roEpDY4POaYQ}%2v-q46!S%ycw-~?e$-033ZgZqrW5QEAG8c)HSx?3bFHP}> z6PD$L55Ee%WfdX%T=u40=8>11?No!o!u)9ZbM$D3uRkfnb`v$w7^Yx-2)amsU>^S_}tJT5v-> zZ*dj=APr*{BV$k;Ij)YggmwrtO&)4fk?a^@SM({G2%m&l_Ieu-RlB=veY-lg3{Fga2!c>e@JBqq zY$#urhS6>);FI;GVF}Un+Hy?nXq$)rDlZogp_l%({6vSE>bGL*lC)}!gNRF<81N$b zooQffks)24haSgwq>^kyL02+)&eQ>h5g{Wacj9D6;RmrxAIw&VPZ$^(dz^ha$ujd` z4|YJHi69>O2bG!;em|In6?(7?kKC!kd{MoVKUj?poB&VrgAupSCK>NeS#M$Y2tar< z^kScs(_cU!-aAe;3*2mWgQM#Nl_7*yw|xA+#Sk0z13atm9?WR$n268WYZ*e;&Cpq% zI691iwqJ*thhfXDq_0e^Fs~D|I73{>5en9no`ZrZZrD51q1E1FyGM5CPd54$=-Wsi z7ccvLs&C(agBTrmMhQ%b#beh?5r7=utdP)8_Ale)GJG(+stNp(;<#T2^=w*i#m39Q zSEnH(2Rwg*5u~i31DA{&sA?%GGO`y`cT>2DtE;DPYe~YH7!V&h!T6dm9?Hl-5SFEz z?sYZZnxx_t#Va&n*?Is+GXP&=x`%t46G&y|2S1vSr>r&9ntRA7#-0&6^(B5=<^yEgFQlNrn6>xbUI75>0CB_$WQhf%~GcRNP1 zBJ!EtLX~a}I(R>#&Y~JOLo-A(2impE(J$#j&ekSjgwrfkkG1X#jvd9Y$#J!AqH`8@9%Tr&^<(Hi@WFt8zu5Pp-Q#frGZ=&Nhy@hIUC zZBmIe+15_~#s=c=RT*d{TadFkXUlvsQQ34NyYy}3tv z@cM#&#aG<0@TsI$*T^5&C)Z{hggx#ahM zlis_`FAe5I+1c0Zo9ytNguElDP^IGu|fYOcP z&NY`DLRKCTc#rNg{eR^g%%;moyCgZeZe@NZ~tsf>T(-6Rlu{@+obmN3*rXdhd=S+CL{8M0fZH2vo`R-zKVgsA3o*9eyJaV%CqLY9ddJ9`xQUPX z==5nQkyqh$@$4)ChnHl?r#rHzYZFCFiA8cK5&4fC%2jTEQz;z*?|y?5to?ijY3L=1 zRNNtf5sHlOkMafKYBFlXV%{6?lnp>B7IhA^gziWMzS;1x{B^>1OGaH+Gb`ruL<$vZ zydX37=0c)2BE_&v5`HM^;cnz>gombchU_zCAnS;dspxptN<(oM4z66cjK$eR-$q;3fvLCd)olF=>JAl_Z+A0q;$oQ96$RE!QRkcP} zTi2wY4inXcO1}r(mgvwNx8V9fH;(X&j@HLIPB!db(e^BDbg`hmF#!Lf^m?DEhyEvR zwIEv#ugMN26&uIVSX&t37OlK2=UB^~2OY7{bpp_0EKI3qxqoS|^LPKvrLIq~aA((k=mymXo6WoDg&0))xU>-Rp0%Nw;0*B z?8=Fm*7ksfq&rKP^xJC6<2DMYF`oJh*7nUp9{2hqHd!$YVOvXx-_W)91%_>Rt3UXJ zf?9o{KR*|cElM5@PLqp5h@lKH2pOBBlnYE;^7oxj@j&;FcDYLQiMK4!0G%2imIY%b ze0t8_*B&&$i5-2vUhJHh0H5wQ-!t9e$hfBj-hSZ+o=9dp8kGf2#v3*5Ke$Kn1dX<> zrH4^WwBK;N@s_Ma7V?;^OHIHy;O+z!o`x15EN$^k>&rV_r^V%fj6>ifmt5vw$x`I{ zK%j}NG07vc#%YnI=kSc%SN1b_a6QKmaWocR-2-grcOy)Qi3!jDf&5Lpo8h`6d6Z3q z?~z_d5yr&%)C0=>IKi}|NK5s6+Ao9sqOC_!j*4U8yq~Q@kN(CD?p@f>;XTg}Jj8Av%WQSCJ&|!n&>}-28fd<<{DS~9{Oi#By z+^8mx7`Ns4qDZM^PO2TRhM*JeP*%6vo=oSI<+#%XyXKOK$U()A-gUDj& z;BzIn;m7z}?Hf#cDg*l4kE1{TDwZWwo$wE?NjBXrlA{`)2u7Xel0}s$a;i>->-~*O zXdq>e_*h8l^G!xxF}xpA@)>6OZ_x(fb+qyGe`g5(e=oIe%oIRfzqgA zln0mSRj~vf4PEP8QpxNJ9bDMW`qn%50cQ}f++O+h;BIoyk!C-=tA~Gpr56RcCW!pS zb$&tBi!}6MI65XdMOen$2uQk)HdtccW@hJ=M5h-T`TCVsyCLIjoG5CVZIB^u;gl^{ zBN?bW2;|Z|q|sK<05lCxqF%;(gip}%`WiBeDeRYxX$@<^gS@YvCmi+-QRbx zk6ih7@ngno`}6Kk>|U$ch#c18h+$MRWfWi9bB$W5?E!yYpBV*gyDju?{?{k587WY{@qm$Egj~ zdnF&MJ|?#`F3%YIBSCB%@baN2O}_KD!d0#z)hK){Pt-BFX-1p1%#uWX-(=An>-mhU z#qBRSFaDm#ss!tDw(_cC3BRiYbc-az=MJ2N90?rrgBMO5y~#q1tG`;}V4sU`m1WUu zhTQ0F5EBE@J-9erF3mADn;_HRjE^7A35b11wKgajwz9^PQAHZhr z;~?VH%?xi@#Y>pz@P?U~VW4o#QlP4>E;v9{c7`!Tcp$9Hp{}07nbqk+FJ8RT`VZWroq;;V{aU`B)A*pnzBbG)v84SP+K2lk9pZRW%0)0WoZ$K?Y?7Srq5_<83~EgFkhP~^M^;6JcVjKLyCw@jQ0<_+!F_HX;zzd#n97Gc%d@Jhsj9&l!C1zH*u!XOI=?d& zLM*SU4YqMLILz1kYjDJ)Jza>F`Ud&QyHZzmSDxFFQ-_mmJl{jXOhUXp6Ry8A6eptD z-l}|jXl&sBB}(@lDR{Dm`%bqYd~MQ+aLZtVjus|{x=?}d z+G0!YJJmuT<-i1NSQIsE#^=-! z(lYq*qUVpgN6+nveaP(;LlV*%`RJ%c@Sv({udZ${!_{GkEO8!Lh;knb?NO+*dLDW5 zU>^tSC`>CdkD^%lJ-6ObxNiHy5hlk@o}`=zLv=qwHfp8$+ZmOSmS!Nxn1??FcdW0K zI*2-cv7e=%FIo$mPwY|hfcor+-0akZ9v2!SL0%im+Q&*ai5V29J&y5XV`Ka&t|F~d z`-d)JgzAPg*8#1yYiyvFtF((h@HW|Eo*8?U=( zpE|rOvbB$uCzE1?KyWfiXoih1Sw+!2Pax52myOitviH$^PRhuL1#M>O-*m2r1svjj z;v-IJCmBuh9H=itf77`RBa5XrRK~sLPO>gWie=89$D}-ukNXvv2jqkW{CiM94?uyz z|A)!H7MQC4p4yN)@cO&J6ayt(Gfn-G^_ReOyCb+iZA$yveISaN>g{C_EITolLa4&K4PtjN>#!o36~NTD#!7pw)AZXSg672@;}vc z?U)Q_Na7GzT&q|b>Kbh3tIX{>uF@lV<{n={H|Ee6cYn=pHCARUqN;!YdOIsnQv~{@e#f}XL!8` z9B_7r6r&EiJrW@ji8o%(|GJ2VeJpes-q%+R*_{*eJ3zMf;_WOQp{q!PS`SYHKi3@y z$SJyB*shK*Ov(lN{Br;GfPpkCgV5NUi`Wu^^EjY~_WL3bgYv-dC?GfBu|74k7e~b_ zreGt>6s8cikI#DEGVL>=;Ve@V;~`v{lg2RKTH`#JQ2(GpG#jQF{D6GB84~kH&S?dv z2!Ae*$6b-a*=H6|TL5X$Chw9zf-Vm0#%a(^#yLqdCTecIi z$U6j59MI;=*U+$Llfj6P`mL-(Br~pT(vEGjF}JcUhE5#}3Y1;sWyY_|t>(DGr&DTw zG&FF?dM6%TMM3>aU3Fkoj{KPQ=7#wZEvJGyFP!v2&%p$#O4nCv&my^%YGDmn0;^rjc=YJ5_N|E@3sco~r5 zX)NeR&($!Ex^O%bg8blc^ff+Xf(>enekaY7KL28%DlI>s3P@ipM?U`EJ-;F!ZA3`+ zM5}u`U)@FmFQ#`^?mMHSPbH4^wyR9h4C52vf*!VM?Z0W@ws-|g*@#6ivL{5Z?;<{q zDJ>W$=b%@oxc*%KNx`%+aKOcnX?M1BDHppyVt^XzUg5jb}3$(h&hYu^s!r3~4KGHkl ze_rteQ)9a}r1`xWClZg4gWaTFhXG8)xzGp7J>+SJfe7_n__M(t%GSdm{>WV7SIWJ# zbBDna&EE)|#KG%Fhaplk%w!Mv+c|YHPBL^aN6RpZH$`g*gIP`R$vEZMD;GnHoEIqq zFR=JJ0)YTt9+gAM`)QUgepHukS6;HTTzgs6Zul8h%k56_t5+00n)b}*^3>(mAp6y)A@A5wj8sFf@x%MQ0w z8L>F4O`Y&w63SQ6Fn;>C)P_LaKT{jU;se(L)1RQEb#+dX#Ou^X|9)CmAG75BP&G?} zli+jLVrcBp|6u1Y{+nyRyU}s@^&cs0y9!;35H00PgjxGvu07I}l2D!nq+11SD=+O{ z+j)Z#IsE#OxNAHAC%POJSg29;^%+0hn+g!$NBi0FlUk^PKvw<{kq;Rtp~32J??)vi z3-Ngwy(QI8xpwW-!ZUob^GYKMY%)vAs$Kag3#}`!U3)$_^mSNbOSeHFX1Te~+~?15y0_zU)3i;NPLli0(Inmd*fM3DAv{bl zWf;x#VtM!#Y*HmP=lHv;#m!e0R+3RaPE)5KK{@ZhW=yDQ1r>+Gl<+*2nCvIIvgNAP z?jptDf()|69h69Zj*D519`N-(&zJh-5}gFH+xBA(w;#^(qI5PJI&?iJYi6mcOQai7 zG-D0STmYT}RfsilKZn^+H==3Jg~r8#4EXa(F@tJ~&lvE#@uj%9tkSe61lHdmwj7-w z5PG;w6I;cs;^l?fd1W^6XFmDhg7vV9pAYQ)TSs&=L|$z4_l6<>{>GGpgU!eCXZ!U` zR%gIAK_a6sM((s#dQ0gmfY8BiqAJP_16LOTekvL3ZYI(06KDF&#LEj&>XBE zq}%Etn-6Sm-OmX(v@E5KwYZW4qPPX*A}sxf2TQW@m=N^&ZrjU6rH1|`+(5I}Q+zXe z$HHrQhaU`SUiP;EtELEaSIlCp5v5B) zx`kor9+2+t?sfoaL_lvrL>amp0RiPV?!C`B_ukKWp6mBF%yq5Ln%8@+^)(acVj!7z zVW%h<8yu=HK{v2NOO2I56gR0F$2ghCBf2F6C--?c)*Vo9Q=GR4hEwrkKV>#M9|5{e zQczESuN8Gde`i_JgNjf!Hu$rUaqMmf8bUVw@uqid@E0xYxc+Ay?bsInm;Ioi*$QVz z&==>MfF{A4Gu5E)dHgI|ME9f3y`ZRL(iZ;L!LHu7WUkjeMO{+Q&%u%4M?Mo-3rfhf z>~PVJYkL-MQzR&_)x{TF{x%iW9b$1L{;}GAMrnmjG9VmioFB*gjT@=kN!1pO#U2dN zIw_C2)7()e8U}-}pdHdmRV@O>@Yl|>m3i3t&+!r}jUJ*pXb>s?gWyfL`-i^6s4cR4 zAJ#Il?p1rwIJ?G(SJ)r~AGID|Ti)t0*^MPz5W(- zQ`pVM)DDuKRaBhglpj}I8UH5P%#OUGs>%CKl8aq%bC=8O+A^xf?stz^>8N~xK*+#^ zD~vH@tn)euC*X>aklXsqXB5lL^uMk=PR>b-O01YPu8$95} z)n)kGYxLnX9~!F6?R>HaZJ!wF42>4ZU3wPZvbwpQ(RcAodb*{~E z`+K(v(ow6+4tjpjseyv_8j|smuVM-R8etQ$*;@hp*vKd`*$?UxJ5`u#-G)pq2LISk z=!+gY1k3uWZ_Rv_xdvYNDIBhTbiVGr{3Z68s7@*1;{83)>+5zU+%(cgPbmMzoh;%UE&#g0H()RQRj^?WV{xq?FU z928b4s9s^4=WcW{2u#y~3b0ZGCi%j0>H5lTXrCnBE$~%32&$aGzC;6UnVZVUNk1jp zlV?xd>;)FLAh!iOkJij;g-FLVh(>$x=%(uBQ5DDgdz{Uv#8dKH8Ur%sU=`tvkx3`03=dr zaAF0kG>9=1+G^Ghn5mLRb|ocZUJVsvpQ*R82eP|zP?KaJM??LesrQ>JFprE-ja-qA zn^YN(4#nffK|n=nm18bZc{4W(0`~hVljqZY4UO9I7)ffqSA92Q)n;6Ocs(__=|1AS z!E8N~$$)t&dzY_GYBsFu*JA&}Mv=35_nBWxVDDPA*F3`#nGz8#66?~+rtcgC^r`*Q z`-KaMm1cmCBl?IUUwu&;h53tw0i8IU)|LbimonEB)}_dw>oJ9SD4Y|rZg!=x@XQ^` zt(MRMi~IWPC3S6X9u{ZKi}NJu&jjGl>goagMA-h3pMvRLI~Tl_Lp94MVfqieHhm*% zIw7<1^}fdo!GV6%<%uQ%P$+4o0y+J7k0RM{Zea7p@p|p`@2j(Yd|aLspD_8w2AQoyw~}iNISyj_$C+iq;Ntl@fP<5ZKQ9=CnREGFUeq@xZ7`aavfE*T` zl&pt%WQCXOHz~P!LI{XmW_EsAxse*9TS-nueN=3GaaLVJyN4)Ev#VcvN1v@IT_`Ht zrGM;+7^KHNylwoGO4m>j_OGwXg;AMQALo|^XQJm;Hdk3ctY>W<@D9u_L>!)p#wBl@ z9f($6I{i24<0mLQ8rsGsHRVdH51td+Wkjjc!rWB-R?`K$C~IorxwbYCpat>4pSz&Eh#u2s+0~&-)gd>%==WR zln>(fmHI28RHfe|`^L@8;re<^fP50%(Wqh=@Wdn2Kxx{6`5{gv<)-24)z4%ob>4&Pdm!0ld@9Ix zp{6Osi_@p#jhF3G7kqPirt#ICfB{0vv(*o!@p4@e7Z<-0(SEnzohiKnrc9x(DG2v4 zxe#LBw0j})l4T&tEseAt__9XoX>jd)6=JF@vqhdHbNc9mC90G zSmi7W0t-4n0RlA4XjR}OeM{3sRWD^6ex)jT;i?dafb=8jIsiA2aIGcOjS=Dz;_DM< zXPtR?%qUJG;a1CK>45maha_zhl>Z>%4h8EaO41S3=}H(W2ZEG%9uz)o=F#eRKr!C0 zbZzbnL?XllpUxb5P)LU_xe1dR<6kqIKqPWbsVduGs{CDd?6>x$?wIdosv_f`8vMy* zx-D)ldvzXiv&%@a3fHL5@J*6I78reE`xY-JMt@Ej=#gJsZxp3E$=&#e*-uGL0Bl!- zXM^6s9PVp?s0^_eRgIZ>ot);WdDy+Gj@RgwCo(xQQ20BYoI`$nQ@b7=2n9 z{8K0V&Zi(uj4hl6JYY*Kb3qZSoX52}mqsk;I}&4n<*NG3@Qw=JK0H6S+|POI4~Fx<947Lly+|=W8@vN>waw;6v+e6^lw?nbWoDUi@_ng% zLUl+`OPEbliO|%|FirSPU=24IsW9&NkSbVb1?RHseY`iF+O4_<2@!Ztb>oe{po5iE zHFn(5;ARG&{~CGO&)x@`H?Z6)|cAT;Ox<+YHQjhDO+xf3cf%EI07ArJte z!@mSN`s5+H04jg{OCXY#5ucr3TE!-3VKlWugKRXy0LS*dqXLtnn%LVt4ZPFz^K%?e4v)U5AucWeV0XZF_`mYSMR zufztDch0*Dj~=|Z8FZ$gJIohud^=?H;OQ36B8RG(*raxdze1j3&YHokY{*C6GL4`s@~s59wX*AKSz2H^;8)6t8cU5KMe#2Ux~;E; z!Di$NR|R`I*gMh>pts`zEUIlb6t+F&o48HBmx#WAIDB@zbb;x&6mS70WGAh3?E|^@ zFpv5$ncXz_Ata9=m?!UyJ+!g9ZV?7ZL~w*F9F+Ej3yg7(yO?D0TuzM+amM}8JNMG#z>4O!>qv?af_{Y4F$|)iM zcp=$MPl3K<(;D^?@`?13zBhIyb!+5~9p&gmmmK6O)MG9Zl<3n_&l9UeET^0h5NB49 z4~`KS$l*Ss=P!7ujo^qOmR^~#&EGP z!W4y{j=_xEN`{OY5q0!E3aa8pz=Z|-sh;iB=N)Vjx+Q_As@X=uT$Qfb)EflDYF!y{ zJ4_48pR!vNLWJ%$TRk6fWFADjiWqN+f`ZyjyO@UFtf1>fnZI{@Rr4a$r#cY$6=42~ z`KO{LqT7Udeh6EN)Yj-tk*V5&9HY^D16)m)(EfYqD;>L5bi5H?ljK@DqAQo8s}w1)A5<1G7z6QPXYu&f6k4NlqFN($No_ zZ_AT#NsWyf@4o-Ut^C}T|LNP7A79$wILWWhLwKVP_dIA}_FQ;w1tvDu1rk90AN3Lu z&sIBt#l5Q3L6Ol|)MCX^EC?4MsiO??eG}0Jo3Rd1SrA0xWUoUrXD)g-1R2;*p#{`h zo+LBoH3Wq1)4DSCW%3iCFKY%E`OuiR=069tgT&OL^ZaSD)pC__ z{nGi!)6bbT{dKio*LR8JuSI|V+$gR6eX-NJ|NHV_NbLIRWaicNuk*hf{c9R$ATh$! z7g&@9c#0(~dM@fXb&Nc>MJfE^s3V$>ULbUUwl@QCesg6Y;_Q3xFO6I(@t^HK>4uZrZ-1v= zfZyG|e@Lbr^Obf8&@1RDPWm_o$JWPidyw~5Zw#}ZIoYQTKI*~V2nYLoYU0TO(e^_! zhm$wVna*m5e^C+1RAV-cCK#vRDsLlizx3Q=fRl!|+l(sqRvP_Y{}&Y^fC6j3a! zC7^6_LyxE;D;E(j8~l8bB5nNNOAAE9qf{rZ_|ihD%&(LC=N@lTq`Qg%`LYw22~}A~ z7JWkY@W1uZSO6sdhqMcCcITMOO8%0~U26WAh?;DZ_qnsk*Zv-+{V@ICU zzw<@=j7~j+p)CJg@FQMziXUs@O+M6f3IJK39^ZU&Uiti+hFkuTpWY~ED`n>NJ^u7my1d04 z@tl^rQiy`4!j%m7ar={Tm~KY3luA{ZjeVfwY~2v0N|1}zRP&sWSY5X9|9gJys2h)PnZ6&1(nymynbzezTn7VuoK zC561v&adG$4>BCk5p-CC9&tSQW=QU@8*nvqz(K93`f9H$;uU3kxts6rU~jbjubgXi2B?D6U_7-vu#orh&qFV{AEL!ZkQf3aW;@rRcF= z2rd#}QUn*BI4kyRoXGj`a=bzv!?HJ08_At0n^Ctyp;vE|NQeeKJ$EQ6Eb@Z6B7gB1p9 zNX7;Pcu*c%81JjR84qZCS}x$_R6#_bYHTzL1hUT&luhLs5%OkObG?KyxL+uN;QIF> zLBtUJz*qIDUIhcx_#mpf$ZCU;q_+d4#73yVuiO~HjTC0%=mSXpA{1HWZyX`U_RG~=jEz8V zT8NoQ&lSN;lKGc&cTNG~72mpnF{m@!zp@^(lG1lLL_FzduSZaasbk`DTT&W(4KThp zTAJiP+JvlfAOcE)r;cHA1krA6D)AhR6iNhche8yFy~n@HVmjU zCSvZ%-bHm!_FIH8(Y^JcD8u=nAufKD>=Htc^=J5tn<(>ZM*a@Rw$j4NJfAItykSo$ zseg^x3Jig%gogy;TA&z1VNZ&^hPb}%;g|Ek!^A9|qdottnpWWW+eQBcV(tCGFJ&t5 zZraaar#>Qg6OPU^xG}2x3>#G^3mq=}zf1f7FdUq`f-ca^aUVsCFrKH{2>KzQO9W5L zgHC|&5XICI(#^9G;QxFs?uvydpPS-zWe906s$Z)hIDXL}``GFZUQ4{|1IU!s@0oFg z(`)wvSZAdfa>@dbpU~eX*Mn|QErtag=Q9{TDd&#rjZFF4Pel-Zmy^Ne)pKSv%_ZHv zISypPD=X4I#@<MUP4B*a%pR}6U_q$?P^Y1hxWCAy z!uBggU3>=-ar?>20=Gtp%I{YIldG>RBXt@V)h>|qtFNqqNDZviG)zI*l#e4F{cEQ- zsnpzx#MGzvA+Zid@d?jw2aR4~e~Ab;VN?EPwJ~a%U5d}?=zw?|v&W6su3w&L5wcPTwPvmXQ#~G-tpT!*^pzlg z3-14~a=+Cb#WPkg{r#W&+ZCxp$}TeS#3HH$%BK$4Kl|I7CaU3t09_(gNcg~?{q5U3 z4+}^D+~#Hb3qhD#1P_C-xux_FNgjr&?ddsZ!>@+j1LvP3@6y+ObEYE$PZVp_H}{mv zCAiI#xN?sqbw0fn!r$2bUeVkq1uUmlC03Z3fA691z~-mN4{F04?_zh#TkUcw4>+VT z0BU#oqSpBj?M3ymf93HpP*}U9i+c8v_LjBK7?Z=$e2XY zP{ldpLKamIABHmDI>%8kCf1on*klcZBDm@zmMBD{CRs^<+-ZGiu?$l#5$f@@Wg5i_ zxJBTd0&z9{@CwhP2KY+SJDEtUlxKs5R;l`cnfYYX23J73)zN_! zIW;ofn(47l{Ys_?Gscq9ep+KS%Qq2jBl_CF4V7v48~P~ky*2=l5g{sJ`|`~%=hCNt zg7)B41Kn7#0QbR)vXAGxP4bXYJe2p}%Ci$;WdLM{6j$JLnT69z$d@$@OF^Y)$g}jD63v$BY5T~0kJ)I)LLP2sUz@0D2}gnTdvyNu5z9N<=*#`#!&n`Gg0`Miw-AfsVmn1XQ6JGUXqNw zP|c^w#2u zt(V;VY657T7j^MP|5F01izybi(HJwDJ4$IAU-g2OkKsht6FzCd#d3!#H8ejwPBs2s zOfGO+EC26hT~@p;|3BFKRyX3mh>Jtj6MTIB+{Is5>>o1`nc^h)_+mxXV}%Stt5h_ez9FG@Vvn4)tUbcw;X zlUgQDuOB$tB5Mbe+t3QSTlV~u+NzQ7UTln64zdl#{A4~lKCe%`m#~N@E?FLl7H^Z; zrD6Wik452b@hg*6Bh&r$QE;E54Dd<8f>Odbf4UV8k?^ z%UhVqt}=e`aUcapoO}(`=R}(eLli=bN%yMAm`;is#{~CP3jNi7J`cWy5bFv#yRj$F zFf%<+3HO`&$>6#&c;DUH+y3W4sVt#9b$=HZGNq}&FQJEnueswd5u?r=tF^|>FWOFS zi!YU1vlcpBY))NqDCeiW+01FqS&xr+sd=$ZqMxJXjCPFEcY=MXnQ2l3O2V-m0(~?Ejjon#zR`fQDoJ__S^EuBpz-^Khg@qUXcG z!tCB?cPiH@Qy7hP8ra5LpEfs~U%xJ&jO+lz2BS<&Qzqn79uD&oC5Cg6u#_N|BScR< zmmvajhpc3>r?y-$B~i3W^z9tyBB;g@92<4N#mgc|PP?5TR%$T9idp|VmM8K-)PYrU zSCS7e8Gtm>T7s;`4)W$zpI2^Hm^OAf^VX8ASvLQUPiQ8pv04GL$B5L3aBcT5z ziXzK(MgS>Goe!wCY8v+WNdhP9g&9+44u?qQI!A`bxiQW?8EsnR5g2{rzJV|Xcta4; zoAINGM-Ru3KOn&(CzGmvvq3<7Nmzmvj&BOTf6RN3GUkOmpd--job7#YkHGapAH3~! zhtfM#y&L5<#x#dp2kMi{eN`&T9hrC!~{f;x3$v=f^H}vRvK^S25&T~P8uye=Mc~fuTddxDEjx>D zO1HOG-4=gsM~HF!?p)`p`gLOgEYeOtf9?PJ;PB2=z~oPS4t_-n%Q75eJFq>snKu*) z=-Cc@?roCKK1>7!jRt`fScsE#kvfhTFkKZjQ7*hs`djUjQmwojI{Z!KYdF-PN)U;k zbYFJU$*RlXMBRNDcluvK=%2(E!lm{PPC^@&gfN^aQz`v(3|$yoJ^%p|U3_(FEoNxW;5zk}*QmP)h}mO2 zEU^rVjVVg7S)@Ot);BsEUTzDi2_7V|xrf zAsNsLN$%+PFb-`2l)W3XYDR_kjZYf}M`J(ErgsemPJUUqBi0jx?=ux5=05=H@d&&q zwe{Bi4=%Cl*w&w?d-hvFyLTnE!WAhc&(JwtfMq%~HMk-RA9_6B+;(>{AB&1L=IBp8m6_ZZM)#G2{m!vHn%-bw3f z8FHB=FVEp+`cH|I=MFt-?ew2Xb(&ih{`L4_eSc!o-Nsk!Mvs|5tP&TVpTpX|v3FEw z!uAb}{Ud)$WeOu2d$ZQ|q)2Bz<*UXNa}2tYOf3yJ@G?D$Va&AVxZLm*{rOaNleHBT zGeL`MvYV_heCEPJh;*Q9(wa|vUECWquSi~X`=OlFzA%~MmFUf@w&Io1p#3ywY`f^j zRK0s$K=wOV6*gY=^*wNB#J);JVB3Agq@Tyjk0oE3{3i5e|C;=f{zt&OU+hb}V9mha z1757q9jI;iwXgiujB)^2P$nk$DBUzK1PPx7h4O2g_W3iAbD&_PDT`(i`&s84QCX8f z&gjI+{3WPZUt52KKoTS*j+fBZf`T4(OBDeB9Welk9xqcy->c}uH=AxjS?Qz{1y(7v z$sevHKeIDrN>w(hFQ#~k9#KwLjEO8xx1<81GG5h<5M(gDe8`pRE?Uk_M}H%o5B6%b z{6QvK$AafsXh8aggjdGYda|?V);uuq!l$fAg;2K7ic@M-nTXpMTh33piA&NnL9hNI|eg31`|SV+4@XKD=@0TucRM;XMx3fnoFpm(Bu!dx9; z=7QHOlcN&5oP(Oh`NC5LQ;z)5PxZSYDKR9P?H>G>L+xp0T0&6j5c%+~RAc%5lFNxl zj&I8mfI8u!IY|J?L6o@|-E~x-6CKz-Q>!TmLX^st!5ps~*y>(W40*Rw&RLdGl;!M~#32hUsOeS0;NhQ!>OQZlY< zO>zgL8;2!7_M*PZWy*Qn@TPD?;tY~TrAaWydC1i_1XC_+SzdcT*Ym0-d4z%G?R=X@s|IV~_noz_e(^Hj2z+7XOkGY1Vgukq4sP@K4dduV@K`A4qgsai{K=0WNo#&JcVxQvUie zfW3MnJS+nGJ`m1zgK+iiHj*E10O9T<62FU-W6;%Ml4M&TEDPQJ6%#_k%mGzy3#J$q z2zZ)?`(}jgqx_`%h*wzUly?YuqXpx}B1{03kf~+obtaS_{|43FxJjRb43o9sgcr@; zWPtVh#mNWL2BoNQ;vnv~X_Ohl@2Psz>bm%Q=yAe2(mKWB_F@DXEOv2_PKk?{SOu)b z`bry!k9<7tiC!T)Sb*?0Ixa3m0Z8|%bwE{c3KJJo#LcIn@wvVJAL|J$n?v{U>j}pl zmOS!bWK}!Jqv{LO1fI33f0d&0l#y84ZRuD0!eg3TMX&->{u{;kBgP~DA;!Yn-I~He zY~TJxG0O22BmWP@Pz`aW5xJH3=PP2x2reoNj1Zs|wfcu*^enohUurU2{7I(x($EmL zu6wF(qk_t7m{@l)8Y;gC(}1|tG(C)ip~;_esYs?xPC;oIH|C9XNqKF0 zXqK%>bX{vOqS4jFrR}XN0uuCsDiAwtAVyy09yv1kxFM!_>hqnk_Z}}GLo*Aabe-=2 zEx2{TFL56>c0*wOsX(fpy;IhNw3^ei@eAPLd2=VV^S3Tv&|5M_wfpGy5ZJNR9Qg2t zqT?q#+=5I5zm2>hD|mHYn>TF9Dt=AA?3=|9mVo9^5?=FvwPM@Cg%Aa*LbP3~vBZVobPZhkwr zN0>+FR6*w2D&EXQk4bg)PgpG;xOq_BYt=<~Zppx4E)>Wp?U^d&aGic zaf9=ORMQ4JDMRxn%meTPI`h1%D#bNVe-+SJ{z>#E@Qh-h!p-E%{gPn2#qIu&@--0pFp!sUgCGcGkdSi?BbG>04u+CT=LI}heL@*R7Y9({ntnZL7RJMX?MM61 z>#{}2V7v*?vRQ4QF#d`%WrCS{09TaUu)1=rjQRGO=HYRC5`;#S5=Hd<~@y+{zj&Pl-LjeVTo_!uxA7AKKc zUi3BsrUeROmWwEO?0q98sw$CQ7Cfye|Mfc2nv-eY_LbW3CvZ z*>z-1<&wo3t`I)RTdIs45op~x8bb^TH@dNKV;dN6E$rBUd(3Y{e1IYIj?-Drwei%K z{W*G)&B7MAHE8p#X}z|8K9 zvxKNH3M!!x!{NLxh&qT0)a#2Oz>(|o*Ajonq50TRq$<(?nj9SqNy(>hH_Y3&`HOxM zDg_kA>auJX*hp~|cG|EsiDM1?*Qgp7DUxJvikzY%o3wx=9EPf{)VhaOHVVDuD&V_A zE(u=Q_RFw38CiinTDkGv|{qG=tT{B?+7-d^5b@s?8xhzoJ|e-75PlY9L8?*YMo%JAvGd1414UuWjd zf91dVg=o}>m6!!gyZ;n{_AF^a2mvyW??A%){y>VBv_6hPt%jiDC$j;LX4%34P$t6c8*YLuy$xxZb?bLNl|H4 za=B?`b;D}}jg^BShbE{)}SKkW+xj&}3fAqFfCM^h!B7BH8d-E5{Z zCvP1M2R{PdYEQ=(S1{QJJREf%tlI-R8pkN8;~>*YGVuPs#b@rr~8BBb8&g8Gqq z5&SIgo%an*~$H|8Pi(d^ z!uh-f(Cyy_R|(Dwf#j6RIN{$xzupWw)8joLzha$Tu?A-tqz zW+c#^!G5%`w@d+q-KeF2UgUz0lWDmdVjeAnOY4gf3-CtANdY32!*16A@-e??NA983 zZ={Dr-AbG+O3coawu(?a!tf;XBE5K^Qei{Iu!+}Sh?BTj53JIN7QIl-M_#rE8|GEQc+*_OaydOIN@Ynt*F{m1StLr}Bg)>eGnH={Q-kK_hX0@X`A zl~hejL}hGns;_E|_8QUj*Uj17Bq_}Src7nRLl+k!(7s2HobtNjm_7<*?%`eUJlbW? z=!3EqvbHp&Q?*M2e&9rY-M1Z9k>M&x_O@?Beuou;Uj*<6_8%Wa|ClhZOQdZz$5wp5 zD?HJ4e)zSn!_iy&XoSDC>S$E>j|{h1jfahM^I=gSTI3{n0zMg210^+{SB(r#+`gH` zLi1X=Qw#DO4OENYbce#Uja5L*g4rN~hip^ZxQ?HiOFd zVH2)_NJ%D_nP0$Rxs9ooIrr^@mhZRx@1HM5@YUc8pVI#?8E%6$X<;`@L}ffzS&OQb zaT%?O4bU3B3G5C(94o!d%AljN8|!y)2J2xHy_&?Z?W-QT666x@MD9=Y1A@1AfqQbK zxe_PFq?og@nGad#XWF{)ZKraGT-S3)(?HiBFVaXGkDp^|8!nir;(n8#zv&9RxL8)X z{`BK5GpVyNcm?>&pase2yl-_Xw6LWcCU&bW-jaUu0TV2Z@7zNSy{*+tL}aZXE$M7U zd({V#mqvj{MS^%S3lN!e5r(KbLLt>JP!A-4V)T8e<|J+jpPSn39giS(pC^39j^gPM z4sE=_LgLUS%f=cP_TUXO?R|FD;oV6h^-o{vpCSfrI)GEe&tsS=4eRc8Kb<0a=5J1w zb>4nc^N_%CPKT2lYRs*!$%32f5~tZAUb8dXbxf5 ze#e*GGv{3v%f5OA!c&JLe}$QbKmesQ_wU+EhPS{!{!@E%l=0zg*`(Ef@rd)thZ2e0 zrtMeiS&;BJ^*`ZkwsAB@(h$JUqlLG?qG{omyFl(+e-3$lG;wtZ08;yp1?GB5_u#QV zISg-stzOdj8u$mqrKBo(`B(yhRDo&v1$rC2iBnXOdXEgugkhXnOKrmDF zbBA;BqJg+my!KYzn&ui#9yB`ggEktf2GH0ab^LTHm`H=!N+_S-w4TTZMenJ~HswCb z40Bd&j$D6UReq~ciZ;q4IrW}l=jj|mzxc@uCVUgmkIwO4u48ohngl zdbUo#sfkb`b~DrV;MyVy|1_}*=@=&Yd#V~KmNt=r2SFA;U7N?{<-Q$M`Os|86lj3) zXFCAhjLoA;y1tGd$%s;$@CwJy(V*`gHiyKl^DE9vDgpF19?b0&v(za!?*N%1T-T>r zr05@hQ#;wIyydW7(@x;+^zFIv9TSn;(fd2#Ser$~yG_vcta;;)CfOhBg< z6DWW#g7`X6nfqKR09K)^1l!KfUQY%l( zf<;uM#B@|VX)xmCVXt~ou$c-qM(_)z{_cpXEP!jR*7V(ovg3y_$g5VTkRnJL{CYcr zubW41aP9JU-?|5AL9A+$5H2M?5fve&X|EEemC1DE+DzQo>uej;+V9qnfr<89oo?g5 zoCy{_z+QQp0tiSM>S}4xyj_SSmh&4BLQer_(d4}vt` zT`dpHU)yrjP4{wpgt~L52*^xOaPXF9tR6D{MVTFc@}%-d=h1s3o2HaV-=BQ^*CEgG z$6rrus(*Yo_S*e1V;U}UI%}Egc>2Y*^mQ$mey6GhLeCATh7gYXc}$3s0-B~o#A2lg z+*<3TKN!G~jZ+eL{MxXQ)Rf+Dbx6d$8(0-sRhNIyWs5DOXz3iR+;L!XzFu{=&DkBb zbywuyK$6yZw-n6;$?gQzDe`=GosC)Du`J8s*?)T8P?>293_?f+8V?nM=f7oD&uq;`h1wD1lU?(?h2-21KS^AKAfEKGBqBqN zg7ar}ZU42eVm@<&|DXFR|6Je_V*y9%5fuDoysAQ1pRF15@GC84FP#{#XZ3v@;}ELX ze~-Aa0`T*6fd8QJzZwT5X*KN4po|Y=RZ9bK;D z60M^G@w7nDhsrLepsZY#)z`hWqAoSTv$nnkB~Je4WmHP*+m}Y2T>w|?khOSmQ1kFa z1}k|mKGYoZVOC)@);agff=FoGr_Z=GA;j1`pl5wgjFqMz^=W$ltnxwpr>*n#%{1J( zTdECfBj7u+xsWC1g;Xfc)Vbpw#gcSnx}cHqM*c!i7?TBX93oLvkpR@X&QJ|aEErAB zH;SW%P%{joqF&C$oF*FTWVePajss2%V{%I1bYyc0obQV{3uS*ml6i!RvO%+zFs%|5 zPh&@^MT1?VC;Ci-Ky~k1kByX8##?Bc7k60#9M%i0476)rba(-iF8#)w9zk~@UnR0= z>z6EIst>fT+7NUv(Z3ABXwxaOsxz}a)`Gq~*r;$O&h_NT)5A;&l)ZjRrhm&(AIv+y z2J>sZ`>pYHKk1~BjBeH7uOB*!a9KBDup*%v^{=0KpS^g6TXU*qpzHIFkNLzE{WFfn z$2(Q-pu2sAW-T&(KirSFJUszBnk+sK2w;W1qmOVBvOQx%fwt;Qu3={^Wed;AjiyW~ zJ~kswLkb9;7s*M?pA3b`Yj2o&as?Ec;XkPY8KecfmlaTO_C&xU3{iYsFmauP6i7>Fr-hkU+T^}*U&n5hf|U7-aeO6j+Mo6S>7_Y&d~Voq9o{^afS< zg019JLi~YoPqsyRGo&4EHP+0jgF0c++C*oV4CDGy1N+_U=2`2?-IjUJ?cLT^d~>_e z9chZK{2WjLXn)Co*-qNX!R){%bKqiSJ8`;7JqE}Fr-bR0gY_;R%grEi(yKA9w=j=9w5f{R987{u|dAmmxOwD}rYBRzRsWXX=01R6H#>9+#YPIDRj)UUfX7 z@ZacG_3ILlVBL59Iab^cS4)!7z7qr-Du8>8=on`A0SJS4ltvZc&QfhK+iHRlmQ=?9 zfbE@~pf3uf2jXq4{G^2QGoH5zXYpCXcK~gn%OB+wm$&cY@{eAJeyi+p90G*Bn!9zw zx7MhgHYPYjme$*3^PJ`F%S$}lcYEfCU`M(6$!$bDYrj~2L-M`7Hlb7Ta^bs^;=r!n zix;7LhJpbD0Onx9tGR^>MWO>k!E3Lb&vbVPj}2SML*{YHCZWf9pMMkluokPFpHK_yagaspZ}7P!rv$*OKD4wTBP}RYWlzEpuMlN z@PGYXhY0=IXX3ZwPx(itAeoi@VF8R#l{|XsAAi^RiIl3JQ>x>4JFKH90nY)b?=Ac1 zS0ffKNj^X-h=y-ymOC9pwjXBl&wvSKA^$cU(J*U5j`uB~*&*8F% z!rT}a*ZpAMuv8rz8>~?Yqx<`;%i#uVKh__RnQik zA&gXm0m_e?B3``!#4@EmPqHMk95&;+eVw7uE@agcBOKYz4Zg`M7RtafXZ#qm(wg0L z#pnQT;$e=zj%vtA4=;F>GjT-uT5ha=DiWCZ=y`L*{Dd-lm3%F_pFDoTI-|>?G zhc7Y39a-OVDgK^5QmEktbj};HnJ(7*8qqx#<@mM1Ytl)=OnL8VXS(}2*;Taa5^;Oe z?>c7LQk`h>Oru5s<}oe`Hkit=EwPk_3}-DTNQlWPv-DOK$kY05gzo~!0P zz1g=Pf_tKVT@ekN5XmKh@411dk+^Fz$c;rUQvm<<7nCef4w#z;49 z8vfW=MmeG*0g@KUmX}80D=2DR5FM(`unb|#@#YejZ5i(Olds_i#VXYtaU_Im11w_b zI0c~L+@en{J-Br2c;s%qu$u%TU&=;#zYwiAr7*n+ofC$W5?hfI8=LB-zEyHA;U)DJ z;1i-{IG_P$6fu@S$x?j6GYeNV=(8L@mDA^j=`)UGg>mPB3*8wJYeo?*4|$4x;iHkc z-ZHS1(o9r^enfhUlHlWVy1q@0%9os*xhcP8Ns4?KE=mgu(<-d0+~=YyAJsk@5E8)d zApimcI-nqM6Z6-5jmW<=&95uDb)SJ+w4Ze5w0!Z_;%qCL_hD;WiRuG1wL~om1&$S9 zceztx>W&?|Yn`;f!>#|ajD+-8s$eJs!k!8Cq0$QUqoRHfLMo$R1*Qzd2vh7w>55~0 zHA%|{l)~ow=vXo_4KR{zdsl9e^{>5krv47jtc(k!gM&bPf0I@6dj9T&GKEoJnh<^U z$+Wig?*H2|QWB6+q#l5GqNF$;k1eG&>>)U&OYn^?a z^EbTL?|$#+dF~)DBRcTi6hqUP&0C#&)UE3hBE<&X>S>O*^Z-QmyJ9e(f|LB)2yy5z zIlDOd_|3it`IpxWZesS+5Hgf`tnyM~K4UH@|VZsM#hwCc@_cR&-s( zx)Zpxf|@_ASI~Yh`EVX2%>8tOb*ESG+1*O7;XjRCJtE@^gk5Br};J{_Zbb^i`+%`gJ?$o10|M!vQrPh0)U za4u7B`aD!K{SE0TOUWa%mxfvyDO7(4O(=#up8tK$RzUoTFEt8>7P#4dyG5hy<*55f zh42CP+VU_`y?>dYRc8ph4sZZa92Z5NbbswIm8)l(z1z*6wt-sBU#fbfFxEE?0VuJ$ zKCvjq`sPSO2G!L75*vmmCaFcbnIPlH7|vpom^Puu1V4#S=(VN-89%e zVu}3tx$E0EzJ}zji|;L2h?}FSO)ETDCLtnmj#RK1uqqr(Q1&sV2&^MxMez0VHrGSAm|)ows`+Z?(kYGm&7d^(Gb{d@?#eWr8xrJLL+8X;Y9Z;7R=LWd zX#88VIr@&TS4Jl{WXDsTagh5G;uL^{J|=&#S>86a$ungw#qa#1{JFzCP-~XjfI)Mz z&<;O!da7Yxjv@ucw=eTA5~m%_z7!gHG)*nZfI>nJ@87eh*9{ewzw-x^;Q&+(?iU{q%tk>E%U} zpCtnrt$la-B`W(C>5nrF^w-zL%i%rEIbIHk)wxTDf6quHAV5`o$M8|Iwa6NT&d9~+ zE_-G3%Ww$*-5M!Ns~jjIXI2w>-?Y7G9V}9+ydLfK3&s@NNX@sdBNsQ7|4G!L-_19rc~3zV7-LLuiJQa&*= z*;?MR#4nAxl$FFpKDeYv4Z@0@$x*wL7>~Ffs_gXsT>28L`nXiRV=m5GZU7-*UCl9w z2&`a~_aL~foT!|zrfiv-GieI@Eoal11h9&1iD`|;xXt7CkJ`Rj6MSnwpR)SaakW+U zt&^pE|2YU>)58?6QQZJZ3%S}qYIbld;HxL%t>yYa%U9lA$EikVAAgs#8{PlXC}XgT zbN~n(e8qx1q$PCzdDP{RL@&^Zt0~@x!<4M!H_C&)TRq0L5z&n!j%9QHNsjgZ37WK< zKrCFq!Rc2Tofu@hjrt)F+d5tO{FB8%q!ix6FJ3N0Sm4NdkPBwc{(#i?6=6i4aol}=ciI#8a)z{b8{n_28mtT~seo5EAD)=ppUcOqvMzh0E z?h_macYh9WJ_G}NCj_!!+C^30@O^#0`7Od|%mu-n8&F7N!Z`R7-nb9AgVB=HU9uN|KX)vLdvegEhGHR^p>VdHyHI zRGomKuzK(rlgnR8*ZcPpD5>PRLlw_fzKr1Yl~WEzC_jv$%8{*p{CAZU6fpeHtz?WiT zOE?Q{@gDc-g1uD1>>drhfe` z+X%?m#}{B24wrfM_1xv*t}G6Gn2>5u@N2A#Tv^y0I-yAYjm`}$_c~E+Mh{S(82ElF zvC7-(xsAC;sj`l)a{=fWL2fn(Ma{nmCECtg0~vthz5t9g69ERJOR8g0 zji(ZHDR1Rm;8S&>SjJFn7_lf0JzL>h6b;G6=RLL>t&vWF)v$HR7O#WG&xUUHD*a{W z5|tb+q}wBpC9_q;uCsO}MK$fbH@}=7rdJbyqUG924>v-U%rmp(u|$@itJyu3L8t#X zzu)z|M)bqv&2J$RI`^$RU~DX0mH@h2+7sp(5)Y`X9IZElGTZ9?9bK?ekd-+be(=-t z?bQ&bLIcClCxRilJam=KQ=vR8Dh3gPL0=eXVU=#ikzJz{h5!kcTq9E&Pc#47>%!miqvu9#$6Tfx8t3rvwuFYPTPe~s=6_62xl}e0#BE=TmZ8KrTOr>2$~Q~) zbY2xJ;^%sx8MSo79~~`3{OHq>WP1471ke56!%^+qp1o_!<(_k($9T_Cbohx_KWHVB z|Aac5mwS)dUcdV0fJe~>GNbBoi+{?P;RBicGJUHA?~FXO)5g*9y*^4rlU9!-?|RTd zt_S$=v*5Ng_vt=9`p?J+ZiwGV0If7V{+|d?y?rFf!vx$1>P3{I)^FD0Q>sC3{BnXY zWBft-zRv@agnECM=>IQRmyWLg zy`WAi{eyMlq@hWyk^!T~%{uZj*1pSsu+E)Y;WdEx6~;MhA`Nj-0}=~{#Kys;$$T*y zQD}TdCbveiQ7SYrt1v4u$2hN`s4|2P?3h>85GfvXwK$od z#dD>OD(u)8j%YyH=i1#Z7o`#6;juE4-}IH=@(|66agZ85kx~rpLY0&mOzO#o$Tz!w zox;ui)=G9WHF!8&c$b6k{bao zU&Q7`1(gOT6`IKq0$QTFwJt_~Gu0?AH%0LQoo%ROGoCle^40 zg}td;`9;m4B>4$urMpIUwvfUU3lIlh;b3T*Nzv>Ar2!6Zvj70DD^Y?1qFTF4i<-Ae z%h;=q_V%mLxSR*oy<}F_kO#%uLAA~OyTz1IOQlw24ixacTfE6f1Os)fYUuLnIQ6?_ zh0A;Vm4yr69VA;YB0O|UbM72Zy~E^3o=V-J`+W^(-pW?^v){v|k|P*6kN^Kz7Y`!m zL!)u7jSesckSX$h!}mOtC5J_@e;&6zA@w{S;@gMAo53CcULvexk8-@rH9q86FT=~e z&maPB*-yU&?qCCNRnml@F9yWUN!7>+&MBVUatKiy5~K@I>b|oSn&}bcem-ZG{IY-g zpj#Ay%h1LWk<3@pXV>*4IbboEA5*1mduUD!fm(>>n*{m8#Ki`GVVi;kfB zeQ($;#A6inblGq3*V33jpn|~a7c>B?%?rBh@ig!hpYfaY8RqEVe?3r}jdij4Jhr1| zu}b;2`jY6t{x?eu?_b-XN>9~Hq2fIW$uLY?qscN>KVRdEl|v7HfNH7O3K zK^OHuY2C;_XhK2fj0b5{tMY6x0Z-noIH>$M^KSq?ge?qAoftTa`O zR|N$ylD&pTjju_81Y8v<u$32c%27Ae0j>%h+Oqa+x_h&-%n5muRiSK)#uLd_-Vk$=fRCV z>`?u2#PG$(j`4q$(l<4b_hExT6og*5xrubQ0ysQ_(*96c^La0KI<_399o=Gjb4puH zxnOP?IuJIk+Dc9USsWHUDa+Pp2CKXZx9;#VHu&0oY-_1ieR67MeUnF7GgDE|nc?e7 zkIj+*SY_uFlhLt{*_l{Xx?`D`WIn%Prqoc{WyZ(%Yzd7OT4LKuwRwR5ELpzv1ti`h zVE{kfT!|lTZ`(-!PT5fQ{W}u{(K=>UpGp$*%%F|OIytNdp=?I}QqQ-+@o`3Q?})gS zoxBWL8FXQ05XW9|ev;*0NwGjOGTy$k3!eS1TT}{KE59m<51AA-&1dAZw}6@D!VVHp zm8gCE;8bPFni6QuL23n=fOVaU_}h24^>#CZTn!6*Xe-!9mtp_hwWDLJmYu?~qt=5) z%n*Fs&-tH2@V}4E)(;4=zwLLGVNc9z74!C8^XozJ0zBU5{OBh0Q?9^qR$H!q zfb6Z#DXILlds$-cRC|4~q-yNL5jg_Mha<1%DH~E~0-ijZVoi!1=rgE#@;#Zq%BCU3 zT%ks&2wr9Lu)sFu&~S+fTzx)oZ_L#^CF-FiOsZ?u+&uk&@mj<^Ur9--kYge80>(@P z7fDMxY%@wZKZsB>MN>cmM8LEgD+#2ZS*?B^kPqPq3CQBpu%GxV zbvK>(^V{hX?G*$OJCoP{OVDF5V+Ya3D;4Fi<@TkP< zC8T6!Gx1TzWe_K#iX(&b^)pMV{5{JJkQlwVm5QdTvt{!KT^d<8ry}%#Vl4s)ZX6sp zgtWOkK_{jSN$Xr2W|mUF3MshqN@%-38*Yqh*@a0KmofX};6m@(a$Q z^1BaRuyVSvM2HNfOu8vrQ`e8_`3#fTw9kb{=#XLe?N*1c_%|L#LN(OnXg1#rsxo^z*A?D4Lg325pe5!y5Rn4~+{`@^R+?Qye6Oc(E5z%Zf z+~4lWbi`l8XkrpStky;?1mCRA5FU$FW)*B8G7Isx2h5$5mnw=6yV&dk4vR@_A0DFa za~>?A{fp#AS(=W6KScZ7jTvY>-JW=TMo04?@l2hK#iVj9^W@@4sAQiH`a9HDaydA8 z+`+r!=2HA~&j%Kt-*wkY$Mbf%x6f~XDgJEoM*?^x4SZ45GayWURb`HWf3i3@hmkle zW+8yWthqao%7ua|_?Ul(o~1qVN+<9U+yIL8M3X)@RH5D#D~xZ-e4SUIPz6YVy&$zt zj9)$T28-pKO(P0L_ah)yxV75Y>1EcjNs#3A8wUDQ{?zA*uOD?Yv#C~|7%>{#vNNU7 z=pBc}={C;dq^A^z8iF{YL;wWZjhkH=@4Nk`@3`yXvby@xFmCe(GpH7)M;tjb^Y}l4 z$Y#g2-rW^4R4?5v%y8M;EkgZ;UsTjs{0pyv*wM1PumXL)iPFe-X~#tn{Cazf;HK8< zGW_bf87uOxwCkR#{<#?Q+L7ECt3ut$IWD3)Z|#HI`v18AuLN-(HE$$Y9sLu(#B~ke zc-R~1-|$+(_PcQKxwNG|%>RDNO)x=K2IzWBh~z4|g;-1D^*q|^Y7m9RR2Px+wwx5w z$PHry?+I)9_C7(46yxDNJUNbh;KPp|utlIwiMX3~yN1O_2r;E?j`C-58K)RvW7sDY zBq6M7KPP^?tXWI+%0onu^o?su{YaYaVP9q2p z(jUZF&PP8`j)>^1AH@C-5v@e_s!M$fIhCFM01aVn4`_)3;^t0;M{65Fb@a6uL4CUD zPe_CY!V@C;j$?vq17dGMn4sD@RyRxl@BuOUiE&q@FO(E`jqaoVZmIylSI%yw z8{~qv{$1e*1&scabj>5G8HTg|4O-bWfqhaAbjnH5Yk$(UCklgiVgPEs`=4qf5SY+C zTkVb|KpfGt5!<#76HZ<_2d3peq$`JRM8X`Ziy>Xsl5bvVfn70u&5Ei%mGzw=E6*0{JrVOk#F~7J}>yJ41&#WQY7}mY;b&D6)vqQ50gEt#j_D;i711*V+26SF=>$q2m+o#EN#N|+81-Nb>LQfNvSSu*?Da8}(J zhnZZICMvzE%|qix2Dv0@3s=`Ryu6r72&i+~t>sT|(p+Toyt)2Gta-fh%;ApMy+V;^ zSWOZXkv3dw{0UGWFB7xazBrvB7OoF@@v9GaNOIFPpHZ)zM@?2*bVqeKK8l)Rc=Scd zbRL&(q0Qq0x@3P92JIDI<2wSmof?Ryq^BI~q@UkwEwfr4)4ka{`pja2H=YY}_r`aj z7OCQRa)X%6`M~Q8uRnWmVzZDvZu~3f=g*53edG$^)u0=8slm#vFaB1wf&Z{Ln4X`w z6##G~IeKjvRBJt$BL-;nT?uA8*p>}psx&YPjjS2_J>yCJh@(V58y>8h%F4{5tz^2H6y%A&mGX+1Vl%~@ zr7w@mbj;N(94n%B%LTiaJt)PzA=QjR_cxLiLc#K^K+x+{ct;R%glW<_YKbqt?-HcC zlbfJ!xm%EenJ@nhT5A(PZ0$#TfgTW@H-MgNWe!A zgz|A&DulWZa1&MHc)$CI@?k%?XGd~W&qT2Vk4^gSdEDbOSV=BTFh6qm?NLPVIQtoO z?WDq31m0J9?O**v29}so%@?A-`T+*4T8$*iMeL9Ag@d2?0c@x%8u9J@yWUT;Pez{f z+eYhJ+=NJdKV) zo=nk%`TS-ue|i}4d7cc5u==U>Js5=kZ`L~~VCJNW;KH3l1qX>;cDA>*Z zDu3}I3&uu4Fikf_F2jeXq@UPFwd>u+ch09srhqWgK#UK%Nu2Z~N)h9Oc6tg`Qvhl@ zV(y`@$iM-L>d+8O6ezDXLP?!6J}E1kF(vvfAP!ZOWF2K*kXc;i0x2_B_o{Akrtxf4uFMu=RayBfQ{dtuk>K6q7D0-vgn_xWvnl!i0!@_R!>J=thu6YUyn78P`OH zi6YM5$1v8!evrRS5(_0xhPze+&!L5Ztjg2Ml zAoY*;J3M}niIP$T0(87=VjSLH^%!!KWH6cCHE=M#7d_tDY_um}#*Nq6cQ(TCa5ud$ zJwW0YhtPg(rT)7J?i>0;YM^D4PDNXjoldNeh9!El#9p*FnjBi`nSHXQ7bl&qv^aBi zx4o=q57p6j`K^l8UpUE2yy0{!J@nQ1(oMj^VFNn))rZbsH&BN1|5bGQ+45YsN7;25!S)GAt$iF)qi&CJGA=O!IxPFge`u z-T+L1kcO=mUVI7P%4Uj5k_C(S>#UNkH0#FQt#tc-_HEaDio4Hn2$@i3$$FUo!5!~X z6gq=5vKmmg3!m?@Qg{W%Td* z76}oe%QI+9O8pyb5O5yoP^U#D$!;y>5!qVSu5Z0IA(}gtrhdK`V6b;tNq!PF`;7q0 z$6nhHvOFI#{7747 zO+RcAp~FA$cCdXDr^!O{VeI))dvA+)x@T1$3z6dT1jB|k)`Sd02XCLA=xD(B%K^fM zWc=yylX$IpgF1XQ)>$E_z7HHZY~;a@EYNh~2LP=-T7-z4?6h2=Ac~6RMPV@VQIh90 z9r~*!u2Rp88P$>B+AD!hzt3g@+*ixS^1uB64ow^vrBU&gEv4?uX^-X0(#yi!%Cd{7 zS}PLrv=OD51Q?%g`_z92Q_v1V>#3?^Dof1umks6u|;;Do5zi zmL)m=ebYpQftRzt%Psa1N%66%#w~v>)zNWyNwEOEu0NJC(37wf8S)qr3CJIKIm(T) zsIoju8#gav$Y6T+<+xcKN18er&}%dHE&B9CoU0cs9vRsRd-k~QQ zA25dVPmdu3_CRpK=Q-BupoICA6v{EDiPddQaLDxR&gcGp;>@E@aly;y!=q7vz#kW# zSNJ#2t!WvYunBN=g!yuK{4c3Q^Km}Gxx*wIzW58| zwT5s%gwI?<&yCYFUsXOGyrm8KMec>tpUZ%EGQ+lcw z!M>LouJg+MFs?{fQ`NX3;Yk_iA#sJ-Y@;*dG+R!yBN28=@q0a85|31Dm&r@s@U9n8 z&5S(>#pQ*E2K4O5M(SB+Pr+wA= za}2umrA&Xkv%{nK+xo3rIabHdmDL7{W@WzTb|bI_yk6HA*mALy*wuZ=Tf9r=D>;|z)vhIUXH(k%cF@2|l>5%~2s?F-RbTb*g`c zml1e1C-fhr=YKX${{=6}(rorXEJC&wwnAxm3_1lH^?WytM$Nv602@BXLaNvZhevxM z&^tsAej*C+J|4l*wM=!C1~D-S=sO$o8W zO@4B%SxJc{w@=fdM96ng|BV4$*l2N1z)6io!AXaHOGsVNqqKop>AoxXaG<7IW_9S- zH?lrXBo#KS@uXpb-=_k-5<3{u6BM@z=d;SGPG~A^v+riuSFk3=qRu!TxG0oFemK}% zkec8bR((Borl^Brpi^J&%xVq_zp02pTqTL1u$J>^yMQ-!4wPLyYFL|&*<|9_9O0B68UgQS2iR6f4+AA}(75Hc~&! z{wM;ac$b`L{}WWk|1VJShHR!JocpH~xU zJ>8ftYAVt9G49WXF`T8&i1-~mxBlkV5@M?ZfIdQoguYa>Qwnqpi;WY8yfFY!2FIso zF!@CW1ZC#M)A(BgNb}1=N!_hHV#@2B)ZPQN>RZhVQRXFWUAkmdO?};iPYaR2(vRct zf&Pg}5gO7?D?shnMRpoYMdZ>38_j1IkIj8Xqgkiw2uuN5?^7I3hPEBnJlUXCaL~^|dtAwQCfD0fs@Po2J+5cW2U=eP-`uGz zeVg15X?q|2uvYmpM2a(sNVBo7^$`$_cl5C3X|;Wwm=yYXo!t*h!8Q#(p>~c!hHBUh zUvFI$qr&%3hP9i+DG%pgmr{-Zg|fxMX9V6V+bmg)X|cRL%2%dvwBAhX=b31KP4L})$Q+sTWO z<=D;tYm#bZ>MIOEDEk5*!07hy@>pV6P)1BK8~C=hsin}OR!CPV4-8h6NK+ry1E^6i z0aS<{Ki;f*1tuuKL!a^?Q)CbZ)+AUlAM^1#q$JU|aa;5R{dI8B@P0s(OS(15!kln6 z6_#QdC+RTR4@2_(N)2v`b+fm&N#ycjAY^Qwc@;cTSWp2AGAZC zbzbsxnso~2=`Ry&osbj6v)btE5Zd!1?s@=uVwsbXCqxh8llgjR=Pw0Fu<8|;1_|wS zXves?xE$lf+hTYiSiPJzpW4!t>pGWSF7!+&i0#%BJ$v|IY4Qm;rnW~9%;)5#`3+Xz za;!voL=4ij$r=*}+q=Z`zZ-RleY;HuUr?Hg^j~`Bz38_r4XW&(@yffyvdW(C)l6ht z7kUnHA{lBz`Q3zGWk(Z~ilkV++xsiKMQA6Vx4|*5=wX^De(Hx7#O|LkEt?{Z--U|t zmyh#+hL`LHppMI3eY~#ARI_b6fnyh{|D1kk0sk94@t)d_2%-4!7d;V+W_}0)$PEy| z1+XwXnd0+Z2e~+2eA7QjA|9Rlk-)rbr#`LhN-itp5Q8LT0pM~Hc;n5j1*x45SQr@` zq6G2N0}6%4#EQ^F=$i$_rKT|?_?ri&=fpv>EWkFoB|bFKR-TyZ%LIhwyP770e3z)= z=FZnNl=YQfANnOAJx)afqlWHCfaBOCPb(4#?fAODMmpq7oU*tfxZ?DAbC0pWXLf&& z?9jXYcmukG`F%$xgz zW4ep)sR>)9A<^MKzY#POdwzW4hknz$wyPH6Gbrv=x7VReTaz7iqj48!>P z+14WjF^l9#k*(tODDm%X3*iiEFoqyT#OwTMUR20NoP_6~Nd#Pi@?)$D21$sx^-4CA zbX;~Z^dyLV>p$tqe@#Cb-fkoBn#8bg2tiYvtY%R&N|kQcA>H_CYayc0b+-5 zRWn4;n6&s8u!P;UAi`#2N8#PG-jgokps{A(d7H>*6*2Z~2>V~fJ72&Z# z^#^Z-;AR}Zee6~cmBBpK{G-cq@JW>RN;_lw{ImMY)7Gl0{z_##0xaHX8>*j6VgnUK zGzU^$3``k3?Rx^xj|dJb`OvlJLiYoEi5$8505D-;t7fK{k=2ikuF4M1pG8-zko>oF z$brkz1AhR6K09Feo+u&Cgrw8!x^9)7g=$hz`^aLS7#Q$A5b#a>ec%%eOnhZAyQ3E= zv%PXL1P`!T`^1SF&6#7X?#TbF^5{X~q>dlo(V?)Dmk;IDasasm^};I# zTa4rV!!zbFxiQP8=xRqBQ}39EB}+4*_mP)L*+qB%BSBvTg9(lQU>D^(UX#hON`LKX zqdA3$4ZwU_o`aZ?rM=Iks}Q4kOk;~P;W9n7DegzsB?Ki8WI%l#4Fr%{6LwhdBfFGRccMGmz_5!Zx11Iy z;jt_aaS5PkeFCIV)tIKEu6~aRR{MfRa;4!=q0a7G@q8;t!K$TXmsv!!&EaDE{mZ*qSl|@qfBVfiAqjz9E=y zc|e$OyK6cgKAj}ovruc0fruGl#z=ytQ#2d(k}!tR46=~Y3n2e#u6|FJp)i-6UvEn? zUV#v9Y(&#M(-#;162BjCcK1>KJuDeaD4f1BWlA!p8BQ}r?YwvS~r8WeFZ4&#~Cinjx@j2;ItM6x{0rxDn&N%Xq<%RDvHTZ^)+aEX&ac2qW8C zCzo2H+%bxta^K6XQ0GS%1t)Rr7bHyhsd~u`iDnEzace^ig8y-Oi?E@2k@n4D<`0AvrOT6ZjfA^xMJsYi_A*b zqPj-03JZZI+ZIz`S-Wm$e78-nNmsx6paFW=V$`5*;_H-CbwBaZUs~^`lKY#s}@%fEUEyr@dO9n{9p>x$s*AonTFA@>5h7NcH z?tG11XNc1fNhcjf{h~JiV>}4w7NzsCwqQ7!&v+;U-@X8pDEMh%q~uIVDhuu})y`JG zQvr~P3$e|_+|A;+~Uywe+tR*Mt!Dv3>rIHA}x8^}kI`zx44`;o^NLJ>Xo%Wah;{5&uv`Xz5$;x0nr+#I>|Jio=tY~ly z60md^Ta==>`dZ3pl&0O|dkpINUKI_8&NBbX`PA{gN5TiH--DhdyX!;_L|^@X(_`^X z(E2FC;4>-z(ka9^5y0c8Ln2*g}?7lfRhOnoLOdM_tfbdR(^T+Z?hO4Qu)P3mKCb+K7)=kovn z$TqQ;flTjN}X7YiDtlX$aKsY`=onE1|hL3&tzpp3j z2Mngu+DSI1FOCotu{C;RhRw+Zdlg1BQpk4(xWxo>tuO!c*}T9!o5H_8o7|yo&kzdL z?54j)QA6jL}<|m{ZMgEExLF(GfIvCw+WJ54LY!uzZ~EN8AU3 zB{h5VrYVfLd-|C>oBR5QXa@Ft``mT@3f%gAMoap2D@W~B5_ zE6F9x@&wyfrk91}G(^^_La9%c`x{V-Y^X>r`H z75nOGixop(tZYs^N3Hu@a!n;4$|d53;3|DxS{zcJ8us<;RHZ>r*aL;e^4U7`FPNWM zW5s-v{rXU*LQ~~po7>sm;;`#VK<9t{%=AW@Ym8F~X%x(yF{5(5PoHB)yKr6JP{yBU z(^|hINV2Q>j=4sF9U*cfPCkeqj_KF@fg7RFe|J-d#jmD7=V=;0T+dKm%QV#> z!hPE8o#*3x8r#mk!UWmR7fe(FYkfHhQnk-E?>lt9DM~RPdRz>#bV-@c;KWYrP6+Q_ zEq)te#1Bt)SWMl@cDtwD2MC_(V~@$1dQ(b*0=evkX04g`mpZ>0!Y;2l5}_!RpU~DQ zli1@3m2|E=@_)$!Pz^<(T#qFnDPO&@xT&1U~rN-{*pKas0O<2@Xd0|V%PVB=r` zXaQWDm}k`oIQ`pNo2!hCY?DrfJJ#;s5ft{=d2|3@6Lft79UE=mzal8m6gD57WNR=2 z%5qhTSV?p|=9XWQ6cHenAVQkeOm0qjeiw=-tIZ_VQP_ytUefAy|l^H7FWErKNB~f!I>wTLzV26|zo6 z;M<|NWQz=$RH3sAiy+mcp%_*VTTqcIl~7J;9Q#J7p!&y0TAQ@HqU#nC)_p zL-92y0I=p=eB%>Y*4^56g{z&J|(+_eLXrFalzh8bJYQ7{<*mg;q zEldseNo!|0+xE!MhW&25k=}iZj;><-6?8niI34WsdlM_;J$Jq<)h%)zKP1cNdnn8h zAMYq;$p)abgEF`&QKl!@bpWDV?mNn*`l1Vpjl#gW_N!n(qlS@jwgsDCSmS2#I#BD! zbE%+*Ntbi@9Ny1Ug9vdcWxZtz!2v!@VSxO&r)~z!IM@OfQn3o(aQ-gv;Vw1;A zfjUFet9YtGEj@|AgJ$D+^elMIlf8GRFvWE4MNz!vRI`*Di6F&BtWPC)!4Ri*Vk_%c zNt0<9-b#p8$m^|-H2LCm@_u1KdzZOT1IIK}J|nVqx>yWGwHJ{k(6ke;cfC?t5<6F9 zncVOj&Q{qn#DOm806B10b5ggI1*WJtaMiNMB<1R30?w3lMKLTqp}4(5S(vGN=M)cRd;;rkw*Ykl+@n1&EJlOMcUztGlc z7GhGuY{*=|43LPIQL=U@yI~=IeDy9I$t35B5`;~3a245zmQ`0P%JKe^#JXcJ5;U&u zba;_v5RHC69Ykl-IOCNO5kG!6YjN$qebuN?r$juR>zvJyjbNhq{1f5D)iAoIsWlM0 z@LVvH&DGNH+K=DX6kmC}Z7}UL;{zWvME%)7NhIC^xrJ=5$2~J_MXR+q53lzt_dkgq z)VE2B%A1z)p^vi4CY*`f_s7KYy9l1bzp)Aa5QTk)51 z>1a;iB<7ZX#J!RA>qIP~O5%F(v!2I~v1H{ZL`NSaWI??HJ`y*%XQLfI&-Sx#W5^}; z@vHBAzAt$Noe}vJ8tr={wRlA*5{j?FNAjxezqR7!oO%?KxZQ=!bim@W?p>vjr%(oN zpoTFL*lk>XPYMO1t&W=)+^Hi=f&&F)a`u8|dhW*=D2nBy#^c=lAlR=%WDejULVzy; z%0Q9km>%0JNScNXQ_pRHq!@7Xz2&I|gg2=&Aj_NaxXc{<0rGkG7u|S*o47cSuE(LJ_QwjqX@y9`Vfm2Xm027gtIRIA&DU?(n zM?!Cad~SJ)$CZ%_RR7qm+IpJ!x7v*Y9@meA4s_FM2~E&3#cCV+hn1!$oc3>_S_VR6w4vjT-%S!_yE@3pEC?7;G(9x zKvyMSz=mf5UTB5@%M*L$D3%0&rcEq4Ub#(RAYJkJa3U;`UEFDR)hOF~ zf3JgGijBvgoL zJ-4~%_b!v>mky;|1L8f3*4hd(WC@DZCM9sb2UOD!{YsbczN+egLo9k)0~IF;FnVvQ z?L`OZLe$mNCs+~CDJYacd~55uxQrj{%a8qr1JVNXm3)y}Z+RL^a-Oi5zh|H2E_hU` z1_S8W{Lm&HY)sBF1sZi&%=d1o6pA%-+cj;xT{?1U9(-Bpm^{3&C3@L15n1W%u`;=< zti8;OR3GKrj?1;oN0I*!6C55Z%-hVpqX#r5cr@vFu zO6y?`GUoAw&A%w=EeB4YFI+APfR^*KpA`RBWtBR&3_cx9nf*CU@q3H|-%FF59M3?d z`;P;^u((Ye&XM%q^@v{u(jUwZ1D{G38CXvv@BVwOkV-woTtvv--5(TOAXSIb`iu|K=eXR_x|(!X&!A_@MPh~ zt))(3Y6_)iZoQMGu|6;!WJ|&n2@=n4H1h_G^VwCTN}}LB-omQu<6F2y*gkaX%f9xw zghccdU}czG_QP+Y)dz~z*@&UUi6yW5iW8Ezcyo8;p8GIR7yDb$a+zoQ=fEje1G&qK zXoFJi$>CT)Qa8VVd3;SnJUYGZ2f=Kp=59Mit`NO&@Aee`2=?+8W=0bop*V&1n7-goskEw%x zX>pGr>$z%=9%mMEXH2u_y6L&Tg$8BqmEXQn!=4FSaA= z%`W!?rtrh*s-9jU%I!wj#a6S#L~g8a?R#FN>j0va4EGvlEaz9tjqM>kkfGhuZM#sA z;XwM$fIv7>V#Bup<&Kfm~baAqUeLOB!b92{gyJRYtwK=#~4ew@N~e(>xIx9v+Qtiv?J zRj~O@TYj3&!`kn&7FHMMl&_Ovu5|9%+`R2xb-ymDeZwcvD=TE)Zi^R7HX>`G1Fp@} zktQw8^9tVfSDVSz%|Dh>;$e?&*B!Z@x6l#>c<=R;Hc2S%1>11n97KJQyg5XYdv^nh ztQIA|wPAfLJ!&Ib5j=_cy#)F;&7j{67-<812Y<5D#(XVdpAP&90@|X}aStER6^Ans z@A*zqcITA=gZ{76y@CJ3*IW2S9j@Ek-x&rbs1b$^=>|bjNf|;)KpI3qL^>3a24NVw zyKCs~kWd^#S{xA&kp^j%7BKjYd+&43KKt{Y_n&yybKmz`*Lv5zGaXYP|NFs{i{P`W z_FR9&kG=;RyY_M*Dx^QDB#ygoP=Qoz&-eSYCEjWN9)#I{<*XDrq!JKzJ2)5-i$KDN z4>C%$fOAjx)Hb?7km{H}k8w({$QoN#b0p#p4j{|j3*pJMfM4+fQ}6C!$*~qlF#tr% zhYoM?FM@Nr1*g$TI5V0PNEw$wympNwmLFI^-(D%pJgQD>wcdgX37a+)D4!SnINHS2S~DglvK-r#{bgJrzkR_&oQZm)0TmDNxq&J<5_cr9$jY` zmHf7pSh&k2VS)y%_-M0a7y%|(M=e1#ZOT+`@AXSt0}|@ZDGy6}fm~k=YLO4nYim|F zUP)`qnk7+eyj+qQ-qXI5o#K{3Vb4UiH%>YJtl;b9lKhsHYS4fI0&0X~4@%S}Nxnt} zM=jI;M(TNzc@zYiZ&C|w-$hH#p@M$P^{H)@zq^K#4EbzRe)(>+o~$27-lYR$)u-YU z8)>Kz=C6v{7B}BZQ{c+EURKbN;q_A|9+n>oS4jm6_2#Zy0XOL?SaH$A5yrvZTE~wJ zi-8Z6Wk*o(kPuheHVMeoGhJC`M{Cf^*s1AyNjgf{blFLx(3re72xV(R8}$*D*qS@d zQ)>2f&*&cgjg$!OU<>;W(|eCS(-YEcAN|z4XIfR=l=-&C?&j#HapUEttkqr1htjhq z>C?>>^1Kcb)pf&7`X=sar9;*`rk5zD8!ork+IY%FApgT+`QbkWugfexWK4bCG=Jk? zXx9pTDIN^QeHapORf_E&$Qh$Byd#FWOaw(ff?HnAo=NJBkXY(kbBcclb0%U* zzK^_-sMFX<+9;5#_gaswEQIhk@!-r9uL|xbR@3mUl3QA*j+KSX zv;38^w|s@Ns_WbYsz()1tH^n1B!p|*SGt2FCFVt_7`oAfAGtImhQAyV0 z()^0+4(_7K4teJ*d`vJynDxVB;l(HZazmBv??D_cth1dr!(rc(lfHEZ^b7TOnemjM zNg2>+B~lah4K7~JZjjq8x>J8u5711^1nEB3KoQ(65dge06cmx5pCAP=eRUAsbvmR< zZ0s=Z>aYDba9)W66obvP2E<#>LZTPwMbuNJ-Km$$+5&y=9|Yx5Scp^89_`wVSC0p1 z5ga_wco?OYs7BD&>%dhb9dg&}QxAS9O2W-{K%T-DuO*yGD0!NkKfC8X*PPWW0Df?) zg|OX}^e9OB0d?tOvz_wiHt1OlRJeD8%XyJ9Vy^7y>&;K`tJ=OZaf+7VK`u{zt8Nf` z4jM1oKlN+LNM#p%i{7fbOm`hbv@6K&THlfXxqCU(lJw1H303H%COrfa6+r*i3;aQUJ3_Z*84Oo~8 z2qG~QMR=7E^6HcWcAvBBQubb`fL0;mFGRt*&q0qnpS^@v9&mzfQZ8pZ6@q}2qnX1vFm%sy@#PXGa zL8UezDuN;o9-R_`SlWw^rvTGa;)iv-XkxPdPr>`|j>dlsiyC@O87Y(bUsc6hA*n7I z?7C>MK;|7=umP#B%{qL2NRt}%6dGq(3NGmYYvsG=nC$Th%Hy>eBCn-B5$U^pZ5VTn zf+I+f$9{ewOIw5jlO2{?KC9j_F8tCUbvjj9J}Xn5BlSb**Hn^U2x-Dq3Ls8Mj-QE) zaF?FUkebr9@YWX&J$mEAC7jacCgOK1f3V%v2#&8kz}3!P4mR22=i-lGxgp3$Si??D8*}$MBX{F*5 zwD*0sQiJPKSda&%np?&Bx3QCEW_oa`Td1?TUe*-*5M8|G?;Z=^s7aYBI@0H)Yjlt$ zW5aK)q~OFVft^{N$Zz^U{1mUvgEJGTQCnEpZ_uNs9iQ%dO{Ygp*;;us&Dv+5v{Y!< zI+={lPJb&b@pP|svA^?qwv)cC?Kj@uxpKx_Xuqk(&=fkbJ@S9(eIxtkChjsfWV52rrB%YfCPl-#^iXQyi@^kCX z)6use9;yUZBDc3XTIBO62}l1kZ)`}Y5JJsD5uic@hb1I>()$NQ!|3CavU7BOiP-DR zN4X`X()m%wg;`~_bzBv$w$;V;ZKYKH4zRe^7q1ggG?fldYw$xJP8MnQ0A~2TXGgyW z&8vw|Hoa3GG49>7E9l84@0Qgq1^T{q@5RCG1K}@kH)amcgb}d$@0jHyII8Du9*4pb znGma@;>Tj=efp}=)w_uh3=Qc)_35}NK6Z8HX$uL5vQpxq$^|oPs5qCVV~XmmqT7LO zXQnXpy@w+$la7BV&*X09*YdKw%TebZFnFc@Q=wpXk8{cUlj?iP#;vUq8?OuRCrKwd z)@DpM)G_AP^@XTwJ@MU z`dBO4g)SkrSw6p)+{Ml+rw|bTdGG$_3 z&CRrY?1N3(xW2lQ7=r2`N#?bI@uZ9@`eFg&Kx96gSKk-vCtx)^mZ>zbS)8$Dlwpfl z)|OU+Dixjekx|w(@FDD?-O6+2*TTQ#cJvHygxbVc_7<>kZLQ;E`|n|aXW5y($+0IL zAwayUUK*!FVsr8MLScW zgJn4DrBBbR$xmQ84#)xaQKf4m-DZwV{4Na=bDAsf7$=b=kY z;-XBnHqp+&RuzXB^OtOArCjL+iMm(IPWL0bs*Q9(Y-dUnoOmgih#o0}xHuMsG)I@b zzQV)-?q@K>;pGtKRuat1poS+r+-gafKH5STRUZ`jjRq-1g?X3{z^dCMd^5tRXK=UC z{MqGRn0&$=Ud0%?YB3IC3`^kUG7bdOKVvjPhs!Xu0m5AVjD#1c*NDAVvk>G zgtU5b#r0zoEtK+-Jk-H+9(%cC?~kyVZK&gKuCxpGL%-X4_zAz6mh51+ZZ7jN<}-cv z77$Y+2{a%tT1{09j0mAbBBM5*nbh@N47`8&OPz!gcuuxi5pzobgi8T;ag?#Vt(R(D z%-0&T-m&bQH%=7&wb#d>^lSg|V7e?FTYnw)&_g}G7qH=Ak6Rz>5(kb%Q4d6Zd{_*Z zUz`n5s62X={RDihe~j{Nii|h+;u1r7MS@B7)T1w46T`$~ z3n}dX#qBjj><=~cvC=ewa+Pe9yL%|@E zIc|{>4k#&_BN5A^2o@ipy*087zN=!xWdx{3D&k@phD`Zb$b!{1-IM?C!S8?Tpob4W zQ9YCm6g`Bwl|4c7@Us<^L-&qNw?qc}=^A2NYJ~iy8|eh36k6e^VC09%GT;E%HHNj> zB^4L#t$5UlpeOf#Pc2$dWZ|aB%;aUEDyx9v3nKYxwc7?w#Pm8tFRhRBHpJaKS=;z z?^Dq`9T%X$;5c|3sdXZi^A2!j0{w!>$DQvI`P|Etzc^gc01Q#*l2DQg0jg4`Fp$9Y z2$L_MyJ|#p>L$2Iivwdsu=sfGDz4? zV{y>v{abcdAk4ZWO0{R)|F`Kw8U-`;lLcVbK_SEpvp0>oLI8?AGch~I-aF!+E|8Ix zTUvH2KeCW2Gp@Y8L5Qlr)c~j|Y3%H}jB2qfs(sm4PXF4TCbq7BEEthu_KYTQ^zF1e zQ-Q~e-j53o-Bs>1#Z!wL+OQS(=*i9RcbDH|*5>zq$c7(c<~mL<#6-{}yaHMB7?{D> zEQ3Ji>rkXd#Un;oMn@!2P)ibunY|tRLx3XGW{*=HLk_=?sj@%d=}v8BmHxGPz^bKw z&6#gZwXyJa9_+Z%*+M*qn!5aH*;Gmp~bmCDDIJ2^;{=^ zv)9rk;x)9|#PrT1KCH zZ@xKnxL{}V108s}Wa?h9o>QMHUP439j-jJL06iny1pr|-WrKtM5Gehx4rrX~c<+ z4S{30+XZ-dc8DJj`s+DO)lGIRW-uqSE`@_7_msWv zmsRFxAtyA7^E5{U2eWwtItl}xZVN8^ZhR742@g&tfU>bSddkVcE)JWps2iPq#X9E| z^N}fLej91oP9~M`7{Bd`Lb||DTS?VI%vF{ARG{q+NWGV=Ys9&$zf$G; z3Spssxh8)0ho3frbOLgdxw|<;mZmSF+<YQImEylm*OZRFE*a1XxouwmGgPd@!;x)7jg_tf=A*pzR_Qw%~2$PGj{yn zZqI`$?|$!QpcdXU@JKx08BHO`QFrq5_#KE*=tgV^$`vRd!3D*iqh=GV~{!4%9>mV=%cOM z^S9e9g1@eKaUqmkMbe^7LeeiaKxMuUO}n-V6XGM)GUteMcL9;KIFQI*6-kiC6upT) z%n1_Jikc(gL77+lua>3%bN`9q%%UM>8oc{Q)#)^*R0N)gkq=LnCNs?!d8C2K@=TUS z!WPB$Ki;{e)0F6f>Jf($K;o*&(hQlntKJ%zo7qXy6p3Z06;Xp~)&@B|jCR)x&NSW9 z(Ye!-oX=2+TJ#jnB>H3AV#VTP5XNg^1j%yJ%B?ZxtNcmY6&vzX_r?Vyn+y1J`I)u_ z2R++pq2FD;zz!YB0xb`3Zq41dB%-98Z_ElOFj&cQb{7al-O1qI2`aP>{YdZ8@OzqpYsz$awyJ_Nlcno- zi)1Jv#Ay%vP=^ltcDP47c)O?E%o8x;T{d|xJ}tyfhoJwm4fo12rU^gB{){b^e;a9( zGD1`CZeC3lm_68eo>mzhP(eAsVA2tuk`aEJ^PVpUV28L73UgJu#?N$*-D5iT$yAT6 zq9D-hXMg~2I#~c0;{){d(=LOh#{G!`SIVk z!vn%UZigYV^V>8GPuZe>^RTZXwH^e=xg6m=n4fDUl8`1t3hn;_`9gObszanvA*%r|krD2++Tq8YSY& z)De`-fF_%9d*Hi|!mKnNDt0I*=jV}8(F*jiM>=ZWzQl}r8h!9xGr-3wy#VKi%1XSS zn^IU=rB-ZXksDs!)O;(m&axrDrR$|E?1c;9*!k*B6;*;KakCmR@Ghpd)DQNS@G%PU zI@=!z>z`SEGBg)JV?4gHZ5H<>U}1Xa;2vr?daCj8{PrwIITZu8KYxyYP2IBMy= zW8<mYI^quiT#ebI#@)-9PPqh_$rpzP+xz^CH8j{t5X5l3W;<>6?%2oPiW) zW*=`V!cD}yvf@7V=ZJc*TkAjDv@E`9d#m=!b$ZCAR`Ytz&6up_X3|b}cNUMwo~<#t z2ftZ-thi`SPegBBIi;Qn$#V9nvkvimK{T(*=J$4be+A!kQ+PVp<-12d_@W{H&j+#_ zlb>10-2evQ?6bn;hP#zQ;M0-Qh&N=ve?#YBVD`qI3kWSEi~|m*-?t2*vL-PKRi1nw z>_<03!x)Z6o+?6rc%F_uYGfZC~kL$M_fmW71(&b zn#iSu%2Nk$5)aylJ2_3j7o2iAQXL$nYi!Mn09SB)iRG2c;^ne(kLpi1(Uj(6u+1lw zVg+?O%IICQ_sT*AA4}O^_Dpx~B!5f4KwnO;c>Wl=O zl7EC0rPI9sQVw=AQzB~Dr!AJuiF-n&S^3N=RV2|eiq&=JKsB~#LfyGmcrJS5Qu9Go zSiQ2Arb9xa9RN31&U6#cv6J= znj6&L6pDT+XVIWbN@nGP=7#Qv6;F?_Dozz-pz+c|9FVnd=aLV9z3uFVP**h&}h`_-``fU&Y+SQMJ^=_;?DDS`NJsMzrVlHin!QuS9o_ z31f511OMV}K;>h?;BLfg9>cZEv$~`rV+HVaPY{_@k|mw`B2Ao+%1)MU^!-c=IzisP zn^KQs%;h-gTVMkhm%Y$Y#BV&^=u8ExpCYK}(WBpD$SztRs|fMbRYd3z266NTiE!Y; zuT%_jL-gz-D6BdEqnGgiQ!zCKfSA%>00|98E2w=U4U)+DL3JxQlk|I9gBIpO^4=W@ zr|)SHb^N(NWw=}wkO2_~gf3TxBTlc9wxjHLr`$l4o!`^g7}vQf9kpqfuI41U*xlrf zd~2JoN9nYtB+2Fod&CUNbReR_KVh_8+212W=fGm~j(xsuh53Fi8!Ssq1le1Mu==qL z`3^YLYSth$JhJ@O!%y;bE6=FwQw3C}aJpAsUL+TAs%$7GB@&)Rql)WxH(?-Y{m`<> z@Iz+M9X%N!&CAUh?vTxCcCKTBMTHc7p1u8LLo*Jm3s4B~X~K2iQ<3rHP%v&#vsU$5 z#ACuKpI0KT3r*46Oord!b%Ks%jU=3Wps8c6rmP)_Fu5@mqWZhsxJNUpCAl@VA)vy5 zA?c%NlPB)_D`E34-B)M7k3t?A*=rxmjGSp0#Cx)0Cu#Pkxv$p zGeotNx|SsW({1BwD&|psXMWr4MP)r4v+(j|51}x<0Q?*HA+?5@-Os)mF9jj03Is2%5gS>V*dxby}obdDU&V; zN$-IAdv=`SdJ*$;R_ z6pfz|K$S_HGY#nrG);?wvdSA8#i}B008~&@XBQtLrP_`r(Cy`$PO4OQn!16vrTIAf z+WzsW`0n=(Kwtgzf*r9c2sXC3Za1^??8TRjZ$_wL>{`e76D0)GCy(Ca9~biamDShc znDHS}E0i_L?>KrR1X*{hKfL4YkKvv$a_=9%tQre;z9cmBl^dVPqIPjZ#PJ|sDJj&r zt^f3@?U>iKOVc*1>UQH1vYcnXe8o453so+djH0ep%BRXflRW%rdX%tK+4}O{8$t?? zMP3+_+Z!Z8v>v{>5ki)-G}7V};~1-n%ouFn7@GJJLI2&r%)iz4)y~IU%jUWz`gKye z>ghL&2dVPSyAo?pT;F=M_?+dM2=mZ+i={J-etr+!F;OHicy13H3ek9d)w!N{#p?El z$97#%3`K{x@^0R$zV$LgRP)T<@~+DoG_7C;o#!XKDgCgx!jjG3{@dIu2C_wqfII8! z-cNwUKkVniEL1Hoek_cH!w(my>S=Jwf!;s$Kxk<2Z+k6_0V@G?;ZNolf}nd z7_gK$*i;YZhFPs8sgqS=lOYIrR5C9zD@%@M?)Jd~la^#g5sPUn3!-?N7L`d2FW6=NKLHp!iE?ui;V@8$~26+?%VSp+#lgPFPh`^I6=ZT z%RMDa!3ZnyP#)8dB+K9kgov(%RH_nq+7`pb+!%S(`4E{g^sh$AB2>Bhzc)&X`Teu$ zVvu-tR20B~wwbM8A&mzv`B*)yV8O6L(L~0>B`PFgo^?yTSF|@6wDJ?rE-Nl8;)e!l z^7OFNA{B*B#KU2~<|uk@tBKhE8G9v(Ewqw7&o@pKklqUGXwadeQ_(Z^dF#o68Y=V*T&UZP(~2quG=D%59tXmFQ9fkZqFV_1qc z8Z^@r45WjBrM77tv$3J^t#w9PJJbt)A8T(V)yqf;qqfX=Iu?#eDCI>E$+NfdH>T>N z>1wPg$#3VTqXEBH&P6Dq&&Kbh8An;`pmt|=g3P+POuIJ1aCCNDvn?*C)P;#Qedb-d zFev?)i$*Qyp6S0I7})>>u<{>@x9ccP#l_t)^)F{BKBt!xL{vPU34t?HxgH|cy4LJz zU(wYpusSOu;q>ojbuGgtrvG`tU&X7BL8TtI{h%EDO5Ci<(le>~-vVH6y2Q zhjUR8RrUZ??Z}6CM5XJq?up4cPpY>dPk?D?e%*fhjRQ^W#y6YAR4>Ap?FG$a@A zogF3~_9hAyH@Z0P*|sYR-5np|Q<-%9K}yn=q>ETO3B11*^7F^S zr_P5q zDDt@i1nGdF-Q5yEx}G>XrlweK!wMB&R`wO?gb+S;%(tuMaM_VH z2861R5`&k~J1I$C=Q}w08JXLqec7EP^|l^J=O)q3&fNMWrLN5jN)~`)moCoO7X(29 zO`v9>JP?TJfG-6|$ar*>z+^ayZ*3R&t`zXT*B!OCBlbx}@UmZMefKj6x>gaSPy#?8 z1rOa`=LYzalF%D1)xD&?@BF5dvVa)?plFfUFpxSc`AYrZYExchJAT>cf5B=fWiv8e%UQv_+qp0Bj-6h{|={gKuJMJ@TMryd1`I(~}`uL@=aB1}*ukmSJu5Rwq>Flosq4ZE$i_Y~^dVny=?hoLTd3_!$- zY2c1Sk1CD{z2(W1$ELCG1wCNu3-MpMp+>z9#?R!E{Dz`Ko zedmy_(e33gJHcSVp8Uo`injp|6z*W)&vb$_zdzfAF)o3gaCrbTk`Gk1(fByk7Esam zQ5*>3gq6`W#PaZhShl2ZDS~_RzsXi22vBvEs>7HTWgEGt=fO7?TAq)mSZE8IzAi9J z0j_?rW?39En7o7|(RgJIo+GXQ9Cbj!p0=bDf;76qd>kfn91NJxPEuou4qiJ)qozEs}#9Wl-yX|1%Wt+s;RndxOdX^7OWv1S;Z8IU^{0N6h@#_=JRpDbm9< zEtLQ&_h;cr$thwee^-Mb`ry>Od=Er=fH5p5v7n;TpeV+arVLxv)GS@|*fcwrxbWmb zWW2Z+l+gHUpbD1h5EuMr@LdWjy2p;jx}5MS?DdETtbcYngo#+kHrBbaZIAe}?zOnJ zb7-kWLIIr^nI_rsfYct@=vLK5R`d0luYQH?8f<4D?BeZOD93B+JL=hF*r@D5#} zTx)-?*rAS4yGSl^py9e@N^5c>AacJ{HH*bjEGqRopHB3!x$4nb%0oi7vJw54a@sXq zzGlX_^9U_*86cW8tmRsDGQJz|%r;3+o*SAMJ(6>WPl;t0glNHaJgXc9I zTowWu@@6kZ{da`ir0B$S^OhWCLTh`<&yL!VI=6LudY$Oj^Ns?N7Gp75 z(N|R0)5e|ez0eU6X>tj#3#RA`V7dAAV-oKVdWN>aZ&Q6g={`0Vc0k%2Q-m+(i#v`f zFAJzY(2yTIUjLlob$6f5|8(L@Pr=RHh4b?td-aI;0^h!X^SHs)3l;$X$M**%2oJhw zH68##=+);gf@uZXIp~RL30%l5gi+-(o2h!C2=kw%Md;nkS?dgPHaaUK0mB~E~j=!$o1WG`5o(3n%YaTpe=8VTYO0pC2E%sLVHnhfrPRFY~ z*33t*riNu^U;$-TU!^qjiDlaqL6>{$Z1(wp9a5wWy`HTsX|<8(GcIV0^b5rC-qBV-wp7 zzJ_ck9J9FtABtb=n ziG1^_nQ~>|rSW^w=LkbQ9!9ss`BjDiy%*eRVgx9H+4_a+*)~>E!d~u2y9J}JS^!Tt z=fuJsU&H0d(ao%sV|t`ynJjzeY-s$I+Y|z^stt>Esd!R4iGc9uBwV{j{d8y5AvBlU zGp_n*MY>^zj!r-FQBxY2TZO>SBY1BkP30orKyb-Vk*qiSA9LOcLbmY8QO(c14+S(F zdG1i_ODgM9>)TEdJ)zGWSBrXEr{lXByg2pmxNpwfOZ}WUsGhSV$^7h)!(0ks6Bp4- zIq4d{7?cswZu!zP%*|7;nefcRKRep!a9(U0 z`H0;i&Aztg!$Y!10Bu!i1*GkU;RByg)sjE;w2b-uunS%mvnR{m!v9!KzVC9qTv(6r ztAHCF3Kv=j6aGrik89KtexJ;F{~IbeP$+dL@z0r3e-1!`P?vbT4Ch!7hy1k=k&>;A z1|r$i(feM6*B2m8%iPaBuPJ6id?*v`-ag_$uu6r3HQk{5+ZNRHK8nY1ahUv$70F_T z%q1Vp!%L`T1j6ezwfIt)cqs9-9WF&TyBGc+4c8IGW8l9FSyDtWG6PiBUN?39DFtHl z@)j8yGa&ku;!n{6AcIr9;D|2-U!Mapc-yN|qnG^n81VpNqYq8khq~|LNn9h}NRlbW zLuMX9NtV?(0sTZ8);_lKL^ZbfV36BnFe`(vqDUDM=5F(dR~|hqB&i=}8f!znW~zD; z#~GZ@S_~7_fJ&R~2U(#?srjVUb*7h7qK?p&Fde_mL7Gxz}&C~-A4Us3@#%SFR#;TxxE6sYj*v4ap9@Npu zZy61sdC>sn-a9^_)Zp8tSoP9)?}TDQ1r^9{|9opp|tIuK{G*6sd=<*9N}$(^4BGbO|SJ#E2& z_5ZlaRar~BrT3)v{@1jH+u}_E;)hBg`;Bm-kA>KmCLN2xcy+NkD%^<~H25o0N1G#G z7XX;Vy}u&GO?rER>WJv!eDusGEIdM<9(K=Mk>>iN$mEn%F24ZRyBKUzT7H28!X-`* zU~&(|RaK*lG9T-^Rn)Y!O8aLSx#d>2b-$*se_)pr@_Mih0qd|Qx|)aHr&7iCInp#w z%%&iwrXAkoeO~n$E%6v1Sle-$AM*&_-aWKkZ}6OXcl1;L+lCkFXrF~KbXGwY=A+0x zv={#Bi5DQ?qJAj?{4kJ$G}WYW6^>XyN+UNLdEg;G_Ab))B+pO}+frD+o%bIRU3?IwX&Z!qabPd0u zYKrl4!}dK#L7xXaaAzaN8UWe`UyVk&615lOhrS5nw8j1A58KPrCaJrajKKVTzpr2a zq9qD8j?PaHW#<93Lf2127dK4M4j^^g590L5>OzE;M`|3a@3FLW1F7^B4Tb4!-U(B3 zAy@@5bM-w$GEp+FNN|He)*<|Vl2@qtG-p=AK~1Ni$ZLU3iX`?+nZ-g(`VWg>SN}-C z6C7+di<9UmrLl2ZRa_W^VinXjHARXjO{T{Ewi%xt9D6fvMr!n?S$WM2J~99+uE#m* zTia2w58Ru`_432=QxSW1?emr5-S9cWNKK_AOnT!66$qClz!kGitPYA$iS8>&Wwv%K z%(OEbDif64-r~pQ@9`sP8D)eJrO6yiRk#)*Y=zwrqPnK-fIz%)9Bo6`uf(qk-zN$X zvAdGEC!~E{1;W>T7T*g7T^83>ylB2Ih{u2;;~Q$42@@X_!4n51_!r@O3}T98hPt$n z`RPmOx}Po1G$e4wraHCB^vNr1fxCCMp*<(Mk8htAH3nZk>h&Y(6lMjuB0iI1it!IR z?q7PLptU41z=sWs=ld>onxYxY;Z056zcAKPWgu|6g z%bP7X^lRrOFw|_DFR}CdEnh1a?Dpco3w)=weKUq{@~&N_V|-lqNta^jbT#pvtNL21 zLZQ^$OdYs=&HhQB??y!Vp7h0L$p?O)tr{TyT%x#sd;}=(68pK^^6|gP(Zs79+LIsX zY2@bFYuf)1C@u$qSNxHs@+^Pe_x|05_%~|Aq{XY_*j4oJ6IlpMVr1-JQ9bI3~`<2w)b7I zOFa&F#S+R`3do9;y(eK1D5f4Cx^<-rG+xwBH+U+_QYG;kV-EfU<*c5>grB}HRqGRDwlYV21XR)ffZ)~Nb7B-RVF=ZFax1t zhbLS2N!lcmAXllm#XmuDa;=d1t(DC6NCKqIkd()wQpbD5fVHHh96jZjgVmfYVm_`= z*RImf7?~`SIj*c`+17g^(_>fL{2!wb6xagJ{?{l}X04|qVu1LUTk-;*`X=~qXn+SV zFbw&J%7n?p6IEt(K02E|q5SVo&*8)M&y)>`k$e9bh4@DrM@gjmpZO3&1Bz5GmI^co zOc-&e$43uyy$eXj5qEl?egS%cvDU<$oVe0zcW}_k>J3j3hpN>bo8g#%He_RZq>UN}YUs&37M7;NDo7&nlTKVkx zWpw}4aMmnji%4oV#v@zjjeRiqXi_N^SGq>sSs2RxTg4 z-ZzN?3Kup@QbTKlsh2J_pdd>;W3lAIRA9F~JJslTpY9_#(t)#ZBXWS}Q$zVgsC39| z0JAQivZ7duKB?4!({Sbeeaa&k^dI)!&>Y$+qLW?yhq=MOHj)u#5Y!(V~Y;!C}CPfM;MG0+&az>9g_=H4@rz<{! zUrl#=26ocvrhIn^1-Ic?nWx5=*l#$rQKU`e?)EQ zC9Rdo>#YCH^w1r}TF<{Ed-%0JN9s9&7r5rw{A<&QOd9c)$>?rPc|Pz`3*OKd!7C zdV1aJz?X;C>lvMhn#$qJ_E>U{Ytq!N9?z?b8V}#gqA?G^$fJOiYK3ds(I1R{?lr+l zHXDvm59)!|2#Y(HZlFkVU5{s%T;861-c6(Q7Ibos*H}aq+=FLQDy&bGX#BB_g>H zLa3=G1aAmn*ndLPpTvZKix<1WU9bmkisf{$godippLM?u#%_N9bx2UV^80Agj z8TVOla4h0?VAtLNl zMZ(-FLM{?V^JzdyWV#`u#s5Cl4xqe827VmtVO7L*5k4R({yxecrA#)uH&DD>4{?=K zh8Q_W(kx&i9Ywg8`|-e)12-Up#payitd~mYYLu$hXG&72x_mD(KGnR0_Y#vTlTvcL zR;~?Qy?VGjmwR0FToKiYI-s|r3yPHk3DatHm}&Qf(N*#XNVsXu%LVzALprK=V6`eiHO?P8( zaNMi&FmErmTy8_-o!{(X{^?lxtsleh0?!W%07?fQ2nXRiycq}6u25poWVE?D>D}3) z3j4PNH7h^{d?lLZ0n&>l{&*Y5e21#K5^Fs-7eSYQ!XLk1Tqhz!5*c{`ydD<#YndnZ zl`@0=TISiL1=y+oB17H@XSd1d8>Q~~--B^C7zx00(3s1R9=9i1X6Q8pPbg1h?q zQ8;_xX>b2nJv~jgJq?Cvna_m{IsmYq(vM4_1MfeN5EInT5U{mp^X*&v&sNjCXx0zT zY(E`)!|Kk#s=m|lGBWbRwVvXOkw?1Q5PM0!l7?+Rb zGPsDgnhDdrnksa=iQ)^5L2IU0thKYQ+5}J!FAWl!Z{$SLVX|xKwbHXRQ4I<)-5NF2~^I*4+5= z8H0FdgNJsYh>KLN)wNKjo893vtCPd7aa50mn3`KXt;^jGcchCJ2zpctqN4TgOjFMH zb_{S?2+W&2+mL6Xq+Txb=WVm;Ry#M{f&+qGOuK(c=}g|tyy^YznlIHBONBw}IJnEJ zZSIcMyFah?Pxrt4C&likAoUWoCTJv_>Ziqr0#p>K`WU7t0Ki-Xk8unw8BnQ8^n~=O zz(_HuZR=%fay!#y6pNpaW~5vq|4L+HUd2i@&n>+rC}W+#Pz*0C0Usx|5*ZREIwGZ> zAVS!Dq=Ke8Q%_P|=USs>(aIzO-)9?a;5w@JA^^0ZW9cov$4tm%?*2_)_eXq^wpr5- zQGA>%n2z6nsN|ZZkS;i=YOONU-eZ`)O2`OV zmH*KkaAxu)lN2EDi#8N~-dRR)Qm0rFifqA8@9kc2Kr)rS`hQI46?Pl7uKo(Ae92J9 z@#cn-YsWVunW46+Z^PC0pVIfMHRtIk(69FEmL7BeIvG{!2Ic3_P@$2%DgJ(3oP$@9Q6~n_8SuvW0%F`TQ)!%>gHAh}^7j+YtS45vU_#ns0t1jv8uW zXKSe@kI%jkbJJ(*p(!gJU-BdVNMEcK`QrqN<8H`oiN?iP5(}g~(CCrNNZl7>z7gN5 zcRg5gWd&bMj4MIgxxaQa^b#3O^8+cpXz=i&IC@FVpWXFHih|HHt$P3eQTNt=QMX&a z_{@+q62s6b(xrlgAc8}uw3LW+i-1Tf4k_K;-Q6V)NVkXxNOyxYh;lyM_r3S_-t|1^ zIs1Fg>-#5MKU{0Q*IMrw`c8~t5ysEntw1DtB!=-EbbQ}usCGEJ`=Qh+CdqqV_Oi;^ z4`ET_?l=QD&HZy?{Xp|Cc2bHME{Nt8%PXoKb>%#0=wj0CpZSQV5 zRV7W2Fueq;iz|WAm@5RoS~<~xut0kN$?VsCv-01@)&xPl7H$*)ro8&5G4=KiWG~%)eErl2p6LnO z6Bs+a1@07VFan(*-~#Uz9-Wr%PKFz=t8AZ=QCMW2mGfK`;h0)nQ!8Bh*c4Gv*YchV zmfdKU{IVL|^FA)2BdojkVx{%6Nq#H*FL{=t51Bh~8&^BXB#uC<497K=(5%mF(*R3rs5Id1Wh zj#h9hx^(q|bMJ&mxMm4+1MIMuXiF;Em^_yMJGY^t2xC>{laoPsYt0M7z#jp3%fzlB z4%(00D|SZA9iY!8IIGHx-t5d|My#Gzh?qV3M9*e1VYt+9-bTB95tg{b{zWiK)B+k+ zGZ3Tor7y-Qa4om;(t)3m)5+F-TIq64Fm!Ds@1WWP z!`*3HyrFE5V8-Sd$;|t>v?6`U^W)7w+(oa#!~SBGP0<5}tVkJ<5R(WFUV6g3I?{;= z1@aYr5HKl2Ux6p%)3~dKYe9ZOujVuO=tE_dFs`TP1K^y=f3sFT+8YzV}SobFrv~*_BBtKpZzr^)bOY0%CK9=>jo@UDS4JpT)8S zc=pyPUna(&^KUkANR@>h=@4V)&8Tof`}X-5D|F`r&G|-@k`ym%#(sL))b`*$#syE! z*tM3IS-uN3!t*jOzcdb#Sh_WQWIxDNiP z%icNc4a`iF_Je#=i99g83p__y;*84SN3rLM7(z-d2GliBT6jNXR4dAEQ%2fZ z1c1?b>7Xx0?$6rrqHiT1f3@qnc{1hr<=M%!%WBEVKZ5g8L4pgu(8trEGCPmIL~4l& z4aah-v|_o7m$PD!(jV7eF2VFb;7q9FFgLi+I?xU)Y?Y<~f~O~s-e#Nf;M~%Zv9;Xb zbXP=yjcK-B-l2Dq0xKa}zyYUqmizu-XxwBuv1Zp)JtSAU>;uT6u34mVW|tdzyl{|Z zeYQfVBG5M=q1*x53Y$8uJ@793!9&{po2Y5BXNSC&6~z6DVXMntG>l=cfB~J36D4sQhH^H~;cTjSk_+7MyIGt8 zlk-PH1HKU%((WkyzKzLflFzwBX8FZ@aGrjeMl}9W0p>m$YlWf4DQUB)v7AbDZZDsf`aRyg4 z`T(^2YmLr?Et|+D3yrS2TL0yiEX!2`M}X+jHrUZX!mK@~ZrPQ1riMOt5J_OzFkin` z?KUvT-aKbUh|H}8YV?e`eR~IBwqR=R?)TQ;;wHjS3Zec8a36{mhIuGydujLrYx>C7 zZ*+l(+4TGZ7ueH;$BxOsEmp{69k_YEE{762z&NOcByTX>Qe|ZLgCmD=phf&zPJa@U z#XZab^_)TX`|g1k>v!^1LL^Vd?^E#>q~<89SDM^eXX?)4Ms6hu+M8(4w z5x19IYpKfY!;c-LZ%5UI+iwb0e&Py~jT4}ql(*_DT4YgR^yJ+dKfg6Fqt?W08xhG* zI8hGneV$svAC1%6{9AfIwgrDiKIB3G zTP}c|xoX#pyzyGtj4gRe^U+xFrEU~tdtG)M2q)PS!;y62hJ?9jarCM6RXu9&hb zc0Fq<&QDkMG!TsAQ>=aO9rMhBDQH4~6`U$6J6NsKB8Nf=)n!064>I>4mGotL6Dlpm zo*Up(IGb<3*{6K2KZTn4+iTV^&JfHJib;9foT}aC_3u5;(|2WYGV_i&N3<=r=; zKRbfbF1b(cO?MEY4%E{~x3pRyR$=Z)gSq#jooFx#m+r{o(+kYn3K&5;28LoRsCrHe z!i4thnbgB3UlZef$O+!!^upHyqtR~tmqo- zBN1`v%ImKQ0qCED=EQMmyc5d#)~+{_~zE)4TzY@33+i(fqcOIZy-- z3N~1;T)~YeH65weA=d8q69y1)0`Zzm23vr5qAQ7|Y_fv)J**p2BdW-)4^9w=SYGL&zbO452#s@zsYH+1jz+^F5}yY)C(sILpxKUz~O? z_x=5P`WFQJFT!GcNHqVkx-!LD{8n9!@RjPn7?}XKL=+f1cyHkaITE>uL(XPrtO?@| zN8-?i4~s!oNrl8C;2P*y2sT^7QwaI19CY{()dW&Zwf(o*>M+Nir#NuI4pY?Aeaz*+ zBE23n0izanxp)UJar2basesjFONjPzDpo3`fi1M7;c0^GkM6W6rAG#A9{v!jfXqmk zEIS}spi)aaGTn&F9eM=XkjolzD$t=D-dlT#t*2u3u)w3d&=!8-r&Syyy>C_8e7vz) zhQ{XHDsKn!ynm^#`vb6NP$=N%ahd)pHymBSXpr;_YO+ATT}69giIF!OI1I)ROi$Xu z;h&saYho$x%WOJyg74yt-GPBy4zaoR(3s>ld#$*v#d~ddcenmcb+xoJ+HYgYD|Tq* zsB6CS?pD`@L+za}ukKU}tiIv}G7)Sx%S3VB*$j!2ZTt84PSPx5;cC<1WbpLmjtYLij|djr+PflWRiti3^S=WxViP$At;0tAh0iC%|9;0pFdGY`keT z)!LZM_{Dj(#A`-|Dtz4@SwzD$@3$C!5`jl^)44Z{FuK7vzxjj0?DOET@qAqRBgdD{y!-k=oMpp`>X8kqWc_VR8FmqV+iGV-)xuSBl!{N5kH(9=HhV_2` z_D{^|ay@Fu?cQ$byMd}Yq^Dn|$0?+Q6R(B2wLhj+e%txrmO^MaF%z6MuDZLz?}137$*oR-nwK|iL}2kOmKt?s5eNt#E_18VC||zVLn{q+?T;Kth3nh& zzi8dA%J2#3$FF5L61Ggw&Bc-WN6ZPJ5QpcK|8B8~2NET?_Dr_qH;`+RK_96|<8@~` z5g<&ueHQm~20$6#LOS_ffd#QSOy;>bg243ZN+?7|`AQ2!N#+=llpId> zR9^Q@LP}1qbDDu!mSlB1R!!%BKfeeMC8@x>cy~x@6_b)6wrrqB zg41A1MTBSK{cTP#$nKWyD~$atvZ+&xor{LCF1Gx~cl#gv9B=G)0|fGBqoNC6O*$_uJ{RD^zyU*bR!bOUzkh zrew27Cxgjhr6&H16!WVxT=L>4l_U;)OU^5d|yYE3b|Go@! z>EA7m=>tIS(6#;U8}7g&;<|azelN{~zWu)X&#;4jo-X-=fuP&kS%4+<&5<+gX%|A|C zJuNVvFzDhrLVM}zfc5yzwi6EK;r7XlA+e5FkAQcuK(O1v_Q^sp@tjlcJ;csN_gnXA zfkk%i8L@G^Y`o3x+Z*rdFA0L4E1C4Ay$LQ{d;NXSIhTC&Sss|C%tHt)e)#NsE+~Pj z3FiUJ++ET}=gICO=rG(A^2&JL1@iubygNReJItLdR5`5?M^)fG7I^q%(EKhQ?wfaH z6G0DJAUmm-KN^Z0ZZ}iWo)&QI&7=XT>r06nV9Xuf55R@$!6hX`HN6$d$pN~H8D1@+@EWqL|#P$sB9>LOYkk-jc z?n$XU!dc3sFpPg!r}L6C&{&c2G}NLHhI>22Y6}G}9p}K^!w=QlO8RE8oFlwY5j2q% zT|}btuI0x!zYfmWl34R@3C(Y=*l?y|uP?GPWMQ&TU&VxRY02^HJIFPNld=lSb-Yg? zfH-EyuqEUPzCS8=O!C&_u=c%MT2UDj;%z!^!Kd)}4A(xODP;#lepg?#&yri0dddiT zxAdch?W{QUXryIdeZY1?!o_F*5rKh%kN#lcUY43rCr^h$*<_|aLuw2V0XQ4{%ThTo z(Ddrq_cusA*Slax&(v*#P)+`wS6FgR63qyL<7U?)+GXY|u4;MXMz~Fr5a0x&|8@8D z{-oDjo2vr}ov9nZEA(f5_Cy~@F?@Nouz2*!L&bs2J0>MH?JgN2SRLWz13>B&lB_p5 zc>tvLEy>o*y&}JBX4aWC%;C7`5?|&rRut9kxu7JEQU|m2Y7INqjDo`e z3l8sFje(gv%%J=%idx(>Fpt`KPexBh0$pB@m{m&t^n}F|hlz>qu##6e>TazUBl^!&Vi*nxQpWqdU4(& zD2+7OZr})S60hG%>EWVqr1-dZp41@}BFU@8_Tm@4(qiG4J5Foh{z} zg`Zq}&szze@zqIRe`hly$JodBsY?`}zd}t}#OCwEry(!Lq@I`XmFqv=wjP18skBa5 z#ECe55ltFkz_9D0y&K%L-hVt`_5r_jhM#J#F4X-4e%7?X;uA22`{njYNH8Z|eYn8v zkNsf(+k>ae@mU)up`@eR4)b@e&zxK?(?;8#uRj!MS;XS?-l<#@m~puWuKuF`ef_R2 z!P)A2zd_V;?$=uvd$|C`bF(?@$N6q$oap^+#{0_1^-f0R!{S?<=!*zi+~?kVqnp~` z;dhOSSzEOScJ5K~JJ^je0!~lA6V_z~-e2qQQ%1p$p0Dc`dzX(ytep6Kr9{2-Z9-n8 zlVeTtLm`)+M(Kl@9&iZ4)my35Ar#tJ5LpgwQi^m+Z0>iC(^hidi`qb%vLKh~4S7ro z6iiFD4f9oy7Ce0#mWPy}YTVSq_P>FjH7r4eK&!P(8W5$aNHQvMXhAJ9@jU6Js6>gh zREv!W3&$mh$2fxY`oZKuYf_iGp7z1Ql3=Q&wYJ-(-$Ly445=+mQG$~ZK{qiq33j`? z=n(0_RYoZI_wKF-kWC0Jy~&NLqav82a)i?%J;FT)#4Nra^2u7W9B;2%A@rNq-KCf~ z$F&{~Gemgxo#+esiS}zsBU%tWW=GRtG9E#)$PHLRirUA3^BUt5?5 z*|MO{apf=Lh+VvzARGZW{?q7Kwf`nWE_(nIr(9cMQz>=<_$o!wCU?;ovgq2XD0=u0?{t*WBOmePZe~ct?iw7^rD_0pZ;{%`dR;7CR|@gs0qfwrEaB9t8T>1VZIsVGIv}ymzHJ!!Qw!U{b%_;9kec>5b#ip0tNnnL!gA1t+J@z^gPV z_pR07WVjZ?aU>_6LXA}!^!|$0z1K8u7d}ig3)W>$7!BL058-HF=i0(8cL-2b&gbx>evH8jMQ!GiayC+jw+Hu`lJ|nzdEa zd_bnkVaxVng_8Y%uv3{MtYs4&Z3snZ$~;P6<_*WEHt~LzF^;n{)i^LBy=Q0xoodD5 z9QM55aIiX@rI4oduJLGdyvllZ@ZFyxg#Y(jSO)2D^l>~rZe76G9@L6ODyRj_A57fh z5GaKKWgtVk1qh>&Cp{AeUo%7cCj(sxXJX!88;jSBe8~X5m;VHZpFq_+}B(QDq%hVMLcRmvyhen&6FxN^9}^8DuW3olJp|pob&KtBhr8 zW2;gMDO_?18=-UGuAOq)+^(DRsj(%Rn`Gpq5Ya$T{QdEcfMTY7YM9gSP$O&)XO_m_Vc2uNSyGU)ko=~K*y21TLXN9 zN+-cqqsY4tYesYQL--4HzutfOh5s?WQ@>Hzw8Mk|XL{|Vc-C~~Bx(EW)~Od=1GW9O zNqX~Bc)&O^`%>LWV3cEbx(>jRp)RxZFk6Qieu~g~Fu+$4S`NCKdS{80PAPMl&2K03 za+%I-?X=tHZ7~{)+(SQet^9+&kRN^Q*6{|p8l5{%^U0w5R=lxxYoA`x;Q4Ci6=^Zk zICZVRz}@a*Q}|p7eMMS)wHE)B-erO;lEQ6wBJQ~;xFt-VZ9_*URXA`d?e_cQ_j#w8 z7MfwFZWsGu+z-xa?IN;l&DaUqkkWgb=rcQmmUBuFB(N>vXQ5UL9bdSVyafF&$0^2E z#GEG)Qw*f~r3ky;ZPZWzsJ_5$t?p3Q+Rp zK?Hr>(l;}QR5H|zsaH?iH(Pl^jI*=o02dBn5BX5{DdX$PF(@QjqXrH{UI_ zFwAhWe7rr`d(!(F*xkm=buJ=u9vo3gT#V=U*V%E4d7_`tEEfc3%W3Qn2ZdZjhbpbh zGiBZeR~(LFC2A`?&b;lL3yFlg_jEnh{H6gbzj18k+6EH03)p+S!cr5*pw>I$_u&;2 zKQyLK`JtWnh!4{bHH~}?TDv#m+02yG{^EEUsv5N7t7rY)O5k%<4IGl|SeIQxGf+FV zqRQ}{!Z;<5&T@|>6SRm-&AlaNc=F}fRM3ONK{em!>4Z;Gr7`kF14q_5UJ=mFN)t`0 z`u>Dv#{{LwC#~L(A`6lz!I+kpA#cXJ$(P=BFud#}e-CfM@v)zEijs4pVCSRs%<4k8 zqDWr-2<1`!oEpdMPi#TBSd5;0NRnn<;HX_mNzwId{~Ij~zxbaCk^g96y2pQwxcS9; zLlmPJV6u4FT1}2M9@mtI{O)u-d0bmRP-5%c_w~5E7We&j$>T+V+chGLe_F<2fC&H8 z{SrB%y_@&UU9J9l6ERR}6_>p-p5o4g`(Cj%OLTK!K|Bdjf?R<`SKY5q3N*4>lRUdu zf8W-gCPD1E%i!+!OMWhdl^O__7Znf~WZ`73f$$HGijEP6g&HA9_+nGj(g}QwlTy<2 z^52kTnMC9klvkJln>$=s8DKmmjvHnMqHJhx@3@=k@;s-re}ENMY=@{H{5;Uo1H|Bb z7@H{|`)FS}yIhXDFgdldl~z6RqHcQo(4+fJ-_bd0ZO;Led<ho_ zXm88iA$?n6>u{+8yR zDoN=F{O+(HdsRapGDNh_l3tLkKfH#2+5LipuTX@Lu^^J`{CS>c(tK>2Q1nreOwnb1 z48OZ-fohqJapvnPd~3Z_+vTMu_fJ~7O|Q}hpLOuq^*5UxQ?(?3O=22@d^z?M%&6PC z@7I7Rj9qVrD zYlKgGddy%(KINYh>PN|agNOV=77vr(LCYjee80^&vVf~+iCszbOfFhYbi&X;MzbKt zTw*&TCss^a6YPv_7eIoqqkDJ7T;BuQn>Z#mykc&r#JXw^gR|3OycooR`{8x2SR2dc$cSfcb#e3GIyt=4nm|3&w6$3E9(>a)Ch&I zmkJ(ow3VSJhdqm!)^v*r-rYfMRthwaue==+|Lev1|BLST4;N?N;Lm*w$CAYEBSC$z{O% z`Yo4wYUfU?ywY~V(S+^s+&ZquU=v()$E&32!GHibH{oUs- z8;#V;KThV9-`qd$XZ%^;KgCP``jnn!PV{>ZZ}_{j0OO8#C!fLRIfrl*{Pe3~9g~K=s(H{umbASzp5#oUz1EP0N zgWu+Y>CIP2fu-N~s7_lC#M=TYoQ z5!HMPm1j~tT3TbjS6G4Zj0Q!I!`>~>@)7iy6mzs+|Pf5t1zX%@gGlM~hj&=>-L*W>pDao6UIMyDHk6 z^(HOhcl2}aHT#;*5 zDyYsoVB`{s7^T~=wp03}93vCXRZCU8#7irw5R;X=U2J{+wpLO#Q*46DXL3_7kwOE3w!%Jknns zQJNkq#Wk77;uZX&@iM%`(onGU| z09kJ>dm&-3I;gh4$@h()dOGRUZKfWXxr>a7bJlibZC`4WH+?j{=2-vY$%PwE<8UGD zB@q6y@3#5)dB%=w`N5O5VE4x#18mivt+(0s)%H#AxScf3;g`8|Da`CAo;0sLEOYzP zH*?&0@@_Ar?A5Bm?D^zL%jrOw$4TGp&-0V_N)6e%pQVa4Ah=neF|wD${d3sDr>*eN zavxU3dD!FAHi|*JUNW1)CmRM*RGqi+=4*t_f0bragCHO{IQQ52lf$O3(2i^94_@w5 zU9v!o8|+k4B!N=%zw>e@)p3Ks35&+xRNe#e>S>Q^0@ zgG|yHh!=Qr)qxF35Kc-U1c`faY+O8ls80mJGazC$og`cxlnO+wqOy}!uOe2f49Ic} zKqM8_&F}8REKCsoEghYFFx*lDL`>JvFcU$YarwtDLu9RXQBC8sMK2xv2Ip2XCi{%1 zSGUtYZ5a8@>>PQZziqZ3U%XE87(0gsW9$+_+%Slh3tv(u~9E$$ANX;*@@SNarH#8t8bDB9gH-JHX0t^zav3+JyJIB z<&v?tRUM2*_SA0DZ}ZD*_F^Jc;f`lh!6m0Z@tfgVAb$9e2T4+o(RDX@7BY?bLq?s8fcBD#NZRn zTQGz%aZmfaotK>s&<6`mW4%3-rNzV*piGHS+J~4%YiRa#M-OkaX@_b$t()G~^mf6;-h%=A*Jq#%YHV6no&1(j8(MQ7uORQ7(WBK-1L)N(1Wto0 z)<~uxQN#oYN!32pSUapzU_5ceDxspXdzPTq3g1`aA?D5-1Abth154Qu9s`+Zwc1dQsZnJ zH?p%@gfEv5!Fk&Jt?28mv)w+tY8VUmN}3(+Nv=Ixg{Vj4Am9*+YI-oE#f=BPFb`52dTbe4 zam2lF@9UMMxU|}BWVL%fWRo!vskJt$*m6&r;Lm5`79Z$Z?7Z3eKI8E(eP9R;_vGRG zOmJIU0xI+^fTr*UTqM2#rZMcR(r-le1h-u+B`knxG?SvvMdFfB^`n|5CL?xNcPDG? zH;8#LiI0E1^i7tzP?vsVNV|nNVTe5V8XhCbk*utEB#(DJgp__=uv`3|TA0dx1{x{S zOd^5(i1_v_YF-K%IkEguL~l0RLA@Nd;~llMDHS%Eo?a2@k6{^wAhySH3am!qI?0ha z#E&OD^=n6B>!+e`X`OZJ1M%c7?M&QK{QX7@2MOJ;vWdM53Se;cu;Km{URw4WR+`@u zokw#8vn;zwcs_xAX!7obS;{^)>P;Ni%eya}-UUk`PMJ?$z0YqssBO!Zc0RRAyS=Xb z3R@%1g^4ZS5jt#xn9G2Nuz@>WWiZ$d)$wSF_?UZDL(ML$GRcoLq|+uoM!H2Olf7Kc zk#hstj7RrIH~)j`PyUvA8IB7$P(p)v1vy z8-wi=6JJE^^<%L?zf{{)Wa>kZJ4H3;E^{~W3D9WcdhvSgIM23RuDay zcAUUirt5$Pv)20O3@_4ZtCUfTk2;gNW~8x!!8SpyXZ>-YP5w3M$3+9DGa&JRVzsdRbIni3C!wR6mUPQ! zpD_qEu)wjSSW|8)_G9WA#JP69^GPz6t{fkzX6)|VrYXEO$JOGy&4`4tI-E>| zl|`Lv0Mi+kydIs$h7X@tvUKXaPMhPCyvg=qWWW1@DTe=Xu*nT-bZ07qbrkQqB!f(E zyI`t=kQPlLt5rhMr~8TVU5YDrk{X^8-6_SrHLP%Jmm`1BOANB0`}74fkr<|<7S>AP z3P4(D#w_1w_*I#6g#d`adA}flL=MeOU8}z$fZZfm;0Mp}bQ*@C=RG!nVscH{{}f~d z%96dY?e>0dFHWs_vhs0-+kkD+%?>1?m}(=y`W9UYkAICI(7RIRJcZ$c93JA5{ie(j zuzT}Rha@^FIpsQ;t{Nf{$eeYt3w{D*&X)S)7V0Co%WCUHVFYncalPx&t-K`7PeHP6 zJ-tjYM5SSI-$*OLkWtI0iL!w)qnDF&IiFp|=U1W!U29gieB0d!!nY5cE8GzKhv!!7 zuAsB;5T^>2{(-xmxH(%uzMw(dThXoUR-B3jM8FA+?v!@cEL{kVMB&~VVRm;Ev+U)< z+1twHZrf+tjmZfJGwLWl38Q`q9`iwaV*B&zdOPLj454eaLjI#Uz478n;#2Fnd84tI zN8IlM_tz7j>Zz)gLv!`UWA$4>+RkLAssd(TQxzozU^g3h*?nLy@VN9N8l%O*@RQvs zj^S}CX($d}Nq*3E0sS07hdxQwN;Z^D!@^f)&>g!S8zPeRPXggb<0z`<)5OJ(>pq(@ z*4lg^(|A7q!}DZ&7VUlQy3&6H0pu%VVQRt?AXu7n2DI^XRlTFK>9G~I} z0w)=d<+0ddqb;=|rZWQBDdtl3G-+DPI(jMgWL9e#{w#%SnZW`ZYgyrcMgU-*9!o-r zSe4e~w1wf;Q08!5EBwMci|d8FK8cX@@>F_GSoK(9A&j)S&>BWN)vH+gJ~wa$x1H=? zvA+MW%;5he0{AG)T5>p|cz65olZwpEqfrg5XGfp4%}b8P^qjYkz8Ji{d0a~u{j7H4 zOKQpSC(Pn-5Dc`q9eiY3w-4|CNYG#;fJ&o&&JK1G8tk_<(g zXC(*>TF&5p@9PfP5pW3z9^j?<)hid|xp7eRx)>kh75wsRH!u3^T*ezrKo17>Kb^Q| zfCi_gdtxx5&QGzMtL(vE6#WL6tb&O=B_Wnu()W9Lh|r8Yq_Cvjb$-d`J{M`Z7hrq0gCaB)zZu&HmS4#kG7 zeMf^{)ueLQ$YayhBT4PGAABZGw!_4*d;049F6wq68bgF;@mdr=1j7*p0`d$3#&|gl zKcX?{qm5yo$AvjycYHa97c=hL$x`fm!wAbpFj6OoYw%k|Mw4VPQ~LHOTG>SfZDh0Z zP{>KTqQkR%=yM)OnQ*~Lw0&Ft(`H0xeh0GvT{6gc?NDJE+^Jj88%Owarw^=C}D&_ z%GW{=xJ&1u<>zpeWpSR!Cdmyur(bRUuPQy_PnEtfP@}2kud`ll#~ad8V?%yhX z#6rXs^^qw3u@x}uos!JicL8*nwZ~1fb|rDNWnZVGmCt}#&-{hrvo}7z;$)tRxPHMQ zLb&dskx_;)0_{i9iP7GgDM{%*FiIVQgpB;xWaipw1!d(zxfRt`uwtFOnkIt?9oOd8 zwh!&P^&Q=1EjnF2gUG&|p-<^SqhACA#=lPSOis_)&CV}bE-tSbtgdfqZElb5?i~ag zj~&i^JpC?nt_dnVh0@6G4Zialy||$#%h*E>ZKPmn$~KK{HwS0P+PQqB?BXO7z9-?c zoF!{Mka(#g)T4&g5lfLp&kg;QAWn~C&2m3d-MlYVRJjGO5kH`hUqE1hm~IoO!)t1Fv* zkHWY{r&wP;|G}S_Q@_8yVzDcnu}ei|9^!qCmXiBaMa&!v7h9AG{-YIy>60PF#65sw zk-#ocMWVUvU#|Awz8Ab>F;}}JjIDPqc-xWp1A)5pWy_*FFzZQ&OZ;|gq-ZY#ZjH2K z>pS+o-gV-SEswuxB|h~@pE7qn)WmBxhf>)CEyjgQm~r(>Ue!M4Ta6ImhSU!EB(K^H5QfsTe{4@*7y7u zm0n5R(=(Y}M+}0Ar_u((bmX256eO5?4g-D7pKs;C3rD$-x`i*|5xj5#gYUuVvwe^Y z+{iAtTRJ!XbuHXV0%nDAMmUB|aykwLIZ>52T|TbQz+OZDo%T7oEzH5WZ~YDu7YO)X zZ%7E9&j@2bR~txn$P{IJFAu~^LR^O4`^4JiYc$48(7^qO`~8rPO~UW!6LW#Iw0Xv(5+KYj`@t`D?>B4u(x z7SQBpb|l!u<%#zGV^2`W>#^588(TdjR?ark%RK5{lx5KgZ;d``aoc#l8|q?mvGdbs z*XWD&#kcMtjf;3v#gfNUM2WO}`wZOW{43-fUmBq?aeMCG*qR~YkUVGl7JV2d;ogVW zY{=L8I&a=HoH1!MGhxzF&;p_Czc_T50TEqYpp@V7ro7Q_4jnd|f2%^TcK;I5)t&9| z8{Yh#@i1O|yf_Zv&GM_8&lLfC0EpI&mheyXJr)THi zFMj;I1UxcnWXscAy>W?CH&BBh81@2vem+| zg*Y~x@2 zAw4hmXz)+*c~JH@xwXap1LI9@;L#P!`UG%EYPErG$StTq76#JO5md41Xn8g^JF(CL z6&Fc=a>cvow_oc|#T=mFxIs}8DwfwUf6y8--#jq2^ogs}pr?(Ow98X)`W(T|5F$Ca zV3254szV!E#tpiVoqx|$tH}m)3paHh|YdB z9Ut)Q364)^hrDRFRRvtuF_Qw~T8yd~V5MUk;WR#uwSOiA!GR{7@V9X+&%4yd-OToH z3$n#S5y6hu$Ea)B|8b(VoN3Q^* zK%#wk;piB7Y&>)Z0H3whu&8&qL11#fc9g#;9-3bEcIdcwFvAm&F&v}XKLWx|zyrEP z&0M|+$8^cg3XzDnP{ol!d^DCOmDKT3A*bxgj^^z}E{Tet!S z#3JW4(8OS+&*{v>FB=U$S~lkMRw-DhSwAd%jJaMyd7%Z1{I@O3d~>57G7h$XZrn)CdWFpyzK zSF${P{{y&z4MZ2$Q4#Uazvq$VXp3e# z>bV885pN~{lmiilkkd%ZMG$%1qDku$$-a_?6~4)Q#Yc%qd!;T1K_m`U(XT&}6NCeT zfV2MgBd?=MEztkiup-$y|E^*EvmYtQ%UI^leEdIYSgsrZhdza@>Z)O>!5aUQ4Qqts zFF%q|KKU;{a;m%HzxOmv@?%29$iU&;$V+?-NBT$7&>bY&ljKpl0U^E`DG}y1h!{$hh;rBv zj)7W(zm>vESCJsc<6eM61ROJnFz8>ZKyK$+7>U8^yCs9M=f~SYgoq_$V&ouTqD@uH zXcQ`kH_UWRK%kyMnD?F`W6WGUZVaA?c!6Xjm*69>_>b`cEHGv98>V>b9>{rqf|23Y zL_QBWuSYL5fz}1zsvnF{2|oj?nT>q7k;+GQ2FBnSWLJ*0r7BcTQmd~w6~%)mT83P3 zx%mdswo@u&Io~<=33BWFfGm7cuRRyD3OY51K-ty`$Sa+~LFu7x-ixJH^@7Nvua5Ft zRGqNGfvCb*!{Y1-wsdPFn##n$5J&@6UvV+iVso~BY2yR3T#8ZwRnMdoUqZ-vu5B&> zQw$)f;XD-7kPc{@E5_~i`T(d`)2-VB!SBm03zl$&Ao<1`2B1>xi%tBN(?FB*Rz@ko zHlN#%kek%M;>0T_H^iUB9UMS5Z}nfN)qjE$H7pZ;cca*Ld+T5J8&0&SWc?i{-Vapi z{|zUm`F=;4S$qCFoXC7T{a2i5ms$1)PJH3r@K>D3!r5_!6F+qI2UJK54*d^tBF7(% z@YioQz6=2xp*It*YdhoLH$vzz0e}-#?{xpyIMIPes12==#7r+qnp7hm7@<6niQJ4X zhGNmCJE=TwvmUKyqA35|`>&?e|7YLs{pBSH`>&1g-%YE3xKRM&j!X_x3iub$O-BRJ z6Y)poIokY5(O8TIYnTI!NgFJTs*GrQMaEAGZBfj zNTOr35d~@xJu)6pFzX|DZoErQwlOh=om3>moGOADpOkxUMchD?2NcaZ{*ejnOjn(g z%9|O^0(GCPio(|v=RrqsBhO>SUGGulLrG;D2@~$%ZCGSnXEFe#VRIFRC#c=m6;Di* z*03bOs6X=5=5m7)CEIg+V@o3~vGgsZdUtM((=5)kMH-gKL4=v=@R2buk7~G>9OIC! zC>#kSW_yCMnTA`dO*IsdIGN(<#i9l)=bc%#lNe$(C=K`Z``GBOGBsbuve2;`jW=v7 z_5oGddl!G}#Qe^+i|*ellPW#{}{I`q)A583}G`T!N6rX~3keZY#r z>c2J2{n{HX3|N3q`X;dMpAK`bh=5=RkUBWzmtih4EamTpx$6;s`J@0^t+H1kYkp0q z+S1zDl}FJ1`!FZb@$r{WYEd!!-yY`v*(d!=Z*0akWa5cp17F4{_OzqfRz%*lZ`F5e>2SK+{TmDfPXbCfnu0Tv90YLiBAzaEw;T& zs`F8=wB3dM!%FG@SD*ARmN9|t=%=@shP5={j@&4G+U$;KFyYcCVCIE5B8 zpw5N!tHdieyF#8YujRwR&nlrNFgI+?uvB(7I9t-IF@v@HT9apZE+S0pBB?O zK)RO6uy&y~z^^78l!wF4(E-w8fDz>sowIMKlve6kOUkP8AhXDyxptIBvhc;_#31I( zCGR7IJ4(Yi9K|519<7B6m`^~SzTg~j>YJ3sKohNnV}2#T_&UY|syd5y$0<5XZo+9g zwJETnULBMV3*Tt`xLtAccoWcnBi(O-q5i_8Wek!9-mNq@^l}I+2doicm>OIhamTsn zU0h0>mz+>aMm!a)394ZmBG`L0_XCEY;*KENVc(4h>~BuJA$StKZ<<7|lI_rWY?Anf=QgZ=o9Y;?|R+JjmA2s*l@yLxJ3`~Pj2<+p#Pzdy#w zC@5MZ(vQg!eJ?0Z?d(pGdYCi(X0qJ*uFNnQmYR5hBveh>@qxi?Sy9LdQ}psEt=KvE znIU`jJH=)cC{hMj0POXTH~l5pd)PJfw5fd<)a6xphjmx!OqrLMBch_~g;Ce#L*KyO z|C4`ap;ArBU|9?{d?%9f_C!n zp__@6m0!_KLEq+>i`UwXm2X7&saAJk(aqS@n*h2ga_jp*Y$iJceuy22qOD66M^^s? z-TduuXY=!8F=dBRc94G}D0#=f(_7bMi4?EaeC7+fnX-cTif;Dy8?UI-DqBijPnzwX zDAsM57#^CuIa&2fj)e+l^srq(ZL-P;#xA_Ye3Zi8=(-D#xn;X$b< zYS>kCnNb)v5~m^bqIf`F>=KFXILKP^l7-)L$&r?{plmj+q0+1b`yN!ex{Ew4Gd`p{y5_qwXS(U*jxpE=@{-LR~ciU0#(SN7am*45#yf&Vy-Q2a$^pu{c-e ze|X(8&;Y(ZB-`+gs~lE?<7yzAL_=RT-zKOHP{mDMi;FPmz|*NZMnr5iA&=D_GJr&vbmm<`LEQD*LoqBM5=$tcKndRng^;8iETO>USX7#pTehE2 zP$AMIZb_(U-z5}ODEoE^1tVDWh_CGUq+-d`S3-f4yW`2?QrN(9-Sssrp`f;~`TC7H z$=lx&3V-33`x!CqJRn%j^!1^5zLfqod@N5Xn&DiYi*dBq|E}y z-J=>ec4^I)3X40YX;ezTrZqiaGhJx+Y@x_hhv`1nwwFPm7U<&8-y;|mLHgA1C(Me$OM|yiFpoubmem_P_PP~mUz4r0(n7I zlem*P6-PiEl%^6nsDXPyB9}tNQkoBy%6H}c*~}B{qe~=iU9Xo&JVr>^as=K`_F|45 z<><}iznT`5&hyE-7bI0wz((q}Zat2he%^^)K1cniwLG3ncu)#g(uZD9eslo}Qsm56 zC|4HGhr*9^f{No`jTT3P^@KJ3l7Q%2RP{wBUeYWmpQ9Z^lQw~B3Hm`g@=R@@>eGW2 z5eQU;ID#qcISmdHT^_qKHvobn7lz22m?*qba)+nhJcq5%U0A;E&FcCr0ANseg1%=3pdWp!FXrq z7BGCk;|oRiIBs~bjx{MuRL2AH z!JipR(TT3oLrTVfP0{JuA{2$9(zQ#6Np$auUa@vvx%bCHfq(E2^Q8=WLW<-)kpzKn zqjaR<2>P=IqNWg!;`QMZbX zQ3i#@Ca56Lrs7Bhyf+Tl1l|ieiC2J5QX^qkjn+W115imM+ma|bnjJU&a|L@)A_U&j z8x8IRvW`BnVU|guY@RXUW(btU8B!~DJa9<6h9B5B9Qa8Tqw`Vv{LG``1y%?YIs^|j zT6luMWp;@+(niDdsEcWS30<(o9gCyhrWydHpJ@|P4Bu#eQr*Cg#a0ycCPB`4Np^+e zCpaK=L+P_z>ZGWS4rqz={!xR4JIKJ8?>`1`UBa~Q+o*Zr(y=#c9)Z4$8b)%gU(tQM z{L7IeCLv?z)}UVKmHd;yZVJQSZrLV&LU}dc=1{K2;kt8znckJ{*ld9++>Dxjw^-dZ6;R9 zaklj0z!~9VetBf#NOmefYR7RFq1uWE#uFJ*!Bt95mr4G>TT^xvN90~iRYFB32OOE&{_`hZ^qgQ^+F=-|N=L9Z5=bfaPU1 zmB26~lJKZ#OY;~kHkcThoF>Mp=bVledKhNr7um%X140jn(#o33(5v5t9_r`YJ4Neu ze->ab8z>z9S?D1etTgg??`PoyueEeMM+0&*KWYW{Mzm%J`)cHL1 z>NPm}qulJDGex$3B{%yH;D6uCOs#@~Ud=h`+|v?|5~om21mjSPqfA8D(esCJ5Yh<{ zsDO#NqOA1Q1qDfdK9C;ws*qGXuhu9dDZC?)nG^>!NNlWeHf=mbD{zoF$*^`}k<4J} z0<*k|sb7(tg+-@@EJ4p;Zx-Wq%Dzm-$-$spYVp}(3V*Kx;KCZRrdTSlYOJ&1AUjAL zKcdx1Q&L%cO(xz!f}RBhcM*nz&DR1}m~cGCRSMG(qh)85{Nsy7V;~=3;QA3ZJ0DVt zSaeA@hreB|2cm}S(0(`$yHdT~zfze6?^~%pANAU&dWtX5$KE9(!B73lW_?#Z)s^n5 zo-)nDUM_8|)2t1AtkY5>2DF#KA^Lvm#IB)O)sy4p_@v{M;o4Ejd#Wb|l02;Hi6O1D zLN4(eF3{YPT)sylOI-ne2H&>+AytB#odqLU)l+W9Bv$n#Jo@1AY;ce4qbJsOORH-a z7oYy2>gn(Q3`MuJ@$Af%3uyMfrRjXpum)M3&bA1khdC&d)IVr$0k#AU>VPq@uR=RVgx}vz-lj1~|i$ zd10q84LuQzt1Hl$qlb8 zg)CV^?eAEyT2|GSu*Rf!cVuTHI|_x*n{dcMWarq{N?y4jIkXev3HnOy7ok=^6gelb z9^rv=zOP3GK~;JCFlXDoFWM!Qs{CDP9}59?J^BWIeSJ5iCmLRRY{C8&{Q61S7kV+` zi?q**ASu;6B`wn^BMYOSlN%2^pI=a_T2dBKbgrVZR{CmPqj*D8t8mM;_7m4{_z+_| zelQ2X2E|q18Z{dF0)BaP&OAH`-hDUdMJ;}l_9fB+FY(`%_Wivg|6ES5aWpVp=+gOX zrFF|WP|;jo*e>{W$d3V#_E{gtQ4V5@A_!!iq!XzAYXV~h9FE@?82@vMyyee|yzJ5- zuJsrI(;h>r&QY-u@l8hP53eLg2$1zh5onTPTFp(Q1U$`Kv>!nsCZRs^8o_bIVR7h#0e0Gt_Nl?=d>`<0u zNvHmHzK9X0K<;*Ss7upq$nA|YLXt5|coBRNXVK{AmH_n0KmEC^b4+F5j90aF+ zuV$+<{oit%Z03h{_ZLmM^u2JBFV&nSKIE>*<4dws?{!X+4ouYOt;`Bu`zlnGQ~8D~ z0YX(f)7|}L4_ESu%go^k02maeyuw|fYKFV6bY-p5)w(p8enaCm$=0@{YMu5Q--N0a z*|$c=QtZcfg{sWW8cs8hXMG<%SrDTHs@a)#7gzeVQ1$Os^H-s2fZ>21GZ>nUV*iAo zV(wJVQxc{>SGKapZB7mt0}M(I!kARu6)Ts&=sHTJ-9KIXen9(3IGN1dMu9}1640N@ z<^MU=9QkL}{3Wn`_Z-Go2IVWRMD=X6cO=?x8#pAV3U54qReVX6Yjn*Hb3mcdrHe z8vO`L+Fzh$o!@}Zb>Wu6FYT7}7r-ZAgaKZo@m~}&-jnHHDZaQpn8rN#i;`N=H74E? zy$gJ@i>7C3XJ+qLQp-^qVk&ESfp*)}d?KmE9o7aYshNm%+X1ejq6c`5=HDDC2aQ$s zO_Yw_Eg_ltrldB00PGZhrlkI}0+sVeDDPuG2GG(u`pvFm?Do`-4D^^iM z`cT0+5@BO`vc1i11$U@#7XV6X<|OAe!c>9E&%$L%v?EouHifI$!>0~(z(9@9sv|sZ$L5o>#M40-#GuSz>+m$ z`9Z1Qi2u7v{Sd~rEfKlA7a#LUzM>sx$ijdIXsm#3fKlhP{gToZ(=q~5w6d}Rw1ble zOChIwSA0V|j7qR*2cXnXZ0+pn)s5H%)-&>e2KX;4_4n78Qv^OPDF?qCiZj2@l?LI> zHEvRH2#-Z$r)aa}CH_#ds4xmmnP8!mAtFEbAnhW{ZEA8K0;vI~5;Ycvm>K!9e}Gc| zzXGgt@70&E$A({^I{T~!0-*}awT9Y#y$8gUJe>kzDJn5NC3SIs1yKR79&&KP{t7A@ z_|~DmUzFM>LZ~4R8X=hmJR(@L0JPc&9t(&9yULj`)gj0 z{T1{@%>FYQx<}2Z1SPA}d-JOLgNM0~IhYQXUIOl_KlUP^3Fl^OBsz6D6fAJ@-cjSnLvQk2?U7Axf8;p(=X5B$ zztW+;UX=QIgnp%F*cT4k5|+vvI!rD~#z_}#YV32I*@*z@mWFPp3L*QS-B=Y28F>GQ zZG3dq&t@YrjkPWBzSDwtifkqcRJZ%+#_BHIRbpWTyFp;h8sclXRjJfr`i0+h4I z^V#7O8mwiGA>t`#8pX|}8cu!JJ{y@=r$3~3ru5T;_vTg=n6rnf6lWG#uo%>mDsN@c zM7gVl>4`k-4wq)EkNdA!9{)K7cSTW5(5RepjqVVsor^j8)RRIJ-cUl z411vK&)cFBEiWB5jr(K85dbYOYG2D+E%+_!2`kt`J+UU+lGi03@i zr$)}RM-hl3MSVP3oE7@w4J3B*CQQ)_L+m_8(qZg3aZaT3XUziK*>ZK3XdH-8-sSda zo)|Ix1!re=Vm#&i89w@?(D6Og^Zx_?4!}k${#nJ9SsaE#n@1CMb(D(KwPe(^#lr-? zz8az%vIc;PgG_b0h(4MW-$%}3x3ahUw=%Y}-xk;?IR&<*yzqwnd2pghh|xLlad^&xxh=Xz9TbV84((Vc*n%va;ar)^D0@O1{5yae@c{^e*yS z=L&yRx(}lMvaG4%?G~2vpt;&NyyF~S*}yNHhx6P&7M3qjSmenFy_l$YKFWk-yEvV+ zls$-=S7jHX-se0NAgljk%+-YL>1g_{7664++~_roUDjL&_mP|bD(f$$MK0~qvQj8f z6WK24ToI4<8;H{&-a((0>qW~XYif5zLY^!rvhX;_d+utvpLqa$O)-la6MqcBp)!)t z!6FG~3Bq`nvPnK>%{>M)O!lOU8FIRNk zxAw)Vx3<;9_!CC_gZ9BxkHTp%aOtg;h+9K&zqe}FrsEwa>{MTtq!!Nx3X7=@dKnlC`e zzgEPDNhM@cmeu2r7pdM5i5d!EpDb6eFwNR@`Zq!-{y9~q`Day@hpz#L7VswNh>1`6 zX)}j|#lxLFRZ}2*v^Zwpp9FhVc58!42Or3I`YvL^URL-B+Fxike`WRmnT!xPh`};$ z9-NF{-k!d4AJBehUHq{*0}4Pp+g<%Hki>^2CZ&c&qyg>hB6wF8xV!pW_?B0(bM0AE zjO?0fiLV0U#V_q_FK0lhWp5Gdy1vV}{mq<#-xM09#K5jKMU2PzK8!fjFCL(u2~07y zz??jNzN;q=wJ@BasytUe=C`0sb;6fGirA$Dk&{GBL8D`09a*Goz!tUEg;pxlbwJ(v zx6)4jIfeE+=$KWHHWPBgFNDD*wnL7fWKmpR_z;VR9<%zy+#!0K>Fx*xdghVO$L@dqJYWD_$Lv2!MN{CvWoK)5XgD21NkMS>kVSgzE z?4MI^8h=!7D?=J;QKOw_kycuFHRQxq8Hk`D(v)!StGbj?3`?-cNa45GEq@mggA^g0 z5URb}`1@az*gC`g0eStG)~`Q}c?tkU{UYW`gc7U%+waQwnq$Ko^V>cDZ^t|tv*NMw zc>8a3qTqpeaY8_j&8?nrNnvBIcw;l^7zqJ?YWNa^94(8=&YEm#ZDAr2^4uH}Ug|%b zp7VQDh^Hf1l4gv_ zUzX@zU;;i;wl^h|V&;i>I9KC}DT1>d>px@&F^v+MlR!m_gcqUoPIm3zyl8;ZA^|7w z+r0FJ^9sJJu)p(?KUrHDIKM)y0IT$f8`!+WzNxUc`Ej(K?pT4)0fD06pk3bklJ~Dl z>sx}Dkt23uHZ~pSX}-n>@ZKCg9YBH@OAMBmygYn^3;^{@{O^3VCy2BHG9&GQ`Q0bv z7{R}*rCXobdDv>Kw8)XnwwoZfM4TdcX$@)tS{}&|%i2POo9}L37RSp34E>8#B}Jp; zp)7!wj+}Bp{vbr>==nXv&;McG`@+wqMPX6$B$(RmN1&oe=o~Jc9kT>JV}}p~M{!aL z6scXhBCRV~Q!;PQ|9QYTO5$6NA*pij0uArx7LyosAt9d$XCvun@B#^r-&c7y>Ku8$ zs=NukU5HF;SJHfw2HZMZqdQEMaoZ9XsJxF5K>r`@e+M`?tM+o@r>`G|`Uz)y7WvxA?u91n-u%W4mM;~;pt*%|av#YX4 zudjbt?I!k3i6Tn8b64gzkf4cGTxdU;7lQdOWDc%8<(QE#f0j|8RK1B6xK&>L0A$x) z2053pB56AP7b=b-`c2QrTsm+{Pn8@1_qB<(&b>~y{R>e*f1XLQD{#}1!J9fKI|hC{ zU2Qs&hpS=2O#wqbw6NxMKM>GrFl&Dx;v~nzcCF8lYzAGb#}RmQMD}^^R}-&A7m{SV z37O6fs7;t!IVc9E}XbXkEi{ZR>BLLUH6~g z`2leM;a{t~-JSoNsrnnZFYUX=zf#;d!zuQVV*t4Bp<7C! z=xaBc{2HYXMn!kUm$FLHXTn#?Dn8)bl-KYqTJIj5jV=)+w%!NVQ3Jhp=LZy}Ec@Qi z>tc;G<#z&=P4z2Wx7ZLEU*(Z06?=O{AhL|B?6G4OqjI(T!?$g;HlFG4cGDU?uLOna z5}2r63X6&54T(#XCk7{_C4sbIcIlYV$lQX{`C1-@WnR(cRs5O2D_1a~zKPLDx3Rg& z_uBPNgSM{PRGq86L+U*@3vcM$8o47qK5sJ}xV57xq1#+l?hxjcwX1`=W@9C~r@}|w_MFcss3}D^Y^Y9G}4U^PSCJv8@ zJ!KV_m}KjqnwtDAm{iQ9px8E{q`bn}Z&#wPa^Bphz9k3L+}bXZZd!DsCl1!#I~W!@ zbc-|Ce0byzE7)Ru;vOCG)P?DpJJEM%7l50)iwnzUk5_v~pRK<%eE#aKME|=FDgz&H z%$a$;KLP}k!Vh%Tmhca3^pyuAFVL5eJCSy99pto81UuwcL`U&^MKW&;cE#15-5~>q z5tB&?ahnY#>N$T2CWWsu{bz$oGnvIZ3E1e7f@Ub(fL@y;FT4>gwIV~w$8CetXSuhjoM9$Ayr*di5{?a=ttp8RD@GiWUQY>+0%~d zmnRQDUwc~Jfyeo*ribiEc-2C~(1N`_pY1cQrV(;(uJE8AFmwnIeYk(qE(@Rd-u>^4 z>{;untq&`mNBEttIp=>646#Sh{KA` z*EhCBXI<|Qs5HLX*~b~xKjbWDaqZ?POUrrU+hcd*O{VTXFunh9Ru@PNSDjyMyl1?; z(r`z2^7%{UXRqE0-+I>uGVT4aBjf}2elsF}-4Aw-TG2`_E6D`0o55y!$d63SWO(4J znKbTT>c;(*s|9j0A&EOE5jY3)&6ML?o!+G5GVN(q)N|N03l(vC-~UWjZ#5Z&mO2Xj zgqa+H2yzs%@$Yk^3_0$t=_E8LO(*$Q!m}=EB)b$%^vPUcH77N~M)Xq;|5Fwk^-G7h z^(&sv$P*jJx?d}{dvKOx`uG_QAxGxEm;-v1hM|5BZ)J^t#y{%WyV_PM^RHef{`7zG zm-u#_xa?pM%2*Fl5{|uWVSJbR(lI2je|ffbh@{|+Is;A zW?<>dtb&?4Cs=KL^QD$+ZI`i{>s@PnL_1b}!QXh^@>Us9lb*u(G%DuagYt*PV+Kzi z7fx!EEUfZXtYuE<6FqyLiqXCQD(kM!hpkTx?>_VA9sq{K4JRce)xt#ggRT%{1iLCl zpy^o^hv1ECx;C@Xk<^mm^$U&wTARzYW4EnJ{9`=t-`t1x3CcKdNXQwe=udWsp!5sf` zGhzgED%t6~23#TeD?2g0iuD-ObC>V>79T{W-hbhUKN;}i<1ITtKuMtE9T0kjOjgSe z*#D&|;}S0hC4Eh6SB=EvXMhdz3QCi_$|_@Bf$-a1tc6E@R|C%0ij9KM?%Yk`9KNMf z@H|{VgU6jKC!$p|&aeba^uh>IN zP^ zQiy{^riSDJ6c!$NWe{gCL2rQ zS*H~gXR8}%mQ-eWeeKH4EwyE>*X`QcJ1^|zknBcYjoA0-RD8`ww)Hg_yFdG+Jwpd% zHCOo%z4DB0`FUlLa@fY3w^tXGUc8%oxn1nnzPa(P8iT!|0dU4hh4x@1B^=Qk($PcTe!?RSj5=^6tgox`qW!+cB@?jUa)a zCP{Q+l9q>F0szCDrX>m2CRWcXEaEFLjw`OHq@yj@0eMz66z1gWtDCT45nwF1vB(A2$V|bnk5TQ zh8&lhES(d*03RiJ+LfrG>~$ivnB`EZ8Q5RxCRuPug9s$_VtH(rAfwVD;rTq}J3h+Vvys-0--Wn^o(hl>;)4W@6rV-jl5D{D$dYVR?J)kMKWtr7FB(+M@h<*Krw&fEY^q=!a(+i~Tmp*10?4%M1{lnVdf*2}uptV<1eu!i@kyzk)I`&8 z`fc7|O4(iwWht(BImESlkMNrCOLn>)GX83ADo>M(hrMw4?AeT7z50pQ$D*V^Jb;t; zK|;&gACIzx4LrF|x$BBo)CXc$cJ(8y5jZLAra+KMbJ_Gd^=<6A&}y!Z{GO*(_g|qgPlU{BcZj zhFR@iqg1%;xUm=8f_=zQ=}fcO3N=a#5&eL54->B;G^Wkb^giAD30- zzlYAxoO8Mzm*u&oGw&oT=1|u8a&h${w0Y#S272rCP=wX_oI}3suise0ecq>SWC3TL z-6eKFz!5nN;%O2+rGJzFraO?N{ctXv!a``k_XL}6mmjUqSVtIJ5t}J|c9Pd9thxer zG_s0%l!1_cTsJIA2!zB$M;l!bQ;>_ZXu-qGnml0fLVpQ!yq7yZE)C&*j zSXd7xbGWQ7MxXgCw3Kj?+IT7Lv`8H^l{wV&CN5*MCvE1(QpzYWohENlb|b2$3)ig+ z21?d+L0b~Ty;WDV2w?jCxprJbEQF#{PBih?&Jak0(Cd=Rdiif%KzZ(LL#4zBj}M1& zOwhue>5+<#9c3wappMddH)k49^W3bZZhV(9C#a*SgTD6Wt(kJ}o4B0aHN~#R&vzQ8 z$M5*L;8UaR0*z-Grh}`H5GYP#(+p1Ag9(+xyb0#(@g#}zq@-n&R7-1#B zmP0Emf=jaW%^L;(E_(`Uoa-dQ6+LxwP=r|tp+;mNa39w4Vi^^ypJRJ}vwSV*LUyD= zJ_r6Knq2Pwk6j=+7i!vWg;|l~WZvl&StD$Lh7hp8&CG!7eBG)pc|!D+j9}ngsOyA8 zOpObXhNTi}Qf~KLD7o{SQInL5Z}0IsMm5r)s-M5T@7T}%?t#nQi|-zKELXZyzy*e0 zKC)v{1zRypBeqCm%C2nnv2C;nQLx7#-_L6*e)d~T4A^vE(moq~YFUX11m3|xplVL7 zloVHeSgUAS|M0Y?pXcMV`n&cYpEoa8eOzyQxBl@(2mZ0`jUI9b;D{V+_4do*lP|Vk zjmjMR^m;WAGp8x^lmof*ypW<6o=36SBk4Ye|XmP;`7Ii{$o4aukSkS zeA-&B-ub-!?gele0)YYH%XUDhHqbCd41^qeFnq%g8Hs_i%61ayZvf{)F?c5jI*GhC z0_YLBFd5k{;`EI`HpN^5oq;a0){P+E$XtY_Y&X@+MzGLuE|L2{H|>Xw5ELR086w-m zK(!evtC&ZeGSI^!ycwn%nMYDA+smQ98Lm5=N7gjZ%j2~fVT{P9=$Gv?;!lrLqTN8@ za&({p9wVy%6$pp=9pnQ=w41x)eMZN3Ek_~|ZWr%}e$jbQC;e``0{Oh9e{w9GF<_M9&D22DnF0WzW{Ze);=(wMmO7|MFj7q#; z=5q0|$DT8XKAhRP0LgGuaTjzfnOMygLK340>BWW4-`UO85!0#=B%c*dUItL0(!0~fwYRDaWs(SF5+RU0`^V?EMJW28d+EJN=nfLvS!(3 zHCHcGSX9?GH7f>Ym}Molbab9{Z!-sl0VkSSX)B#TaW}`iw0bW9Cz@Lbh+Ri#W^1mw z0wMpJqMDiS33ADmvvvhMwGUe0y-&Dw# z-Og)$ldjEqy+vbCv?1u^5)H--)9~DY*gDNj8(tk)KsF%SD@YmPi8xgo(07_mr!lP| zEU+`M56Abu zXF=rrfxQn83`H>^uTa?>Ot~P;L0Ayaf7ZGXN;Aq_v~4xCiUL1-zj_K3D!g`>)UYG8 z*aSupRMy{VgND`lfSytp(h3ISlk$SZ;WvcI?U3dc)@$5&Of{Lc3|GsNNQTQgP_|=3 z^ISVLJ1rm1LYf|>*`CGIcwHKo4Db8->a4e^2^EmOWCLMpCelrt)fl{X5#ST%_PnRPs zo%AtUyaUde;^a`sedkFv1<4VrSJcN<#{621^PctJVg#KD8i=OlyhKSeF?@9tO>wc- zKt$|$^tgHe+bqWTUE<@E8Z8n+w@D zAznKx&eac2t^V9|52OKi(kN7IpQoZ`!7uVCHZH>>ac&IUXXv@O&B6Ap-J5>E7qk7! zRY*(%w^+kh8uyOvi;(qJ%NL*ikM-O}{`AdAE5&@Oy90fKt(#Gfk@?iivi-s{o6#P_ z`Lyo_`b9r%#-I@e^!RcE5>zi^Llp}c$Om_OZfs-$6RX^yy#7m|=N7P>92`{kdYOPh z6tc<44XLM(6VuLWanP|kUSIyQUy-||QMTX~t6 zyxbM-@{wfItE-GMJ%?53y1lkcc5B>7X8g&H}EVGUi;!175eW zr55E?b@i?_mJw+U*V@zwysg2o*6Y1}r$UlCK~eo9x7o?UTx&KyIk%*x+Xc~ z=F{_dsVc<3Yx&vA9S@&}&tJva1%hW@e|Xd37x589HFE(Eno3&CstX@i{GZ^%s*U}VSb71@&?44&1~ zEFzZSw@8ncbp34jM%9?wXFC2o$Ma3XyXCIw!C74j&sw;UR|ZW!x;?RzfxLSgb?^A* z{6GSy(a3(0K^a)kFemfMX){pw^{2L|MU=}OX2+Nw6?4FSdN{y0~Hg2 zJx(q2C@x`^v#EtQSux!Fu%4{I=vR{2VYGLa5s`v6!};tL?4|jqUD%cn>tySR<7%kt z`xlPZfH+Eqw1BfabQH!N_()zflg(i};h;)QL(tRmY9CCw0|75^%8`AWY8c$C&9`#6 zRv5{P|kh>gmwau(thR=zPMbKZOJmHIeNx3ea_Ue|~GrQoXK(}d2f1#0Bggb_-|+*NxII5HVVWc9W@jn$q#kaYG4__y zkPcrQqVss;ExY>*jEi&ilu|cHa3KpaTj&xCf|{Im7oQPDDhJG7gDRf8DUSLKz7u^d z%Jo5@>9hCC*~`YKb_g*k(N6bvTY2jHTV70Q3A`VkHZ&`rW`|DuTxMclYyZvqe1xi_ z9~9+hV4gPw@ClD!^gxEuPP#%aY^Ap-aU(fluJ0&p-cz*XLXR zy;lA*u|%7#>OzpbsWS1GxSVH`@J-J@a5C= zI5VvNVU)|hgDw(~>=rSLIn~rA5!gIxpvBJXRmLo$Sg2oa#5w&{W)P<6L`{e?t6f6u z3-d8t(`BS9*-sA*`l^|q~VYP+t+En}CL*52DEWZ=^ZqKxUkJ<7;k z=60!aY`Ras(;W=!x%Z^;j_1_eazj|aqmh;MOxlS>(Cmx1af5;22k$-w)5^Ubd?ll* z(k9_dz|kXl_Fk*)0meMJ1=X07VHCGPB1|0l{TxRKUAJY`2gKt@fn|NdiP!{K)@|!2 z-tiaRI(+=@WZU53NmSOEfOJ^cM)7Dii4@ftuj6zQK8l`=)Av|V*GrUAwDZHY3Wfd7 z1qn{zpQyN%X;7UWv`V4^9BqutJBP=&u18>4-FDG3rP3d*#a#0IntC!X$Q7obR91Az zsMm*PfpqR7??M*=zv5@UXD`)^Gu%O5&)##*D}bnz`qE`>V@_SriD)o}hh~n}nl<)a zWKguf){(sN_EU!A0UkP3F8z7$H^EDz`3gD8*LRn7+wYngv8O|R%L^ZAI{ZaH&A^8r zx5FBSP3JgdjjX=}I0aiMGj6_~B8Hc^1KN(qHSLaju1!m2N)Z*oayq6^8`K@vUkp6@li4AB6Vo-7Z`NiXH+*7-Gth7I~Dbl!b3&*Kipq zHo%pnXadR_Hj0jpN?VYl4Hd&9Rlf>0REOP;HE_2utS&$ic@aroubEY39a`@MsL+s2z)Ugi7-d{10giLp`_k$q^sc%8?L9;9e z7l^et329t-JNqP}Yn<9C-{o%x5UV^}$4AnkKul2HHvWT@mfM?yOo5bgH|Eb};)ma^ z^?OAkobdhOpcZ5lJj1WJDL^OipNi9ARCC@_O-Z@KCj)ZH`OfO zbiU_qTq!*&5CL@kzL_A$`z}pRE|(C)+~<5`PlgC0aiBa~v;NECTTgHdO**D|SnRtW ztCdtr!1~+79@qc1ZJWtE87tEm)!+&rtGuEu6ws1w3O!ZnVP7 z%^r0xYdp0_ykL2-{*kF8g?@XZiaKWdXziVLkj{c(!R$VqwL%CBNfb#2gzK!~lmp!3_KF zDGZ8f=Vbg9aUr0vp3T;D>0JF#|uB-}9u*&nVZfLZirOmGeU2D40fodVaSQ@8w z4h{)jCblyoj=Fhgf{V7y)tIt=@?oc5uML=Z;L%bO_lUa@?7{Mj!dcJx#f`UFcLOTk zZKvM~oG*BDL`YVr*)A2v!IW673NkvtxTc07GCmzfafgYYgg3vR6YmrYFaqRdLl}V( zu za^uvNY~sqxLKX+?=0JfL?GkIQMkf}pzqhq^Sh|`K<@p(ro=R#JESFyxdlDwlT*hgz zaRhgGVOockeGQCv(&%KR6LjN>$H0*h=HSD{nK%7$1~?Lr{muwbX>WUfVc>STk(ey# za_4#};_*hd(Kfqm!ChZ>qanY8AD&w(`>JiTV$MJ%_&Rs+@o0rG-Zb94;44I43G_%p zJl!Y!C0fRsWZ`d3+bM_bpMpb1cA7NR-Hh+vo`p`(=$;R;x0wXB< z0{O{lAqlTDWH0C7VxK{vaJe~iCb+D0SU+%*@?N*9h<@qqSP9d#%!6RmD)R|^)q#Li zOP0g)gep@V78!BW8%2Z{#^I4!2uR5i5m*skkR3DJ5`f{PmtUa)MqLSkFOL^9NsRoA zT%mxm%_>WJ9&)AVa(pRUNs)_w7uX_RKcbX3y3B^8rDx60R~WMvRZ*vZR|1#G5Ls?3 z1ez`5ZeatI_zb+N;ygD!Rl&7vTdmTVQVz3<9WXmvY`G1sAu0gesU%)`YPza}v+0qr z0N0TU38$(QV@+FGeDB&gkewS}Y)H*Z34ZaU>g-X28wH>T-HniNj}9obiC_HsMTp}v z%owym*G;%H-q}r@bFZ`ia3I&qe#)FWz5sk#>II@v!6JvFP-@KLQT})DaR!Czy{B&m z)L+H}AAg*CDMs8E1v)BqpRYbrG{dPLuJo$oQjDoIVb7gnJZjvj0^KZ0NOH1W$h2zg z^}Nbh$0)pM7dI68o^|sl!6P(Wm2XblJ-(s>(Rlhv`LWOC?j~1HqujSgp$JDA{2+~f z&IhNceM0BVQm)Y~2+Br77Q$jsr%2PEc6jWxJ~HvSxopKtv{in|{qU1DKMgZa03%oC zSZl;$V3w9esP7?%@_S?%P!GZ z^h03i?e?Pxmz{Q!A#F!L@XOo(K#cs+|K11~pVgz21tr2z!-sfBK*$bq=rQ{1N7`1^SIAhEPQux#I5yJ)<&eIA#mf< z#fH!XZ=;C6uca%0Od~tDei{DajUVzSrTmYIoU-U_)2I;{wdC4IUm$vn<*N@(k9-s7K0++w>jo5s{b0w^G+uM%b{mpC=v;kMlb53rHEdot;FN%W83Cq# zCR?k3vG@$yL30ffD;!AlVQa`-Rrl)&Be7mXjL$6{Njn`tc6F7lcr;(g%R(T$o;^H8 z!9+Og!;^*aB+X*HE-xZfdxf#d1rm58SL)TxAqL#}JCqs?%123=4y2S#$67xnIOm~K z_UJl+^!nJ=NzSY7L4^4Brw zF&yb?h+C*})vdBoe_o{iN!QD#-I0M&E#1T#SzXE-JpewF`auGN1Ix6)b|OT?)7rcc^Yrk$7o|*Rr(!& zSDFsYc~Ch0Y=8#45X6Tho){f)-jU5egpvivl>AUMuSsZUWa^MVc^=!a-|3E2|8O1x zNk;gQ1t7(NHMx@k&Oap^4&sEibVr>eU?+&Xp!m`ZF3k}JPhfvNEg7b6mowjs= zwbw_3jys3PVu*NY22f%zNSM_=ihu75qTW3XgC_sAH>-qNq&qQVvg? zR>6O^6cKd&f$Qu>H}g@%Y_jrp`LS*iTBH%q%*)(O{LM{2zJQ}JmxUp`vnj>2~E(FF^Quwa- zZ*?zA6!4s!V`QQi_A0EaZGkm?RO?((EswqYVr}8`>5X}W%C=w)oo~eEkW9DttIm!r zk>ApyHzXi<6tOK^1y)M_iz^ZF=#uC23~%Af{f}WE8Ibm3ESd?JozKx*IWQ95Ga#x; zA3VdrXYv=?q5oU7==}d)%m3r8U+-qk8E&-${G{8avRo5jFyy}C(HG7rL6W(H2OzJF zg~F!APLlC@UzqO}E|t6eb?bjOc-tp^GjnY^OKcL|5iPPlYp7b`d!Q?bZVIWMjj{B}d>X>OJXU-v;W+1)i-MLFB z3t}QIpAf(gBE(IkAQ|8p0mQvJ5l|}YxRE4h=U^nzh88lpKo$WrPfP(QsO)NOV!mBr za9vBQJ-3{F)3weny{PmX#Q%@H_kL?~-`fSBgg}ZAB3-G{yMRbXLy-=mAR;2YcLAkK zXi|kxr4xGZRX_|yx)c>eLj`4;UYK|FN58>Vfr{mc@jhg(m7gRlaR#*w&kO zgDB;7ARpaQVph`xI@*35n8*#@d_ns23;%hWoGWaOwJYB)*x5QSrbq;|TFzHi3_Rc> zm2GlDTZ9X0XCeg5oh8h1YM($9#4`mra~HIT<7{X3Gefw!65aJZj$!Bam7fl?;W zF>8$xLT)cgnqQ){=rqI83n$LgQavD=g@5+9y8<@Usjzf(usBZM$O1vRqB$!{y-Vt7f2@f8ClS>YTp{HR7qD~M zC>>Ljnxb54=5EKo$3;iU#uKg!UnGqv- zcIX%hqh(BdnQm#pGsIoKqEb1H-rP*Gk9?@Whh-e8*6D*>l!eoIWfIXvgQVe}{B97? z-ig1G%L}lTUu<6DXCWc;#}jLj{$P^I7XbKgJMv;HYWw+zaK~O4PCv!E;kx+>cHY=l zlG^EXJhpZ!IXbxY7WmYuo~-eMwg$DHs%EDib0B?cG5!5jW9_}~LqT6b2CQRaM;4s3 zpqCp8W{oHh=^j@{m{D7&j)w-pbwm{4G#5w+J@a?is##&)3A<=EKSB0BvW_Sygwkc2 z^hG3Z`=`N_hL-RVv1g*z{WpQ1R?*7coqLQ>O9KUVwekv8IAH0p_lSp6D0EW6{eACC zmrSkYwj?HRV9G`O=Pgo|M4tO&d%6@}%48K1U!}<8n3>3vZAmZMSYY!drh{A_>hY zK4MXCW`V783o^F(wpyeB8(#J1e%n2L5q>)aZx)%|Bc@S*!I8`V!VcruAPB=WFn93K zd%HalPW#$%iMQmLYvj?p!Q)8V@ps2$i$~#I*k3>21w+VE0f6lPeLKwhzZdRnY52}T zKWWnStBAbtfW(FE=yh&stw8oZvswT6NPy0AhYsHv%P?^JK;<|!tUX(!J1b?%9Z z*R*cd3y|&EQy&cwhUfeuFTui(%ABZ@Qo5sar8%IwO#J6z|1)b&S$ej`wfv8|f4TeP zt$xSj7+sWEM~KN$6DCVI$2tPr*VC-~1V zOTgpIag5VAcGL9?7Z@diol{wNNHt5V^Xz!Nm*0-Qzw=} z#}GtfM{nOv7MhGMh zSl<1*_j&Wf;m=$lb@Z)0)iEk*}nV<_h+{MH~ha> zoX-=0{dp7yFSE2iHdzRw+^y8=H~sJ-;D@0WU>x}J2i%Mn;)x|3D}q!{C^dz!_tnrJ zKixjSHr08rhN7XOK?qt0UUWF~5n&Ea5;b)yl50~09?h?)#~gERVa)8ID0^ZK@EYl! zhu~ZCM#gmRV9v!W*1aTBUd-DzPngvWRh^aIG6NA{ALZHZG%x)M;BHyvFj39OZg*ObkzR7|~&>ViC8 z@QtbBs#$ZCAjT5cYkFFz`0MQS!To63xyB8;R~EUr`LTpd=&u6^w$T@1$V;-ncA8k5>xp4ar>*$@ z3Ifw(H!Jw^K6*0X=%rX^w>`0GmQ6pMQ3uZI$WV#q9rdwJX4f)v>Ej9X27ocqauNv5 zZN*QN%ml%`G1@pbG2<R&t0K_Y0F-EFV!!4hdU7c^NJTgINRQBdPn*~yG0I^Vd!B&s*j0- z%~zOApl1c%9AZeUs=h6e_>VO+!rX*?kC*LqW3zgU@ejH`Df^FvufA2lyPem!oef#@ z^)v$(-wwPxwb|f_#}a2xKMP-%0!B&K1vt%c^D{The$Xo1bPf3Oy59fi!3~6Kwa?4y zymsCXtiQSsm(KV2ALX)*{`wx&N*O4zI~o@gtnltHRF7L=w;$azbW0Qrq|DYW%^1xt z$RmZjf_QYXFd@TM8Yg_nZ6X0lfOjeBZ+XMT)Bb~2sp-@ChYPJllIj)6Tc21s zY>XM1+%EQ?oYPxme6w!h;2!_3i#zY?!hG*TZ{ z6Igs6uAMPXE$*)kg&c`yPW6WL1VE;)%|uwgKc~f{WP&^#&+1RSu6F!@GotPjIvKhA zB-5T`=@MuKs@o>MWYo#RUYX*w5-S;}VmWspSN2L<{gKwAwGeO7wQ;)3Zz6o`zVMHR zYPOAdYKZ4gl^71W%QK3XX6HG*TN`ZUw=gae>Ux<_bKvsoiMR5%=j8zZdApEmgS=&d zoryamfc`zf3CNvujl9%NTBiVu7a8Zj+F4QVn+h9xCr5xhB*fJA*dhb2Fk;_YF93tQe4ph=(2YR4+j`p zG(tGFwpk+>e~n?$?6GXDQQ-}CT~RT31c!*2QG7n){H#=etls`Ihluzux}I>Q`_KXk zp4}R&gwwyw^HEn7OVuAr!ElQxd7}Z90C?zIY@&|u8Ftzm>Gm4wQcNO+=`A((AsKG$ z96ZUclRiUPyxXPA+z%26pK@%EM0j)WA7Odug4m}+asVfvu!7j4qL5G@i*begvrPnI zabZ^N3iF*`bM~Y;8pYV(&>w=q>O#sKW76S;MitX*<+UcdLGV6M7J%`I=t6{=sKgXX zC3r!`8kuPZkmMeH>O3Y5G4qXsNMONsmp8tNPHH{r2cNm%T6lY&jOn|=MpH6+A6l!$ zL0i8PgPWlB79EdDz*?Ti7VVDFn@$*lLr}2`;f1Z1f?vffJw2SA6SDqJ2jzyuuk_VY zqQf_8&@*UtY-y?x5j7Ca(vGy ztA~dT87XW3>ZFf**nDNN>M0Akf1oCmn7-Y5n3&|Kc(~%4_W%jn=?A~2a6sdtoD^cV>rCwjoZ}$4K@q z$KDDbb_jZ($Dx2Z^xzop@6n$HgVTTT^q1wGp#MkReg0aLa0QZ_4Q}7(4;g_-5VHx$thIU z4WO%Dz3YhZ?dhFaXqor`dHZp-_I60m*xGib}!~j@!uLW&fT^i zOp}s#w(`DEJgP*3?EIm=AF7!o8oeN%Hm;*qsC(I8a9`ZvS^!&!(U(%|;#a^yll#Qr zE5cM^WT=FUW`nV8lv7`m09|usSdr}!SLHj=DalsF*v?&|I^=oUg8QXVO-KDX^?kSk@lQQNyp(%i=Db zG-8K3kR{0vR~tNNBz1hd>HnooNcEHui2jOD-n+$PrVj#* zAMjC!j_1f6-+9@IJAA^Uc#K0t=@Bsdk!GeLujCkDA<*mIS|o5!23*)>UaH)OPjL*- zBd8L*HAxzn)VlomgRK@KMSle^AOk_cfK}Q|4H|gy2x>(s8LMlBPZ*Y3L_=C4I1-)- zmUhSMb~NP2>Vt{{rFIoynH*;o84|~fN80egod!UScs79>14zB)7Jhz_t}tV%(YefhBIF6q&9MswHrE)gC& zWYU4weF%)z7;re7Pqk}JSz=P-P>%A(WkAU@@i<6T`n;W-(7uBrv~q3j7AaZ9m=kT9 zhJzX$KJ%937}l@TCwLidcy<6*Uo_|JRI&N8vY`l^z_6NH;L5U7_TET-9c@=%}tQprl0>zfich9PBZt$U0yE4PaLKyHDZf`Hm*C8&I zcka?2_DWe4<8__;I`5fRs={G%0q{2_rtw757_NZxmRUC>o2*nF-#}pYx2+}atCUL- zxs}(iN!qvP#Y<}X9k)XvUeO}N51H-nCG2UjnER9w85n6)SpH568YzPDGK)3t=w4*? ztW-MwWD{{IY#}3GyJ^|r9^kZ=&4<0uM{wPh@v5Ot#*#icb*W|RYYqB`P$Okv%y#d; z$WguGB*-6BZ&X#ljXYS@p~u6*9h}#4OrySW6;xk3Hy@4P{vI}bwQFWy)gtg$mC(IOArXXPRXJP#-sByxUlVyvVUZhx5YDOY+~Zppk2@8 zOyA4hV9Ev}ZcJef0E+fFNd>oL6ZHI4ORZc8 zZL%(=@S7I z{{dfOqZVnsO=;o2+Rl$N4PgP-XwC`0ZwMn9zjUZ(_+om0y_&E6HMbMufZ~0drt1n- zd&?g~0O!&EAZa8)qTh#h^K+P)Y4Zt(UXp9xQA9I|uwtI#ksEEd(?ra@e|T>O!dAA= z9S7L``a-X#XBA2EXz8Qa z%p*Et46jI>$vcb)x5?xM#o{V<918A4_!uiUeUk*>nzS2!#DBOF5~CPv$w>+0K7)$q z6a2;&t0U2s>uYF({Dc%=8skC=86eeD&B)FaramQ3DFJGEtHThhgzdtNM(^A^!1Xne zWu)`VTi0o@yZGW9hIm`<+>V}Gii8OE{1pV8Y1;0596#@BK@;yFchP7M5}Skd9OEq3 z#h>9T&05>$D}y^5QI?<1(olu_wU!b|$rp_j&N7*lsZ=VSB+^+$YS!=4GvJAJ!)Jlc z+L$0Ccx7@CUhug7#ih0kD25Z)RfqAsk87AvCODyxnA>M5W*zoQt7CNql-u~n%F|kF zVop_ayLCm8upY^DvjP+B;nftd52ZEtHB0Et;or}`>V&~Df?-bstqn+ePWN@Q`Wp(L z+b!{AnKLI@EHdAPQvlytdp%0*^Vq~bfFN$sTA`A`eD!X9>cwa*z$RX#^?dXO*-wR0 z2XcA%%LuVMq@%ym=NmX=G|hpAz%$r>$jzIupk7{$M-SiXF&W>JyX{D~>1i2AcEQ6r zu;~67*ka|^S)X^EUq6^9LK{haD6-NsO!g+47fe>*__S4osdRUOZl0~CF(adiX&Th^8~fg zT74zgXs&?f2gIL9qd%3@mi_tDF*jm)m+d+(4kk+ddw%SZFH^!*ciJ&wp^4w4z&8gZ z-jK2pPolu*{dgVBfVq;BC@|nA3s5poF`@mVf8 zd8K86c+2eanpzv>LW}CUmM6L>RhtNr*3K>^^g}C%E2uZ~3N>0c55F9|=@}9A>TQcq zuPr2LdcJnz-kXKxQkGG72ytaA#q0gu{*vvlIF_dm{0gjo=PKPCjP4g%)lL5~BmH^cE)Ni>7pb@y4mcVVLcJt@M%9-!Dq96` z3&MqkZe-1Js@)Svd^gnOITR}&CA6h&a(DTt(h;(ns2-BoRCkZR)Q6>A9^xiO# za#?Z;Hwbz6>X^AER{s0b&wAY6k_Z!x@ZFE|xtC|oJw4#NUC?&9c@}xNxz{*B&wlBd zFCV1gYv+SsqDpg=D+4#pjzz$%7%_xIV>}0uDa4=wK&P&E1<@4+&oeOHXV8p*CxL4* zQZU{;u|w_J4=_}fcdh_*u%9hL0{w~|d2SNGK9YV|&w-{UD>aRg-nUzPbm>RSqS*Sm zG&7C3 z6TSKKi;-~Mw>)XGfZH;`r|vXw-tdnny!n8<14TZqF<3}qt7fF?XP|g(m9!lsgGew8 zY@l`tnvJZ|qd53WOR~$>oXHvR0E(>QY*=ovu$V%aq@nJ5B{!#;gJWwMwgLk*9HGgE zittVrEXEk;V;;EHSUK-!$WSJ<4?0!RG^|x~r?~Hi<{|`WSa)gT)xlQz0)$hmNEl{J ztwYumq~h2!4K2{~OP`X@!1enO5Y&g;VW~$)r)#^-#oG}XR$A+ynyd}wx_WHwwC>Wf zL=*2au%C~ty%)?0l$pX`-4$bIi*x#L|AMWI*@!-k*3IG0dqB{OuPs_>quo1N4Pq*K zMZ_`d*A-E(^|4R)r7>m>MxjCW$6%|8cvt{*w{YylQno=3CD~nS%+*jh~W>H5=OB_|2|9@ZnE)MQbc) zhYKGauM|9XIr>`^c*L#@!?x+mjg-6O#~Ykz_Vsfh=Ntq@*t-<=uFG<_4T*x8%AN5! zKZ<}2%AO}JYtr~nuV1MCZ+teaULuW&(yz577RJ80+#X4E=hS5!d;L}X(`kas_7F1- zIaXu;2AeOxoe9)>U?6ZxIEWToNPgzckQ=7{w{*d3_>i@XhyRNPbMYKxs8M!zy1NmV zT&(&F*8a+j>2)Hh;$OU?f5-q=WxLBHfjsu#5@OP%Tzl~Z;EFQ&?{y9|Wo``dl`I^Rno*@Y# zwEb0xQ$k7(AvrZ&H`6&6taG?gaIGjC^bDEbi!=A}t8Z<)8r)>z6Vcw?BZERzHX~}D zzZl`TH_!|`8J!$OJ+tZLU>yuKUBf_?xw*gJ}5nRZ+K z4n44+AEA&7LVS7+>EX^*lKcXk@m0GP16K?L3}&W=Oqm`rDg9dE8PD%elvF#m5s$3n zI+fyrZO!~v$N3^7$js$cq{q^g4Ed0hh}6^I`G4wITyF5SQm5BW>d~T4blGdX^7yB= zv-)FtqCoH6&uJ7{6Sa(;14vy8p||z;8TP{MMw*LHR7anR($JpQFcsyB_!3=Dcg8q0 z!v@+Ues}h{o{4nIphncBj64mLOqIKjk_N1Uesv|21B zrFO9v4^>CpiFp2LqD7)VQw=Lx<~pBlyivBe<>PY!$R!nvSoPD7Z45kd@%HRA*c9gk z5@N#LwLR{Ps@Kv3>02vl{h1F?G(c8R!gw&0mUrytxlmsZyF8TlHe=q2unS?ux+&!8 z5lYqaFSGfAXT32BLX!D%Nr4no04R`VY}-dB>(s3AR}@tq#a5JP0mNh}L2Nf^(LAa* zgL{DtWDwnYF7BV|?PTX| z@9&W(ui)ytw!NkT9lc(uw|?_^Aw zXHp>E$<8q`ksyhcAuZm^k0jq}t$c2NFLe_C)eba}$+)A08BYbMLY^#fVy>gG;bglL;6*~UV5(7-@b|M2C z-)F>!mc>7NOh}kpFzUWLW*3|q;V{eQ_Un$ zHEP^chT?^-V$k|Gm(D$GgM98Ybdmx7yJq}~?DgyChqK>cb|Xpw`#q=i^qKgum|5dH@@WlE_saG8`c61at1~dY`^|OPZ}sTdscz>qX$@Gf8!&gqSc>!< zD>$AallvHx(-SSvi*AUh6BDdo#F0Ogd4=hQpS7D)?#Jos3^uWGRD z1Xnf-lpCdXZCLw$uS31#6<#%ZL|YVZl0CF3=KkHwQKIuQg09Jz!FBw(9IX|$qI<-+ zU)DV9{pmRq$zg>Tx;Ey0o!7?{OhuGJj&ojc<`^Qt%)4yeTGnBdJ8p_w-l~K zF`PYOC71hjikU?OGW(D!lA~h9LI5@?`tdwp0-Gg;NP^kyBm5#*_Q0`^;N+1_m|Tb- z<$UryL2G*9Jw#su{~oQPatjqN?H1XUY_vQ72`?LSW{JV34!@L^P>~j#;Y8+Rnn@&< zTBdj=SQH}wY?`gmeVLWzoGKy`$PP`oZb<=QOXn32Zkk`o_huI1Ewu0^lokctN*^uC zoGvN_E10(-Fmk7;Hw6dEqHCn&nS)r;+~6gJ3LXZxAh@li&08BYHyEhMyzLr@8XtI%IAUT^vw|trhQ)>}+2j zmvx07F1_mX)h}z?bnaggEj;)6G?AnO!ND~A2qt(G)afS`vr0`BNOWePRoXCbv%m_3 z^>TX4G4+{8kdyXvq_%grIK-2a4aS#LkPJE88GiV}nJ7s1LUpYoe3bgDnFvHG?(TV} zZL&(wB)RhBeYdOYH^iNo#eYsVoTsb_o^&QBeqp(GOnX3$UEjGl)nZ|IAE_5zb06dS z9gm$RJbIx#BQuxP^;YfGqqCE44VBH5As@#Sp!73E0L(dXLZRi!4KwUVmFHeTLnSXn zzFCA{!1*|(Ys!B;UT%qZpj>=!u{D%x-d zlHQ4iLv}^od=&kR*EYk2csvQdKkFIcrUXOVfe_H!tvPaTL5(mj&PxyZx7YADuuOyEQ{o{n^ihI5jUjVR% zDnU-Rf=WCG_b`r-(~2se!C{o`*Zc|#P$2ZmZ^%yhd`gKU^*3bqp+VSOhEUOX2Y|NE zJMNxW0nO-y#3X5yhn~G-GB_^&=uUceenAAmB(Jcn+yWI_5?@hQf0YH{gl}kVlW`9= z3(Wvec-|@(`|#&O-3G3q#=|e`1FM}NUazJr44%CSdpBRu=L5O9u#(u}+qt?K)impD zH@aYF4&LJkh}!8V0tnj*a36u3r7)emh*b!7tBuE2p^+AO!BVvg_1Lqr4`STl>4u5%MkR>QvAJP+S}9&V9$LFfMU|VEUL5s2 zWV~fGl&#(NJF=@Z{o#afvE&FmHAmcShI7kRfA?)QSRJgSq!?3ZGgxLN`V|`m$c=2W z*JZq!n8W#fxol8vJAuX0uX1oFZfnhRk16iwfhTu_M8qHE0PAzi1X=7J*SHVUOh42qyuk^N8$Gnc`z44+L7&J_gH7 zn=QmPFpXJKKodkb@Sh^ai18e~{m@u79cm!ynwYqCGWDHEYb7I>TbKwFDoWBdU==MyTvn7|EONe>XtE1{;fI=fa(CNg#wmX`<0wbm+LJUn4VSV#q5 zPpgRs^^6gi-O|^9lC}EGt+Cm)NGjC4^27=Py*h6?j~n05hYKmZWJdsv0tT8>b*@sj z9FPElV}7nKlVKTyZ(VtJ+pf;M0P9NEX;+3c74>TR?~{HcAzi-lu1NSPa%G|gO@+v* zg-4|kJ+An2b2v=fsIT!Y^0Sn0+NF}AKWvz+8R~usgD+)ICF8?I0sX{UP z4W(ykjTKSD?0`1O3m;DaGVIDXSI?+i&E`ojvu-B-@*bGmdU{P^*cj{$_l@M^++9wZib!KJjf5;5hmZcZe1&MCsq*6si7{SY)H(IR*) z8UmT)`)Ve|cwSZb$){9X(Ds?>wfSwC@OK)9osg~LMap(uAj8G}Y!f-kwIU?TgfNouvS%GF+Od@@Vw(c!de9cHp7G%>;EEN>=e}8 zfyjJ`6V$G0SUY9+WC1km|KexD5z>NBs(IuF-NAZ)%@fa!i`!L?dnet+po2@-=JrXC zCMybY_j+PfDk0YabtY5K10>JQSmI4=g39aam1qLYY(UhO^>+Z!?OokGl||+dptfhY zt;q?Z`r=i6<^93eZ%aFz$EQC$?)3t4=9YZYy@|^kAv5=%eBQm!Leu9=^=a?B-lPve zbBKf`ZkpBvAqsh0F6tO{g=^ET?U2>xVFDZ$Zp}<}cRh6>myT+mziZJS&#QNArj;*R zI7Cggr|Ykt*sm@T=&(j}P4|6gmiW)oQ;3G5r*hw-CjH^p?O$X&Pf7>yjf}h~Wlyv5 zjJRk$adE1(<8@R_xnYuNe1M!R6~Azvlj$V^#%7yoJ@s|6dlTwV&|uf?x!5j z$FUFS4-dpYe3v>lm-An~I`zSnmhe5CZ0+-#n852}JOmwB6dPF06U)gE7C^rFo0Muc zAI8vO6Y}6RNVia8?w7m>mv`f37vkK-EJP+V%`HTW=%faR$c*)~i=OJTnS1mCFzk(z zLwR6hX~_7r94H7W3uuY6rKorbrkec3dh8P@pm&`wI+@R`la4n#McNwx>c3fY72PcG5I$O-J4()8?R zIh6`8+|+e>g1pBz3l|n{oeGH|Zu zEWBJ))c3ThpvrT5yC2(>6xH)P516Qp6$`G#ked!5N;h6M(a|sL_KCl7+EcpF7V5+R z+uzt5m9K~Fj|uug>J4d`J}Zy=l4B874;9{ry^;{Q(>TFzCR7KB(I!o( zt;VzWfXL{Rv)gL$2^>oVO_SN5)NKO6n_J5dBvj1ZuK_nBz+xTgsO$F}<3Zz0qF!=Z zc1{>ehJF^IsMw0m!z?DWq`F3j<-S!+ZF7rEUZ6!#3Rr~9gDST=Q`I#o)HLG1>d(0`e;mME^eWhecsd z1{MP6552BS*%gM#9~N67!*)e5c(uGEIiKIh!ua9&ceMnSez}t(WN~%PMUYV8c5g@2 z+bH=_*-iTUT*w;968I(!Lo}2iD4+kBztF13ot>nWah)KwWUf#6G8fZklys)K(AeC@ zS?@DgK5z2gQ?|`R@Qk~YIVxA?${k~Z{qu^a?xF0DPS4Gfm= z@ZUW6^kPfSBJhFruN^##|M5K7poVyWnL9>Pyx zU#@s{`LX6vSsM(XbH(5yy2BzIU)6#PwVN_C;Q#n3 z=9Zjd{a4h-S_E4-xpFi28%MPP3dVsQW;`8LJtO(vmt8kzLqGcGgGm3!Bi&s1I=PFi zy?gYSoP-93OO%ha;a6lIL3=bcf8K$f4Y2`+EZnrafKD^#f;STS@}zHNJ=yL%V-Q&x z5baSLL1zcm%8d63TyCDO-mDf9NW1#nCde)L8%gfK^>_dlc022U%eqXI#3!y%uR#OZ6tDNX`Of2RuGu* zYG+Y)^{+{U@-;U%pKn0>v6#)GqlyRI5%r-kH*3+yZ>6op_R_|{wAHhzA#NFuz~-da z=U<%G+Wi)TF(`Kdo)Il~`KkX8A`x*Y5>bpJTUw+jyY4HB+8|JO0D zCcVTNTY7)!v+olT;^?&>CkFU8mI@Id@mP4$gzTN%6>kL|<38Xqep?vrs(n`^3^YN? zIT>7y#)D24_5`C7EcZsa+`bE9xoKWxWf)i45pZC4?<*!488&zbI#EiOyqv4VW*9B;5C|Q;jmxVQ>CzIJK?T#V@`i`nSRh#~vNmotEdn&Z1(!kecluxm5Hz zMWtD*O{T$yzTEh#uiqfQ!&IV4BVg!jz&TKT`JIHdDu3k+-g14Gw#-3;$-&S1AnYZd z+f^UkUx0+1UiNzyaR$xzoUl%&0b^5tHa`wvX_TOJye-(;u==V*@8lS7Tz^wz`TH?` z4qo8YBIMQOGHWY~Cwnk)!FE9`j^lBf-?s@Q`vcj&GlUStr&mG}qrx<;h^-k{in!}p zJ%`&RO`6x@W(`P$=bmZ0QflC$NDlYbk3~$M>uv16r8dP?)jVbhYGyDDJ`R>4k09I^ z01nyc$rCKHP-vZ0orh-^+_8Z&`cv})@XY3rP!8WZNQ9hms)gdGrwER4u`X)h(Z!CB z7O_8o8jiSw2n463Bzj;Ja`~(}8j#}urWLPKMvcQ4D65kv8yni@C0`X8_{1#i4>BM& z6r$D%AzC;KN|e5?LRxC$z)6QONO04)+b==1jXo-n(hu9?Af6^{Mx>s3Kxe8vj7=pc z1*ow`(~6k!pve7ud8uP9BBKiAjLQ^@Vmf_-9{?+l-@(RmeYD_XpCtGw3&>LJ&QfEr z2uSPZSkS!+#q_Qsgzr&Ut?4GtiJt5reM59h{(ETs%lq@4$819e(cO*q%9_wdAFJ}u z&8O&s7h4qO;8o0rx$B#45-q6n?Ym{%YwhwC(OVQG;(67~UpGk=o<3fg-a^AqB@k^P zfe9j%l;zu7)QuWV+sxGO6t*$6mNvv*><|9ke)eL8-2t{!Ny3Mq+U%W)^-JJNQ(tG8dp0f`9!_CYn;!iJnB#p_Jxd@)B z!-W{h&BKp)RpD=oNjF`-{R=Grhm+;+$M|2!@jsQM{bvk`9O5r45P^r^C*aCWHHGuq z9<&&yQ-i%t!{b5-W*nBDrw@0jyB2%%rm`{Va0Cg|ET##G{jKCYAylpsnRu zbA_!p@p*M?RCn)CQDa@%@OT{EfF02F@@*)=9U?qE7r-*sy*R&Yhnlc|v$AQ|>glqz ze`m&{{>#xV7OVG5-@#oK)$mkeh$`YGB%;QgBFuw9CbI>a#}r9(A-#qHp5GhCDpe$k zs9RJCysHMX(r3iXAP?98|Kr-|i^epNp$aa*h{ zdwAhsAFrEm-&2@sk{zF@*B{=AjdHg7-+t>XPEa`RDE-B?(H9cH4Xor`B71-b`He4_ z{y9EmR1JY*NB*$im%*k#8ez!}C~(a=z4^kHo}o&y$}|s9}%x@9AfK zw8uQp5}Q258yYFsG(`en$-bFVUOKy~mcS!YT5wLsLh@r`q4E>sc(o0+Pp5UrL_VcV zGvNx2%{I^3q^)2gm!uu4O0@yogB`9%sMmaNGHr^cLg1`Z1IxB3V-YBfRew$kZQ(Cc zbdDMzEK`8^3nh7Ia-SFZxQ?wCLM>=C05h=Qw?id}72zPNPBK}=g`NOE`tUOuXJUth@`ao+a9moXJQ&z zk%ny-S&b5jyKme=<-4Y=;-Z7w>@#*eNM)LThD?(83raFAJ`eah>;Luh*AF;2SUns{ z?{YZ*|0_tvc(RlLFx_Mvdv8Sqs|ZloE+I{cWrHwp8=??n5H6KXeP0ep(^yIiYRVZ& zW@a%*vwcO8C-t+dt&<`=b)rekecs{nA9g~tdkm3MGQ)AXmW;x}#J&mSb!A$%v`Yns zt=CIqB6;E1kRpJ-j(iQ?7_E-I=HrKSf-bk z*ir|w4w;2+ei7$S7AXT+VRPEm@3!jg-D5$&-bEWNdvGu~ELcA@Jm!%TOXQ8{lSN7g z0|1QzC-1JXh}=rgDJ;5(_rGNV!YU8S*8EInbyIP!qi=J2R-;wJ)2`SjPHo-&fwfMM zs{^CnWmXkq6P|faKq}aa z*Ua(bd4d8nNxiddzlciL#p$yeNjrG0&PWEmejg9fd{wG1D?h$R#G5i8In<9O#Fx46 zXe5(A%cX`>e^d#(sD51}^2(i&xFMqScj<8?BT_t4f}FqTt!5$cC_x>SoC{Agd}xr2 z2rZ^^xP3uGh&pBQ6-U8fLIdtb7wXEjhXfl_;MM6xz{W7!E;xeqv(P+v;wcu_;L^?|7U zmQGZ*rEiA)KI8e&)}VwpLsu0{#r&0bR+69FS>c$!vwxK#_u+1DnevG?7USh@wpQ6JBO2DumLUxTK z&dHLwNa=*LxRY2!j2WKPdu22s^$S zp>8Dx{7}=4U=e?7MWr|x5uT(jwHjolZ2<0Ru!|6giSkT@0#>EjxgaRLh)5Tysqj)z zIxjIYBvoJLdNBoyeoa?$;Ld;&00GS2!MxI;*fU9F>vXc?b&;p2yES zXqsk0u8Ko5haM@Ew!||8VV30uNV)Yv%9ZnW+bPcr+xccPo8CPepi?=w2M=(b_>B)?Eid_y9B;}HBC~CNTx^3 zrDMVUzrd=h(3jWxH~(^}PFbBy-q{sb9!xtm|9SH6{|2n?{=swozwuIiyc~223qZ-t zlFF$N5HfwX8#mi<16JFmFszxC?jG=X*E$4d=U|^XH;1-T5l09^Y%f^i5OH{bx`-m= zLirh5#CB)Wz!*woW(o#BnY|l(6p$mskO_fYb-0V@oH)-ylK-S^0^k+*xZ$S>-uHyQ2Ncmx1TcK>o>nK zMnLD%04S25$$T3e=0&ll#3O3i&wA5cDDz7Z{n%oy)H{uQHZgX`P0Jtq2}r+iU%a8ShQMdE_Fvx3z!VI z)PC%fY*NhDl1^J36dkar@;2+T$-rICX%{@pzWS23lL`Bx^INR~# zsWAmfz9}8MM9ik_=^bi{1OZc%AIm#S$u3HxJORFq09bL`JR&Li)gaeL?pS9Hd&rzV zP;Tl9mGZNl{ctn-{IgrY(U-kI_}J~h`kh}p!KS!2rm-AuSZln=ac~WJznLKV(v(Ih zmBGqXFrCV|H|$uL?(-l#t|Syr8$%?*nb0W~Rt!c^oS!5wpn&ofZK4Irua!`cUeF<1 zfXQ%wdr_tq~|Kw*pEw zJQdqr1HAtj=Is;Q8$MCbUPvuh?2X8M1=TYw9JDR} z`MUgn0tSEjf*p_;D;Mk%2JCmQ`ZSmd=z#q#Z-XE$QGSq0g-jF6Mi#XpWw@G&BeoRl zsk_n8wk*&#z_lAK`{~}B*|n`6o@zO%?(ubcBIaR@vODln)om9EH@V82&hGLF~pg?by-51R8 z@T3%jN1a`8y~V#nPdS+i1wLQ{`)~L@2njXQ4hoBm(nMKD$Kj)FZaT-OJobcyr)K_- z_P)cf>FilMkPrxFAyN#uh8n6ZfD{205RoPX1wjO)N)hQbQW6L)AcWo_^w3dMKvAlS zfQuEeW2L!*iv>m3d%giR?(Xlt_bqpK@9*9JU_R$O^UR!?XXfOt%65Q-7FQ;xRxxXh zgc$L4%|{BI{8~3QpyyRSXozPtI}Y3}3b`xUJl8Lj4lgQ5+i zm-Bk#Mpj=IXIIw;{_Wt95;Q=2~zW^GQo@2Cr0Eq$XqVm zqRgo5=W_2Sz%)Oca0_Hwtme-}5W_d!Hq+kKS1h$k*v?$WByR70;a!8njU(EV;dh>_ z9cx*&hOp&G*1EfGeowY0nY1C9e z&9vAbuxvHKCBf{O(EEJnx?ucfohp>azxy2xd~~_AMccZsi+!8wxwDJ!=AI0dns=T1 zBr5!J=HWu~DL+m|tnwJA@W?X9KmT?A+Mk+wUg&p0VWKE#)N`VEiDKSPO_Y+6 zijxfLDzC}1|JvW*72Ld*z;znH`Xf%UyonwzBz~^PUuDfLT~5r?8n8f{daKVL({GGJ z^opgEn@4p0xLOBw55;i|ZC-nCy;b$On8t_;(;<{Krw*=t+5S}4`EbW%^`c1A%fpMb z6Pe144GOvDyG1LCfGeF(XiNi=A7TsTji%FrQVrthM(cO)h0Pbk6Bgq zT$yaRKD38EM^f|Dc+0|q%7%-RCu}1e&OCIgzkW6T?yPBtpw2}wABuOQP~-4o2W*Yv zQ{sdK_S27MW|?zj=lLW$!;5dd!4>|k+-+|_GssI&%5{99(asDI`+in+4K5I=joZM zF`wqS$9^~8w2Zv}Xg26M{2^OewnYMSz-v-8CBfXZJg$yMuSmXPRUYgIg@bxR7?Yhx z^VS{g;R(3emm$CZvn#cnP&LGlKQJhC)#rI-CJ}$9f!dn%Q?Yi%4TSBKJs)aY(m~rK zIBZYVrxd+nug%R?hl@7Y4hfBr&l?N??s`?*!(4)WHgKDD1Zq({<1&=C#3IB*IJ=}&xF_fM`i%R?+^>BcCwomDqF->1lU$5^THv1W%USszgOg~iktX`u-4m1WYbPm+B zK@c~T<-<%jV9y)ZhF@+{4Eq@rKK0Z&_(0(^&3BPZaak1;7h!0}LyAuUy(GFU^?+u2 zj#ab+M{d!sWQXkHa=rYD>U1%;!kPxP+Qya?UN09|=CSs*RW2bN=cJksCU*7rxYqZd zzch46tZev-{e`PHtghc2GyUoIy*u6`_lv~(Tm~K$i=B1!n^PF1gffKKCZZY0I zp0<1bA-!$#)00Z_z3$l47)84Q;sq_mH>)>1l{-e%Q5TlBfZclPd?8Ju?-?pQsRBd8 zk9@vta_P8RVYaH;=DA4$fpY~Kfz$UcwbqQ3>csNmj88DHRv2a~+7F(nyxtaveU>LrIdq&p*VWzATi@1qL5-vF;*bglb2vQp z%JmyJM{jM*+#5I+bj|ww{VN=_$Ns#7W&(Gf58eAYXvFlzobQy8!0ej~&lZCp?Rok> z_6d(8-2pDB`1IQBP8rIIsmaBwg!1#rA}U_@298x+Oq1A7TVr&*@=_+yD%ROuI$kxD zOK=%1GHR{9T=@SPr0M^AkX}pbCUc;I2%H=mkLC5aQDEZ-*F$m@nFELEh9h*HRi9#T z1hN$uYCIb+V5S$`mO;9-$f$Xn80g^(tlZfQ zco#IB@}w^NSS!42-?#RMq1lCTg^?PmhLFe@lU1qDR<09KfSN#>kfV~)H+ znfM|Iq!nO=X$`T2S>Mpu)SOw@(t6_LskZhG@#Ck@vOwC`fBr%?r^*%5pcRNu)5g+N9dpJ1k#2t?c8FqW4O79}nbAq!*7T2OW} z7X@Xfqom^}Peu8)*$M!Rd7tRY?C3o&-gDv7pj@y4ZRpC?Yb+uhyKVI2o%;_Uj6He! z?D@px)HDlYbFY5+2V>v;tn_P50xuekH=HYrJ@Rg5n~o!cal4-vsflSx?}jPIVIx|^ zF`s{UO5rdF!boW9Vm4Xm>hK25>Bs(RM;I4;@v2WJJWXOi(hwW9kd+{n<8e1ecGYVM zi63_hN;$z#gxSXD5)*fm*-H%JFcj=GES&?!^;zPVqpqGM9(CW~^!1}I@Id+!SN{-B ztcCs1@`VVndksiP!G|r-0v%}YCa7Y9rmvHp!DK zqZh-`XuB(S=BOjlqpQ<|J4Iz|z~kCx(6nppZhP}fR*k@0=$?lzMtyhBvi_+cG!e;J zxp_oPzD(F*dXZ0InX6@`cTNon1Fvgpma1r}5|{kePh2u>4KOWc$uy5?1>rs&`Vp%V zmT8@wGR6G5>Muk@)Jg&_=_?6bwv;h$EKp1;6Xr7V>C#-cU_ee8k%Mch+ouV?Z122L za`%?-&ygb&h2XW~A05L6!5AtXL`@1Y2QZqrUr|U&sfmNSZux#vO-}ewdk6X=7%NyAXUxI>72q zb35YIQH#!2jYc!wJ9F&=ip|MW(21#AefZ8ZLL82M3Fdj~NNj#23h!O)f=ny-I#}%$ zR=dad4{f3?+vG)RU}eE#F8KR9F%!QAqx#OP0Gs5vD*Lvl3ZTmajd9^QR)Ufimq>16 z+vg8W+YNXKN;ewIkGYz2Hc2&1-B5qPbzAyP6y?C~<)bpBCIj*}fTu$V#xnVP+LtDg z%i}|gp5An!+-V9cgqq;qje$QQ*j+n~YjAk6Ei@a4kuHo#266GRP-YP;APY z$XK`%Bcpebp#xeXD_@E1P^uq$!Cn4FM)7{jtQ7L);N+%^2EHzEWZDD8cdw^twJ=#^ zq8-eBlV6WaHzNPAWsw&uywrbJMX`8QwHuNhTtl!Z4o{Xz#wJ&kfOZ@h$ z?Y+e^m*_v_H|@Y&%}7(*q5@;eVMaKnGPt591Xbr+^qX^9GV17(QIk_vDe0Z|Yr4ey zEgkAW44)S>DBr%2tr<`AzvP{vO-~ivVMwSRd%?`O@)EtdIj?3iH5f4vZXY9b`*bR2 zl-l*HxkpB&Z_YPG?TUnAxO8B`GU;whTDnGgWd3ptFLA1%R8?;?uFc78pcFP!u)^@; zQB7@rfxoj5q6^BBh4Rx@Xjc)VHC>pBFzDDGTDS1`$VmkWVAenuiX@c@TIJg|OUGdf zr*+!LOOzX2pkuSmwK?;!LlFuKS98xq9k8DNU085(fqXJ2*A9ut<=Gs@2NaiANMXV& z{mPh*rHQr)zq9H`U{%7BRe&k5PxUSg*)220MUi5Din^)DhR(`>@Or`?DqsKG23r%c zKGlSKq|Eq7??$ImfmN$_+NYfaxldN!1drE|<4qS=7Da0Nv2vfKV3iyJkyw^GJevi7 zV{|biJKQ?9%!gjRU$-_{m)Q_f+7bd6{+(^miKQ;v_95KC%HA}>idF*=Y&*nak`RmW z0v6j8E>Y~%n&oKPJSHHWw`HY3c2gL)=)>;kLAAYBHRzW?o15Rm?6$h(SRM*Jbmowduq|m>|9b^`SyJfSOwFHBVAZf|8;zIXG8XaC^n$k@4^H zopRoRn11eTsPYH0w-+1aQqxkxmYg)xCNEj5Fe%ubQR3p{FYQy|ZE9Z&a<|$Bc#E%P zbXsiMZ|qy5IqH&qlT!*e8a;TPXc6z>ZHX}Nq zg0!bPytLLEF6Emf{KxmX?5pzA;lglTgEd{IC#!*B+6Q!jVJvpzV(~AgOfb70_^O4B z(r`6etT`-nDkTsx7rx~e{FoLp!Y+Rv4MO|t2aAs)qqXc~G{S%*d`o)6gK6+AmaisL zOUkr)G3BOCdl=Q$m;kAS`e=0Cv6#A(AqQL9!`aSm5cb6rVwdSekz^dKL>#uueq0Mo z?3`AL?@wrv#%Q7ppN$^UEUiq&cxkQ{y3r6qyKK4!Qj?Pgl$VEfpD;+GQe~9>zLu)k3|}7jl>KmXj1qM_Xt0^kZF5TTJIo~ znl0|OX>O>|onFws#5l0`UZi{kgt?%21;^jnRaETcSyEQ6C@daY!K|&Ui-hwwkaU|9 zTfBZ_+aXr0Ph37T(sFiGUZZ1lEmHr$TdKL7lcT)HK;`kLPWT+W-bEtCwi)k^IZ_wU zrNm=%^Hu7IH1bZiMpIYG#Qq(`k;a#2ptsCB=Pzf*cC8S55CigDyquAR)}<7g0!E;7 zNHvM~VBHba{wDYEq(*k~9fXlN4zUhy`9hhjM5NeoxRpl^SsCUDz1z*5CNb1n1T_J2 zR$ig8eP+!zE2VQj$q3yiwDbzY^Piu%6TYu-=%qM5mFs%kJj=M>MO6A>dS+&bvqzR; zhP7Y*K6GITHM~4(H@qs!ad&O#&a?)0Us$qhHQ=_mFHUMtPsiJ9U$}orCp-5g$l12= z!wp~s%iIRtWQR0f1OUy_$omK)_NB>7g~2WY$zHjIGNc~9?z0ncQU{ZVASl>Tv@o&p zmOH-WBFi=wulnr>q{?bt;^rPut09EfJ)DD z4$00-*=`zw0j);u%rX+Pq%!>QQt_|lm{|>#?Igcp@5{3Rwq0&~neN%BTDPZBM3IF=szxV0c?-x$WCkO{Wy{^ z%ZgvXX+ivw_GAVAEqkDR(>Em-%1!XrCHoAd(W-b}`?9)v?SO`egN){=)O_(%-*XD& z8W04R;~2R0;$etuseBKQn5~QA9CR-ROtA)C~Bw zP1aoU*zH!dcP0ApCcMu~(bU36k2-VB#Z8C^GSxLSP9B}8>J7bWSP)djeo38zq8SyH z8XNLxRR?y|f2~FWm399n zHIl(Uqek*dXN-}sB3zRxspH7?R^z?T33Je`0~OWj zq78|VkZ<4ZR@PtjbIh>wiFapb%$!Rn$A8bvUm5TZDyn~d3GC{halMd`?@=E`+m6t3 zafF+bE?s}c1*R9b_LETbqz;*f!iUTmn}_u%32~zI`{u9an-quW4BOeL@Bcw0FmP-^ zJ{PIvFnsP!0iRi?#;JR⋘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 GY5fOuZZib{ literal 0 HcmV?d00001 diff --git a/src/assets/404_images/404.png b/src/assets/404_images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8e2305cc973ad2121403aee4bf08728f76c461 GIT binary patch literal 98071 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 literal 0 HcmV?d00001 diff --git a/src/assets/404_images/404_cloud.png b/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..c6281d09013e0a2c5f8e699a0a6038d9480291e5 GIT binary patch literal 4766 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 literal 0 HcmV?d00001 diff --git a/src/assets/icons/svg/404.svg b/src/assets/icons/svg/404.svg new file mode 100644 index 0000000..6df5019 --- /dev/null +++ b/src/assets/icons/svg/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/bug.svg b/src/assets/icons/svg/bug.svg new file mode 100644 index 0000000..05a150d --- /dev/null +++ b/src/assets/icons/svg/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/build.svg b/src/assets/icons/svg/build.svg new file mode 100644 index 0000000..97c4688 --- /dev/null +++ b/src/assets/icons/svg/build.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/button.svg b/src/assets/icons/svg/button.svg new file mode 100644 index 0000000..904fddc --- /dev/null +++ b/src/assets/icons/svg/button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/cascader.svg b/src/assets/icons/svg/cascader.svg new file mode 100644 index 0000000..e256024 --- /dev/null +++ b/src/assets/icons/svg/cascader.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/chart.svg b/src/assets/icons/svg/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/src/assets/icons/svg/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/checkbox.svg b/src/assets/icons/svg/checkbox.svg new file mode 100644 index 0000000..013fd3a --- /dev/null +++ b/src/assets/icons/svg/checkbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/clipboard.svg b/src/assets/icons/svg/clipboard.svg new file mode 100644 index 0000000..90923ff --- /dev/null +++ b/src/assets/icons/svg/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/code.svg b/src/assets/icons/svg/code.svg new file mode 100644 index 0000000..5f9c5ab --- /dev/null +++ b/src/assets/icons/svg/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/color.svg b/src/assets/icons/svg/color.svg new file mode 100644 index 0000000..44a81aa --- /dev/null +++ b/src/assets/icons/svg/color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/component.svg b/src/assets/icons/svg/component.svg new file mode 100644 index 0000000..29c3458 --- /dev/null +++ b/src/assets/icons/svg/component.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/dashboard.svg b/src/assets/icons/svg/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/src/assets/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/date-range.svg b/src/assets/icons/svg/date-range.svg new file mode 100644 index 0000000..fda571e --- /dev/null +++ b/src/assets/icons/svg/date-range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/date.svg b/src/assets/icons/svg/date.svg new file mode 100644 index 0000000..52dc73e --- /dev/null +++ b/src/assets/icons/svg/date.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/dict.svg b/src/assets/icons/svg/dict.svg new file mode 100644 index 0000000..4849377 --- /dev/null +++ b/src/assets/icons/svg/dict.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/documentation.svg b/src/assets/icons/svg/documentation.svg new file mode 100644 index 0000000..7043122 --- /dev/null +++ b/src/assets/icons/svg/documentation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/download.svg b/src/assets/icons/svg/download.svg new file mode 100644 index 0000000..c896951 --- /dev/null +++ b/src/assets/icons/svg/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/drag.svg b/src/assets/icons/svg/drag.svg new file mode 100644 index 0000000..4185d3c --- /dev/null +++ b/src/assets/icons/svg/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/druid.svg b/src/assets/icons/svg/druid.svg new file mode 100644 index 0000000..a2b4b4e --- /dev/null +++ b/src/assets/icons/svg/druid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/edit.svg b/src/assets/icons/svg/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/src/assets/icons/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/education.svg b/src/assets/icons/svg/education.svg new file mode 100644 index 0000000..7bfb01d --- /dev/null +++ b/src/assets/icons/svg/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/email.svg b/src/assets/icons/svg/email.svg new file mode 100644 index 0000000..74d25e2 --- /dev/null +++ b/src/assets/icons/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/enter.svg b/src/assets/icons/svg/enter.svg new file mode 100644 index 0000000..f7cabf2 --- /dev/null +++ b/src/assets/icons/svg/enter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/example.svg b/src/assets/icons/svg/example.svg new file mode 100644 index 0000000..46f42b5 --- /dev/null +++ b/src/assets/icons/svg/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/excel.svg b/src/assets/icons/svg/excel.svg new file mode 100644 index 0000000..74d97b8 --- /dev/null +++ b/src/assets/icons/svg/excel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/exit-fullscreen.svg b/src/assets/icons/svg/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/src/assets/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/eye-open.svg b/src/assets/icons/svg/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/src/assets/icons/svg/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/eye.svg b/src/assets/icons/svg/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/src/assets/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/form.svg b/src/assets/icons/svg/form.svg new file mode 100644 index 0000000..dcbaa18 --- /dev/null +++ b/src/assets/icons/svg/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/fullscreen.svg b/src/assets/icons/svg/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/src/assets/icons/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/github.svg b/src/assets/icons/svg/github.svg new file mode 100644 index 0000000..db0a0d4 --- /dev/null +++ b/src/assets/icons/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/guide.svg b/src/assets/icons/svg/guide.svg new file mode 100644 index 0000000..b271001 --- /dev/null +++ b/src/assets/icons/svg/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/hongcha.svg b/src/assets/icons/svg/hongcha.svg new file mode 100644 index 0000000..e36eeeb --- /dev/null +++ b/src/assets/icons/svg/hongcha.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/icon.svg b/src/assets/icons/svg/icon.svg new file mode 100644 index 0000000..82be8ee --- /dev/null +++ b/src/assets/icons/svg/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/input.svg b/src/assets/icons/svg/input.svg new file mode 100644 index 0000000..ab91381 --- /dev/null +++ b/src/assets/icons/svg/input.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/international.svg b/src/assets/icons/svg/international.svg new file mode 100644 index 0000000..e9b56ee --- /dev/null +++ b/src/assets/icons/svg/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/job.svg b/src/assets/icons/svg/job.svg new file mode 100644 index 0000000..2a93a25 --- /dev/null +++ b/src/assets/icons/svg/job.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/language.svg b/src/assets/icons/svg/language.svg new file mode 100644 index 0000000..0082b57 --- /dev/null +++ b/src/assets/icons/svg/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/link.svg b/src/assets/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/src/assets/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/list.svg b/src/assets/icons/svg/list.svg new file mode 100644 index 0000000..20259ed --- /dev/null +++ b/src/assets/icons/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/lock.svg b/src/assets/icons/svg/lock.svg new file mode 100644 index 0000000..74fee54 --- /dev/null +++ b/src/assets/icons/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/log.svg b/src/assets/icons/svg/log.svg new file mode 100644 index 0000000..d879d33 --- /dev/null +++ b/src/assets/icons/svg/log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/logininfor.svg b/src/assets/icons/svg/logininfor.svg new file mode 100644 index 0000000..267f844 --- /dev/null +++ b/src/assets/icons/svg/logininfor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/lvgou.svg b/src/assets/icons/svg/lvgou.svg new file mode 100644 index 0000000..e56f7ae --- /dev/null +++ b/src/assets/icons/svg/lvgou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/message.svg b/src/assets/icons/svg/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/src/assets/icons/svg/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/money.svg b/src/assets/icons/svg/money.svg new file mode 100644 index 0000000..c1580de --- /dev/null +++ b/src/assets/icons/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/monitor.svg b/src/assets/icons/svg/monitor.svg new file mode 100644 index 0000000..bc308cb --- /dev/null +++ b/src/assets/icons/svg/monitor.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/moon.svg b/src/assets/icons/svg/moon.svg new file mode 100644 index 0000000..ec72d77 --- /dev/null +++ b/src/assets/icons/svg/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/more-up.svg b/src/assets/icons/svg/more-up.svg new file mode 100644 index 0000000..d30ac11 --- /dev/null +++ b/src/assets/icons/svg/more-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/nested.svg b/src/assets/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/src/assets/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/number.svg b/src/assets/icons/svg/number.svg new file mode 100644 index 0000000..ad5ce9a --- /dev/null +++ b/src/assets/icons/svg/number.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/online.svg b/src/assets/icons/svg/online.svg new file mode 100644 index 0000000..330a202 --- /dev/null +++ b/src/assets/icons/svg/online.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/password.svg b/src/assets/icons/svg/password.svg new file mode 100644 index 0000000..6c64def --- /dev/null +++ b/src/assets/icons/svg/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/pdf.svg b/src/assets/icons/svg/pdf.svg new file mode 100644 index 0000000..957aa0c --- /dev/null +++ b/src/assets/icons/svg/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/people.svg b/src/assets/icons/svg/people.svg new file mode 100644 index 0000000..2bd54ae --- /dev/null +++ b/src/assets/icons/svg/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/peoples.svg b/src/assets/icons/svg/peoples.svg new file mode 100644 index 0000000..aab852e --- /dev/null +++ b/src/assets/icons/svg/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/phone.svg b/src/assets/icons/svg/phone.svg new file mode 100644 index 0000000..ab8e8c4 --- /dev/null +++ b/src/assets/icons/svg/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/post.svg b/src/assets/icons/svg/post.svg new file mode 100644 index 0000000..2922c61 --- /dev/null +++ b/src/assets/icons/svg/post.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/qq.svg b/src/assets/icons/svg/qq.svg new file mode 100644 index 0000000..ee13d4e --- /dev/null +++ b/src/assets/icons/svg/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/question.svg b/src/assets/icons/svg/question.svg new file mode 100644 index 0000000..cf75bd4 --- /dev/null +++ b/src/assets/icons/svg/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/radio.svg b/src/assets/icons/svg/radio.svg new file mode 100644 index 0000000..0cde345 --- /dev/null +++ b/src/assets/icons/svg/radio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/rate.svg b/src/assets/icons/svg/rate.svg new file mode 100644 index 0000000..aa3b14d --- /dev/null +++ b/src/assets/icons/svg/rate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/redis-list.svg b/src/assets/icons/svg/redis-list.svg new file mode 100644 index 0000000..98a15b2 --- /dev/null +++ b/src/assets/icons/svg/redis-list.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/redis.svg b/src/assets/icons/svg/redis.svg new file mode 100644 index 0000000..2f1d62d --- /dev/null +++ b/src/assets/icons/svg/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/row.svg b/src/assets/icons/svg/row.svg new file mode 100644 index 0000000..0780992 --- /dev/null +++ b/src/assets/icons/svg/row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/search.svg b/src/assets/icons/svg/search.svg new file mode 100644 index 0000000..84233dd --- /dev/null +++ b/src/assets/icons/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/select.svg b/src/assets/icons/svg/select.svg new file mode 100644 index 0000000..d628382 --- /dev/null +++ b/src/assets/icons/svg/select.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/server.svg b/src/assets/icons/svg/server.svg new file mode 100644 index 0000000..eb287e3 --- /dev/null +++ b/src/assets/icons/svg/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/shopping.svg b/src/assets/icons/svg/shopping.svg new file mode 100644 index 0000000..87513e7 --- /dev/null +++ b/src/assets/icons/svg/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/size.svg b/src/assets/icons/svg/size.svg new file mode 100644 index 0000000..1a409f5 --- /dev/null +++ b/src/assets/icons/svg/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/skill.svg b/src/assets/icons/svg/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/src/assets/icons/svg/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/slider.svg b/src/assets/icons/svg/slider.svg new file mode 100644 index 0000000..fbe4f39 --- /dev/null +++ b/src/assets/icons/svg/slider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/star.svg b/src/assets/icons/svg/star.svg new file mode 100644 index 0000000..6cf86e6 --- /dev/null +++ b/src/assets/icons/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/sunny.svg b/src/assets/icons/svg/sunny.svg new file mode 100644 index 0000000..cc628bf --- /dev/null +++ b/src/assets/icons/svg/sunny.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/swagger.svg b/src/assets/icons/svg/swagger.svg new file mode 100644 index 0000000..05d4e7b --- /dev/null +++ b/src/assets/icons/svg/swagger.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/switch.svg b/src/assets/icons/svg/switch.svg new file mode 100644 index 0000000..0ba61e3 --- /dev/null +++ b/src/assets/icons/svg/switch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/system.svg b/src/assets/icons/svg/system.svg new file mode 100644 index 0000000..5992593 --- /dev/null +++ b/src/assets/icons/svg/system.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tab.svg b/src/assets/icons/svg/tab.svg new file mode 100644 index 0000000..b4b48e4 --- /dev/null +++ b/src/assets/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/table.svg b/src/assets/icons/svg/table.svg new file mode 100644 index 0000000..0e3dc9d --- /dev/null +++ b/src/assets/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/textarea.svg b/src/assets/icons/svg/textarea.svg new file mode 100644 index 0000000..2709f29 --- /dev/null +++ b/src/assets/icons/svg/textarea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/theme.svg b/src/assets/icons/svg/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/src/assets/icons/svg/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/time-range.svg b/src/assets/icons/svg/time-range.svg new file mode 100644 index 0000000..13c1202 --- /dev/null +++ b/src/assets/icons/svg/time-range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/time.svg b/src/assets/icons/svg/time.svg new file mode 100644 index 0000000..b376e32 --- /dev/null +++ b/src/assets/icons/svg/time.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tool.svg b/src/assets/icons/svg/tool.svg new file mode 100644 index 0000000..48e0e35 --- /dev/null +++ b/src/assets/icons/svg/tool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tree-table.svg b/src/assets/icons/svg/tree-table.svg new file mode 100644 index 0000000..8aafdb8 --- /dev/null +++ b/src/assets/icons/svg/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tree.svg b/src/assets/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/src/assets/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/upload.svg b/src/assets/icons/svg/upload.svg new file mode 100644 index 0000000..bae49c0 --- /dev/null +++ b/src/assets/icons/svg/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/user.svg b/src/assets/icons/svg/user.svg new file mode 100644 index 0000000..0ba0716 --- /dev/null +++ b/src/assets/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/validCode.svg b/src/assets/icons/svg/validCode.svg new file mode 100644 index 0000000..cfb1021 --- /dev/null +++ b/src/assets/icons/svg/validCode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/wechat.svg b/src/assets/icons/svg/wechat.svg new file mode 100644 index 0000000..c586e55 --- /dev/null +++ b/src/assets/icons/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/zip.svg b/src/assets/icons/svg/zip.svg new file mode 100644 index 0000000..f806fc4 --- /dev/null +++ b/src/assets/icons/svg/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/blood_zero.png b/src/assets/images/blood_zero.png new file mode 100644 index 0000000000000000000000000000000000000000..7475ca7fbf071a3dffc7ebc6a9d4c9ddb4ece12b GIT binary patch literal 32292 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 FV1kRC^I!k~ literal 0 HcmV?d00001 diff --git a/src/assets/images/dark.svg b/src/assets/images/dark.svg new file mode 100644 index 0000000..f646bd7 --- /dev/null +++ b/src/assets/images/dark.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/light.svg b/src/assets/images/light.svg new file mode 100644 index 0000000..ab7cc08 --- /dev/null +++ b/src/assets/images/light.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/login-background.jpg b/src/assets/images/login-background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1e9e6fd627098a37c8d15db93d712f484cdcc69 GIT binary patch literal 179896 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⪚Qtkb%d>g#-LSNh%i+&KIv%8nu~e?RcYN{JrPu3ZEc-{+d1p=Ro` z3o@D>Q7n&QH(`7TaJlh-mO*F+hnbxU5`W>KpFXJYR>23d9r|WKCndtboo=LogRLB@ zO(|Tx>$0A9C;Roe?`?4EPK==KdC1PA8n~k znkvnfS8=7n-}~-|GBBGE0ROdU73(0Gt10z-{|ns`F!{3E>LB@t zBw3_%tx1G9@#^=@^oOSHW$u{-)?bfPY=lt`OyeaNbWNlQ@U-7{NaVEBHrUj}RIlm0 zpKuC{E)^W?z2)F$sJ_A7_F8`(SM7NOuiw;((13x-*rW_=O{{3TTJ{px)3IdV%Uuo} z@fT=>>D%0NTI38m0%0DPE7eM0kkNm3)ip|C5la2TKdK*qSyI= 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
Mwjv1O|m)?Ado-a(W~a$DrxyA`8Df-aa~G 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/login_left.png b/src/assets/images/login_left.png new file mode 100644 index 0000000000000000000000000000000000000000..2344b3eaca01f315aeb06424828cd13f7c0619b4 GIT binary patch literal 85471 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 z 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�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 literal 0 HcmV?d00001 diff --git a/src/assets/images/logo_new.png b/src/assets/images/logo_new.png new file mode 100644 index 0000000000000000000000000000000000000000..74849a249cf3623f514a75a52f36040ce1f20853 GIT binary patch literal 12411 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

D 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/profile.jpg b/src/assets/images/profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bcc14d353f49baa566ede594bb3041df5d013daf GIT binary patch literal 6832 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 U_n~$qm&KpQ8{`v0x|0w82VaRRegFUf literal 0 HcmV?d00001 diff --git a/src/assets/images/xjt.png b/src/assets/images/xjt.png new file mode 100644 index 0000000000000000000000000000000000000000..c641ad5daec3d6053164c3c234b4731a20a595e7 GIT binary patch literal 1767 zcmeH|`#0Nn7{}=vmyoSPqq?+ZWzEqc9H(MMq>Z8O>Q>=|Vm58vGMCLIJt=M7iflqA zr7hziXla8*rB#w3zU`UIW>iWd->SLIHA|N7zS;k<-}=Mn^Ld`$Gb5`KaAwaPpZUT2;LR}hMr?Yf9zZUZzd2|!bmF-__BMfT z9C(QKKJoo{{)b1=Ir=6Ow5t~i|Je_J^0jd0)pfjV<$k`CvduGKvD>;bIxjPTvVL=O zJR|DaJD&s5QG>M>ug}gBavqk~hZZHaO{^)y0|Yc7MS5EN^UGhel$7Ic<(*S4T=SW= z<+hSE46V2mR~7ts8uaJFQeaD~0b><_dNH@Q&*v7h97_r7odW|$ti$q%T`Er{-cTY4 zuen{aM=qoNNW<23=krQ_qo8OI)%DJDnu;V1K1wm9m{8WOAELHdH9GZna!JDQ(jyktXYtrmd&u^b*?6DTt_BJO&w$KtgJ9?^ zw>xmIlO~vv7W=uTElIxb70 z9_#Hs>Mkqb^^Wt?-irHli#e%!%?c-b@OUX5^E_6a z0JwgLa1I{ZvZJnTVnzCqY?|~QiyCmKZy{o$YwDG1jGglZGW|h|B}&XsdnWFqi#}>@ z%~O}XNB|Cd+zgy_fj*N*nITxjGL3`_R^*%X6HEY}Cw>+3LiLI6DEn-K$e7Avwxd9b zd`=Nm!Sb`3iGj)DfoOMGabLSDB(QJ*Z7sWoji%W&W9r&vtcX5c1B+C95Yb#2jKFh2 zcG0cm5}XsYUivRllZuc-fs4g;5iNq zGY7QEN_c|jV}W)O8USw&Yt*jSN=N_&>>97IS?%Ot(W_?PWVYg@ zt3pAhfq-qv;h7*S)RmxBy@X**%->XSKD zE8~6TzSO=3I)amRQG1yBbdlvxgWi4F77BF26sDDH)xsxyF0%Y95v5Ya7O;rU3tR`!a|EkEsHSwnJoKFMe;v|dG!@qAgMZDPUC%_T&i_eAs z)nb;J)30Ba-ut%a-+qUf`Hdx(Kx-Sl^BYTSz>MpSFAly*4T}6_*|0;8`DHQCZA{b8 zF}>!cfChA;afcKwr{sV|?iJetL$^3*dG zl2*MhtEMy;#MEh=GD!F( z<8Y_1v1ZnpWve~EE_l!0>+s+apUa`8eyh4Ca9-r@=we;OuGtN=3h0oD4x45I!}UOF zvcgPXEl_65QK%}|G$&-5ow`6e)5$Wh)2BNa%@3LOg4IQKZf$G}^Ul+?L6PS_Q0 literal 0 HcmV?d00001 diff --git a/src/assets/logo/logo.png b/src/assets/logo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ebcd63dc13e137e55917821a274a6fa37b956c18 GIT binary patch literal 137750 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 uhsG&Ga?r?YuaLUk%==ioTdATs div + > .el-submenu + > .el-submenu__title + .el-submenu__icon-arrow { + display: none; +} + +.el-dropdown .el-dropdown-link{ + color: var(--el-color-primary) !important; +} \ No newline at end of file diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss new file mode 100644 index 0000000..286fabb --- /dev/null +++ b/src/assets/styles/index.scss @@ -0,0 +1,716 @@ +@use './mixin.scss'; +@use './transition.scss'; +@use './element-ui.scss'; +@use './sidebar.scss'; +@use './btn.scss'; +@use './ruoyi.scss'; + +body { + height: 100%; + margin: 0; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +.no-padding { + padding: 0px !important; +} + +.padding-content { + padding: 4px 0; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.fr { + float: right; +} + +.fl { + float: left; +} + +.pr-5 { + padding-right: 5px; +} + +.pl-5 { + padding-left: 5px; +} + +.block { + display: block; +} + +.pointer { + cursor: pointer; +} + +.inlineBlock { + display: block; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +aside { + background: #eef1f6; + padding: 8px 24px; + margin-bottom: 20px; + border-radius: 2px; + display: block; + line-height: 32px; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + color: #2c3e50; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + a { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } + } +} + +//main-container全局样式 +.app-container { + padding: 10px 10px 0 10px; + height: calc(100vh - 5.25rem); + background-color: #f9f9f9; + box-sizing: border-box; +} + +.components-container { + margin: 30px 50px; + position: relative; +} + +.pagination-container { + margin-top: 10px; +} + +.text-center { + text-align: center +} + +.sub-navbar { + height: 50px; + line-height: 50px; + position: relative; + width: 100%; + text-align: right; + padding-right: 20px; + transition: 600ms ease position; + background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%); + + .subtitle { + font-size: 20px; + color: #fff; + } + + &.draft { + background: #d0d0d0; + } + + &.deleted { + background: #d0d0d0; + } +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } +} + + +.compact-form { + flex: 1; + position: relative; + height: 100%; + overflow-y: auto; + overflow-x: hidden; + + + .el-form-item { + margin-bottom: 0px; + } + + .el-form-item__label { + padding-bottom: 0px; + color: #08355E; + font-size: .75rem; + } + + // pointer-events: none; + + :deep(.el-radio__label) { + color: #08355E; + } +} + +.filter-container { + padding-bottom: 10px; + + .filter-item { + display: inline-block; + vertical-align: middle; + margin-bottom: 10px; + } +} + + +.flex-between { + display: flex; + justify-content: space-between; +} + + +.time-line-box { + display: flex; + justify-content: space-around; + align-items: center; + margin-top: .35rem; + background-color: #f0f3f8; + padding: .3rem 2.5rem; + + + .time-line-item { + display: flex; + align-items: center; + justify-content: space-around; + width: 16.6%; + + .timeline-content { + display: flex; + flex-direction: column; + align-items: center; + + .index { + width: 1.875rem; + height: 1.875rem; + line-height: 1.875rem; + background: #E1E9F7; + border-radius: 50%; + text-align: center; + font-family: SourceHanSansCN, SourceHanSansCN; + font-weight: 500; + font-size: 1.125rem; + color: #4767A3; + } + + .active { + background-color: #4096ff; + box-shadow: 0 0 0 .25rem rgba(64, 150, 255, 0.2); + color: #FFF; + } + + + + .timeline-title { + font-family: SourceHanSansCN, SourceHanSansCN; + font-weight: 500; + font-size: 1rem; + color: #4767A3; + } + + .timeline-time { + font-family: SourceHanSansCN, SourceHanSansCN; + font-weight: 400; + font-size: .875rem; + color: #4767A3; + height: 1rem; + } + + } + + .no_active { + + .index, + .timeline-title { + color: #9b9999 !important; + } + } + + .timg { + width: 3.125rem; + } + } +} + +.next_box { + display: flex; + align-items: center; + justify-content: space-between; + + .jt_btn { + width: 1.5rem; + height: 2rem; + line-height: 2rem; + font-size: 1rem; + text-align: center; + background-color: #f6fafc; + color: #fff; + cursor: pointer; + } + + .next_btn { + margin-right: 0.2rem; + } +} + + +.search-form { + :deep(.el-form-item__label) { + padding: 0 !important; + } + + :deep(.el-form-item) { + margin-right: 0; + } + + .el-form-item--default { + margin-bottom: .3125rem !important; + } + + .el-form-item--small { + margin-bottom: .3125rem !important; + } +} + + +.page-box { + margin-top: 10px; + float: right; +} + + +.tabs_box { + .el-tabs__header { + height: 1.875rem !important; + margin-bottom: 0px; + font-size: .875rem; + + .el-tabs__item { + height: 1.875rem !important; + padding: 0 .625rem; + + &.is-active { + border-bottom: .125rem solid #00a5ff !important; + background-color: #00a5ff; + color: #fff; + } + } + } + + .el-tabs__nav-next, + .el-tabs__nav-prev { + line-height: 1.875rem; + color: #00a5ff; + } +} + +.dialog-footer { + margin-top: 20px; + text-align: right; +} + + +.el-tree-node__children { + padding-left: 15px !important; +} + + +/* 禁止文本选中 */ +.no-select { + user-select: none; + /* 兼容旧版浏览器 */ + -webkit-user-select: none; + /* Safari/Chrome */ + -moz-user-select: none; + /* Firefox */ + -ms-user-select: none; + /* IE/Edge */ + + cursor: pointer; +} + + +.el-form .el-form-item__label { + font-weight: 700; +} + +.el-form--inline .el-form-item { + margin-right: .9375rem; +} + +.el-form-item__label { + font-weight: 400; + font-size: .875rem; + color: #81878d; +} + +.el-dialog:not(.is-fullscreen) { + margin-top: 6vh !important; + padding: 0; + // border-radius: 20px; + + .el-dialog__body { + padding: 10px; + } +} + +.el-dialog.scrollbar .el-dialog__body { + overflow: auto; + overflow-x: hidden; + max-height: 70vh; + padding: 16px; +} + +.el-dialog__header { + background: linear-gradient(90deg, #0c1a97 0%, #1373d3 100%); + padding: 10px 20px; + position: relative; + font-family: SourceHanSansCN, SourceHanSansCN; + + &::before { + content: ''; + position: absolute; + left: 20px; + top: 50%; + transform: translateY(-50%); + width: 28px; + height: 28px; + background: url('@/assets/logo/logo.png') no-repeat center; + background-size: contain; + z-index: 1; + } + + // 标题文本样式 + .el-dialog__title { + color: #fff; + /* 标题文字颜色 */ + padding-left: 40px; + /* 给 Logo 留出空间 */ + font-size: 16px; + font-weight: 600; + } + + .el-dialog__headerbtn .el-dialog__close { + color: #fff; + /* 关闭按钮颜色 */ + font-size: 18px; + + &:hover { + color: #fff; + } + } +} + +.el-dialog__footer { + padding: 10px; +} + +.el-table { + padding: 0 !important; + + .el-table__header-wrapper, + .el-table__fixed-header-wrapper { + th { + word-break: break-word; + background-color: #f6fafc !important; + color: #3c526f; + height: 1.875rem !important; + font-size: 15px; + font-weight: 700; + } + } + + .el-table__body-wrapper { + .el-button [class*="el-icon-"]+span { + margin-left: 1px; + } + } + + .el-table__body td { + font-size: 15px; + + } + + + /* 表格最外层边框(可选) */ + .el-table--border { + border: 1px solid #cc3d61 !important; + } + + .el-scrollbar__thumb { + background-color: #d9ecf7 !important; + opacity: 1; + } + + .el-scrollbar__thumb:hover { + background-color: #d9ecf7 !important; + opacity: 1; + } + + .cell.el-tooltip { + min-width: 0; + } + + .el-table__body-wrapper .el-table-column--selection>.cell { + padding: 0 !important; + height: 1.8125rem; + line-height: 1.8125rem; + } + + // .el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell { + // background-color: #a4beef !important; + // color: #000 !important; + // } + + .cell.el-tooltip { + padding: 0 !important; + height: 1.8125rem; + line-height: 1.8125rem; + } + + .el-table-header-cell .cell { + padding: 0 !important; + } + + .el-table--default { + .cell { + padding: 0 !important; + } + } + + + .el-table__cell { + padding: 0 !important; + height: 1.8125rem; + line-height: 1.8125rem; + color: #3c526f; + font-size: 14px; + } + + .el-checkbox { + height: 100% !important; + } + + /* 修改选中行背景色 */ + .el-table__body tr.current-row>td { + background-color: #d9ecf7 !important; + } + + // /* 可选:修改悬停颜色 */ + // .el-table__body tr.hover-row>td { + // background-color: #a4beef !important; + // } + + .el-table__empty-block { + width: 100% !important; + } +} + + + +.el-input__wrapper, +.el-select__wrapper { + box-shadow: 0 0 0 1px #96B8D9 inset; +} + +.el-select__wrapper.is-disabled { + background-color: #dfdcdc !important; +} + +.el-select-dropdown__item.is-hovering { + background-color: #a4beef !important; +} + +.el-input.is-disabled .el-input__wrapper { + background-color: #dfdcdc !important; +} + +.el-input.is-disabled .el-input__inner { + -webkit-text-fill-color: #4e4c4c; +} + + +.el-date-editor.el-input__wrapper { + box-shadow: 0 0 0 1px #96B8D9 inset; + + .is-focus { + box-shadow: 0 0 0 1px #f6fafc inset !important; + } + + &:hover { + box-shadow: 0 0 0 1px #f6fafc inset !important; + } +} + + + + +.vxe-table { + border: 1px solid #96B8D9 !important; + border-top: none !important; + /* 蓝色外边框 */ + border-radius: .5rem; + /* 可选:添加边框圆角 */ + overflow: hidden; +} + +.mytable-style { + + .vxe-header--column { + word-break: break-word; + background-color: #f6fafc !important; + color: #3c526f; + height: 1.875rem !important; + line-height: 1.875rem !important; + padding: 0 !important; + font-size: 16px; + border-color: #f6fafc !important; + } + + .vxe-table--render-default.is--padding .vxe-body--column .vxe-cell { + padding: 0 !important; + } + + .vxe-table--render-default .vxe-header--column .vxe-cell { + padding: 0 !important; + } + + .vxe-table--render-default .vxe-body--column, + .vxe-footer--column, + .col--ellipsis { + height: 1.875rem !important; + line-height: 1.875rem !important; + } + + .el-checkbox { + height: 1.875rem !important; + } +} + + + + +// 高亮 +.vxe-table--render-default .vxe-body--row.row--current { + background-color: #a4beef !important; + color: #FFF !important; +} + +.vxe-table--render-default .vxe-body--row.row--current .vxe-cell { + background-color: #a4beef !important; + color: #FFF !important; +} + +// 滚动条 +.mytable-style ::-webkit-scrollbar { + width: .6rem; + height: .5rem; +} + +.mytable-style ::-webkit-scrollbar-thumb { + background-color: #817e7e; + cursor: pointer; +} + +.mytable-style ::-webkit-scrollbar-thumb:hover { + background-color: #817e7e; + cursor: pointer; +} + +.el-table--default .cell { + padding: 0 0 0 .3125rem !important; +} + +// 表格input宽度,表格select宽度 +.full-width-input .el-input__inner .el-select__inner { + width: 100%; + height: 100%; + + background: transparent !important; + border: none !important; +} + +.full-width-input { + .el-input__wrapper { + // box-shadow: 0 0 0 1px rgba(64, 158, 255, 0.2); + box-shadow: none; + background: transparent !important; + padding: 0 !important; + padding-left: .3125rem !important; + outline: none; + + &:hover { + box-shadow: none !important; + } + } + + .el-select__wrapper { + box-shadow: none; + background: transparent !important; + padding: 0 !important; + padding-left: .3125rem !important; + outline: none; + + &:hover { + box-shadow: none !important; + } + } +} \ No newline at end of file diff --git a/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss new file mode 100644 index 0000000..06fa061 --- /dev/null +++ b/src/assets/styles/mixin.scss @@ -0,0 +1,66 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} + +@mixin pct($pct) { + width: #{$pct}; + position: relative; + margin: 0 auto; +} + +@mixin triangle($width, $height, $color, $direction) { + $width: $width/2; + $color-border-style: $height solid $color; + $transparent-border-style: $width solid transparent; + height: 0; + width: 0; + + @if $direction==up { + border-bottom: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==right { + border-left: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } + + @else if $direction==down { + border-top: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==left { + border-right: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } +} diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss new file mode 100644 index 0000000..5bcb881 --- /dev/null +++ b/src/assets/styles/ruoyi.scss @@ -0,0 +1,344 @@ +/** + * 通用css样式布局处理 + * Copyright (c) 2019 ruoyi + */ + +/** 基础通用 **/ +.pt5 { + padding-top: 5px; +} + +.pr5 { + padding-right: 5px; +} + +.pb5 { + padding-bottom: 5px; +} + +.mt5 { + margin-top: 5px; +} + +.mr5 { + margin-right: 5px; +} + +.mb5 { + margin-bottom: 5px; +} + +.mb8 { + margin-bottom: 8px; +} + +.ml5 { + margin-left: 5px; +} + +.mt10 { + margin-top: 10px; +} + +.mr10 { + margin-right: 10px; +} + +.mb10 { + margin-bottom: 10px; +} + +.ml10 { + margin-left: 10px; +} + +.mt20 { + margin-top: 20px; +} + +.mr20 { + margin-right: 20px; +} + +.mb20 { + margin-bottom: 20px; +} + +.ml20 { + margin-left: 20px; +} + +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +.el-form--inline { + .el-form-item { + + .el-input, + .el-cascader, + .el-select, + .el-autocomplete { + width: 200px; + } + } +} + +.el-form .el-form-item__label { + font-weight: 700; +} + +.el-dialog:not(.is-fullscreen) { + margin-top: 6vh !important; +} + +.el-dialog.scrollbar .el-dialog__body { + overflow: auto; + overflow-x: hidden; + max-height: 70vh; + padding: 10px 20px 0; +} + +.el-table { + + .el-table__header-wrapper, + .el-table__fixed-header-wrapper { + th { + word-break: break-word; + background-color: #f8f8f9 !important; + color: #515a6e; + height: 40px !important; + font-size: 13px; + } + } + + .el-table__body-wrapper { + .el-button [class*="el-icon-"]+span { + margin-left: 1px; + } + } +} + +/** 表单布局 **/ +.form-header { + font-size: 15px; + color: #6379bb; + border-bottom: 1px solid #ddd; + margin: 8px 10px 25px 10px; + padding-bottom: 5px +} + +/** 表格布局 **/ +.pagination-container { + display: flex; + justify-content: flex-end; + margin-top: 20px; + background-color: transparent !important; +} + +/* 弹窗中的分页器 */ +.el-dialog .pagination-container { + position: static !important; + margin: 10px 0 0 0; + padding: 0 !important; + + .el-pagination { + position: static; + } +} + +/* 移动端适配 */ +@media (max-width: 768px) { + .pagination-container { + .el-pagination { + >.el-pagination__jump { + display: none !important; + } + + >.el-pagination__sizes { + display: none !important; + } + } + } +} + +/* tree border */ +.tree-border { + margin-top: 5px; + border: 1px solid var(--el-border-color-light, #e5e6e7); + background: var(--el-bg-color, #FFFFFF) none; + border-radius: 4px; + width: 100%; +} + +.el-table .fixed-width .el-button--small { + padding-left: 0; + padding-right: 0; + width: inherit; +} + +/* horizontal el menu */ +.el-menu--horizontal .el-menu-item .svg-icon+span, +.el-menu--horizontal .el-sub-menu__title .svg-icon+span { + margin-left: 3px; +} + +.el-menu--horizontal .el-menu--popup { + min-width: 120px !important; +} + +/** 表格更多操作下拉样式 */ +.el-table .el-dropdown-link { + cursor: pointer; + color: #00a5ff; + margin-left: 10px; +} + +.el-table .el-dropdown, +.el-icon-arrow-down { + font-size: 12px; +} + +.el-tree-node__content>.el-checkbox { + margin-right: 8px; +} + +.list-group-striped>.list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} + +.list-group { + padding-left: 0px; + list-style: none; +} + +.list-group-item { + border-bottom: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + margin-bottom: -1px; + padding: 11px 0px; + font-size: 13px; +} + +.pull-right { + float: right !important; +} + +.el-card__header { + padding: 14px 15px 7px !important; + min-height: 40px; +} + +.el-card__body { + padding: 15px 20px 20px 20px !important; +} + +.card-box { + margin-bottom: 10px; +} + +/* button color */ +.el-button--cyan.is-active, +.el-button--cyan:active { + background: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +.el-button--cyan:focus, +.el-button--cyan:hover { + background: #48D1CC; + border-color: #48D1CC; + color: #FFFFFF; +} + +.el-button--cyan { + background-color: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +/* text color */ +.text-navy { + color: #1ab394; +} + +.text-primary { + color: inherit; +} + +.text-success { + color: #1c84c6; +} + +.text-info { + color: #23c6c8; +} + +.text-warning { + color: #f8ac59; +} + +.text-danger { + color: #ed5565; +} + +.text-muted { + color: #888888; +} + +/* image */ +.img-circle { + border-radius: 50%; +} + +.img-lg { + width: 120px; + height: 120px; +} + +.avatar-upload-preview { + position: absolute; + top: 50%; + transform: translate(50%, -50%); + width: 200px; + height: 200px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + overflow: hidden; +} + +/* 拖拽列样式 */ +.sortable-ghost { + opacity: .8; + color: #fff !important; + background: #42b983 !important; +} + +/* 表格右侧工具栏样式 */ +.top-right-btn { + margin-left: auto; +} + +/* 分割面板样式 */ +.splitpanes.default-theme .splitpanes__pane { + background-color: var(--splitpanes-default-bg) !important; +} \ No newline at end of file diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss new file mode 100644 index 0000000..5ee4ac8 --- /dev/null +++ b/src/assets/styles/sidebar.scss @@ -0,0 +1,238 @@ +@use './variables.module.scss' as vars; + +#app { + + .main-container { + min-height: 100%; + transition: margin-left .28s; + margin-left: vars.$base-sidebar-width; + position: relative; + } + + .sidebarHide { + margin-left: 0!important; + } + + .sidebar-container { + transition: width 0.28s; + width: vars.$base-sidebar-width !important; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35); + box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1); + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 10px !important; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + .el-menu-item, .menu-title { + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; + } + + .el-menu-item .el-menu-tooltip__trigger { + display: inline-block !important; + } + + // menu hover + .sub-menu-title-noDropdown, + .el-sub-menu__title { + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .is-active > .el-sub-menu__title { + color: vars.$base-menu-color-active !important; + } + + & .nest-menu .el-sub-menu>.el-sub-menu__title, + & .el-sub-menu .el-menu-item { + min-width: vars.$base-sidebar-width !important; + + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title, + & .theme-dark .el-sub-menu .el-menu-item { + background-color: vars.$base-sub-menu-background; + + &:hover { + background-color: vars.$base-sub-menu-hover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .sub-menu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + + .el-sub-menu { + overflow: hidden; + + &>.el-sub-menu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + } + } + + .el-menu--collapse { + .el-sub-menu { + &>.el-sub-menu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + &>i { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-sub-menu { + min-width: vars.$base-sidebar-width !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform .28s; + width: vars.$base-sidebar-width !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-(vars.$base-sidebar-width), 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + } + + .nest-menu .el-sub-menu>.el-sub-menu__title, + .el-menu-item { + &:hover { + // you can use $sub-menuHover + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + // the scroll bar appears when the sub-menu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/src/assets/styles/transition.scss b/src/assets/styles/transition.scss new file mode 100644 index 0000000..1f74a7e --- /dev/null +++ b/src/assets/styles/transition.scss @@ -0,0 +1,80 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter-from, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform--move, +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter-from { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter-from, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} + +/* 黑暗模式下过渡效果 */ +::view-transition-new(root), ::view-transition-old(root) { + animation: none !important; + backface-visibility: hidden; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.dark::view-transition-old(root) { + z-index: 2147483646; + background: var(--bg-color-dark); +} + +.dark::view-transition-new(root) { + z-index: 1; + background: var(--bg-color); +} + +::view-transition-old(root) { + z-index: 1; + background: var(--bg-color); +} + +::view-transition-new(root) { + z-index: 2147483646; + background: var(--bg-color-dark); +} diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss new file mode 100644 index 0000000..83706c6 --- /dev/null +++ b/src/assets/styles/variables.module.scss @@ -0,0 +1,280 @@ +// base color +$blue: #324157; +$light-blue: #333c46; +$red: #C03639; +$pink: #E65D6E; +$green: #30B08F; +$tiffany: #4AB7BD; +$yellow: #FEC171; +$panGreen: #30B08F; + +// 默认主题变量 +$menuText: #bfcbd9; +$menuActiveText: #00a5ff; +$menuBg: #304156; +$menuHover: #263445; + +// 浅色主题theme-light +$menuLightBg: #ffffff; +$menuLightHover: #f0f1f5; +$menuLightText: #303133; +$menuLightActiveText: #00a5ff; + +// 基础变量 +$base-sidebar-width: 200px; +$sideBarWidth: 200px; + +// 菜单暗色变量 +$base-menu-color: #bfcbd9; +$base-menu-color-active: #f4f4f5; +$base-menu-background: #304156; +$base-sub-menu-background: #1f2d3d; +$base-sub-menu-hover: #001528; + +// 组件变量 +$--color-primary: #00a5ff; +$--color-success: #67C23A; +$--color-warning: #E6A23C; +$--color-danger: #F56C6C; +$--color-info: #909399; + +:export { + menuText: $menuText; + menuActiveText: $menuActiveText; + menuBg: $menuBg; + menuHover: $menuHover; + menuLightBg: $menuLightBg; + menuLightHover: $menuLightHover; + menuLightText: $menuLightText; + menuLightActiveText: $menuLightActiveText; + sideBarWidth: $sideBarWidth; + // 导出基础颜色 + blue: $blue; + lightBlue: $light-blue; + red: $red; + pink: $pink; + green: $green; + tiffany: $tiffany; + yellow: $yellow; + panGreen: $panGreen; + // 导出组件颜色 + colorPrimary: $--color-primary; + colorSuccess: $--color-success; + colorWarning: $--color-warning; + colorDanger: $--color-danger; + colorInfo: $--color-info; +} + +// CSS变量定义 +:root { + /* 亮色模式变量 */ + --sidebar-bg: #{$menuBg}; + --sidebar-text: #{$menuText}; + --menu-hover: #{$menuHover}; + + --navbar-bg: #ffffff; + --navbar-text: #303133; + + /* splitpanes default-theme 变量 */ + --splitpanes-default-bg: #ffffff; + +} + +// 暗黑模式变量 +html.dark { + /* 默认通用 */ + --el-bg-color: #141414; + --el-bg-color-overlay: #1d1e1f; + --el-text-color-primary: #ffffff; + --el-text-color-regular: #d0d0d0; + --el-border-color: #434343; + --el-border-color-light: #434343; + + /* primary */ + --primary-bg: #18212b; + + /* 侧边栏 */ + --sidebar-bg: #141414; + --sidebar-text: #ffffff; + --menu-hover: #2d2d2d; + --menu-active-text: #{$menuActiveText}; + + /* 顶部导航栏 */ + --navbar-bg: #141414; + --navbar-text: #ffffff; + --navbar-hover: #141414; + + /* 标签栏 */ + --tags-bg: #141414; + --tags-item-bg: #1d1e1f; + --tags-item-border: #303030; + --tags-item-text: #d0d0d0; + --tags-item-hover: #2d2d2d; + --tags-close-hover: #64666a; + + /* splitpanes 组件暗黑模式变量 */ + --splitpanes-bg: #141414; + --splitpanes-border: #303030; + --splitpanes-splitter-bg: #1d1e1f; + --splitpanes-splitter-hover-bg: #2d2d2d; + + /* blockquote 暗黑模式变量 */ + --blockquote-bg: #1d1e1f; + --blockquote-border: #303030; + --blockquote-text: #d0d0d0; + + /* Cron 时间表达式 模式变量 */ + --cron-border: #303030; + + /* splitpanes default-theme 暗黑模式变量 */ + --splitpanes-default-bg: #141414; + + /* 侧边栏菜单覆盖 */ + .sidebar-container { + + .el-menu-item:not(.is-active), + .menu-title { + color: var(--el-text-color-regular); + } + + & .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title, + & .theme-dark .el-sub-menu .el-menu-item { + background-color: var(--el-bg-color) !important; + } + } + + .topmenu-container { + + .el-menu-item, + .el-sub-menu .el-sub-menu__title { + color: var(--el-text-color-regular) !important; + } + } + + .topbar-menu.el-menu--horizontal>.el-sub-menu .el-sub-menu__title { + color: var(--el-text-color-regular) !important; + } + + /* 顶部栏栏菜单覆盖 */ + .el-menu--horizontal { + + .el-menu-item, + .el-sub-menu { + &:not(.is-disabled) { + + &:hover, + &:focus { + background-color: var(--navbar-hover) !important; + + .el-sub-menu__title { + background-color: var(--navbar-hover) !important; + } + } + } + } + } + + /* 分割窗格覆盖 */ + .splitpanes { + background-color: var(--splitpanes-bg); + + .splitpanes__pane { + background-color: var(--splitpanes-bg); + border-color: var(--splitpanes-border); + } + + .splitpanes__splitter { + background-color: var(--splitpanes-splitter-bg); + border-color: var(--splitpanes-border); + + &:hover { + background-color: var(--splitpanes-splitter-hover-bg); + } + + &:before, + &:after { + background-color: var(--splitpanes-border); + } + } + } + + /* 按钮样式覆盖 */ + .el-button--primary.is-plain { + background-color: var(--primary-bg); + border: 1px solid var(--el-color-primary-light-2); + color: var(--el-color-primary-light-2); + + &:hover { + background-color: var(--el-button-hover-bg-color); + border-color: var(--el-button-hover-border-color); + color: var(--el-button-hover-text-color); + } + + &.is-disabled { + background-color: var(--link-active-bg-color); + border-color: var(--el-color-primary-light-3); + color: var(--el-color-primary-light-3); + opacity: 0.5; + } + } + + /* primary tag 样式覆盖 */ + .el-tag--primary { + background-color: var(--primary-bg); + border: 1px solid var(--el-border-color-light); + color: var(--el-color-primary); + } + + /* 表格样式覆盖 */ + .el-table { + --el-table-header-bg-color: var(--el-bg-color-overlay) !important; + --el-table-header-text-color: var(--el-text-color-regular) !important; + --el-table-border-color: var(--el-border-color-light) !important; + --el-table-row-hover-bg-color: var(--el-bg-color-overlay) !important; + + .el-table__header-wrapper, + .el-table__fixed-header-wrapper { + th { + background-color: var(--el-bg-color-overlay, #f8f8f9) !important; + color: var(--el-text-color-regular, #515a6e); + } + } + } + + /* 树组件高亮样式覆盖 */ + .el-tree { + .el-tree-node.is-current>.el-tree-node__content { + background-color: var(--el-bg-color-overlay) !important; + color: var(--el-color-primary); + } + + .el-tree-node__content:hover { + background-color: var(--el-bg-color-overlay); + } + } + + /* 下拉菜单样式覆盖 */ + .el-dropdown-menu__item:not(.is-disabled):focus, + .el-dropdown-menu__item:not(.is-disabled):hover { + background-color: var(--navbar-hover) !important; + } + + /* blockquote样式覆盖 */ + blockquote { + background-color: var(--blockquote-bg) !important; + border-left-color: var(--blockquote-border) !important; + color: var(--blockquote-text) !important; + } + + /* 时间表达式标题样式覆盖 */ + .popup-result .title { + background: var(--cron-border); + } + + /* 底部版权样式覆盖 */ + .copyright { + background-color: var(--el-bg-color) !important; + color: var(--el-text-color-regular) !important; + border-top: 1px solid var(--el-bg-color) !important; + } +} \ No newline at end of file diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..19bf96c --- /dev/null +++ b/src/components/Breadcrumb/index.vue @@ -0,0 +1,97 @@ + + + + + \ No newline at end of file diff --git a/src/components/Crontab/day.vue b/src/components/Crontab/day.vue new file mode 100644 index 0000000..07ffe90 --- /dev/null +++ b/src/components/Crontab/day.vue @@ -0,0 +1,174 @@ + + + + \ No newline at end of file diff --git a/src/components/Crontab/hour.vue b/src/components/Crontab/hour.vue new file mode 100644 index 0000000..2eacf44 --- /dev/null +++ b/src/components/Crontab/hour.vue @@ -0,0 +1,133 @@ + + + + + \ No newline at end of file diff --git a/src/components/Crontab/index.vue b/src/components/Crontab/index.vue new file mode 100644 index 0000000..16a05f6 --- /dev/null +++ b/src/components/Crontab/index.vue @@ -0,0 +1,314 @@ + + + + + \ No newline at end of file diff --git a/src/components/Crontab/min.vue b/src/components/Crontab/min.vue new file mode 100644 index 0000000..dc61554 --- /dev/null +++ b/src/components/Crontab/min.vue @@ -0,0 +1,126 @@ + + + + \ No newline at end of file diff --git a/src/components/Crontab/month.vue b/src/components/Crontab/month.vue new file mode 100644 index 0000000..288226d --- /dev/null +++ b/src/components/Crontab/month.vue @@ -0,0 +1,141 @@ + + + + + \ No newline at end of file diff --git a/src/components/Crontab/result.vue b/src/components/Crontab/result.vue new file mode 100644 index 0000000..ee32e0d --- /dev/null +++ b/src/components/Crontab/result.vue @@ -0,0 +1,543 @@ + + + \ No newline at end of file diff --git a/src/components/Crontab/second.vue b/src/components/Crontab/second.vue new file mode 100644 index 0000000..69e3fc2 --- /dev/null +++ b/src/components/Crontab/second.vue @@ -0,0 +1,129 @@ + + + + + \ No newline at end of file diff --git a/src/components/Crontab/week.vue b/src/components/Crontab/week.vue new file mode 100644 index 0000000..6b6e3b4 --- /dev/null +++ b/src/components/Crontab/week.vue @@ -0,0 +1,197 @@ + + + + + \ No newline at end of file diff --git a/src/components/Crontab/year.vue b/src/components/Crontab/year.vue new file mode 100644 index 0000000..cbc5852 --- /dev/null +++ b/src/components/Crontab/year.vue @@ -0,0 +1,143 @@ + + + + + \ No newline at end of file diff --git a/src/components/DictTag/index.vue b/src/components/DictTag/index.vue new file mode 100644 index 0000000..b71e68f --- /dev/null +++ b/src/components/DictTag/index.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue new file mode 100644 index 0000000..e154056 --- /dev/null +++ b/src/components/Editor/index.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue new file mode 100644 index 0000000..8ff9d10 --- /dev/null +++ b/src/components/FileUpload/index.vue @@ -0,0 +1,265 @@ + + + + diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue new file mode 100644 index 0000000..15a58a6 --- /dev/null +++ b/src/components/Hamburger/index.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue new file mode 100644 index 0000000..f578be7 --- /dev/null +++ b/src/components/HeaderSearch/index.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue new file mode 100644 index 0000000..a9d230e --- /dev/null +++ b/src/components/IconSelect/index.vue @@ -0,0 +1,111 @@ + + + + + \ No newline at end of file diff --git a/src/components/IconSelect/requireIcons.ts b/src/components/IconSelect/requireIcons.ts new file mode 100644 index 0000000..de6b46a --- /dev/null +++ b/src/components/IconSelect/requireIcons.ts @@ -0,0 +1,8 @@ +const icons: string[] = [] +const modules = import.meta.glob('./../../assets/icons/svg/*.svg') +for (const path in modules) { + const p = path.split('assets/icons/svg/')[1].split('.svg')[0] + icons.push(p) +} + +export default icons diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue new file mode 100644 index 0000000..e1bdd85 --- /dev/null +++ b/src/components/ImagePreview/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue new file mode 100644 index 0000000..f0adf77 --- /dev/null +++ b/src/components/ImageUpload/index.vue @@ -0,0 +1,269 @@ + + + + + diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue new file mode 100644 index 0000000..64cbca7 --- /dev/null +++ b/src/components/Pagination/index.vue @@ -0,0 +1,105 @@ + + + + + \ No newline at end of file diff --git a/src/components/ParentView/index.vue b/src/components/ParentView/index.vue new file mode 100644 index 0000000..7bf6148 --- /dev/null +++ b/src/components/ParentView/index.vue @@ -0,0 +1,3 @@ + diff --git a/src/components/RightToolbar/index.vue b/src/components/RightToolbar/index.vue new file mode 100644 index 0000000..11f0512 --- /dev/null +++ b/src/components/RightToolbar/index.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/components/RuoYi/Doc/index.vue b/src/components/RuoYi/Doc/index.vue new file mode 100644 index 0000000..c92195f --- /dev/null +++ b/src/components/RuoYi/Doc/index.vue @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/src/components/RuoYi/Git/index.vue b/src/components/RuoYi/Git/index.vue new file mode 100644 index 0000000..c76acb7 --- /dev/null +++ b/src/components/RuoYi/Git/index.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue new file mode 100644 index 0000000..5508a1f --- /dev/null +++ b/src/components/Screenfull/index.vue @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/src/components/SelectTable/YQSelectTable/index.vue b/src/components/SelectTable/YQSelectTable/index.vue new file mode 100644 index 0000000..6ba03ed --- /dev/null +++ b/src/components/SelectTable/YQSelectTable/index.vue @@ -0,0 +1,77 @@ + + + + \ No newline at end of file diff --git a/src/components/SelectTable/index.vue b/src/components/SelectTable/index.vue new file mode 100644 index 0000000..d0c1cf7 --- /dev/null +++ b/src/components/SelectTable/index.vue @@ -0,0 +1,402 @@ + + + + + + \ No newline at end of file diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue new file mode 100644 index 0000000..707c1b3 --- /dev/null +++ b/src/components/SizeSelect/index.vue @@ -0,0 +1,50 @@ + + + + + \ No newline at end of file diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..e6ff2a3 --- /dev/null +++ b/src/components/SvgIcon/index.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/components/SvgIcon/svgicon.ts b/src/components/SvgIcon/svgicon.ts new file mode 100644 index 0000000..086c470 --- /dev/null +++ b/src/components/SvgIcon/svgicon.ts @@ -0,0 +1,11 @@ +import { App } from 'vue' +import * as components from '@element-plus/icons-vue' + +export default { + install: (app: App) => { + for (const key in components) { + const componentConfig = (components as any)[key] + app.component(componentConfig.name, componentConfig) + } + } +} diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue new file mode 100644 index 0000000..be5363d --- /dev/null +++ b/src/components/TopNav/index.vue @@ -0,0 +1,215 @@ + + + + + diff --git a/src/components/elTable/index.vue b/src/components/elTable/index.vue new file mode 100644 index 0000000..9e80611 --- /dev/null +++ b/src/components/elTable/index.vue @@ -0,0 +1,484 @@ + + + + \ No newline at end of file diff --git a/src/components/iFrame/index.vue b/src/components/iFrame/index.vue new file mode 100644 index 0000000..b0febe9 --- /dev/null +++ b/src/components/iFrame/index.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue new file mode 100644 index 0000000..53c1e74 --- /dev/null +++ b/src/layout/components/Navbar.vue @@ -0,0 +1,291 @@ + + + + + diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue new file mode 100644 index 0000000..5d8f1fe --- /dev/null +++ b/src/layout/components/Settings/index.vue @@ -0,0 +1,304 @@ + + + + + \ No newline at end of file diff --git a/src/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue new file mode 100644 index 0000000..c659267 --- /dev/null +++ b/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 0000000..586bc8c --- /dev/null +++ b/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,102 @@ + + + + + \ No newline at end of file diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..fa1f69a --- /dev/null +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..0317753 --- /dev/null +++ b/src/layout/components/Sidebar/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue new file mode 100644 index 0000000..a26cdeb --- /dev/null +++ b/src/layout/components/TagsView/ScrollPane.vue @@ -0,0 +1,110 @@ + + + + + \ No newline at end of file diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue new file mode 100644 index 0000000..8825216 --- /dev/null +++ b/src/layout/components/TagsView/index.vue @@ -0,0 +1,408 @@ + + + + + + + \ No newline at end of file diff --git a/src/layout/components/TopBar/index.vue b/src/layout/components/TopBar/index.vue new file mode 100644 index 0000000..1ffb454 --- /dev/null +++ b/src/layout/components/TopBar/index.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/layout/components/index.ts b/src/layout/components/index.ts new file mode 100644 index 0000000..464f38e --- /dev/null +++ b/src/layout/components/index.ts @@ -0,0 +1,4 @@ +export { default as AppMain } from './AppMain.vue' +export { default as Navbar } from './Navbar.vue' +export { default as Settings } from './Settings/index.vue' +export { default as TagsView } from './TagsView/index.vue' diff --git a/src/layout/components/tabViews/index.vue b/src/layout/components/tabViews/index.vue new file mode 100644 index 0000000..0b8bd7d --- /dev/null +++ b/src/layout/components/tabViews/index.vue @@ -0,0 +1,189 @@ + + + + + \ No newline at end of file diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..fc98324 --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,116 @@ + + + + + \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..ec787e4 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,105 @@ +import { createApp } from 'vue' + +import Cookies from 'js-cookie' + +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' +import 'element-plus/theme-chalk/dark/css-vars.css' +import locale from 'element-plus/es/locale/lang/zh-cn' +import VxeUI from 'vxe-pc-ui' +import 'vxe-pc-ui/lib/style.css' +import VXETable from 'vxe-table' +import 'vxe-table/lib/style.css' +import '@/assets/styles/index.scss' // global css +import '@/utils/polyfills'; +import { + setupRem +} from './utils/rem'; + + +setupRem(); // 初始化rem适配 + + +import App from './App.vue' +import store from './store' +import router from './router' +import directive from './directive' // directive + +// 注册指令 +import plugins from './plugins' // plugins +import { download } from '@/utils/request' + +// svg图标 +import 'virtual:svg-icons-register' +import SvgIcon from '@/components/SvgIcon/index.vue' +import elementIcons from '@/components/SvgIcon/svgicon' + +import './permission' // permission control + +import { useDict } from '@/utils/dict' +import { getConfigKey } from "@/api/system/config" +import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi' + +// 分页组件 +import Pagination from '@/components/Pagination/index.vue' +// 自定义表格工具组件 +import RightToolbar from '@/components/RightToolbar/index.vue' +// 富文本组件 +import Editor from "@/components/Editor/index.vue" +// 文件上传组件 +import FileUpload from "@/components/FileUpload/index.vue" +// 图片上传组件 +import ImageUpload from "@/components/ImageUpload/index.vue" +// 图片预览组件 +import ImagePreview from "@/components/ImagePreview/index.vue" +// 字典标签组件 +import DictTag from '@/components/DictTag/index.vue' +// elTable表格组件 +import CustomTable from '@/components/elTable/index.vue' +// vxeTable 组件 +import CustomVxeTable from '@/components/vxeTable/index.vue' +// 下拉框表格组件 +import SelectTable from '@/components/SelectTable/index.vue' +const app = createApp(App) + +// 全局方法挂载 +app.config.globalProperties.useDict = useDict +app.config.globalProperties.download = download +app.config.globalProperties.parseTime = parseTime +app.config.globalProperties.resetForm = resetForm +app.config.globalProperties.handleTree = handleTree +app.config.globalProperties.addDateRange = addDateRange +app.config.globalProperties.getConfigKey = getConfigKey +app.config.globalProperties.selectDictLabel = selectDictLabel +app.config.globalProperties.selectDictLabels = selectDictLabels + +// 全局组件挂载 +app.component('DictTag', DictTag) +app.component('Pagination', Pagination) +app.component('FileUpload', FileUpload) +app.component('ImageUpload', ImageUpload) +app.component('ImagePreview', ImagePreview) +app.component('RightToolbar', RightToolbar) +app.component('Editor', Editor) +app.component('CustomTable', CustomTable) +app.component('CustomVxeTable', CustomVxeTable) +app.component('SelectTable', SelectTable) + +app.use(router) +app.use(store) +app.use(plugins) +app.use(elementIcons) +app.component('svg-icon', SvgIcon) +app.use(VxeUI) +app.use(VXETable) +directive(app) + +// 使用element-plus 并且设置全局的大小 +// @ts-ignore +app.use(ElementPlus, { + locale: locale, + // 支持 large、default、small + size: Cookies.get('size') || 'default' +}) + +app.mount('#app') diff --git a/src/permission.ts b/src/permission.ts new file mode 100644 index 0000000..0c19318 --- /dev/null +++ b/src/permission.ts @@ -0,0 +1,69 @@ +import router from './router' +import { ElMessage } from 'element-plus' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import { getToken } from '@/utils/auth' +import { isHttp, isPathMatch } from '@/utils/validate' +import { isRelogin } from '@/utils/request' +import useUserStore from '@/store/modules/user' +import useSettingsStore from '@/store/modules/settings' +import usePermissionStore from '@/store/modules/permission' + +NProgress.configure({ showSpinner: false }) + +const whiteList = ['/login', '/register'] + +const isWhiteList = (path: string): boolean => { + return whiteList.some((pattern: string) => isPathMatch(pattern, path)) +} + +router.beforeEach((to, from, next) => { + NProgress.start() + if (getToken()) { + to.meta.title && useSettingsStore().setTitle(to.meta.title as string) + /* has token*/ + if (to.path === '/login') { + next({ path: '/' }) + NProgress.done() + } else if (isWhiteList(to.path)) { + next() + } else { + if (useUserStore().roles.length === 0) { + isRelogin.show = true + // 判断当前用户是否已拉取完user_info信息 + useUserStore().getInfo().then(() => { + isRelogin.show = false + usePermissionStore().generateRoutes().then((accessRoutes: any[]) => { + // 根据roles权限生成可访问的路由表 + accessRoutes.forEach((route: any) => { + if (!isHttp(route.path)) { + router.addRoute(route) // 动态添加可访问路由表 + } + }) + next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 + }) + }).catch((err: any) => { + useUserStore().logOut().then(() => { + ElMessage.error(err as string) + next({ path: '/' }) + }) + }) + } else { + next() + } + } + } else { + // 没有token + if (isWhiteList(to.path)) { + // 在免登录白名单,直接进入 + next() + } else { + next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 + NProgress.done() + } + } +}) + +router.afterEach(() => { + NProgress.done() +}) diff --git a/src/plugins/auth.ts b/src/plugins/auth.ts new file mode 100644 index 0000000..ae5f2c7 --- /dev/null +++ b/src/plugins/auth.ts @@ -0,0 +1,60 @@ +import useUserStore from '@/store/modules/user' + +function authPermission(permission: string): boolean { + const all_permission = "*:*:*" + const permissions = useUserStore().permissions + if (permission && permission.length > 0) { + return permissions.some((v: string) => { + return all_permission === v || v === permission + }) + } else { + return false + } +} + +function authRole(role: string): boolean { + const super_admin = "admin" + const roles = useUserStore().roles + if (role && role.length > 0) { + return roles.some((v: string) => { + return super_admin === v || v === role + }) + } else { + return false + } +} + +export default { + // 验证用户是否具备某权限 + hasPermi(permission: string): boolean { + return authPermission(permission) + }, + // 验证用户是否含有指定权限,只需包含其中一个 + hasPermiOr(permissions: string[]): boolean { + return permissions.some(item => { + return authPermission(item) + }) + }, + // 验证用户是否含有指定权限,必须全部拥有 + hasPermiAnd(permissions: string[]): boolean { + return permissions.every(item => { + return authPermission(item) + }) + }, + // 验证用户是否具备某角色 + hasRole(role: string): boolean { + return authRole(role) + }, + // 验证用户是否含有指定角色,只需包含其中一个 + hasRoleOr(roles: string[]): boolean { + return roles.some(item => { + return authRole(item) + }) + }, + // 验证用户是否含有指定角色,必须全部拥有 + hasRoleAnd(roles: string[]): boolean { + return roles.every(item => { + return authRole(item) + }) + } +} diff --git a/src/plugins/cache.ts b/src/plugins/cache.ts new file mode 100644 index 0000000..686dab8 --- /dev/null +++ b/src/plugins/cache.ts @@ -0,0 +1,88 @@ +interface CacheInterface { + set(key: string, value: string): void + get(key: string): string | null + setJSON(key: string, jsonValue: any): void + getJSON(key: string): any + remove(key: string): void +} + +const sessionCache: CacheInterface = { + set (key: string, value: string) { + if (!sessionStorage) { + return + } + if (key != null && value != null) { + sessionStorage.setItem(key, value) + } + }, + get (key: string): string | null { + if (!sessionStorage) { + return null + } + if (key == null) { + return null + } + return sessionStorage.getItem(key) + }, + setJSON (key: string, jsonValue: any) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key: string): any { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + return null + }, + remove (key: string) { + sessionStorage.removeItem(key) + } +} + +const localCache: CacheInterface = { + set (key: string, value: string) { + if (!localStorage) { + return + } + if (key != null && value != null) { + localStorage.setItem(key, value) + } + }, + get (key: string): string | null { + if (!localStorage) { + return null + } + if (key == null) { + return null + } + return localStorage.getItem(key) + }, + setJSON (key: string, jsonValue: any) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key: string): any { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + return null + }, + remove (key: string) { + localStorage.removeItem(key) + } +} + +export default { + /** + * 会话级缓存 + */ + session: sessionCache, + /** + * 本地缓存 + */ + local: localCache +} diff --git a/src/plugins/download.ts b/src/plugins/download.ts new file mode 100644 index 0000000..37ccca8 --- /dev/null +++ b/src/plugins/download.ts @@ -0,0 +1,93 @@ +import axios from 'axios' +import { ElLoading, ElMessage } from 'element-plus' +import { saveAs } from 'file-saver' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { blobValidate } from '@/utils/ruoyi' + +const baseURL = import.meta.env.VITE_APP_BASE_API +let downloadLoadingInstance: ReturnType + +export default { + name(name: string, isDelete = true) { + const url = baseURL + "/common/download?fileName=" + encodeURIComponent(name) + "&delete=" + isDelete + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() }, + onDownloadProgress: (progressEvent) => { + // console.log(progressEvent) + //progressEvent.loaded 下载文件的当前大小 + //progressEvent.total 下载文件的总大小 如果后端没有返回 请让他加上 + let progressPercent = Math.round((progressEvent.loaded / progressEvent.total) * 100); + let loading = ElLoading.service({ + lock: true, + text: `下载中,请稍候${progressPercent}%`, + background: 'rgba(0, 0, 0, 0.7)', + }) + loading.setText(`下载中,请稍候${progressPercent}%`) + if (progressPercent == 100) { + loading.close() + } + } + }).then((res: any) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data]) + this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) + } else { + this.printErrMsg(res.data) + } + }) + }, + resource(resource: string) { + const url = baseURL + "/common/download/resource?resource=" + encodeURIComponent(resource) + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res: any) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data]) + this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) + } else { + this.printErrMsg(res.data) + } + }) + }, + zip(url: string, name: string) { + const downloadUrl = baseURL + url + downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", }) + axios({ + method: 'get', + url: downloadUrl, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res: any) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data], { type: 'application/zip' }) + this.saveAs(blob, name) + } else { + this.printErrMsg(res.data) + } + downloadLoadingInstance.close() + }).catch((r: any) => { + console.error(r) + ElMessage.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close() + }) + }, + saveAs(text: Blob, name: string, opts?: any) { + saveAs(text, name, opts) + }, + async printErrMsg(data: any) { + const resText = await data.text() + const rspObj = JSON.parse(resText) + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] + ElMessage.error(errMsg) + } +} diff --git a/src/plugins/index.ts b/src/plugins/index.ts new file mode 100644 index 0000000..aace780 --- /dev/null +++ b/src/plugins/index.ts @@ -0,0 +1,19 @@ +import { App } from 'vue' +import tab from './tab' +import auth from './auth' +import cache from './cache' +import modal from './modal' +import download from './download' + +export default function installPlugins(app: App){ + // 页签操作 + app.config.globalProperties.$tab = tab + // 认证对象 + app.config.globalProperties.$auth = auth + // 缓存对象 + app.config.globalProperties.$cache = cache + // 模态框对象 + app.config.globalProperties.$modal = modal + // 下载文件 + app.config.globalProperties.$download = download +} diff --git a/src/plugins/modal.ts b/src/plugins/modal.ts new file mode 100644 index 0000000..12ffa37 --- /dev/null +++ b/src/plugins/modal.ts @@ -0,0 +1,82 @@ +import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus' + +let loadingInstance: ReturnType + +export default { + // 消息提示 + msg(content: string) { + ElMessage.info(content) + }, + // 错误消息 + msgError(content: string) { + ElMessage.error(content) + }, + // 成功消息 + msgSuccess(content: string) { + ElMessage.success(content) + }, + // 警告消息 + msgWarning(content: string) { + ElMessage.warning(content) + }, + // 弹出提示 + alert(content: string) { + ElMessageBox.alert(content, "系统提示") + }, + // 错误提示 + alertError(content: string) { + ElMessageBox.alert(content, "系统提示", { type: 'error' }) + }, + // 成功提示 + alertSuccess(content: string) { + ElMessageBox.alert(content, "系统提示", { type: 'success' }) + }, + // 警告提示 + alertWarning(content: string) { + ElMessageBox.alert(content, "系统提示", { type: 'warning' }) + }, + // 通知提示 + notify(content: string) { + ElNotification.info(content) + }, + // 错误通知 + notifyError(content: string) { + ElNotification.error(content) + }, + // 成功通知 + notifySuccess(content: string) { + ElNotification.success(content) + }, + // 警告通知 + notifyWarning(content: string) { + ElNotification.warning(content) + }, + // 确认窗体 + confirm(content: string) { + return ElMessageBox.confirm(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 提交内容 + prompt(content: string) { + return ElMessageBox.prompt(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 打开遮罩层 + loading(content: string) { + loadingInstance = ElLoading.service({ + lock: true, + text: content, + background: "rgba(0, 0, 0, 0.7)", + }) + }, + // 关闭遮罩层 + closeLoading() { + loadingInstance.close() + } +} diff --git a/src/plugins/tab.ts b/src/plugins/tab.ts new file mode 100644 index 0000000..0475f98 --- /dev/null +++ b/src/plugins/tab.ts @@ -0,0 +1,71 @@ +import useTagsViewStore from '@/store/modules/tagsView' +import router from '@/router' + +export default { + // 刷新当前tab页签 + refreshPage(obj?: any) { + const { path, query, matched } = router.currentRoute.value + if (obj === undefined) { + matched.forEach((m: any) => { + if (m.components && m.components.default && m.components.default.name) { + if (!['Layout', 'ParentView'].includes(m.components.default.name)) { + obj = { name: m.components.default.name, path: path, query: query } + } + } + }) + } + return useTagsViewStore().delCachedView(obj).then(() => { + const { path, query } = obj + router.replace({ + path: '/redirect' + path, + query: query + }) + }) + }, + // 关闭当前tab页签,打开新页签 + closeOpenPage(obj?: any) { + useTagsViewStore().delView(router.currentRoute.value) + if (obj !== undefined) { + return router.push(obj) + } + }, + // 关闭指定tab页签 + closePage(obj?: any) { + if (obj === undefined) { + return useTagsViewStore().delView(router.currentRoute.value).then(({ visitedViews }: { visitedViews: any[] }) => { + const latestView = visitedViews.slice(-1)[0] + if (latestView) { + return router.push(latestView.fullPath) + } + return router.push('/') + }) + } + return useTagsViewStore().delView(obj) + }, + // 关闭所有tab页签 + closeAllPage() { + return useTagsViewStore().delAllViews() + }, + // 关闭左侧tab页签 + closeLeftPage(obj?: any) { + return useTagsViewStore().delLeftTags(obj || router.currentRoute.value) + }, + // 关闭右侧tab页签 + closeRightPage(obj?: any) { + return useTagsViewStore().delRightTags(obj || router.currentRoute.value) + }, + // 关闭其他tab页签 + closeOtherPage(obj?: any) { + return useTagsViewStore().delOthersViews(obj || router.currentRoute.value) + }, + // 打开tab页签 + openPage(title: string, url: string, params?: any) { + const obj = { path: url, meta: { title: title } } as any + useTagsViewStore().addView(obj) + return router.push({ path: url, query: params }) + }, + // 修改tab页签 + updatePage(obj: any) { + return useTagsViewStore().updateVisitedView(obj) + } +} diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..59f733d --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,175 @@ +import { createWebHistory, createRouter } from 'vue-router' +/* Layout */ +import Layout from '@/layout/index.vue' + +/** + * Note: 路由配置项 + * + * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 + * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面 + * // 若你想不管路由下面的 children 声明的个数都显示你的根路由 + * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由 + * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 + * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数 + * roles: ['admin', 'common'] // 访问路由的角色权限 + * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限 + * meta : { + noCache: true // 如果设置为true,则不会被 缓存(默认 false) + title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字 + icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg + breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示 + activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 + } + */ + +// 公共路由 +export const constantRoutes = [ + { + path: '/redirect', + component: Layout, + hidden: true, + children: [ + { + path: '/redirect/:path(.*)', + component: () => import('@/views/redirect/index.vue') + } + ] + }, + { + path: '/login', + component: () => import('@/views/login.vue'), + hidden: true + }, + { + path: '/register', + component: () => import('@/views/register.vue'), + hidden: true + }, + + { + path: "/:pathMatch(.*)*", + component: () => import('@/views/error/404.vue'), + hidden: true + }, + { + path: '/401', + component: () => import('@/views/error/401.vue'), + hidden: true + }, + { + path: '', + component: Layout, + redirect: '/index', + children: [ + { + path: '/index', + component: () => import('@/views/index.vue'), + name: 'Index', + meta: { title: '首页', icon: 'dashboard', affix: true } + } + ] + }, + { + path: '/user', + component: Layout, + hidden: true, + redirect: 'noredirect', + children: [ + { + path: 'profile/:activeTab?', + component: () => import('@/views/system/user/profile/index.vue'), + name: 'Profile', + meta: { title: '个人中心', icon: 'user' } + } + ] + } +] + +// 动态路由,基于用户权限动态去加载 +export const dynamicRoutes = [ + { + path: '/system/user-auth', + component: Layout, + hidden: true, + permissions: ['system:user:edit'], + children: [ + { + path: 'role/:userId(\\d+)', + component: () => import('@/views/system/user/authRole.vue'), + name: 'AuthRole', + meta: { title: '分配角色', activeMenu: '/system/user' } + } + ] + }, + { + path: '/system/role-auth', + component: Layout, + hidden: true, + permissions: ['system:role:edit'], + children: [ + { + path: 'user/:roleId(\\d+)', + component: () => import('@/views/system/role/authUser.vue'), + name: 'AuthUser', + meta: { title: '分配用户', activeMenu: '/system/role' } + } + ] + }, + { + path: '/system/dict-data', + component: Layout, + hidden: true, + permissions: ['system:dict:list'], + children: [ + { + path: 'index/:dictId(\\d+)', + component: () => import('@/views/system/dict/data.vue'), + name: 'Data', + meta: { title: '字典数据', activeMenu: '/system/dict' } + } + ] + }, + { + path: '/monitor/job-log', + component: Layout, + hidden: true, + permissions: ['monitor:job:list'], + children: [ + { + path: 'index/:jobId(\\d+)', + component: () => import('@/views/monitor/job/log.vue'), + name: 'JobLog', + meta: { title: '调度日志', activeMenu: '/monitor/job' } + } + ] + }, + { + path: '/tool/gen-edit', + component: Layout, + hidden: true, + permissions: ['tool:gen:edit'], + children: [ + { + path: 'index/:tableId(\\d+)', + component: () => import('@/views/tool/gen/editTable.vue'), + name: 'GenEdit', + meta: { title: '修改生成配置', activeMenu: '/tool/gen' } + } + ] + } +] + +const router = createRouter({ + history: createWebHistory(), + routes: constantRoutes, + scrollBehavior(to, from, savedPosition) { + if (savedPosition) { + return savedPosition + } + return { top: 0 } + }, +}) + +export default router diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..55fdc65 --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,57 @@ +export default { + /** + * 网页标题 + */ + title: import.meta.env.VITE_APP_TITLE, + + /** + * 侧边栏主题 深色主题theme-dark,浅色主题theme-light + */ + sideTheme: 'theme-dark', + + /** + * 是否系统布局配置 + */ + showSettings: true, + + /** + * 菜单导航模式 1、纯左侧 2、混合(左侧+顶部) 3、纯顶部 + */ + navType: 1, + + /** + * 是否显示 tagsView + */ + tagsView: true, + + /** + * 显示页签图标 + */ + tagsIcon: false, + + /** + * 是否固定头部 + */ + fixedHeader: true, + + /** + * 是否显示logo + */ + sidebarLogo: true, + + /** + * 是否显示动态标题 + */ + dynamicTitle: false, + + /** + * 是否显示底部版权 + */ + footerVisible: false, + + /** + * 底部版权文本内容 + */ + footerContent: 'Copyright © 2018-2026 RuoYi. All Rights Reserved.' +} + diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..db1107e --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,5 @@ +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' +const store = createPinia() +store.use(piniaPluginPersistedstate) // 注册持久化插件 + +export default store diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts new file mode 100644 index 0000000..1de6d2d --- /dev/null +++ b/src/store/modules/app.ts @@ -0,0 +1,59 @@ +import Cookies from 'js-cookie' +import { defineStore } from 'pinia' + +interface SidebarState { + opened: boolean + withoutAnimation: boolean + hide: boolean +} + +interface AppState { + sidebar: SidebarState + device: string + size: string +} + +const useAppStore = defineStore( + 'app', + { + state: (): AppState => ({ + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus')! : true, + withoutAnimation: false, + hide: false + }, + device: 'desktop', + size: Cookies.get('size') || 'default' + }), + actions: { + toggleSideBar(withoutAnimation?: boolean) { + if (this.sidebar.hide) { + return false + } + this.sidebar.opened = !this.sidebar.opened + this.sidebar.withoutAnimation = withoutAnimation || false + if (this.sidebar.opened) { + Cookies.set('sidebarStatus', '1') + } else { + Cookies.set('sidebarStatus', '0') + } + }, + closeSideBar({ withoutAnimation }: { withoutAnimation?: boolean }) { + Cookies.set('sidebarStatus', '0') + this.sidebar.opened = false + this.sidebar.withoutAnimation = withoutAnimation || false + }, + toggleDevice(device: string) { + this.device = device + }, + setSize(size: string) { + this.size = size + Cookies.set('size', size) + }, + toggleSideBarHide(status: boolean) { + this.sidebar.hide = status + } + } + }) + +export default useAppStore diff --git a/src/store/modules/commonStore.ts b/src/store/modules/commonStore.ts new file mode 100644 index 0000000..d738c12 --- /dev/null +++ b/src/store/modules/commonStore.ts @@ -0,0 +1,28 @@ +//公共状态管理 +import { defineStore } from 'pinia' +// 定义配置对象接口 +interface DefaultConfig { + defaultinstr?: string //默认仪器 + lisgroupid?: string //默认分组id + [key: string]: any // 允许其他属性 +} +export const useCommonStore = defineStore('commonStore', { + state: () => ({ + + defaultConfig: {} as DefaultConfig, // 存储默认配置 + }), + actions: { + setDefaultConfig(config: DefaultConfig) { + this.defaultConfig = config + }, + }, + // 持久化配置 + persist: { + // 指定要持久化的状态字段 + pick: ['fingerprint', 'defaultConfig'], + // 可选配置:自定义存储键名(默认是store的id) + // key: 'common_store', + // 可选配置:指定存储位置(默认是localStorage 也可以用sessionStorage) + storage: localStorage, + } +}) \ No newline at end of file diff --git a/src/store/modules/dict.ts b/src/store/modules/dict.ts new file mode 100644 index 0000000..46ef506 --- /dev/null +++ b/src/store/modules/dict.ts @@ -0,0 +1,67 @@ +interface DictItem { + key: string + value: any[] +} + +interface DictState { + dict: DictItem[] +} + +const useDictStore = defineStore( + 'dict', + { + state: (): DictState => ({ + dict: [] + }), + actions: { + // 获取字典 + getDict(_key: string): any[] | null { + if (_key == null && _key == "") { + return null + } + try { + for (let i = 0; i < this.dict.length; i++) { + if (this.dict[i].key == _key) { + return this.dict[i].value + } + } + } catch (e) { + return null + } + return null + }, + // 设置字典 + setDict(_key: string, value: any[]) { + if (_key !== null && _key !== "") { + this.dict.push({ + key: _key, + value: value + }) + } + }, + // 删除字典 + removeDict(_key: string): boolean { + let bln = false + try { + for (let i = 0; i < this.dict.length; i++) { + if (this.dict[i].key == _key) { + this.dict.splice(i, 1) + return true + } + } + } catch (e) { + bln = false + } + return bln + }, + // 清空字典 + cleanDict() { + this.dict = [] + }, + // 初始字典 + initDict() { + } + } + }) + +export default useDictStore diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts new file mode 100644 index 0000000..2c6d40e --- /dev/null +++ b/src/store/modules/permission.ts @@ -0,0 +1,127 @@ +import auth from '@/plugins/auth' +import router, { constantRoutes, dynamicRoutes } from '@/router' +import { getRouters } from '@/api/menu' +import Layout from '@/layout/index.vue' +import ParentView from '@/components/ParentView/index.vue' +import InnerLink from '@/layout/components/InnerLink/index.vue' + +// 匹配views里面所有的.vue文件 +const modules = import.meta.glob('./../../views/**/*.vue') + +const usePermissionStore = defineStore( + 'permission', + { + state: () => ({ + routes: [] as any[], + addRoutes: [] as any[], + defaultRoutes: [] as any[], + topbarRouters: [] as any[], + sidebarRouters: [] as any[] + }), + actions: { + setRoutes(routes: any[]) { + this.addRoutes = routes + this.routes = constantRoutes.concat(routes) + }, + setDefaultRoutes(routes: any[]) { + this.defaultRoutes = constantRoutes.concat(routes) + }, + setTopbarRoutes(routes: any[]) { + this.topbarRouters = routes + }, + setSidebarRouters(routes: any[]) { + this.sidebarRouters = routes + }, + generateRoutes(roles?: any[]): Promise { + return new Promise(resolve => { + // 向后端请求路由数据 + getRouters().then(res => { + const sdata = JSON.parse(JSON.stringify(res.data)) + const rdata = JSON.parse(JSON.stringify(res.data)) + const defaultData = JSON.parse(JSON.stringify(res.data)) + const sidebarRoutes = filterAsyncRouter(sdata) + const rewriteRoutes = filterAsyncRouter(rdata, false, true) + const defaultRoutes = filterAsyncRouter(defaultData) + const asyncRoutes = filterDynamicRoutes(dynamicRoutes) + asyncRoutes.forEach(route => { router.addRoute(route) }) + this.setRoutes(rewriteRoutes) + this.setSidebarRouters(constantRoutes.concat(sidebarRoutes)) + this.setDefaultRoutes(sidebarRoutes) + this.setTopbarRoutes(defaultRoutes) + resolve(rewriteRoutes) + }) + }) + } + } + }) + +// 遍历后台传来的路由字符串,转换为组件对象 +function filterAsyncRouter(asyncRouterMap: any[], lastRouter = false, type = false) { + return asyncRouterMap.filter(route => { + if (type && route.children) { + route.children = filterChildren(route.children) + } + if (route.component) { + // Layout ParentView 组件特殊处理 + if (route.component === 'Layout') { + route.component = Layout + } else if (route.component === 'ParentView') { + route.component = ParentView + } else if (route.component === 'InnerLink') { + route.component = InnerLink + } else { + route.component = loadView(route.component) + } + } + if (route.children != null && route.children && route.children.length) { + route.children = filterAsyncRouter(route.children, route, type) + } else { + delete route['children'] + delete route['redirect'] + } + return true + }) +} + +function filterChildren(childrenMap: any[], lastRouter: any = false) { + var children: any[] = [] + childrenMap.forEach(el => { + el.path = lastRouter ? lastRouter.path + '/' + el.path : el.path + if (el.children && el.children.length && el.component === 'ParentView') { + children = children.concat(filterChildren(el.children, el)) + } else { + children.push(el) + } + }) + return children +} + +// 动态路由遍历,验证是否具备权限 +export function filterDynamicRoutes(routes: any[]): any[] { + const res: any[] = [] + routes.forEach(route => { + if (route.permissions) { + if (auth.hasPermiOr(route.permissions)) { + res.push(route) + } + } else if (route.roles) { + if (auth.hasRoleOr(route.roles)) { + res.push(route) + } + } + }) + return res +} + +export const loadView = (view: string): any => { + let res + for (const path in modules) { + const dir = path.split('views/')[1].split('.vue')[0] + if (dir === view) { + res = () => modules[path]() + } + } + return res +} + +export default usePermissionStore diff --git a/src/store/modules/printStore.ts b/src/store/modules/printStore.ts new file mode 100644 index 0000000..f410c28 --- /dev/null +++ b/src/store/modules/printStore.ts @@ -0,0 +1,36 @@ +// 打印状态管理 +import { defineStore } from 'pinia' + +export const usePrintStore = defineStore('printStore', { + state: () => ({ + isConnected: false, // 存储连接状态 + clientInfo: null, // 存储客户端信息 + printerList: [] as any[], // 存储打印机列表 + defaultPrinter: '' as string, // 存储默认打印机名称 + }), + actions: { + setConnected(status: boolean) { + this.isConnected = status + }, + setClientInfo(info: any) { + this.clientInfo = info + }, + setPrinterList(list: any[]) { + this.printerList = list + }, + + setDefaultPrinter(printerName: string) { + this.defaultPrinter = printerName + } + }, + + // 持久化配置 + persist: { + // 指定要持久化的状态字段 + pick: ['defaultPrinter',], + // 可选配置:自定义存储键名(默认是store的id) + // key: 'common_store', + // 可选配置:指定存储位置(默认是localStorage 也可以用sessionStorage) + storage: localStorage, + } +}) \ No newline at end of file diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts new file mode 100644 index 0000000..f40b20c --- /dev/null +++ b/src/store/modules/settings.ts @@ -0,0 +1,67 @@ +import defaultSettings from '@/settings' +import { useDark, useToggle } from '@vueuse/core' +import { useDynamicTitle } from '@/utils/dynamicTitle' + +const isDark = useDark() +const toggleDark = useToggle(isDark) + +const { sideTheme, showSettings, navType, tagsView, tagsIcon, fixedHeader, sidebarLogo, dynamicTitle, footerVisible, footerContent } = defaultSettings + +const storageSetting = JSON.parse(localStorage.getItem('layout-setting') || '{}') || {} + +interface SettingsState { + title: string + theme: string + sideTheme: string + showSettings: boolean + navType: number + tagsView: boolean + tagsIcon: boolean + fixedHeader: boolean + sidebarLogo: boolean + dynamicTitle: boolean + footerVisible: boolean + footerContent: string + isDark: boolean +} + +const useSettingsStore = defineStore( + 'settings', + { + state: (): SettingsState => ({ + title: '', + theme: storageSetting.theme || '#00a5ff', + sideTheme: storageSetting.sideTheme || sideTheme, + showSettings: showSettings, + navType: storageSetting.navType === undefined ? navType : storageSetting.navType, + tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, + tagsIcon: storageSetting.tagsIcon === undefined ? tagsIcon : storageSetting.tagsIcon, + fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, + sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, + dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle, + footerVisible: storageSetting.footerVisible === undefined ? footerVisible : storageSetting.footerVisible, + footerContent: footerContent, + isDark: isDark.value + }), + actions: { + // 修改布局设置 + changeSetting(data: { key: string; value: any }) { + const { key, value } = data + if (this.hasOwnProperty(key)) { + (this as any)[key] = value + } + }, + // 设置网页标题 + setTitle(title: string) { + this.title = title + useDynamicTitle() + }, + // 切换暗黑模式 + toggleTheme() { + this.isDark = !this.isDark + toggleDark() + } + } + }) + +export default useSettingsStore diff --git a/src/store/modules/tagsView.ts b/src/store/modules/tagsView.ts new file mode 100644 index 0000000..1c87d30 --- /dev/null +++ b/src/store/modules/tagsView.ts @@ -0,0 +1,219 @@ +interface ViewMeta { + title?: string + noCache?: boolean + affix?: boolean + link?: string + [key: string]: any +} + +interface View { + path: string + name?: string + meta: ViewMeta + [key: string]: any +} + +const useTagsViewStore = defineStore( + 'tags-view', + { + state: () => ({ + visitedViews: [] as View[], + cachedViews: [] as string[], + iframeViews: [] as View[] + }), + + actions: { + addView(view: any) { + this.addVisitedView(view) + this.addCachedView(view) + }, + + addIframeView(view: any) { + if (this.iframeViews.some((v: any) => v.path === view.path)) return + this.iframeViews.push( + Object.assign({}, view, { + title: view.meta?.title || 'no-name' + }) + ) + }, + + addVisitedView(view: any) { + if (this.visitedViews.some((v: any) => v.path === view.path)) return + this.visitedViews.push( + Object.assign({}, view, { + title: view.meta?.title || 'no-name' + }) + ) + }, + + addCachedView(view: any) { + if (this.cachedViews.includes(view.name)) return + if (!view.meta?.noCache) { + this.cachedViews.push(view.name) + } + }, + + delView(view: any) { + return new Promise<{ visitedViews: View[], cachedViews: string[] }>(resolve => { + this.delVisitedView(view) + this.delCachedView(view) + resolve({ + visitedViews: [...this.visitedViews], + cachedViews: [...this.cachedViews] + }) + }) + }, + + delVisitedView(view: any) { + return new Promise(resolve => { + for (const [i, v] of this.visitedViews.entries()) { + if (v.path === view.path) { + this.visitedViews.splice(i, 1) + break + } + } + this.iframeViews = this.iframeViews.filter((item: any) => item.path !== view.path) + resolve([...this.visitedViews]) + }) + }, + + delIframeView(view: any) { + return new Promise(resolve => { + this.iframeViews = this.iframeViews.filter((item: any) => item.path !== view.path) + resolve([...this.iframeViews]) + }) + }, + + delCachedView(view: any) { + return new Promise(resolve => { + const index = this.cachedViews.indexOf(view.name) + index > -1 && this.cachedViews.splice(index, 1) + resolve([...this.cachedViews]) + }) + }, + + delOthersViews(view: any) { + return new Promise<{ visitedViews: View[], cachedViews: string[] }>(resolve => { + this.delOthersVisitedViews(view) + this.delOthersCachedViews(view) + resolve({ + visitedViews: [...this.visitedViews], + cachedViews: [...this.cachedViews] + }) + }) + }, + + delOthersVisitedViews(view: any) { + return new Promise(resolve => { + this.visitedViews = this.visitedViews.filter((v: any) => { + return v.meta?.affix || v.path === view.path + }) + this.iframeViews = this.iframeViews.filter((item: any) => item.path === view.path) + resolve([...this.visitedViews]) + }) + }, + + delOthersCachedViews(view: any) { + return new Promise(resolve => { + const index = this.cachedViews.indexOf(view.name) + if (index > -1) { + this.cachedViews = this.cachedViews.slice(index, index + 1) + } else { + this.cachedViews = [] + } + resolve([...this.cachedViews]) + }) + }, + + delAllViews(view?: any) { + return new Promise<{ visitedViews: View[], cachedViews: string[] }>(resolve => { + this.delAllVisitedViews(view) + this.delAllCachedViews(view) + resolve({ + visitedViews: [...this.visitedViews], + cachedViews: [...this.cachedViews] + }) + }) + }, + + delAllVisitedViews(view: any) { + return new Promise(resolve => { + const affixTags = this.visitedViews.filter((tag: any) => tag.meta?.affix) + this.visitedViews = affixTags + this.iframeViews = [] + resolve([...this.visitedViews]) + }) + }, + + delAllCachedViews(view: any) { + return new Promise(resolve => { + this.cachedViews = [] + resolve([...this.cachedViews]) + }) + }, + + updateVisitedView(view: any) { + for (let v of this.visitedViews) { + if (v.path === view.path) { + v = Object.assign(v, view) + break + } + } + }, + + delRightTags(view: any) { + return new Promise(resolve => { + const index = this.visitedViews.findIndex((v: any) => v.path === view.path) + if (index === -1) { + return + } + this.visitedViews = this.visitedViews.filter((item: any, idx: number) => { + if (idx <= index || (item.meta && item.meta.affix)) { + return true + } + if (item.name) { + const i = this.cachedViews.indexOf(item.name) + if (i > -1) { + this.cachedViews.splice(i, 1) + } + } + if (item.meta?.link) { + const fi = this.iframeViews.findIndex((v: any) => v.path === item.path) + this.iframeViews.splice(fi, 1) + } + return false + }) + resolve([...this.visitedViews]) + }) + }, + + delLeftTags(view: any) { + return new Promise(resolve => { + const index = this.visitedViews.findIndex((v: any) => v.path === view.path) + if (index === -1) { + return + } + this.visitedViews = this.visitedViews.filter((item: any, idx: number) => { + if (idx >= index || (item.meta && item.meta.affix)) { + return true + } + if (item.name) { + const i = this.cachedViews.indexOf(item.name) + if (i > -1) { + this.cachedViews.splice(i, 1) + } + } + if (item.meta?.link) { + const fi = this.iframeViews.findIndex((v: any) => v.path === item.path) + this.iframeViews.splice(fi, 1) + } + return false + }) + resolve([...this.visitedViews]) + }) + } + } + } +) + +export default useTagsViewStore diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts new file mode 100644 index 0000000..b23d037 --- /dev/null +++ b/src/store/modules/user.ts @@ -0,0 +1,135 @@ +import router from '@/router' +import { ElMessageBox } from 'element-plus' +import { login, logout, getInfo, loginAnonymous } from '@/api/login' +import { getToken, setToken, removeToken } from '@/utils/auth' +import { isHttp, isEmpty } from "@/utils/validate" +import defAva from '@/assets/images/profile.jpg' + +interface RoleInfo { + roleName: string + [key: string]: any +} + +interface UserState { + token: string | undefined + id: string | number + name: string + nickName: string + roleName: string + avatar: string + roles: string[] + permissions: string[] + sysLoginParam: Object + deptParam: Object +} + +const useUserStore = defineStore( + 'user', + { + state: (): UserState => ({ + token: getToken(), + id: '', + name: '', + nickName: '', + roleName: '', + avatar: '', + roles: [], + permissions: [], + sysLoginParam: {}, // 登录参数 + deptParam: {} // 部门参数 + }), + actions: { + // 单点登录 + loginAnonymous(data: { name: string; yljg: string }) { + return new Promise((resolve, reject) => { + loginAnonymous({ + username: data.name, + yljg: data.yljg + }).then(res => { + if (res.code == 200) { + setToken(res.token) + this.token = res.token + resolve(true) + } + + }).catch(error => { + reject(error) + }) + }) + }, + // 登录 + login(userInfo: { username: string; password: string; code: string; uuid: string; loginParam: Object }) { + const username = userInfo.username.trim() + const password = userInfo.password + const code = userInfo.code + const uuid = userInfo.uuid + const loginParam = userInfo.loginParam + return new Promise((resolve, reject) => { + login(username, password, code, uuid, loginParam).then(res => { + setToken(res.token) + this.token = res.token + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + // 获取用户信息 + getInfo() { + return new Promise((resolve, reject) => { + getInfo().then(res => { + const user = res.user + let avatar = user.avatar || '' + this.sysLoginParam = user.sysLoginParam + this.deptParam = user.dept + if (!isHttp(avatar)) { + avatar = (isEmpty(avatar)) ? defAva : import.meta.env.VITE_APP_BASE_API + avatar + } + const roles = res.user.roles as any[] + if (roles && roles.length > 0) { + this.roles = roles + this.permissions = res.permissions + this.roleName = (roles[0] as RoleInfo).roleName + } else { + this.roles = ['ROLE_DEFAULT'] + } + this.id = user.userId || '' + this.name = user.userName || '' + this.nickName = user.nickName || '' + this.avatar = avatar + /* 初始密码提示 */ + if (res.isDefaultModifyPwd) { + ElMessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) + }).catch(() => { }) + } + /* 过期密码提示 */ + if (!res.isDefaultModifyPwd && res.isPasswordExpired) { + ElMessageBox.confirm('您的密码已过期,请尽快修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) + }).catch(() => { }) + } + resolve(res) + }).catch(error => { + reject(error) + }) + }) + }, + // 退出系统 + logOut() { + return new Promise((resolve, reject) => { + logout().then(() => { + this.token = '' + this.roles = [] + this.permissions = [] + removeToken() + resolve() + }).catch((error: any) => { + reject(error) + }) + }) + } + } + }) + +export default useUserStore diff --git a/src/types/Object.d.ts b/src/types/Object.d.ts new file mode 100644 index 0000000..0248fd1 --- /dev/null +++ b/src/types/Object.d.ts @@ -0,0 +1,212 @@ +export interface LabReportInstr { + index?: number; //序号 + yq: string; //仪器 + xh: number; //序号 + bgdh: string; //报告单号 + yljg: string; //医疗机构 + type: string; //使用类型 + condition: string; //使用条件 + status?: string; //状态 +} + +export interface DictData { + XMGL?: Array; + ITEMCLASS?: Array; + YQDL?: Array; + xmlbList?: Array; + YQ?: Array; + VA?: Array; + LF?: Array; + BT?: Array; + SLZQ?: Array; + UT?: Array; + MD?: Array; + ITEMCLASS?: Array; + GBDM?: Array; + [key: string]: any[] | undefined; // 添加索引签名以支持动态访问 +} + + +export class LabInstr { + yq: string; //仪器 + yqmc: string; //仪器名称 + yqdl: string; //仪器大类 +} + +export class XmInfoNew { + xmid?: string; //项目ID + xmdh?: string; //项目代号 + xmmc?: string; //项目名称 + cksx?: number;//参考值上限 + ckxx?: number;//参考值下限 + dw?: string; //单位 + dyckz?: string; //对应参考值 + dyxh?: number; //对应序号 + xmlb?: string; //项目类别 + jsxm?: string; //计算项目 + yqdl?: string; //仪器大类 + val1?: string; //备用1 + val2?: string; //备用2 + val3?: string; //备用3 + val4?: string; //备用4 + val5?: string; //备用5 + uflag?: boolean; //是否无效 + cp_jgz?: string; + jgbz?: string; + jgz?: string; + xmgl?: string; + mrz?: string; + qccv?: string; + xsbs?: string; + whocode?: string; + germflag?: string; + yymc?: string; + knowledge?: string; + xsws?: number; + dylx?: string; + zhbdh?: string; + bgdh?: string; + jg?: number; + zjf?: string; + csff?: string; + fzdyxh?: number; + itemclass?: string; + jsgs?: string; + ygxb?: string; + ygnl?: string; + ygbb?: string; + ygzq?: string; + ygzd?: string; + sjx?: string; + xjx?: string; + jgjg?: string; + hlimt?: string; + llimit?: string; + redoxx?: string; + redosx?: string; +} + +export class XmAlarmdetailNew { + xmid: number; + seq: number; + samplecondition: string; + resultcondition: string; + +} + +// 定义菜单项的类型 +export interface ContextMenuItem { + // 菜单项类型:普通项或分隔线 + type?: 'item' | 'divider'; + // 菜单项显示文本 + label?: string; + // 菜单项唯一标识,用于事件处理 + action?: string; + // 是否为危险操作(如删除) + danger?: boolean; + // 是否禁用 + disabled?: boolean; + // 快捷键提示文本 + shortcut?: string; + // 菜单项的子级菜单项 + props?: Record; +} + + +export class XmValNew { + xmid: number; + xmdh?: string; + qz: string; + srm?: string; + xh?: number; + jgbz?: string; + +} + +export class XmInfoVs { + vsid?: number; + yq: string; + xmid: number; + xs?: number; + zkxm?: string; + cksx?: number; + ckxx?: number; + dyckz?: string; + +} + +export class XmTextresultNew { + xmid?: string; + xmdh?: string; + xh?: number; + textresult?: string; +} + +export class LabResultItem { + xmdh: string; + xmmc: string; + csjg: string; + qz: string; + [key: string]: any; +} + +export class ymTableDataItem { + zhywdh: string; + ywdh: any; + ywmc: any; + mic: string; + rad: string; + csjg: string; + jgbz: string; + ckz: string; + bz: string; + txtresult: string; + cp_bz: string; +} + +// 定义原始数据项的接口 +interface OriginalItem { + zkph: string | null; + zkbz: string | null; + cs: number; + xmdh: string; + sd: string | null; + qccv: number | null; + xmmc: string; + cv: string | null; + zkjg: string | null; + yq: string | null; + ld: string | null; + zkrq: string | null; + daynum?: number | undefined; +} + +// 定义原始数据的接口 +interface OriginalData { + cs1: OriginalItem[]; + cs2: OriginalItem[]; + cs3: OriginalItem[]; + cs4: OriginalItem[]; + cs5: OriginalItem[]; + cs6: OriginalItem[]; + cs7: OriginalItem[]; +} + +// 定义最终结果的接口 +interface ResultItem { + zkph: number; + yq: string | undefined; + zkrq: string; + xmdh: string; + xmmc: string; + sd: string; + zkbz: string; + daynum?: number | undefined; + cs1: string; + cs2: string; + cs3: string; + cs4: string; + cs5: string; + cs6: string; + cs7: string; +} \ No newline at end of file diff --git a/src/types/SelectTable.d.ts b/src/types/SelectTable.d.ts new file mode 100644 index 0000000..04583e6 --- /dev/null +++ b/src/types/SelectTable.d.ts @@ -0,0 +1,32 @@ +export interface Emits { + (e: "update:data", val: any): void; + (e: "getDataValue", val: any): void; + (e: 'enter-press'): void; +} + +export interface Props { + data: any; + fields?: Field[]; + tableData?: object[]; + label?: string; + value?: string; + objKey?: string; + isHighlight?: boolean; + size?: string; + placeholder?: string; + border?: boolean; + width?: string | number; + disabled?: boolean; + dictType?: string; + optionselect?: boolean; + clearable?: boolean; + keyValue?: boolean; //是否使用键值对模式 +} + + +export interface Field { + prop: string; + label: string; + width?: number; + enablePinyinSearch?: boolean; //是否参与拼音搜索 +} \ No newline at end of file diff --git a/src/types/api/common.ts b/src/types/api/common.ts new file mode 100644 index 0000000..e6fc621 --- /dev/null +++ b/src/types/api/common.ts @@ -0,0 +1,85 @@ +/** API 通用响应类型 */ +export interface AjaxResult { + /** 状态码 */ + code: number + /** 返回内容 */ + msg: string + /** 数据对象 */ + data?: T +} + +/** API 表格响应类型 */ +export interface TableDataInfo { + /** 状态码 */ + code: number + /** 返回内容 */ + msg: string + /** 总记录数 */ + total: number + /** 列表数据 */ + rows: T[] +} + +/** 分页参数类型 */ +export interface PageDomain { + /** 当前记录起始索引 */ + pageNum?: number + /** 每页显示记录数 */ + pageSize?: number + /** 排序列 */ + orderByColumn?: string + /** 排序的方向desc或者asc */ + isAsc?: string + /** 分页参数合理化 */ + reasonable?: boolean +} + +/** Entity基类 */ +export interface BaseEntity { + /** 搜索值 */ + searchValue?: string + /** 创建者 */ + createBy?: string + /** 创建时间 */ + createTime?: string + /** 更新者 */ + updateBy?: string + /** 更新时间 */ + updateTime?: string + /** 备注 */ + remark?: string + /** 请求参数 */ + params?: Record +} + +/** Treeselect树结构类型 */ +export interface TreeSelect { + /** 节点ID */ + id?: number + /** 节点名称 */ + label?: string + /** 节点禁用 */ + disabled: boolean + /** 子节点 */ + children: TreeSelect[] +} + +/** 显隐列信息 */ +export interface TableShowColumns { + // 显示名称 + label: string + // 是否显示 + visible: boolean +} + +/** 文件上传响应数据 */ +export interface UploadFileResult extends AjaxResult { + /** 文件名称(包含路径) */ + fileName: string + /** 文件名称(不含路径) */ + newFileName: string + /** 完整URL地址 */ + url: string + /** 原始文件名称 */ + originalFilename: string +} diff --git a/src/types/api/index.ts b/src/types/api/index.ts new file mode 100644 index 0000000..2ffa461 --- /dev/null +++ b/src/types/api/index.ts @@ -0,0 +1,29 @@ +/** + * API 类型统一导出 + */ +export * from "./common"; + +// 登录模块 +export * from "./login"; +export * from "./menu"; + +// System 模块 +export * from "./system/user"; +export * from "./system/role"; +export * from "./system/menu"; +export * from "./system/dept"; +export * from "./system/post"; +export * from "./system/dict"; +export * from "./system/config"; +export * from "./system/notice"; + +// monitor 模块 +export * from "./monitor/cache"; +export * from "./monitor/job"; +export * from "./monitor/jobLog"; +export * from "./monitor/logininfor"; +export * from "./monitor/operlog"; +export * from "./monitor/online"; + +// 代码生成模块 +export * from "./tool/gen"; diff --git a/src/types/api/login.ts b/src/types/api/login.ts new file mode 100644 index 0000000..de8db26 --- /dev/null +++ b/src/types/api/login.ts @@ -0,0 +1,50 @@ +import type { AjaxResult } from './common' +import type { SysUser } from './system/user' + +// 登录响应 +export interface LoginInfoResult extends AjaxResult { + /** 令牌 */ + token: string +} + +/** 用户信息响应 */ +export interface UserInfoResult extends AjaxResult { + /** 用户信息 */ + user: SysUser + /** 角色数据 */ + roles: string[] + /** 权限数据 */ + permissions: string[] + /** 初始密码是否提醒修改 */ + isDefaultModifyPwd?: boolean + /** 密码是否过期 */ + isPasswordExpired?: boolean +} + +/** 验证码响应 */ +export interface CaptchaInfoResult extends AjaxResult { + /** 验证码缓存key */ + uuid: string; + /** 验证码图片Base64 */ + img: string; + /** 验证码开关 */ + captchaEnabled: boolean +} + +/** 注册提交信息 */ +export interface RegisterForm { + username: string + password: string + confirmPassword: string + code: string + uuid: string +} + +/** 登录提交信息 */ +export interface LoginForm { + username: string + password: string + rememberMe?: boolean | string + code: string + uuid: string +} diff --git a/src/types/api/menu.ts b/src/types/api/menu.ts new file mode 100644 index 0000000..c3d3db9 --- /dev/null +++ b/src/types/api/menu.ts @@ -0,0 +1,33 @@ +/** 路由信息 */ +export interface RouterVo { + /** 路由名字 */ + name?: string; + /** 路由地址 */ + path?: string; + /** 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 */ + hidden?: boolean; + /** 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 */ + redirect?: string; + /** 组件地址 */ + component?: string; + /** 路由参数:如 {"id": 1, "name": "ry"} */ + query?: string; + /** 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 */ + alwaysShow?: boolean; + /** 其他元素 */ + meta?: MetaVo; + /** 子路由 */ + children?: RouterVo[] +} + +/** 路由其他元素信息 */ +export interface MetaVo { + /** 设置该路由在侧边栏和面包屑中展示的名字 */ + title?: string + /** 设置该路由的图标,对应路径src/assets/icons/svg */ + icon?: string + /** 设置为true,则不会被 缓存 */ + noCache?: boolean + /** 内链地址(http(s)://开头) */ + link?: string +} diff --git a/src/types/api/monitor/cache.ts b/src/types/api/monitor/cache.ts new file mode 100644 index 0000000..7e076d9 --- /dev/null +++ b/src/types/api/monitor/cache.ts @@ -0,0 +1,11 @@ +/** 定时任务信息 */ +export interface SysCache { + /** 缓存名称 */ + cacheName?: string; + /** 缓存键名 */ + cacheKey?: string; + /** 缓存内容 */ + cacheValue?: string; + /** 备注 */ + remark?: string; +} diff --git a/src/types/api/monitor/job.ts b/src/types/api/monitor/job.ts new file mode 100644 index 0000000..04c713a --- /dev/null +++ b/src/types/api/monitor/job.ts @@ -0,0 +1,33 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** 定时任务分页查询参数 */ +export interface JobQueryParams extends PageDomain { + /** 任务名称 */ + jobName?: string; + /** 任务组名 */ + jobGroup?: string; + /** 任务状态 */ + status?: string; +} + +/** 定时任务信息 */ +export interface SysJob extends BaseEntity { + /** 任务编号 */ + jobId?: number; + /** 任务名称 */ + jobName?: string; + /** 任务组名 */ + jobGroup?: string; + /** 调用目标字符串 */ + invokeTarget?: string; + /** 执行表达式 */ + cronExpression?: string; + /** 下次执行时间 */ + nextValidTime?: Date; + /** 计划策略 */ + misfirePolicy?: '1' | '2' | '3'; + /** 并发执行(0允许 1禁止) */ + concurrent?: '0' | '1'; + /** 状态(0正常 1暂停) */ + status?: '0' | '1'; +} diff --git a/src/types/api/monitor/jobLog.ts b/src/types/api/monitor/jobLog.ts new file mode 100644 index 0000000..7a61a46 --- /dev/null +++ b/src/types/api/monitor/jobLog.ts @@ -0,0 +1,34 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** 定时任务日志分页查询参数 */ +export interface JobLogQueryParams extends PageDomain { + /** 任务名称 */ + jobName?: string; + /** 任务组名 */ + jobGroup?: string; + /** 执行状态 */ + status?: string; + /** 执行时间 */ + params?: { + beginTime?: string; + endTime?: string; + }; +} + +/** 定时任务日志信息 */ +export interface SysJobLog extends BaseEntity { + /** 任务日志编号 */ + jobLogId?: number; + /** 任务名称 */ + jobName?: string; + /** 任务组名 */ + jobGroup?: string; + /** 调用目标字符串 */ + invokeTarget?: string; + /** 日志信息 */ + jobMessage?: string; + /** 异常信息 */ + exceptionInfo?: string; + /** 状态(0正常 1失败) */ + status?: '0' | '1'; +} diff --git a/src/types/api/monitor/logininfor.ts b/src/types/api/monitor/logininfor.ts new file mode 100644 index 0000000..0b81e83 --- /dev/null +++ b/src/types/api/monitor/logininfor.ts @@ -0,0 +1,38 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** 登录日志分页查询参数 */ +export interface LogininforQueryParams extends PageDomain { + /** 登录地址 */ + ipaddr?: string; + /** 用户名称 */ + userName?: string; + /** 状态 */ + status?: string; + /** 登录时间 */ + params?: { + beginTime?: string; + endTime?: string; + }; +} + +/** 登录日志信息 */ +export interface SysLogininfor extends BaseEntity { + /** 登录日志编号 */ + infoId?: number; + /** 用户账号 */ + userName?: string; + /** 登录地址 */ + ipaddr?: string; + /** 登录地点 */ + loginLocation?: string; + /** 浏览器 */ + browser?: string; + /** 操作系统 */ + os?: string; + /** 提示消息 */ + msg?: string; + /** 访问时间 */ + loginTime?: Date; + /** 状态(0正常 1失败) */ + status?: '0' | '1'; +} diff --git a/src/types/api/monitor/online.ts b/src/types/api/monitor/online.ts new file mode 100644 index 0000000..3ca96cd --- /dev/null +++ b/src/types/api/monitor/online.ts @@ -0,0 +1,27 @@ +/** 在线用户分页查询参数 */ +export interface OnlineQueryParams { + /** 登录地址 */ + ipaddr?: string; + /** 用户名称 */ + userName?: string; +} + +/** 在线用户信息 */ +export interface SysUserOnline { + /** 会话编号 */ + tokenId?: string; + /** 部门名称 */ + deptName?: string; + /** 用户名称 */ + userName?: string; + /** 登录IP */ + ipaddr?: string; + /** 登录地址 */ + loginLocation?: string; + /** 浏览器类型 */ + browser?: string; + /** 操作系统 */ + os?: string; + /** 登录时间 */ + loginTime?: number; +} diff --git a/src/types/api/monitor/operlog.ts b/src/types/api/monitor/operlog.ts new file mode 100644 index 0000000..a6530e3 --- /dev/null +++ b/src/types/api/monitor/operlog.ts @@ -0,0 +1,58 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** 操作日志分页查询参数 */ +export interface OperlogQueryParams extends PageDomain { + /** 操作地址 */ + operIp?: string; + /** 系统模块 */ + title?: string; + /** 操作人员 */ + operName?: string; + /** 类型 */ + businessType?: number; + /** 状态 */ + status?: string; + /** 登录时间 */ + params?: { + beginTime?: string; + endTime?: string; + }; +} + +/** 操作日志信息 */ +export interface SysOperLog extends BaseEntity { + /** 操作日志编号 */ + operId?: number; + /** 操作模块 */ + title?: string; + /** 业务类型(0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据) */ + businessType?: number; + /** 请求方法 */ + method?: string; + /** 请求方式 */ + requestMethod?: string; + /** 操作类别 */ + operatorType?: string; + /** 操作人员 */ + operName?: string; + /** 部门名称 */ + deptName?: string; + /** 请求地址 */ + operUrl?: string; + /** 操作地址 */ + operIp?: string; + /** 操作地点 */ + operLocation?: string; + /** 请求参数 */ + operParam?: string; + /** 返回参数 */ + jsonResult?: string; + /** 错误消息 */ + errorMsg?: string; + /** 操作时间 */ + operTime?: Date; + /** 消耗时间 */ + costTime?: number; + /** 状态(0正常 1异常) */ + status?: '0' | '1'; +} diff --git a/src/types/api/system/config.ts b/src/types/api/system/config.ts new file mode 100644 index 0000000..3e02f6d --- /dev/null +++ b/src/types/api/system/config.ts @@ -0,0 +1,30 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** 参数配置分页查询参数 */ +export interface ConfigQueryParams extends PageDomain { + /** 参数名称 */ + configName?: string; + /** 参数键名 */ + configKey?: string; + /** 系统内置 */ + configType?: string; + /** 创建时间 */ + params?: { + beginTime?: string; + endTime?: string; + }; +} + +/** 参数配置信息 */ +export interface SysConfig extends BaseEntity { + /** 参数编号 */ + configId?: number; + /** 参数名称 */ + configName?: string; + /** 参数键名 */ + configKey?: string; + /** 参数键值 */ + configValue?: string; + /** 系统内置(Y是 N否) */ + configType?: 'Y' | 'N'; +} diff --git a/src/types/api/system/dept.ts b/src/types/api/system/dept.ts new file mode 100644 index 0000000..ff29ba5 --- /dev/null +++ b/src/types/api/system/dept.ts @@ -0,0 +1,31 @@ +import type { BaseEntity } from "../common"; + +/** 部门查询参数 */ +export interface DeptQueryParams { + /** 部门名称 */ + deptName?: string; + /** 状态 */ + status?: string; +} + +/** 部门信息 */ +export interface SysDept extends BaseEntity { + /** 部门编号 */ + deptId?: number; + /** 父部门ID */ + parentId?: number; + /** 祖级列表 */ + ancestors?: string; + /** 部门名称 */ + deptName?: string; + /** 显示顺序 */ + orderNum?: number; + /** 负责人 */ + leader?: string; + /** 联系电话 */ + phone?: string; + /** 邮箱 */ + email?: string; + /** 状态(0正常 1停用) */ + status?: '0' | '1'; +} diff --git a/src/types/api/system/dict.ts b/src/types/api/system/dict.ts new file mode 100644 index 0000000..fb1d7d3 --- /dev/null +++ b/src/types/api/system/dict.ts @@ -0,0 +1,60 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** 字典分页查询参数 */ +export interface DictTypeQueryParams extends PageDomain { + /** 字典名称 */ + dictName?: string; + /** 字典类型 */ + dictType?: string; + /** 状态 */ + status?: string; + /** 创建时间 */ + params?: { + beginTime?: string; + endTime?: string; + }; +} + +/** 字典数据查询参数 */ +export interface DictDataQueryParams extends PageDomain { + /** 字典名称 */ + dictName?: string; + /** 字典标签 */ + dictLabel?: string; + /** 状态 */ + status?: string; +} + +/** 字典类型信息 */ +export interface SysDictType extends BaseEntity { + /** 字典编号 */ + dictId?: number; + /** 字典名称 */ + dictName?: string; + /** 字典类型 */ + dictType?: string; + /** 状态(0正常 1停用) */ + status?: '0' | '1'; +} + +/** 字典数据信息 */ +export interface SysDictData extends BaseEntity { + /** 字典编码 */ + dictCode?: number; + /** 字典标签 */ + dictLabel?: string; + /** 字典键值 */ + dictValue?: string; + /** 字典类型 */ + dictType?: string; + /** 样式属性 */ + cssClass?: string; + /** 表格字典样式 */ + listClass?: string; + /** 字典排序 */ + dictSort?: number; + /** 是否默认(Y是 N否) */ + isDefault?: 'Y' | 'N'; + /** 状态(0正常 1停用) */ + status?: '0' | '1'; +} diff --git a/src/types/api/system/menu.ts b/src/types/api/system/menu.ts new file mode 100644 index 0000000..6a4cbb6 --- /dev/null +++ b/src/types/api/system/menu.ts @@ -0,0 +1,50 @@ +import type { BaseEntity, AjaxResult, TreeSelect } from "../common"; + +/** 菜单查询参数 */ +export interface MenuQueryParams { + /** 菜单名称 */ + menuName?: string; + /** 状态 */ + status?: string; +} + +/** 菜单信息 */ +export interface SysMenu extends BaseEntity { + /** 菜单编号 */ + menuId?: number; + /** 父菜单ID */ + parentId?: number; + /** 菜单名称 */ + menuName?: string; + /** 显示顺序 */ + orderNum?: number; + /** 路由地址 */ + path?: string; + /** 组件路径 */ + component?: string; + /** 路由参数 */ + query?: string; + /** 路由名称 */ + routeName?: string; + /** 权限字符串 */ + perms?: string; + /** 菜单图标 */ + icon?: string; + /** 是否为外链(0是 1否) */ + isFrame?: '0' | '1'; + /** 是否缓存(0缓存 1不缓存) */ + isCache?: '0' | '1'; + /** 类型(M目录 C菜单 F按钮) */ + menuType?: 'M' | 'C' | 'F'; + /** 显示状态(0显示 1隐藏) */ + visible?: '0' | '1'; + /** 状态(0正常 1停用) */ + status?: '0' | '1'; +} + +export interface RoleMenuTreeselectResult extends AjaxResult { + /** 已选中的菜单ID列表 */ + checkedKeys: number[] + /** 菜单树形结构 */ + menus: TreeSelect[] +} diff --git a/src/types/api/system/notice.ts b/src/types/api/system/notice.ts new file mode 100644 index 0000000..6506356 --- /dev/null +++ b/src/types/api/system/notice.ts @@ -0,0 +1,25 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** 通知公告分页查询参数 */ +export interface NoticeQueryParams extends PageDomain { + /** 公告标题 */ + noticeTitle?: string; + /** 操作人员 */ + createBy?: string; + /** 公告类型 */ + noticeType?: string; +} + +/** 通知公告信息 */ +export interface SysNotice extends BaseEntity { + /** 公告编号 */ + noticeId?: number; + /** 公告标题 */ + noticeTitle?: string; + /** 公告类型(1通知 2公告) */ + noticeType?: '1' | '2'; + /** 公告内容 */ + noticeContent?: string; + /** 状态(0正常 1停用) */ + status?: '0' | '1'; +} diff --git a/src/types/api/system/post.ts b/src/types/api/system/post.ts new file mode 100644 index 0000000..e49fbd7 --- /dev/null +++ b/src/types/api/system/post.ts @@ -0,0 +1,25 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** 岗位分页查询参数 */ +export interface PostQueryParams extends PageDomain { + /** 岗位编码 */ + postCode?: string; + /** 岗位名称 */ + postName?: string; + /** 状态 */ + status?: string; +} + +/** 岗位信息 */ +export interface SysPost extends BaseEntity { + /** 岗位编号 */ + postId?: number; + /** 岗位编码 */ + postCode?: string; + /** 岗位名称 */ + postName?: string; + /** 岗位排序 */ + postSort?: number; + /** 状态(0正常 1停用) */ + status?: '0' | '1'; +} diff --git a/src/types/api/system/role.ts b/src/types/api/system/role.ts new file mode 100644 index 0000000..55c5d9b --- /dev/null +++ b/src/types/api/system/role.ts @@ -0,0 +1,71 @@ +import type { PageDomain, BaseEntity, AjaxResult, TreeSelect } from "../common"; + +/** 角色分页查询参数 */ +export interface RoleQueryParams extends PageDomain { + /** 角色名称 */ + roleName?: string; + /** 角色权限 */ + roleKey?: string; + /** 状态 */ + status?: string; + /** 创建时间 */ + params?: { + beginTime?: string; + endTime?: string; + }; +} + +/** 批量授权用户参数 */ +export interface AuthUserSelectParams { + roleId: number; + userIds: number[]; +} + +/** 用户和角色关联信息 */ +export interface SysUserRole { + /** 用户编号 */ + userId?: number; + /** 角色编号 */ + roleId: number; +} + +/** 用户和多角色关联信息 */ +export interface SysUserRoles { + /** 用户编号 */ + userId?: number; + /** 角色编号组 */ + roleIds?: number[]; +} + + +/** 角色信息 */ +export interface SysRole extends BaseEntity { + /** 角色编号 */ + roleId?: number; + /** 角色名称 */ + roleName?: string; + /** 角色权限 */ + roleKey?: string; + /** 角色排序 */ + roleSort?: number; + /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ + dataScope?: '1' | '2' | '3' | '4' | '5'; + /** 菜单树选择项是否关联显示 */ + menuCheckStrictly?: boolean; + /** 部门树选择项是否关联显示 */ + deptCheckStrictly?: boolean; + /** 角色权限 */ + menuIds?: number[]; + /** 角色权限 */ + deptIds?: number[]; + /** 状态(0正常 1停用) */ + status?: '0' | '1'; +} + +/** 角色部门树响应 */ +export interface RoleDeptTreeResult extends AjaxResult { + /** 选中部门ID */ + checkedKeys: number[] + /** 部门树列表 */ + depts: TreeSelect[] +} diff --git a/src/types/api/system/user.ts b/src/types/api/system/user.ts new file mode 100644 index 0000000..02ea61a --- /dev/null +++ b/src/types/api/system/user.ts @@ -0,0 +1,109 @@ +import type { SysRole } from './role' +import type { SysDept } from './dept' +import type { SysPost } from './post' +import type { PageDomain, AjaxResult, BaseEntity } from "../common"; + +/** 用户分页查询参数 */ +export interface UserQueryParams extends PageDomain { + /** 用户名称 */ + userName?: string; + /** 手机号码 */ + phonenumber?: string; + /** 状态(0正常 1停用) */ + status?: string; + /** 部门编号 */ + deptId?: number; + /** 创建时间 */ + params?: { + beginTime?: string; + endTime?: string; + }; +} + +/** 角色授权用户分页查询参数 */ +export interface AuthUserQueryParams extends UserQueryParams { + /** 角色编号 */ + roleId?: number; +} + +/** 用户信息 */ +export interface SysUser extends BaseEntity { + /** 用户ID */ + userId?: number; + /** 部门ID */ + deptId?: number; + /** 用户账号 */ + userName?: string; + /** 用户昵称 */ + nickName?: string; + /** 用户邮箱 */ + email?: string; + /** 手机号码 */ + phonenumber?: string; + /** 用户性别(0男 1女 2未知) */ + sex?: '0' | '1' | '2'; + /** 用户头像 */ + avatar?: string; + /** 密码 */ + password?: string; + /** 账号状态(0正常 1停用) */ + status?: '0' | '1'; + /** 部门对象 */ + dept?: SysDept; + /** 角色对象 */ + roles?: SysRole[]; + /** 角色组 */ + roleIds?: number[]; + /** 岗位组 */ + postIds?: number[]; + // 登录参数 + sysLoginParam?: Object; +} + +/** 注册信息 */ +export interface SysRegister { + /** 用户账号 */ + userName?: string; + /** 密码 */ + password?: string; + /** 验证码 */ + code?: string; + /** 唯一标识 */ + uuid?: string; +} + +/** 用户详情查询响应 */ +export interface UserFormDataResult extends AjaxResult { + /** 用户信息 */ + data?: SysUser + /** 用户的岗位ID列表 */ + postIds?: number[] + /** 用户的角色ID列表 */ + roleIds?: number[] + /** 所有角色列表 */ + roles: SysRole[] + /** 所有岗位列表 */ + posts: SysPost[] +} + +/** 用户个人资料响应 */ +export interface UserProfileResult extends AjaxResult { + /** 角色分组 */ + roleGroup: string + /** 岗位分组 */ + postGroup: string +} + +/** 用户头像上传响应 */ +export interface UserProfileAvatarResult extends AjaxResult { + /** 头像地址 */ + imgUrl: string +} + +/** 用户授权角色响应 */ +export interface UserAuthRoleResult extends AjaxResult { + /** 用户信息 */ + user: SysUser + /** 角色列表 */ + roles: SysRole[] +} diff --git a/src/types/api/tool/gen.ts b/src/types/api/tool/gen.ts new file mode 100644 index 0000000..08135f3 --- /dev/null +++ b/src/types/api/tool/gen.ts @@ -0,0 +1,112 @@ +import type { PageDomain, BaseEntity } from "../common"; + +/** 数据表分页查询参数 */ +export interface GenQueryParams extends PageDomain { + /** 表名称 */ + tableName?: string; + /** 表描述 */ + tableComment?: string; + /** 创建时间 */ + params?: { + beginTime?: string; + endTime?: string; + }; +} + +/** 代码生成业务信息 */ +export interface GenTable extends BaseEntity { + /** 主键编号 */ + tableId?: number; + /** 表名称 */ + tableName?: string; + /** 表描述 */ + tableComment?: string; + /** 关联父表的表名 */ + subTableName?: string; + /** 本表关联父表的外键名 */ + subTableFkName?: string; + /** 实体类名称(首字母大写) */ + className?: string; + /** 使用的模板(crud单表操作 tree树表操作 sub主子表操作) */ + tplCategory?: 'crud' | 'tree' | 'sub' + /** 前端类型(element-ui模版 element-plus模版) */ + tplWebType?: 'element-ui' | 'element-plus' + /** 生成包路径 */ + packageName?: string; + /** 生成模块名 */ + moduleName?: string; + /** 生成业务名 */ + businessName?: string; + /** 生成功能名 */ + functionName?: string; + /** 生成作者 */ + functionAuthor?: string; + /** 生成代码方式(0zip压缩包 1自定义路径) */ + genType?: '0' | '1' + /** 生成路径(不填默认项目路径) */ + genPath?: string; + /** 其它生成选项 */ + options?: string; + /** 树编码字段 */ + treeCode?: string; + /** 树父编码字段 */ + treeParentCode?: string; + /** 树名称字段 */ + treeName?: string; + /** 上级菜单ID字段 */ + parentMenuId?: string; + /** 上级菜单名称字段 */ + parentMenuName?: string; + /** 表列信息 */ + columns?: GenTableColumn[] +} + +/** 生成表列字段信息 */ +export interface GenTableColumn extends BaseEntity { + /** 主键编号 */ + columnId?: number + /** 归属表编号 */ + tableId?: number + /** 列名称 */ + columnName?: string + /** 列描述 */ + columnComment?: string + /** 列类型 */ + columnType?: string + /** Java类型 */ + javaType?: string + /** Java字段名 */ + javaField?: string + /** 是否主键(1是) */ + isPk?: '1' | '0' + /** 是否自增(1是) */ + isIncrement?: '1' | '0' + /** 是否必填(1是) */ + isRequired?: '1' | '0' + /** 是否为插入字段(1是) */ + isInsert?: '1' | '0' + /** 是否编辑字段(1是) */ + isEdit?: '1' | '0' + /** 是否列表字段(1是) */ + isList?: '1' | '0' + /** 是否查询字段(1是) */ + isQuery?: '1' | '0' + /** 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */ + queryType?: 'EQ' | 'NE' | 'GT' | 'LT' | 'LIKE' | 'BETWEEN' + /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */ + htmlType?: string + /** 字典类型 */ + dictType?: string + /** 排序 */ + sort?: number +} + +/** 代码生成信息响应 */ +export interface GenTableInfoResult { + /** 表信息 */ + info: GenTable + /** 列信息列表 */ + rows: GenTableColumn[] + /** 所有表信息 */ + tables: GenTable[] +} diff --git a/src/types/components.d.ts b/src/types/components.d.ts new file mode 100644 index 0000000..35d2077 --- /dev/null +++ b/src/types/components.d.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + } +} diff --git a/src/types/global.d.ts b/src/types/global.d.ts new file mode 100644 index 0000000..4d55a97 --- /dev/null +++ b/src/types/global.d.ts @@ -0,0 +1,134 @@ +/** 模块类型声明 */ +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} + +/** Vite 环境变量类型 */ +interface ImportMetaEnv { + readonly VITE_APP_TITLE: string + readonly VITE_APP_BASE_API: string + readonly VITE_APP_ENV: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} + +// element-plus +declare module 'element-plus' + +// vue +declare module 'vue' { + interface ComponentInternalInstance { proxy: any } +} + +// nprogress +declare module 'nprogress' { + export interface NProgressOptions { + minimum?: number + template?: string + easing?: string + speed?: number + trickle?: boolean + trickleSpeed?: number + showSpinner?: boolean + parent?: string + barSelector?: string + } + + export interface NProgress { + start(): NProgress + set(n: number): NProgress + inc(amount?: number): NProgress + done(force?: boolean): NProgress + remove(): void + configure(options: NProgressOptions): NProgress + status: number | null + } + + const nprogress: NProgress + export default nprogress +} + +// js-cookie +declare module 'js-cookie' { + export default Cookies +} + +// file-saver +declare module 'file-saver' { + export function saveAs(data: Blob | string, filename?: string, options?: any): void + export function saveAs(data: Blob | string, filename?: string, disableAutoBOM?: boolean): void + export default saveAs +} + +// jsencrypt +declare module 'jsencrypt/bin/jsencrypt.min' { + import JSEncrypt from 'jsencrypt' + export default JSEncrypt +} + +// axios +declare module 'axios' + +// vue-quill +declare module '@vueup/vue-quill' + +// sortablejs +declare module 'sortablejs' { + export interface SortableEvent { + oldIndex: number; + newIndex: number; + } + + export interface SortableOptions { + ghostClass?: string; + onEnd?: (evt: SortableEvent) => void; + } + + export default class Sortable { + static create(el: HTMLElement, options: SortableOptions): Sortable; + } +} + +// fuse +declare module 'fuse.js' { + export interface FuseOptions { + keys: string[]; + threshold?: number; + includeScore?: boolean; + includeMatches?: boolean; + minMatchCharLength?: number; + shouldSort?: boolean; + // 添加其他你需要的选项 + } + + export default class Fuse { + constructor(list: T[], options?: FuseOptions) + search(pattern: string): T[] + } +} + +// vuedraggable +declare module 'vuedraggable/dist/vuedraggable.common' { + import { DefineComponent } from 'vue' + const draggable: DefineComponent + export default draggable +} + +// vue-cropper +declare module 'vue-cropper' { + import { DefineComponent } from 'vue' + const VueCropper: DefineComponent + export { VueCropper } +} + +// splitpanes +declare module 'splitpanes' { + import { DefineComponent } from 'vue' + + export const Splitpanes: DefineComponent + export const Pane: DefineComponent +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..e623738 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,7 @@ +/** + * 类型统一导出 + */ + +export * from "./api"; +export * from './SelectTable'; +export * from './Object'; diff --git a/src/utils/auth.ts b/src/utils/auth.ts new file mode 100644 index 0000000..a4c77fc --- /dev/null +++ b/src/utils/auth.ts @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie' + +const TokenKey = 'Admin_czlis-Token' + +export function getToken(): string | undefined { + return Cookies.get(TokenKey) +} + +export function setToken(token: string): string | undefined { + return Cookies.set(TokenKey, token) +} + +export function removeToken(): void { + Cookies.remove(TokenKey) +} diff --git a/src/utils/classCom.ts b/src/utils/classCom.ts new file mode 100644 index 0000000..55737d6 --- /dev/null +++ b/src/utils/classCom.ts @@ -0,0 +1,163 @@ + +/** + * 颜色处理工具类 + * 提供十进制颜色值转十六进制颜色码(支持BGR转RGB)及文字对比度计算功能 + */ + +function decimalToHexColor(decimal: number | string): string { + // 处理空值和非数字情况 + if (decimal === undefined || decimal === null || decimal === '') { + return '#FFFFFF'; + } + + // 统一转换为数字类型 + const num = typeof decimal === 'string' ? parseFloat(decimal) : decimal; + + if (isNaN(num)) { + return '#FFFFFF'; + } + + // 十进制转十六进制并转为大写 + let hex = Math.floor(num).toString(16).toUpperCase(); + let rgbHex = '' + // 确保十六进制字符串为6位,不足则补0 + if (hex.length < 6) { + hex = hex.padStart(6, '0'); + } + + // BGR转RGB(交换前后两位) + const r = hex.substring(4, 6); + const g = hex.substring(2, 4); + const b = hex.substring(0, 2); + rgbHex = r + g + b; + return `#${rgbHex}`; +} + + +// 处理颜色转换为十进制数字 +const convertHexToNumber = (hex: string) => { + if (!hex) return + hex = hex.replace('#', ''); + const bgr = hex.slice(4, 6) + hex.slice(2, 4) + hex.slice(0, 2); + return parseInt(bgr, 16); +}; +/** + * 根据背景色计算对比度文字颜色(黑/白) + * @param bgColor 十六进制背景色(如#FFFF80) + * @returns 对比度文字颜色(#333333或#FFFFFF) + */ +function getContrastTextColor(bgColor: string): string { + // 验证颜色格式 + if (!/^#([0-9A-F]{6})$/i.test(bgColor)) { + throw new Error('Invalid hex color format. Expected #RRGGBB'); + } + + // 提取RGB分量 + const r = parseInt(bgColor.slice(1, 3), 16); + const g = parseInt(bgColor.slice(3, 5), 16); + const b = parseInt(bgColor.slice(5, 7), 16); + + // 计算亮度(标准 luminance 公式) + const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255; + + // 根据亮度返回对比色 + return luminance > 0.5 ? '#333333' : '#FFFFFF'; +} + +// 打印https pdf +function printPDF(pdfUrl: string) { + // 验证URL是否为HTTPS + if (pdfUrl.startsWith('http')) { + console.warn('PDF URL不是HTTPS协议,可能存在安全风险'); + } + + const iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + iframe.src = pdfUrl; + document.body.appendChild(iframe); + iframe.onload = () => { + iframe.contentWindow?.print(); + setTimeout(() => URL.revokeObjectURL(pdfUrl), 1000); // 释放内存 + }; +} + +// 打印base64 pdf +function printBase64PDF(base64: string) { + const blob = base64ToBlob(base64); + const pdfUrl = URL.createObjectURL(blob); + const iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + iframe.src = pdfUrl; + document.body.appendChild(iframe); + iframe.onload = () => { + iframe.contentWindow?.print(); + setTimeout(() => URL.revokeObjectURL(pdfUrl), 1000); // 释放内存 + }; +} + +function base64ToBlob(base64: string) { + const binaryString = atob(base64.replace(/[\n\r]/g, '')); + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return new Blob([bytes], { type: 'application/pdf' }); +} + +// 计算两个日期的天数差(支持带时分秒) +const getDayDiff = (start: string, end: string): number => { + const startTime = new Date(start).getTime(); + const endTime = new Date(end).getTime(); + + if (isNaN(startTime) || isNaN(endTime)) { + return -2; // -2 表示日期无效 + } + + const dayDiff = Math.ceil((endTime - startTime) / (24 * 60 * 60 * 1000)); + return dayDiff < 0 ? -1 : dayDiff; // -1 表示结束时间早于开始时间,>=0 为正常天数 +}; + + +/** + * 自动根据屏幕分辨率切换按钮尺寸(small/default) + * @returns 按钮尺寸的响应式ref + */ +function useAutoSize() { + const autoSize = ref<'small' | 'default'>('default'); + // 防抖函数,避免频繁触发 + const debounce = (fn: Function, delay: number) => { + let timer: any; + return (...args: any[]) => { + clearTimeout(timer); + timer = setTimeout(() => fn.apply(null, args), delay); + }; + }; + + const calculateSize = () => { + const screenWidth = window.innerWidth || document.documentElement.clientWidth; + autoSize.value = screenWidth < 1600 ? 'small' : 'default'; + }; + + // 防抖版本的计算函数 + const debouncedCalculateSize = debounce(calculateSize, 100); + + onMounted(() => { + calculateSize(); + // 添加防抖的resize监听 + window.addEventListener('resize', debouncedCalculateSize); + + // 在组件实例上存储清理函数 + (autoSize as any)._cleanup = () => { + window.removeEventListener('resize', debouncedCalculateSize); + }; + }); + + onUnmounted(() => { + const cleanup = (autoSize as any)._cleanup; + if (cleanup) cleanup(); + }); + + return autoSize; +} + +export const classCom = { decimalToHexColor, convertHexToNumber, getContrastTextColor, printBase64PDF, printPDF, useAutoSize, getDayDiff } diff --git a/src/utils/dict.ts b/src/utils/dict.ts new file mode 100644 index 0000000..e5595b2 --- /dev/null +++ b/src/utils/dict.ts @@ -0,0 +1,101 @@ + +import useDictStore from '@/store/modules/dict'; +import { + getDicts +} from '@/api/system/dict/data'; +import { + getComDicts +} from '@/api/liswork/dict/ComDict'; + +// 定义字典项的类型 +interface DictItem { + label: string; + value: string; + elTagType: string; + elTagClass: string; +} + +// 定义返回值类型 +type DictResult = { + [key: string]: Ref; +}; + +/** + * 获取字典数据 + * @param args 字典类型列表 + * @returns 字典数据对象(包含响应式引用) + */ +export function useDict(...args: string[]): DictResult { + const res = ref<{ + [key: string]: DictItem[] + }>({}); + + args.forEach((dictType) => { + res.value[dictType] = []; + const dicts = useDictStore().getDict(dictType); + + if (dicts) { + res.value[dictType] = dicts as DictItem[]; + } else { + getDicts(dictType).then((resp: any) => { + const dictList = resp.data.map((p: any) => ({ + label: p.dictLabel, + value: p.dictValue, + elTagType: p.listClass || '', + elTagClass: p.cssClass || '' + })); + + res.value[dictType] = dictList; + useDictStore().setDict(dictType, dictList); + }); + } + }); + + return toRefs(res.value) as DictResult; +} + +/** + * 获取字典数据(改进版) + * 返回 Promise,确保所有字典数据加载完成后才 resolve + * @param args 字典类型列表 + * @returns 包含响应式字典数据的 Promise + */ +export function comDict(...args: string[]): Promise { + const res = ref<{ + [key: string]: DictItem[] + }>({}); + const promises: Promise[] = []; + + args.forEach((dictType) => { + res.value[dictType] = []; + const dicts = useDictStore().getDict(dictType); + + if (dicts) { + // 缓存存在,直接赋值 + res.value[dictType] = dicts as DictItem[]; + } else { + // 缓存不存在,发起请求并记录 Promise + const promise = getComDicts({ + dict_type: dictType + }).then((resp: any) => { + const dictList = resp.data.map((p: any) => ({ + label: p.dictName, + value: p.dictCode, + elTagType: "", + elTagClass: "" + })); + + res.value[dictType] = dictList; + useDictStore().setDict(dictType, dictList); + return dictList; + }); + + promises.push(promise); + } + }); + + // 等待所有 Promise 完成后才返回 + return Promise.all(promises).then(() => { + return toRefs(res.value) as DictResult; + }); +} \ No newline at end of file diff --git a/src/utils/dynamicTitle.ts b/src/utils/dynamicTitle.ts new file mode 100644 index 0000000..66a503a --- /dev/null +++ b/src/utils/dynamicTitle.ts @@ -0,0 +1,14 @@ +import defaultSettings from '@/settings' +import useSettingsStore from '@/store/modules/settings' + +/** + * 动态修改标题 + */ +export function useDynamicTitle(): void { + const settingsStore = useSettingsStore() + if (settingsStore.dynamicTitle) { + document.title = settingsStore.title + ' - ' + defaultSettings.title + } else { + document.title = defaultSettings.title + } +} diff --git a/src/utils/errorCode.ts b/src/utils/errorCode.ts new file mode 100644 index 0000000..ab2832d --- /dev/null +++ b/src/utils/errorCode.ts @@ -0,0 +1,8 @@ +const errorCode: Record = { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + 'default': '系统未知错误,请反馈给管理员' +} + +export default errorCode diff --git a/src/utils/generator/config.js b/src/utils/generator/config.js new file mode 100644 index 0000000..449715f --- /dev/null +++ b/src/utils/generator/config.js @@ -0,0 +1,452 @@ +export const formConf = { + formRef: 'formRef', + formModel: 'formData', + size: 'default', + labelPosition: 'right', + labelWidth: 100, + formRules: 'rules', + gutter: 15, + disabled: false, + span: 24, + formBtns: true, +} + +export const inputComponents = [ + { + label: '单行文本', + tag: 'el-input', + tagIcon: 'input', + type: 'text', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': '', + 'suffix-icon': '', + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/input', + }, + { + label: '多行文本', + tag: 'el-input', + tagIcon: 'textarea', + type: 'textarea', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + labelWidth: null, + autosize: { + minRows: 4, + maxRows: 4, + }, + style: { width: '100%' }, + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/input', + }, + { + label: '密码', + tag: 'el-input', + tagIcon: 'password', + type: 'password', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + 'show-password': true, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': '', + 'suffix-icon': '', + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/input', + }, + { + label: '计数器', + tag: 'el-input-number', + tagIcon: 'number', + placeholder: '', + defaultValue: undefined, + span: 24, + labelWidth: null, + min: undefined, + max: undefined, + step: undefined, + 'step-strictly': false, + precision: undefined, + 'controls-position': '', + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/input-number', + }, +] + +export const selectComponents = [ + { + label: '下拉选择', + tag: 'el-select', + tagIcon: 'select', + placeholder: '请选择', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + disabled: false, + required: true, + filterable: false, + multiple: false, + options: [ + { + label: '选项一', + value: 1, + }, + { + label: '选项二', + value: 2, + }, + ], + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/select', + }, + { + label: '级联选择', + tag: 'el-cascader', + tagIcon: 'cascader', + placeholder: '请选择', + defaultValue: [], + span: 24, + labelWidth: null, + style: { width: '100%' }, + props: { + props: { + multiple: false, + }, + }, + 'show-all-levels': true, + disabled: false, + clearable: true, + filterable: false, + required: true, + options: [ + { + id: 1, + value: 1, + label: '选项1', + children: [ + { + id: 2, + value: 2, + label: '选项1-1', + }, + ], + }, + ], + dataType: 'dynamic', + labelKey: 'label', + valueKey: 'value', + childrenKey: 'children', + separator: '/', + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/cascader', + }, + { + label: '单选框组', + tag: 'el-radio-group', + tagIcon: 'radio', + defaultValue: 0, + span: 24, + labelWidth: null, + style: {}, + optionType: 'default', + border: false, + size: 'default', + disabled: false, + required: true, + options: [ + { + label: '选项一', + value: 1, + }, + { + label: '选项二', + value: 2, + }, + ], + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/radio', + }, + { + label: '多选框组', + tag: 'el-checkbox-group', + tagIcon: 'checkbox', + defaultValue: [], + span: 24, + labelWidth: null, + style: {}, + optionType: 'default', + border: false, + size: 'default', + disabled: false, + required: true, + options: [ + { + label: '选项一', + value: 1, + }, + { + label: '选项二', + value: 2, + }, + ], + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/checkbox', + }, + { + label: '开关', + tag: 'el-switch', + tagIcon: 'switch', + defaultValue: false, + span: 24, + labelWidth: null, + style: {}, + disabled: false, + required: true, + 'active-text': '', + 'inactive-text': '', + 'active-color': null, + 'inactive-color': null, + 'active-value': true, + 'inactive-value': false, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/switch', + }, + { + label: '滑块', + tag: 'el-slider', + tagIcon: 'slider', + defaultValue: null, + span: 24, + labelWidth: null, + disabled: false, + required: true, + min: 0, + max: 100, + step: 1, + 'show-stops': false, + range: false, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/slider', + }, + { + label: '时间选择', + tag: 'el-time-picker', + tagIcon: 'time', + placeholder: '请选择', + defaultValue: '', + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + format: 'HH:mm:ss', + 'value-format': 'HH:mm:ss', + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/time-picker', + }, + { + label: '时间范围', + tag: 'el-time-picker', + tagIcon: 'time-range', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + 'is-range': true, + 'range-separator': '至', + 'start-placeholder': '开始时间', + 'end-placeholder': '结束时间', + format: 'HH:mm:ss', + 'value-format': 'HH:mm:ss', + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/time-picker', + }, + { + label: '日期选择', + tag: 'el-date-picker', + tagIcon: 'date', + placeholder: '请选择', + defaultValue: null, + type: 'date', + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + format: 'YYYY-MM-DD', + 'value-format': 'YYYY-MM-DD', + readonly: false, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/date-picker', + }, + { + label: '日期范围', + tag: 'el-date-picker', + tagIcon: 'date-range', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + type: 'daterange', + 'range-separator': '至', + 'start-placeholder': '开始日期', + 'end-placeholder': '结束日期', + disabled: false, + clearable: true, + required: true, + format: 'YYYY-MM-DD', + 'value-format': 'YYYY-MM-DD', + readonly: false, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/date-picker', + }, + { + label: '评分', + tag: 'el-rate', + tagIcon: 'rate', + defaultValue: 0, + span: 24, + labelWidth: null, + style: {}, + max: 5, + 'allow-half': false, + 'show-text': false, + 'show-score': false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/rate', + }, + { + label: '颜色选择', + tag: 'el-color-picker', + tagIcon: 'color', + defaultValue: null, + labelWidth: null, + 'show-alpha': false, + 'color-format': '', + disabled: false, + required: true, + size: 'default', + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/color-picker', + }, + { + label: '上传', + tag: 'el-upload', + tagIcon: 'upload', + action: 'https://jsonplaceholder.typicode.com/posts/', + defaultValue: null, + labelWidth: null, + disabled: false, + required: true, + accept: '', + name: 'file', + 'auto-upload': true, + showTip: false, + buttonText: '点击上传', + fileSize: 2, + sizeUnit: 'MB', + 'list-type': 'text', + multiple: false, + regList: [], + changeTag: true, + document: 'https://element-plus.org/zh-CN/component/upload', + tip: '只能上传不超过 2MB 的文件', + style: { width: '100%' }, + }, +] + +export const layoutComponents = [ + { + layout: 'rowFormItem', + tagIcon: 'row', + type: 'default', + justify: 'start', + align: 'top', + label: '行容器', + layoutTree: true, + children: [], + document: 'https://element-plus.org/zh-CN/component/layout', + }, + { + layout: 'colFormItem', + label: '按钮', + changeTag: true, + labelWidth: null, + tag: 'el-button', + tagIcon: 'button', + span: 24, + default: '主要按钮', + type: 'primary', + icon: 'Search', + size: 'default', + disabled: false, + document: 'https://element-plus.org/zh-CN/component/button', + }, +] + +// 组件rule的触发方式,无触发方式的组件不生成rule +export const trigger = { + 'el-input': 'blur', + 'el-input-number': 'blur', + 'el-select': 'change', + 'el-radio-group': 'change', + 'el-checkbox-group': 'change', + 'el-cascader': 'change', + 'el-time-picker': 'change', + 'el-date-picker': 'change', + 'el-rate': 'change', +} diff --git a/src/utils/generator/css.js b/src/utils/generator/css.js new file mode 100644 index 0000000..c1c62e6 --- /dev/null +++ b/src/utils/generator/css.js @@ -0,0 +1,18 @@ +const styles = { + 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}', + 'el-upload': '.el-upload__tip{line-height: 1.2;}' +} + +function addCss(cssList, el) { + const css = styles[el.tag] + css && cssList.indexOf(css) === -1 && cssList.push(css) + if (el.children) { + el.children.forEach(el2 => addCss(cssList, el2)) + } +} + +export function makeUpCss(conf) { + const cssList = [] + conf.fields.forEach(el => addCss(cssList, el)) + return cssList.join('\n') +} diff --git a/src/utils/generator/drawingDefault.js b/src/utils/generator/drawingDefault.js new file mode 100644 index 0000000..3345c84 --- /dev/null +++ b/src/utils/generator/drawingDefault.js @@ -0,0 +1,37 @@ +export const drawingDefaultValue = [] + +export function initDrawingDefaultValue() { + if (drawingDefaultValue.length === 0) { + drawingDefaultValue.push({ + layout: 'colFormItem', + tagIcon: 'input', + label: '手机号', + vModel: 'mobile', + formId: 6, + tag: 'el-input', + placeholder: '请输入手机号', + defaultValue: '', + span: 24, + style: {width: '100%'}, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': 'Cellphone', + 'suffix-icon': '', + maxlength: 11, + 'show-word-limit': true, + readonly: false, + disabled: false, + required: true, + changeTag: true, + regList: [{ + pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', + message: '手机号格式错误' + }] + }) + } +} + +export function cleanDrawingDefaultValue() { + drawingDefaultValue.splice(0, drawingDefaultValue.length) +} diff --git a/src/utils/generator/html.js b/src/utils/generator/html.js new file mode 100644 index 0000000..4b29841 --- /dev/null +++ b/src/utils/generator/html.js @@ -0,0 +1,359 @@ +/* eslint-disable max-len */ +import { trigger } from './config' + +let confGlobal +let someSpanIsNot24 + +export function dialogWrapper(str) { + return ` + ${str} + + ` +} + +export function vueTemplate(str) { + return `` +} + +export function vueScript(str) { + return `` +} + +export function cssStyle(cssStr) { + return `` +} + +function buildFormTemplate(conf, child, type) { + let labelPosition = '' + if (conf.labelPosition !== 'right') { + labelPosition = `label-position="${conf.labelPosition}"` + } + const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : '' + let str = ` + ${child} + ${buildFromBtns(conf, type)} + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + return str +} + +function buildFromBtns(conf, type) { + let str = '' + if (conf.formBtns && type === 'file') { + str = ` + 提交 + 重置 + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + } + return str +} + +// span不为24的用el-col包裹 +function colWrapper(element, str) { + if (someSpanIsNot24 || element.span !== 24) { + return ` + ${str} + ` + } + return str +} + +const layouts = { + colFormItem(element) { + let labelWidth = '' + if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) { + labelWidth = `label-width="${element.labelWidth}px"` + } + const required = !trigger[element.tag] && element.required ? 'required' : '' + const tagDom = tags[element.tag] ? tags[element.tag](element) : null + let str = ` + ${tagDom} + ` + str = colWrapper(element, str) + return str + }, + rowFormItem(element) { + const type = element.type === 'default' ? '' : `type="${element.type}"` + const justify = element.type === 'default' ? '' : `justify="${element.justify}"` + const align = element.type === 'default' ? '' : `align="${element.align}"` + const gutter = element.gutter ? `gutter="${element.gutter}"` : '' + const children = element.children.map(el => layouts[el.layout](el)) + let str = ` + ${children.join('\n')} + ` + str = colWrapper(element, str) + return str + } +} + +const tags = { + 'el-button': el => { + const { + tag, disabled + } = attrBuilder(el) + const type = el.type ? `type="${el.type}"` : '' + const icon = el.icon ? `icon="${el.icon}"` : '' + const size = el.size ? `size="${el.size}"` : '' + let child = buildElButtonChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}` + }, + 'el-input': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : '' + const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : '' + const readonly = el.readonly ? 'readonly' : '' + const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : '' + const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : '' + const showPassword = el['show-password'] ? 'show-password' : '' + const type = el.type ? `type="${el.type}"` : '' + const autosize = el.autosize && el.autosize.minRows + ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"` + : '' + let child = buildElInputChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}` + }, + 'el-input-number': el => { + const { disabled, vModel, placeholder } = attrBuilder(el) + const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : '' + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const stepStrictly = el['step-strictly'] ? 'step-strictly' : '' + const precision = el.precision ? `:precision='${el.precision}'` : '' + + return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}>` + }, + 'el-select': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const filterable = el.filterable ? 'filterable' : '' + const multiple = el.multiple ? 'multiple' : '' + let child = buildElSelectChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}` + }, + 'el-radio-group': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + let child = buildElRadioGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${size} ${disabled}>${child}` + }, + 'el-checkbox-group': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const min = el.min ? `:min="${el.min}"` : '' + const max = el.max ? `:max="${el.max}"` : '' + let child = buildElCheckboxGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}` + }, + 'el-switch': el => { + const { disabled, vModel } = attrBuilder(el) + const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : '' + const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : '' + const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : '' + const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : '' + const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : '' + const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : '' + + return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}>` + }, + 'el-cascader': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const options = el.options ? `:options="${el.vModel}Options"` : '' + const props = el.props ? `:props="${el.vModel}Props"` : '' + const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"' + const filterable = el.filterable ? 'filterable' : '' + const separator = el.separator === '/' ? '' : `separator="${el.separator}"` + + return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}>` + }, + 'el-slider': el => { + const { disabled, vModel } = attrBuilder(el) + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const range = el.range ? 'range' : '' + const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : '' + + return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}>` + }, + 'el-time-picker': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const isRange = el['is-range'] ? 'is-range' : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : '' + + return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}>` + }, + 'el-date-picker': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const type = el.type === 'date' ? '' : `type="${el.type}"` + const readonly = el.readonly ? 'readonly' : '' + + return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}>` + }, + 'el-rate': el => { + const { disabled, vModel } = attrBuilder(el) + const max = el.max ? `:max='${el.max}'` : '' + const allowHalf = el['allow-half'] ? 'allow-half' : '' + const showText = el['show-text'] ? 'show-text' : '' + const showScore = el['show-score'] ? 'show-score' : '' + + return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}>` + }, + 'el-color-picker': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const showAlpha = el['show-alpha'] ? 'show-alpha' : '' + const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : '' + + return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}>` + }, + 'el-upload': el => { + const disabled = el.disabled ? ':disabled=\'true\'' : '' + const action = el.action ? `:action="${el.vModel}Action"` : '' + const multiple = el.multiple ? 'multiple' : '' + const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : '' + const accept = el.accept ? `accept="${el.accept}"` : '' + const name = el.name !== 'file' ? `name="${el.name}"` : '' + const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : '' + const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"` + const fileList = `:file-list="${el.vModel}fileList"` + const ref = `ref="${el.vModel}"` + let child = buildElUploadChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}` + } +} + +function attrBuilder(el) { + return { + vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`, + clearable: el.clearable ? 'clearable' : '', + placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '', + width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '', + disabled: el.disabled ? ':disabled=\'true\'' : '' + } +} + +// el-buttin 子级 +function buildElButtonChild(conf) { + const children = [] + if (conf.default) { + children.push(conf.default) + } + return children.join('\n') +} + +// el-input innerHTML +function buildElInputChild(conf) { + const children = [] + if (conf.prepend) { + children.push(``) + } + if (conf.append) { + children.push(``) + } + return children.join('\n') +} + +function buildElSelectChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + children.push(``) + } + return children.join('\n') +} + +function buildElRadioGroupChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio' + const border = conf.border ? 'border' : '' + children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :value="item.value" :disabled="item.disabled" ${border}>{{item.label}}`) + } + return children.join('\n') +} + +function buildElCheckboxGroupChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox' + const border = conf.border ? 'border' : '' + children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :value="item.label" :disabled="item.disabled" ${border} />`) + } + return children.join('\n') +} + +function buildElUploadChild(conf) { + const list = [] + if (conf['list-type'] === 'picture-card') list.push('') + else list.push(`${conf.buttonText}`) + if (conf.showTip) list.push(`

只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件
`) + return list.join('\n') +} + +export function makeUpHtml(conf, type) { + const htmlList = [] + confGlobal = conf + someSpanIsNot24 = conf.fields.some(item => item.span !== 24) + conf.fields.forEach(el => { + htmlList.push(layouts[el.layout](el)) + }) + const htmlStr = htmlList.join('\n') + + let temp = buildFormTemplate(conf, htmlStr, type) + if (type === 'dialog') { + temp = dialogWrapper(temp) + } + confGlobal = null + return temp +} diff --git a/src/utils/generator/icon.json b/src/utils/generator/icon.json new file mode 100644 index 0000000..2d9999a --- /dev/null +++ b/src/utils/generator/icon.json @@ -0,0 +1 @@ +["platform-eleme","eleme","delete-solid","delete","s-tools","setting","user-solid","user","phone","phone-outline","more","more-outline","star-on","star-off","s-goods","goods","warning","warning-outline","question","info","remove","circle-plus","success","error","zoom-in","zoom-out","remove-outline","circle-plus-outline","circle-check","circle-close","s-help","help","minus","plus","check","close","picture","picture-outline","picture-outline-round","upload","upload2","download","camera-solid","camera","video-camera-solid","video-camera","message-solid","bell","s-cooperation","s-order","s-platform","s-fold","s-unfold","s-operation","s-promotion","s-home","s-release","s-ticket","s-management","s-open","s-shop","s-marketing","s-flag","s-comment","s-finance","s-claim","s-custom","s-opportunity","s-data","s-check","s-grid","menu","share","d-caret","caret-left","caret-right","caret-bottom","caret-top","bottom-left","bottom-right","back","right","bottom","top","top-left","top-right","arrow-left","arrow-right","arrow-down","arrow-up","d-arrow-left","d-arrow-right","video-pause","video-play","refresh","refresh-right","refresh-left","finished","sort","sort-up","sort-down","rank","loading","view","c-scale-to-original","date","edit","edit-outline","folder","folder-opened","folder-add","folder-remove","folder-delete","folder-checked","tickets","document-remove","document-delete","document-copy","document-checked","document","document-add","printer","paperclip","takeaway-box","search","monitor","attract","mobile","scissors","umbrella","headset","brush","mouse","coordinate","magic-stick","reading","data-line","data-board","pie-chart","data-analysis","collection-tag","film","suitcase","suitcase-1","receiving","collection","files","notebook-1","notebook-2","toilet-paper","office-building","school","table-lamp","house","no-smoking","smoking","shopping-cart-full","shopping-cart-1","shopping-cart-2","shopping-bag-1","shopping-bag-2","sold-out","sell","present","box","bank-card","money","coin","wallet","discount","price-tag","news","guide","male","female","thumb","cpu","link","connection","open","turn-off","set-up","chat-round","chat-line-round","chat-square","chat-dot-round","chat-dot-square","chat-line-square","message","postcard","position","turn-off-microphone","microphone","close-notification","bangzhu","time","odometer","crop","aim","switch-button","full-screen","copy-document","mic","stopwatch","medal-1","medal","trophy","trophy-1","first-aid-kit","discover","place","location","location-outline","location-information","add-location","delete-location","map-location","alarm-clock","timer","watch-1","watch","lock","unlock","key","service","mobile-phone","bicycle","truck","ship","basketball","football","soccer","baseball","wind-power","light-rain","lightning","heavy-rain","sunrise","sunrise-1","sunset","sunny","cloudy","partly-cloudy","cloudy-and-sunny","moon","moon-night","dish","dish-1","food","chicken","fork-spoon","knife-fork","burger","tableware","sugar","dessert","ice-cream","hot-water","water-cup","coffee-cup","cold-drink","goblet","goblet-full","goblet-square","goblet-square-full","refrigerator","grape","watermelon","cherry","apple","pear","orange","coffee","ice-tea","ice-drink","milk-tea","potato-strips","lollipop","ice-cream-square","ice-cream-round"] \ No newline at end of file diff --git a/src/utils/generator/js.js b/src/utils/generator/js.js new file mode 100644 index 0000000..dc38bfe --- /dev/null +++ b/src/utils/generator/js.js @@ -0,0 +1,370 @@ +import { titleCase } from '@/utils/index' +import { trigger } from './config' +// 文件大小设置 +const units = { + KB: '1024', + MB: '1024 / 1024', + GB: '1024 / 1024 / 1024', +} +/** + * @name: 生成js需要的数据 + * @description: 生成js需要的数据 + * @param {*} conf + * @param {*} type 弹窗或表单 + * @return {*} + */ +export function makeUpJs(conf, type) { + conf = JSON.parse(JSON.stringify(conf)) + const dataList = [] + const ruleList = [] + const optionsList = [] + const propsList = [] + const methodList = [] + const uploadVarList = [] + + conf.fields.forEach((el) => { + buildAttributes( + el, + dataList, + ruleList, + optionsList, + methodList, + propsList, + uploadVarList + ) + }) + + const script = buildexport( + conf, + type, + dataList.join('\n'), + ruleList.join('\n'), + optionsList.join('\n'), + uploadVarList.join('\n'), + propsList.join('\n'), + methodList.join('\n') + ) + + return script +} +/** + * @name: 生成参数 + * @description: 生成参数,包括表单数据表单验证数据,多选选项数据,上传数据等 + * @return {*} + */ +function buildAttributes( + el, + dataList, + ruleList, + optionsList, + methodList, + propsList, + uploadVarList +){ + buildData(el, dataList) + buildRules(el, ruleList) + + if (el.options && el.options.length) { + buildOptions(el, optionsList) + if (el.dataType === 'dynamic') { + const model = `${el.vModel}Options` + const options = titleCase(model) + buildOptionMethod(`get${options}`, model, methodList) + } + } + + if (el.props && el.props.props) { + buildProps(el, propsList) + } + + if (el.action && el.tag === 'el-upload') { + uploadVarList.push( + ` + // 上传请求路径 + const ${el.vModel}Action = ref('${el.action}') + // 上传文件列表 + const ${el.vModel}fileList = ref([])` + ) + methodList.push(buildBeforeUpload(el)) + if (!el['auto-upload']) { + methodList.push(buildSubmitUpload(el)) + } + } + + if (el.children) { + el.children.forEach((el2) => { + buildAttributes( + el2, + dataList, + ruleList, + optionsList, + methodList, + propsList, + uploadVarList + ) + }) + } +} +/** + * @name: 生成表单数据formData + * @description: 生成表单数据formData + * @param {*} conf + * @param {*} dataList 数据列表 + * @return {*} + */ +function buildData(conf, dataList) { + if (conf.vModel === undefined) return + let defaultValue + if (typeof conf.defaultValue === 'string' && !conf.multiple) { + defaultValue = `'${conf.defaultValue}'` + } else { + defaultValue = `${JSON.stringify(conf.defaultValue)}` + } + dataList.push(`${conf.vModel}: ${defaultValue},`) +} +/** + * @name: 生成表单验证数据rule + * @description: 生成表单验证数据rule + * @param {*} conf + * @param {*} ruleList 验证数据列表 + * @return {*} + */ +function buildRules(conf, ruleList) { + if (conf.vModel === undefined) return + const rules = [] + if (trigger[conf.tag]) { + if (conf.required) { + const type = Array.isArray(conf.defaultValue) ? "type: 'array'," : '' + let message = Array.isArray(conf.defaultValue) + ? `请至少选择一个${conf.vModel}` + : conf.placeholder + if (message === undefined) message = `${conf.label}不能为空` + rules.push( + `{ required: true, ${type} message: '${message}', trigger: '${ + trigger[conf.tag] + }' }` + ) + } + if (conf.regList && Array.isArray(conf.regList)) { + conf.regList.forEach((item) => { + if (item.pattern) { + rules.push( + `{ pattern: new RegExp(${item.pattern}), message: '${ + item.message + }', trigger: '${trigger[conf.tag]}' }` + ) + } + }) + } + ruleList.push(`${conf.vModel}: [${rules.join(',')}],`) + } +} +/** + * @name: 生成选项数据 + * @description: 生成选项数据,单选多选下拉等 + * @param {*} conf + * @param {*} optionsList 选项数据列表 + * @return {*} + */ +function buildOptions(conf, optionsList) { + if (conf.vModel === undefined) return + if (conf.dataType === 'dynamic') { + conf.options = [] + } + const str = `const ${conf.vModel}Options = ref(${JSON.stringify(conf.options)})` + optionsList.push(str) +} +/** + * @name: 生成方法 + * @description: 生成方法 + * @param {*} methodName 方法名 + * @param {*} model + * @param {*} methodList 方法列表 + * @return {*} + */ +function buildOptionMethod(methodName, model, methodList) { + const str = `function ${methodName}() { + // TODO 发起请求获取数据 + ${model}.value + }` + methodList.push(str) +} +/** + * @name: 生成表单组件需要的props设置 + * @description: 生成表单组件需要的props设置,如;级联组件 + * @param {*} conf + * @param {*} propsList + * @return {*} + */ +function buildProps(conf, propsList) { + if (conf.dataType === 'dynamic') { + conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey) + conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey) + conf.childrenKey !== 'children' && + (conf.props.props.children = conf.childrenKey) + } + const str = ` + // props设置 + const ${conf.vModel}Props = ref(${JSON.stringify(conf.props.props)})` + propsList.push(str) +} +/** + * @name: 生成上传组件的相关内容 + * @description: 生成上传组件的相关内容 + * @param {*} conf + * @return {*} + */ +function buildBeforeUpload(conf) { + const unitNum = units[conf.sizeUnit] + let rightSizeCode = '' + let acceptCode = '' + const returnList = [] + if (conf.fileSize) { + rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize} + if(!isRightSize){ + proxy.$modal.msgError('文件大小超过 ${conf.fileSize}${conf.sizeUnit}') + }` + returnList.push('isRightSize') + } + if (conf.accept) { + acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type) + if(!isAccept){ + proxy.$modal.msgError('应该选择${conf.accept}类型的文件') + }` + returnList.push('isAccept') + } + const str = ` + /** + * @name: 上传之前的文件判断 + * @description: 上传之前的文件判断,判断文件大小文件类型等 + * @param {*} file + * @return {*} + */ + function ${conf.vModel}BeforeUpload(file) { + ${rightSizeCode} + ${acceptCode} + return ${returnList.join('&&')} + }` + return returnList.length ? str : '' +} +/** + * @name: 生成提交表单方法 + * @description: 生成提交表单方法 + * @param {Object} conf vModel 表单ref + * @return {*} + */ +function buildSubmitUpload(conf) { + const str = `function submitUpload() { + this.$refs['${conf.vModel}'].submit() + }` + return str +} +/** + * @name: 组装js代码 + * @description: 组装js代码方法 + * @return {*} + */ +function buildexport( + conf, + type, + data, + rules, + selectOptions, + uploadVar, + props, + methods +) { + let str = ` + const { proxy } = getCurrentInstance() + const ${conf.formRef} = ref() + const data = reactive({ + ${conf.formModel}: { + ${data} + }, + ${conf.formRules}: { + ${rules} + } + }) + + const {${conf.formModel}, ${conf.formRules}} = toRefs(data) + + ${selectOptions} + + ${uploadVar} + + ${props} + + ${methods} + ` + + if(type === 'dialog') { + str += ` + // 弹窗设置 + const dialogVisible = defineModel() + // 弹窗确认回调 + const emit = defineEmits(['confirm']) + /** + * @name: 弹窗打开后执行 + * @description: 弹窗打开后执行方法 + * @return {*} + */ + function onOpen(){ + + } + /** + * @name: 弹窗关闭时执行 + * @description: 弹窗关闭方法,重置表单 + * @return {*} + */ + function onClose(){ + ${conf.formRef}.value.resetFields() + } + /** + * @name: 弹窗取消 + * @description: 弹窗取消方法 + * @return {*} + */ + function close(){ + dialogVisible.value = false + } + /** + * @name: 弹窗表单提交 + * @description: 弹窗表单提交方法 + * @return {*} + */ + function handelConfirm(){ + ${conf.formRef}.value.validate((valid) => { + if (!valid) return + // TODO 提交表单 + + close() + // 回调父级组件 + emit('confirm') + }) + } + ` + } else { + str += ` + /** + * @name: 表单提交 + * @description: 表单提交方法 + * @return {*} + */ + function submitForm() { + ${conf.formRef}.value.validate((valid) => { + if (!valid) return + // TODO 提交表单 + }) + } + /** + * @name: 表单重置 + * @description: 表单重置方法 + * @return {*} + */ + function resetForm() { + ${conf.formRef}.value.resetFields() + } + ` + } + return str +} diff --git a/src/utils/generator/render.js b/src/utils/generator/render.js new file mode 100644 index 0000000..d6d4414 --- /dev/null +++ b/src/utils/generator/render.js @@ -0,0 +1,156 @@ +import { defineComponent, h } from 'vue' +import { makeMap } from '@/utils/index' + +const isAttr = makeMap( + 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' + + 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' + + 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' + + 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' + + 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' + + 'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,' + + 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' + + 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' + + 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' + + 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' + + 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' + + 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' + + 'target,title,type,usemap,value,width,wrap' + 'prefix-icon' +) +const isNotProps = makeMap( + 'layout,prepend,regList,tag,document,changeTag,defaultValue' +) + +function useVModel(props, emit) { + return { + modelValue: props.defaultValue, + 'onUpdate:modelValue': (val) => emit('update:modelValue', val), + } +} +const componentChild = { + 'el-button': { + default(h, conf, key) { + return conf[key] + }, + }, + 'el-select': { + options(h, conf, key) { + return conf.options.map(item => h(resolveComponent('el-option'), { + label: item.label, + value: item.value, + })) + } + }, + 'el-radio-group': { + options(h, conf, key) { + return conf.optionType === 'button' ? conf.options.map(item => h(resolveComponent('el-checkbox-button'), { + label: item.value, + }, () => item.label)) : conf.options.map(item => h(resolveComponent('el-radio'), { + label: item.value, + border: conf.border, + }, () => item.label)) + } + }, + 'el-checkbox-group': { + options(h, conf, key) { + return conf.optionType === 'button' ? conf.options.map(item => h(resolveComponent('el-checkbox-button'), { + label: item.value, + }, () => item.label)) : conf.options.map(item => h(resolveComponent('el-checkbox'), { + label: item.value, + border: conf.border, + }, () => item.label)) + } + }, + 'el-upload': { + 'list-type': (h, conf, key) => { + const option = {} + // if (conf.showTip) { + // tip = h('div', { + // class: "el-upload__tip" + // }, () => '只能上传不超过' + conf.fileSize + conf.sizeUnit + '的' + conf.accept + '文件') + // } + if (conf['list-type'] === 'picture-card') { + return h(resolveComponent('el-icon'), option, () => h(resolveComponent('Plus'))) + } else { + // option.size = "small" + option.type = "primary" + option.icon = "Upload" + return h(resolveComponent('el-button'), option, () => conf.buttonText) + } + }, + + } +} +const componentSlot = { + 'el-upload': { + 'tip': (h, conf, key) => { + if (conf.showTip) { + return () => h('div', { + class: "el-upload__tip" + }, '只能上传不超过' + conf.fileSize + conf.sizeUnit + '的' + conf.accept + '文件') + } + }, + } +} +export default defineComponent({ + + // 使用 render 函数 + render() { + const dataObject = { + attrs: {}, + props: {}, + on: {}, + style: {} + } + const confClone = JSON.parse(JSON.stringify(this.conf)) + const children = [] + const slot = {} + const childObjs = componentChild[confClone.tag] + if (childObjs) { + Object.keys(childObjs).forEach(key => { + const childFunc = childObjs[key] + if (confClone[key]) { + children.push(childFunc(h, confClone, key)) + } + }) + } + const slotObjs = componentSlot[confClone.tag] + if (slotObjs) { + Object.keys(slotObjs).forEach(key => { + const childFunc = slotObjs[key] + if (confClone[key]) { + slot[key] = childFunc(h, confClone, key) + } + }) + } + Object.keys(confClone).forEach(key => { + const val = confClone[key] + if (dataObject[key]) { + dataObject[key] = val + } else if (isAttr(key)) { + dataObject.attrs[key] = val + } else if (!isNotProps(key)) { + dataObject.props[key] = val + } + }) + if(children.length > 0){ + slot.default = () => children + } + + return h(resolveComponent(this.conf.tag), + { + modelValue: this.$attrs.modelValue, + ...dataObject.props, + ...dataObject.attrs, + style: { + ...dataObject.style + }, + } + , slot ?? null) + }, + props: { + conf: { + type: Object, + required: true, + }, + } +}) \ No newline at end of file diff --git a/src/utils/groupHelper.ts b/src/utils/groupHelper.ts new file mode 100644 index 0000000..607d73b --- /dev/null +++ b/src/utils/groupHelper.ts @@ -0,0 +1,145 @@ + +// 定义通用类型 +interface GroupOriginValues { + [key: string]: string | number | null | undefined +} + +interface GroupMetaItem { + groupSeq: number + key: string + originValues: GroupOriginValues + itemCount: number + firstRowIndex: number | null +} +// @ts-ignore +interface GroupedItem extends T { + rowSeq: number // 组内行序号 + groupSeq?: number // 组序号(可选) +} + +interface GroupData { + groupSeq: number + key: string + originValues: GroupOriginValues + items: GroupedItem[] +} + +interface UseGroupTableDataReturn { + tableData: ComputedRef<(GroupedItem & { [key: string]: string | number | '' })[]> + groupMeta: ComputedRef + groupedData: ComputedRef[]> +} + +/** + * 通用多字段分组函数 + * @param rawList - 原始数据列表 + * @param groupFields - 分组字段(单个字段传字符串,多个传数组) + * @param showFields - 每组仅第一条显示的字段 + * @param sortField - 排序字段(默认按orderDate降序) + * @param originalData - 原始数据赋值字段(可选) + * @returns 表格渲染数据 + 分组元信息 + */ +export function useGroupTableData>( + rawList: string[], + groupFields: string, + showFields: string | string[], + sortField: string = 'orderDate', + originalData: string[] +): UseGroupTableDataReturn { + // 处理参数格式:确保为数组 + const groupFieldArr = Array.isArray(groupFields) ? groupFields : [groupFields] + const showFieldArr = Array.isArray(showFields) ? showFields : [showFields] + + // 1. 核心分组逻辑 + const groupedData = computed[]>(() => { + const groups: Record[] + }> = {} + + rawList.forEach((item: any) => { + // 生成分组key(多字段拼接,避免重复) + const groupKey = groupFieldArr.map(field => item[field] ?? '').join('_') + + if (!groups[groupKey]) { + groups[groupKey] = { + key: groupKey, + originValues: groupFieldArr.reduce((obj, field) => { + obj[field] = item[field] ?? '' + return obj + }, {} as GroupOriginValues), + items: [] + } + } + // 处理仅第一条显示的字段 + showFieldArr.forEach((field, i) => { + originalData.forEach((v, _i) => { + if (i == _i) { + item[field] = item[v] + } + }) + }) + // 添加组内行序号 + groups[groupKey].items.push({ + ...item, + rowSeq: groups[groupKey].items.length + 1 + }) + }) + + // 2. 按指定字段降序排序分组 + const sortedGroupKeys = Object.keys(groups).sort((a, b) => { + const aSortValue = groups[a].originValues[sortField] ?? '' + const bSortValue = groups[b].originValues[sortField] ?? '' + // 兼容日期/字符串/数字排序 + if (aSortValue && bSortValue && !isNaN(new Date(aSortValue).getTime())) { + return new Date(bSortValue).getTime() - new Date(aSortValue).getTime() + } + return String(bSortValue).localeCompare(String(aSortValue)) + }) + + // 3. 生成带组序号的分组数据 + return sortedGroupKeys.map((key, groupIndex) => ({ + groupSeq: groupIndex + 1, + ...groups[key] + })) + }) + + // 4. 构造扁平化表格数据 + const tableData = computed(() => { + const result: (GroupedItem & { [key: string]: string | number | '' })[] = [] + groupedData.value.forEach(group => { + group.items.forEach((item, idx) => { + const processedItem = { ...item } + + // 处理仅第一条显示的字段 + showFieldArr.forEach(field => { + processedItem[field] = idx === 0 ? (item[field] ?? '') : '' + }) + + // 组序号仅每组第一条显示 + processedItem.groupSeq = idx === 0 ? group.groupSeq : '' + + result.push(processedItem) + }) + }) + return result + }) + + // 5. 生成分组元信息(用于合并单元格) + const groupMeta = computed(() => { + return groupedData.value.map(group => ({ + groupSeq: group.groupSeq, + key: group.key, + originValues: group.originValues, + itemCount: group.items.length, + firstRowIndex: null + })) + }) + + return { + tableData, + groupMeta, + groupedData + } +} \ No newline at end of file diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..6cfe740 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,348 @@ +import { parseTime } from './ruoyi' + +/** + * 表格时间格式化 + */ +export function formatDate(cellValue: any): string { + if (cellValue == null || cellValue == "") return "" + const date = new Date(cellValue) + const year = date.getFullYear() + const month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + const day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + const hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + const minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + const seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() + return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds +} + +/** + * @param time + * @param option + * @returns {string} + */ +export function formatTime(time: number | string, option?: string): string { + if (('' + time).length === 10) { + time = parseInt(time as string) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d.getTime()) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) || '' + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param url + * @returns {Object} + */ +export function getQueryObject(url?: string | null): Record { + url = url == null ? window.location.href : url + const search = url.substring(url.lastIndexOf('?') + 1) + const obj: Record = {} + const reg = /([^?&=]+)=([^?&=]*)/g + search.replace(reg, (rs, $1: string, $2: string) => { + const name = decodeURIComponent($1) + let val = decodeURIComponent($2) + val = String(val) + obj[name] = val + return rs + }) + return obj +} + +/** + * @param input value + * @returns {number} output value + */ +export function byteLength(str: string): number { + // returns the byte length of an utf8 string + let s = str.length + for (let i = str.length - 1; i >= 0; i--) { + const code = str.charCodeAt(i) + if (code > 0x7f && code <= 0x7ff) s++ + else if (code > 0x7ff && code <= 0xffff) s += 2 + if (code >= 0xDC00 && code <= 0xDFFF) i-- + } + return s +} + +/** + * @param actual + * @returns {Array} + */ +export function cleanArray(actual: any[]): any[] { + const newArray: any[] = [] + for (let i = 0; i < actual.length; i++) { + if (actual[i]) { + newArray.push(actual[i]) + } + } + return newArray +} + +/** + * @param json + * @returns {Array} + */ +export function param(json: Record): string { + if (!json) return '' + return cleanArray( + Object.keys(json).map(key => { + if (json[key] === undefined) return '' + return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) + }) + ).join('&') +} + +/** + * @param url + * @returns {Object} + */ +export function param2Obj(url: string): Record { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj: Record = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} + +/** + * @param val + * @returns {string} + */ +export function html2Text(val: string): string { + const div = document.createElement('div') + div.innerHTML = val + return div.textContent || div.innerText || '' +} + +/** + * Merges two objects, giving the last one precedence + * @param target + * @param source + * @returns {Object} + */ +export function objectMerge(target: any, source: any): any { + if (typeof target !== 'object') { + target = {} + } + if (Array.isArray(source)) { + return source.slice() + } + Object.keys(source).forEach(property => { + const sourceProperty = source[property] + if (typeof sourceProperty === 'object') { + target[property] = objectMerge(target[property], sourceProperty) + } else { + target[property] = sourceProperty + } + }) + return target +} + +/** + * @param element + * @param className + */ +export function toggleClass(element: HTMLElement, className: string): void { + if (!element || !className) { + return + } + let classString = element.className + const nameIndex = classString.indexOf(className) + if (nameIndex === -1) { + classString += ' ' + className + } else { + classString = + classString.substr(0, nameIndex) + + classString.substr(nameIndex + className.length) + } + element.className = classString +} + +/** + * @param type + * @returns {Date} + */ +export function getTime(type?: string): number { + if (type === 'start') { + return new Date().getTime() - 3600 * 1000 * 24 * 90 + } else { + return new Date(new Date().toDateString()).getTime() + } +} + +/** + * This is just a simple version of deep copy + * Has a lot of edge cases bug + * If you want to use a perfect deep copy, use lodash's _.cloneDeep + * @param source + * @returns {Object} + */ +export function deepClone(source: T): T { + if (!source && typeof source !== 'object') { + throw new Error('error arguments') + } + const targetObj = (source as any).constructor === Array ? [] : {} + Object.keys(source as any).forEach(keys => { + if ((source as any)[keys] && typeof (source as any)[keys] === 'object') { + (targetObj as any)[keys] = deepClone((source as any)[keys]) + } else { + (targetObj as any)[keys] = (source as any)[keys] + } + }) + return targetObj as T +} + +/** + * @param arr + * @returns {Array} + */ +export function uniqueArr(arr: T[]): T[] { + return Array.from(new Set(arr)) +} + +/** + * @returns {string} + */ +export function createUniqueString(): string { + const timestamp = +new Date() + '' + const randomNum = parseInt((1 + Math.random()) * 65536 + '') + '' + return (+(randomNum + timestamp)).toString(32) +} + +/** + * Check if an element has a class + * @param elm + * @param cls + * @returns {boolean} + */ +export function hasClass(ele: HTMLElement, cls: string): boolean { + return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) +} + +/** + * Add class to element + * @param ele + * @param cls + */ +export function addClass(ele: HTMLElement, cls: string): void { + if (!hasClass(ele, cls)) ele.className += ' ' + cls +} + +/** + * Remove class from element + * @param ele + * @param cls + */ +export function removeClass(ele: HTMLElement, cls: string): void { + if (hasClass(ele, cls)) { + const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') + ele.className = ele.className.replace(reg, ' ') + } +} + +export function makeMap(str: string, expectsLowerCase?: boolean): (val: string) => boolean { + const map = Object.create(null) + const list = str.split(',') + for (let i = 0; i < list.length; i++) { + map[list[i]] = true + } + return expectsLowerCase + ? (val: string) => map[val.toLowerCase()] + : (val: string) => map[val] +} + +export const exportDefault = 'export default ' + +export const beautifierConf = { + html: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'separate', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: false, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + }, + js: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'normal', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: true, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + } +} + +// 首字母大小 +export function titleCase(str: string): string { + return str.replace(/( |^)[a-z]/g, L => L.toUpperCase()) +} + +// 下划转驼峰 +export function camelCase(str: string): string { + return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase()) +} + +export function isNumberStr(str: string): boolean { + return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) +} diff --git a/src/utils/jsencrypt.ts b/src/utils/jsencrypt.ts new file mode 100644 index 0000000..1f832cb --- /dev/null +++ b/src/utils/jsencrypt.ts @@ -0,0 +1,29 @@ +import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' + +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' + +const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + + '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + + 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + + 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + + 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + + 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + + 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + + 'UP8iWi1Qw0Y=' + +// 加密 +export function encrypt(txt: string): string | false { + const encryptor = new JSEncrypt() + encryptor.setPublicKey(publicKey) // 设置公钥 + return encryptor.encrypt(txt) // 对数据进行加密 +} + +// 解密 +export function decrypt(txt: string): string | false { + const encryptor = new JSEncrypt() + encryptor.setPrivateKey(privateKey) // 设置私钥 + return encryptor.decrypt(txt) // 对数据进行解密 +} diff --git a/src/utils/mitt.ts b/src/utils/mitt.ts new file mode 100644 index 0000000..68f108e --- /dev/null +++ b/src/utils/mitt.ts @@ -0,0 +1,30 @@ + +import mitt, { Emitter, EventType } from "mitt" + +// 扩展原始Emitter类型,添加自定义方法 +interface CustomEmitter extends Emitter> { + emitWithCache: (eventName: string, data: any) => void + getCache: (eventName: string) => any +} + +const emitter = mitt() as CustomEmitter + +// 全局缓存:key为事件名,value为最新的事件数据 +const eventCache = new Map() + +// 触发事件时自动缓存数据 +emitter.emitWithCache = (eventName: string, data: any) => { + // 缓存数据(覆盖旧数据,只保留最新一次) + eventCache.set(eventName, data) + // 正常触发事件(供已挂载的组件监听) + emitter.emit(eventName, data) +} + +// 获取并清除缓存(避免重复处理) +emitter.getCache = (eventName: string) => { + const data = eventCache.get(eventName) + eventCache.delete(eventName) // 取出后删除,确保只处理一次 + return data +} + +export default emitter \ No newline at end of file diff --git a/src/utils/permission.ts b/src/utils/permission.ts new file mode 100644 index 0000000..5327c59 --- /dev/null +++ b/src/utils/permission.ts @@ -0,0 +1,76 @@ +import useUserStore from '@/store/modules/user' + +/** + * 字符权限校验 + * @param value 校验值 + * @returns {Boolean} + */ +export function checkPermi(value: string[]): boolean { + if (value && value instanceof Array && value.length > 0) { + const permissions = useUserStore().permissions + const permissionDatas = value + const all_permission = "*:*:*" + + const hasPermission = permissions.some((permission: string) => { + return all_permission === permission || permissionDatas.includes(permission) + }) + + if (!hasPermission) { + return false + } + return true + } else { + console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`) + return false + } +} + +/** + * 角色权限校验 + * @param value 校验值 + * @returns {Boolean} + */ +export function checkRole(value: string[]): boolean { + if (!value || !(value instanceof Array) || value.length === 0) { + console.error(`need roles! Like checkRole="['admin','editor']"`) + return false + } + + const userStore = useUserStore() + const roles = userStore.roles + const permissionRoles = value + + // 取出 roleKey 进行判断 + const hasRole = roles.some((role: any) => { + const roleKey = role.roleKey || '' + // 是超级管理员 admin 或者 包含指定角色 + return roleKey === 'admin' || permissionRoles.includes(roleKey) + }) + + return hasRole +} + + +/** + * 管理员、检测机构权限校验 + * @param value 校验值 + * @returns {Boolean} + */ +export function checkDeptRole(value: string[]): boolean { + if (!value || !(value instanceof Array) || value.length === 0) { + console.error(`need roles! Like checkRole="['admin','editor']"`) + return false + } + + const userStore = useUserStore() + const roles = userStore.roles + const permissionRoles = value + const deptParam = userStore.deptParam + // 取出 roleKey 进行判断 + const hasRole = roles.some((role: any) => { + const roleKey = role.roleKey || '' + // 是超级管理员 admin 或者 包含指定角色 、 检测机构人员权限 203 + return roleKey === 'admin' || permissionRoles.includes(roleKey) || deptParam.parentId == 203 + }) + return hasRole +} diff --git a/src/utils/pinyin.ts b/src/utils/pinyin.ts new file mode 100644 index 0000000..c626b3d --- /dev/null +++ b/src/utils/pinyin.ts @@ -0,0 +1,60 @@ +// pinyin.ts - 拼音转换工具 +// src/utils/pinyin-utils.ts +import { + pinyin +} from 'pinyin-pro'; + +/** + * 获取文本的拼音首字母 + * @param {string} text - 要转换的文本 + * @returns {string} - 拼音首字母字符串 + */ +export function getFirstLetter(text: string): string { + if (!text) return ''; + + // 获取拼音(不带音调,数组形式) + const pinyinArray = pinyin(text, { + toneType: "none", + type: "array" + }) as string[]; + + // 提取每个拼音的首字母并连接 + return pinyinArray.map(word => word.charAt(0)).join(''); +} + +/** + * 获取文本的拼音全拼 + * @param {string} text - 要转换的文本 + * @returns {string} - 拼音全拼字符串 + */ +export function getFullPinyin(text: string): string { + if (!text) return ''; + + // 获取拼音(不带音调,字符串形式) + return pinyin(text, { + toneType: "none" + }).replace(/\s+/g, ''); +} + +interface Option { + id: string | number; + text: string; +} + +interface ProcessedOption extends Option { + pinyin: string; + firstLetters: string; +} + +/** + * 处理选项数据,添加拼音和首字母属性 + * @param {Option[]} options - 原始选项数组,每个元素包含id和text属性 + * @returns {ProcessedOption[]} - 处理后的选项数组,每个元素包含pinyin和firstLetters属性 + */ +export function processOptions(options: Option[]): ProcessedOption[] { + return options.map(option => ({ + ...option, + pinyin: getFullPinyin(option.text), + firstLetters: getFirstLetter(option.text) + })); +} \ No newline at end of file diff --git a/src/utils/polyfills.ts b/src/utils/polyfills.ts new file mode 100644 index 0000000..0e9a14a --- /dev/null +++ b/src/utils/polyfills.ts @@ -0,0 +1,21 @@ +// 检测浏览器是否支持,不支持则注入兼容版 +if (!Array.prototype.findLastIndex) { + Object.defineProperty(Array.prototype, 'findLastIndex', { + value: function ( + this: T[], + callback: (value: T, index: number, array: T[]) => boolean, + thisArg?: any + ): number { + const arr = this; + const len = arr.length >>> 0; + for (let i = len - 1; i >= 0; i--) { + if (i in arr && callback.call(thisArg, arr[i], i, arr)) { + return i; + } + } + return -1; + }, + writable: true, + configurable: true + }); +} \ No newline at end of file diff --git a/src/utils/printHelper.ts b/src/utils/printHelper.ts new file mode 100644 index 0000000..d604e3b --- /dev/null +++ b/src/utils/printHelper.ts @@ -0,0 +1,47 @@ +/** + * @file printHelper.ts 检查打印服务连接状态 + * @author: w + * @since: 2026-01-26 + */ + +import { ElMessageBox, ElMessage } from 'element-plus' +import Download from '@/plugins/download' +import { getWebSocketState } from '@/utils/webSocket'; + +export const checkPrintService = async (): Promise => { //连接成功返回true,失败返回false + try { + if (getWebSocketState() == 1) { // 1表示WebSocket已连接 + return true + } else { + await showPrintServiceError('打印服务未连接') + return false + } + } catch (error) { + console.error('打印服务检查失败:', error) + await showPrintServiceError('打印服务连接异常') + return false + } +} + + +export const showPrintServiceError = async (msg: string) => { + // 挂载downExe方法到window,供提示框内的onclick调用 + if (!(window as any).downExe) { + (window as any).downExe = () => { + Download.name('lisprintsetup.exe', false) + } + } + + await ElMessageBox.alert( + `${msg}!
请确保目标服务器已
下载安装 并运行打印服务!`, + "客户端未连接", + { + dangerouslyUseHTMLString: true, + } + ) +} + +//触发打印服务安装包下载 +export const downloadPrintSetup = () => { + Download.name('lisprintsetup.exe', false) +} \ No newline at end of file diff --git a/src/utils/rem.ts b/src/utils/rem.ts new file mode 100644 index 0000000..c1fec08 --- /dev/null +++ b/src/utils/rem.ts @@ -0,0 +1,22 @@ +// src/utils/rem.ts +export const setupRem = () => { + const baseDesignWidth = 1920; // 设计稿宽度 + const baseFontSize = 16; // 设计稿对应根字体大小(1rem = 16px) + const minWidth = 1280; // 最小支持宽度(避免过小屏幕错乱) + + const updateRem = () => { + // 获取当前屏幕宽度(取可视区域宽度) + const clientWidth = document.documentElement.clientWidth || window.innerWidth; + // 限制最小宽度 + const actualWidth = Math.max(clientWidth, minWidth); + // 计算当前根字体大小(按比例缩放) + const currentFontSize = (actualWidth / baseDesignWidth) * baseFontSize; + // 设置到 html 元素 + document.documentElement.style.fontSize = `${currentFontSize.toFixed(2)}px`; + }; + + // 初始化计算 + updateRem(); + // 监听窗口尺寸变化,实时更新 + window.addEventListener('resize', updateRem); +}; \ No newline at end of file diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000..8af479d --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,175 @@ +import axios from 'axios' +import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { tansParams, blobValidate } from '@/utils/ruoyi' +import cache from '@/plugins/cache' +import { saveAs } from 'file-saver' +import useUserStore from '@/store/modules/user' + +let downloadLoadingInstance: ReturnType +// 是否显示重新登录 +export const isRelogin = { show: false } + +axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' +// 创建axios实例 +const service = axios.create({ + // axios中请求配置有baseURL选项,表示请求URL公共部分 + baseURL: import.meta.env.VITE_APP_BASE_API, + // 超时 + timeout: 10000 +}) + +// request拦截器 +service.interceptors.request.use((config: any) => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + // 是否需要防止数据重复提交 + const isRepeatSubmit = (config.headers || {}).repeatSubmit === false + // 间隔时间(ms),小于此时间视为重复提交 + const interval = (config.headers || {}).interval || 1000 + if (getToken() && !isToken) { + config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + } + // get请求映射params参数 + if (config.method === 'get' && config.params) { + let url = config.url + '?' + tansParams(config.params) + url = url.slice(0, -1) + config.params = {} + config.url = url + } + if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { + const requestObj = { + url: config.url, + data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, + time: new Date().getTime() + } + const requestSize = Object.keys(JSON.stringify(requestObj)).length // 请求数据大小 + const limitSize = 5 * 1024 * 1024 // 限制存放数据5M + if (requestSize >= limitSize) { + console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。') + return config + } + const sessionObj = cache.session.getJSON('sessionObj') + if (sessionObj === undefined || sessionObj === null || sessionObj === '') { + cache.session.setJSON('sessionObj', requestObj) + } else { + const s_url = sessionObj.url // 请求地址 + const s_data = sessionObj.data // 请求数据 + const s_time = sessionObj.time // 请求时间 + if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { + const message = '数据正在处理,请勿重复提交' + console.warn(`[${s_url}]: ` + message) + return Promise.reject(new Error(message)) + } else { + cache.session.setJSON('sessionObj', requestObj) + } + } + } + return config +}, (error: any) => { + console.log(error) + Promise.reject(error) +}) + +// 响应拦截器 +service.interceptors.response.use((res: any) => { + // 未设置状态码则默认成功状态 + // 未设置状态码则默认成功状态 + const code = (() => { + const rawCode = res.data.code; + + // 如果是 null/undefined,返回默认值 200 + if (rawCode === null || rawCode === undefined) { + return 200; + } + + // 如果是字符串,尝试转换为数字 + if (typeof rawCode === 'string') { + const numericCode = Number(rawCode); + return isNaN(numericCode) ? 200 : numericCode; + } + + // 如果已经是数字,直接返回 + if (typeof rawCode === 'number') { + return rawCode; + } + + // 其他情况,返回默认值 + return 200; + })(); + // 获取错误信息 + const msg = errorCode[code] || res.data.msg || errorCode['default'] + // 二进制数据则直接返回 + if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { + return res.data + } + if (code === 401) { + if (!isRelogin.show) { + isRelogin.show = true + ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { + isRelogin.show = false + useUserStore().logOut().then(() => { + location.href = '/index' + }) + }).catch(() => { + isRelogin.show = false + }) + } + return Promise.reject('无效的会话,或者会话已过期,请重新登录。') + } else if (code === 500) { + ElMessage({ message: msg, type: 'error' }) + return Promise.reject(new Error(msg)) + } else if (code === 601) { + ElMessage({ message: msg, type: 'warning' }) + return Promise.reject(new Error(msg)) + } else if (code !== 200 && code !== 0) { + ElNotification.error({ title: msg }) + return Promise.reject('error') + } else { + return Promise.resolve(res.data) + } +}, + (error: any) => { + console.log('err' + error) + let { message } = error + if (message == "Network Error") { + message = "后端接口连接异常" + } else if (message.includes("timeout")) { + message = "系统接口请求超时" + } else if (message.includes("Request failed with status code")) { + message = "系统接口" + message.slice(-3) + "异常" + } + ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) + return Promise.reject(error) + } +) + +// 通用下载方法 +export function download(url: string, params: any, filename: string, config?: any) { + downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", }) + return service.post(url, params, { + transformRequest: [(params: any) => { return tansParams(params) }], + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + responseType: 'blob', + ...config + }).then(async (data: any) => { + const isBlob = blobValidate(data) + if (isBlob) { + const blob = new Blob([data]) + saveAs(blob, filename) + } else { + const resText = await data.text() + const rspObj = JSON.parse(resText) + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] + ElMessage.error(errMsg) + } + downloadLoadingInstance.close() + }).catch((r: any) => { + console.error(r) + ElMessage.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close() + }) +} + +export default service diff --git a/src/utils/ruoyi.ts b/src/utils/ruoyi.ts new file mode 100644 index 0000000..9724779 --- /dev/null +++ b/src/utils/ruoyi.ts @@ -0,0 +1,230 @@ +/** + * 通用js方法封装处理 + * Copyright (c) 2019 ruoyi + */ + +// 日期格式化 +export function parseTime(time: any, pattern?: string): string | null { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date: Date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '') + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj: Record = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} + +// 表单重置 +export function resetForm(refName: string): void { + // @ts-ignore + if ((this as any).$refs[refName]) { + // @ts-ignore + (this as any).$refs[refName].resetFields() + } +} + +// 添加日期范围 +export function addDateRange(params: any, dateRange: string[], propName?: string): any { + let search = params + search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {} + dateRange = Array.isArray(dateRange) ? dateRange : [] + if (typeof (propName) === 'undefined') { + search.params['beginTime'] = dateRange[0] + search.params['endTime'] = dateRange[1] + } else { + search.params['begin' + propName] = dateRange[0] + search.params['end' + propName] = dateRange[1] + } + return search +} + +// 回显数据字典 +export function selectDictLabel(datas: any, value: any): string { + if (value === undefined) { + return "" + } + const actions: string[] = [] + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + value)) { + actions.push(datas[key].label) + return true + } + }) + if (actions.length === 0) { + actions.push(value) + } + return actions.join('') +} + +// 回显数据字典(字符串、数组) +export function selectDictLabels(datas: any, value: any, separator?: string): string { + if (value === undefined || value.length === 0) { + return "" + } + if (Array.isArray(value)) { + value = value.join(",") + } + const actions: string[] = [] + const currentSeparator = undefined === separator ? "," : separator + const temp = value.split(currentSeparator) + Object.keys(value.split(currentSeparator)).some((val) => { + let match = false + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + temp[val])) { + actions.push(datas[key].label + currentSeparator) + match = true + } + }) + if (!match) { + actions.push(temp[val] + currentSeparator) + } + }) + return actions.join('').substring(0, actions.join('').length - 1) +} + +// 字符串格式化(%s ) +export function sprintf(str: string, ...args: any[]): string { + let flag = true, i = 1 + str = str.replace(/%s/g, function () { + const arg = args[i++] + if (typeof arg === 'undefined') { + flag = false + return '' + } + return arg + }) + return flag ? str : '' +} + +// 转换字符串,undefined,null等转化为"" +export function parseStrEmpty(str: any): string { + if (!str || str == "undefined" || str == "null") { + return "" + } + return str +} + +// 数据合并 +export function mergeRecursive(source: any, target: any): any { + for (const p in target) { + try { + if (target[p].constructor == Object) { + source[p] = mergeRecursive(source[p], target[p]) + } else { + source[p] = target[p] + } + } catch (e) { + source[p] = target[p] + } + } + return source +} + +/** + * 构造树型结构数据 + * @param data 数据源 + * @param id id字段 默认 'id' + * @param parentId 父节点字段 默认 'parentId' + * @param children 孩子节点字段 默认 'children' + */ +export function handleTree(data: any[], id?: string, parentId?: string, children?: string): any[] { + const config = { + id: id || 'id', + parentId: parentId || 'parentId', + childrenList: children || 'children' + } + + const childrenListMap: Record = {} + const tree: any[] = [] + for (const d of data) { + const id = d[config.id] + childrenListMap[id] = d + if (!d[config.childrenList]) { + d[config.childrenList] = [] + } + } + + for (const d of data) { + const parentId = d[config.parentId] + const parentObj = childrenListMap[parentId] + if (!parentObj) { + tree.push(d) + } else { + parentObj[config.childrenList].push(d) + } + } + return tree +} + +/** +* 参数处理 +* @param params 参数 +*/ +export function tansParams(params: Record): string { + let result = '' + for (const propName of Object.keys(params)) { + const value = params[propName] + const part = encodeURIComponent(propName) + "=" + if (value !== null && value !== "" && typeof (value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { + const params = propName + '[' + key + ']' + const subPart = encodeURIComponent(params) + "=" + result += subPart + encodeURIComponent(value[key]) + "&" + } + } + } else { + result += part + encodeURIComponent(value) + "&" + } + } + } + return result +} + +// 返回项目路径 +export function getNormalPath(p: string): string { + if (p.length === 0 || !p || p == 'undefined') { + return p + } + let res = p.replace('//', '/') + if (res[res.length - 1] === '/') { + return res.slice(0, res.length - 1) + } + return res +} + +// 验证是否为blob格式 +export function blobValidate(data: Blob): boolean { + return data.type !== 'application/json' +} diff --git a/src/utils/scroll-to.ts b/src/utils/scroll-to.ts new file mode 100644 index 0000000..9078347 --- /dev/null +++ b/src/utils/scroll-to.ts @@ -0,0 +1,64 @@ +declare global { + interface Math { + easeInOutQuad(t: number, b: number, c: number, d: number): number + } +} + +Math.easeInOutQuad = function(t: number, b: number, c: number, d: number): number { + t /= d / 2 + if (t < 1) { + return c / 2 * t * t + b + } + t-- + return -c / 2 * (t * (t - 2) - 1) + b +} + +// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts +const requestAnimFrame = (function() { + return window.requestAnimationFrame || (window as any).webkitRequestAnimationFrame || (window as any).mozRequestAnimationFrame || function(callback: FrameRequestCallback) { window.setTimeout(callback, 1000 / 60) } +})() + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param amount + */ +function move(amount: number): void { + document.documentElement.scrollTop = amount + ;(document.body.parentNode as HTMLElement).scrollTop = amount + document.body.scrollTop = amount +} + +function position(): number { + return document.documentElement.scrollTop || (document.body.parentNode as HTMLElement).scrollTop || document.body.scrollTop +} + +/** + * @param to + * @param duration + * @param callback + */ +export function scrollTo(to: number, duration?: number, callback?: () => void): void { + const start = position() + const change = to - start + const increment = 20 + let currentTime = 0 + duration = (typeof (duration) === 'undefined') ? 500 : duration + const animateScroll = function() { + // increment the time + currentTime += increment + // find the value with the quadratic in-out easing function + const val = Math.easeInOutQuad(currentTime, start, change, duration!) + // move the document.body + move(val) + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll) + } else { + if (callback && typeof (callback) === 'function') { + // the animation is done so lets callback + callback() + } + } + } + animateScroll() +} diff --git a/src/utils/theme.ts b/src/utils/theme.ts new file mode 100644 index 0000000..3e2f518 --- /dev/null +++ b/src/utils/theme.ts @@ -0,0 +1,49 @@ +// 处理主题样式 +export function handleThemeStyle(theme: string): void { + document.documentElement.style.setProperty('--el-color-primary', theme) + for (let i = 1; i <= 9; i++) { + document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(theme, i / 10)}`) + } + for (let i = 1; i <= 9; i++) { + document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, `${getDarkColor(theme, i / 10)}`) + } +} + +// hex颜色转rgb颜色 +export function hexToRgb(str: string): number[] { + str = str.replace('#', '') + const hexs = str.match(/../g) || [] + for (let i = 0; i < 3; i++) { + hexs[i] = String(parseInt(hexs[i], 16)) + } + return hexs.map(h => parseInt(h)) +} + +// rgb颜色转Hex颜色 +export function rgbToHex(r: number, g: number, b: number): string { + const hexs = [r.toString(16), g.toString(16), b.toString(16)] + for (let i = 0; i < 3; i++) { + if (hexs[i].length == 1) { + hexs[i] = `0${hexs[i]}` + } + } + return `#${hexs.join('')}` +} + +// 变浅颜色值 +export function getLightColor(color: string, level: number): string { + const rgb = hexToRgb(color) + for (let i = 0; i < 3; i++) { + rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]) + } + return rgbToHex(rgb[0], rgb[1], rgb[2]) +} + +// 变深颜色值 +export function getDarkColor(color: string, level: number): string { + const rgb = hexToRgb(color) + for (let i = 0; i < 3; i++) { + rgb[i] = Math.floor(rgb[i] * (1 - level)) + } + return rgbToHex(rgb[0], rgb[1], rgb[2]) +} diff --git a/src/utils/validate.ts b/src/utils/validate.ts new file mode 100644 index 0000000..ed99eee --- /dev/null +++ b/src/utils/validate.ts @@ -0,0 +1,114 @@ +/** + * 路径匹配器 + * @param pattern + * @param path + * @returns {Boolean} + */ +export function isPathMatch(pattern: string, path: string): boolean { + const regexPattern = pattern.replace(/\//g, '\\/').replace(/\*\*/g, '.*').replace(/\*/g, '[^\\/]*') + const regex = new RegExp(`^${regexPattern}$`) + return regex.test(path) +} + +/** + * 判断value字符串是否为空 + * @param value + * @returns {Boolean} + */ +export function isEmpty(value: any): boolean { + if (value == null || value == "" || value == undefined || value == "undefined") { + return true + } + return false +} + +/** + * 判断url是否是http或https + * @param url + * @returns {Boolean} + */ +export function isHttp(url: string): boolean { + return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1 +} + +/** + * 判断path是否为外链 + * @param path + * @returns {Boolean} + */ +export function isExternal(path: string): boolean { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param str + * @returns {Boolean} + */ +export function validUsername(str: string): boolean { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} + +/** + * @param url + * @returns {Boolean} + */ +export function validURL(url: string): boolean { + const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + return reg.test(url) +} + +/** + * @param str + * @returns {Boolean} + */ +export function validLowerCase(str: string): boolean { + const reg = /^[a-z]+$/ + return reg.test(str) +} + +/** + * @param str + * @returns {Boolean} + */ +export function validUpperCase(str: string): boolean { + const reg = /^[A-Z]+$/ + return reg.test(str) +} + +/** + * @param str + * @returns {Boolean} + */ +export function validAlphabets(str: string): boolean { + const reg = /^[A-Za-z]+$/ + return reg.test(str) +} + +/** + * @param email + * @returns {Boolean} + */ +export function validEmail(email: string): boolean { + const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + return reg.test(email) +} + +/** + * @param str + * @returns {Boolean} + */ +export function isString(str: any): boolean { + return typeof str === 'string' || str instanceof String +} + +/** + * @param arg + * @returns {Boolean} + */ +export function isArray(arg: any): boolean { + if (typeof Array.isArray === 'undefined') { + return Object.prototype.toString.call(arg) === '[object Array]' + } + return Array.isArray(arg) +} diff --git a/src/utils/webSocket.ts b/src/utils/webSocket.ts new file mode 100644 index 0000000..f19309b --- /dev/null +++ b/src/utils/webSocket.ts @@ -0,0 +1,103 @@ +// WebSocket连接配置 +type WebSocketOptions = { + fullUrl: string; + onMessage?: (data: string) => void; + onOpen?: () => void; + onError?: (error: Event) => void; + onClose?: () => void; + reconnectInterval?: number; +}; + +let websocket: WebSocket | null = null; +let reconnectTimer: any = null; +let isManualClose = false; + +// 初始化WebSocket连接 +export function initWebSocket(options: WebSocketOptions) { + const { + fullUrl, + onMessage, + onOpen, + onError, + onClose, + reconnectInterval = 3000 + } = options; + + // 关闭旧连接 + if (websocket) { + websocket.close(); + } + + // 检查浏览器支持性 + if (!('WebSocket' in window)) { + console.error('当前浏览器不支持WebSocket'); + return; + } + + // 创建WebSocket连接 + try { + websocket = new WebSocket(fullUrl); + + // 连接成功回调 + websocket.onopen = () => { + clearTimeout(reconnectTimer!); + isManualClose = false; + onOpen?.(); + }; + + // 接收消息回调 + websocket.onmessage = (event) => { + onMessage?.(event.data); + }; + + // 错误回调 + websocket.onerror = (error) => { + onError?.(error); + startReconnect(() => initWebSocket(options), reconnectInterval); + }; + + // 关闭回调 + websocket.onclose = () => { + onClose?.(); + if (!isManualClose) { + startReconnect(() => initWebSocket(options), reconnectInterval); + } + }; + } catch (error) { + console.error('WebSocket连接创建失败:', error); + startReconnect(() => initWebSocket(options), reconnectInterval); + } +} + +// 发送消息 +export function sendWebSocketMessage(message: any): boolean { + if (websocket && websocket.readyState === WebSocket.OPEN) { + websocket.send(JSON.stringify(message)); + return true; + } + console.error('WebSocket未连接,无法发送消息'); + return false; +} + +// 手动关闭WebSocket +export function closeWebSocket(): void { + isManualClose = true; + if (reconnectTimer) { + clearTimeout(reconnectTimer); + } + websocket?.close(); + websocket = null; +} + +// 启动重连 +function startReconnect(connectCallback: () => void, interval: number): void { + if (reconnectTimer) { + clearTimeout(reconnectTimer); + } + reconnectTimer = setTimeout(connectCallback, interval); +} + +// 获取当前连接状态 +export function getWebSocketState(): number | null { + return websocket?.readyState || null; +} \ No newline at end of file diff --git a/src/views/blood/deptPatient/components/bloodTransfusionApplication.vue b/src/views/blood/deptPatient/components/bloodTransfusionApplication.vue new file mode 100644 index 0000000..84bad7d --- /dev/null +++ b/src/views/blood/deptPatient/components/bloodTransfusionApplication.vue @@ -0,0 +1,645 @@ +/** +* @file bloodTransfusionApplication.vue +* @description: 输血申请 +* @author: w +* @since: 2026-06-04 +*/ + + + + + + \ No newline at end of file diff --git a/src/views/blood/deptPatient/components/bloodTransfusionAssessment.vue b/src/views/blood/deptPatient/components/bloodTransfusionAssessment.vue new file mode 100644 index 0000000..e93a98a --- /dev/null +++ b/src/views/blood/deptPatient/components/bloodTransfusionAssessment.vue @@ -0,0 +1,550 @@ +/** +* @file bloodTransfusionAssessment.vue +* @description: 输血评估 +* @author: w +* @since: 2026-06-04 +*/ + + + + + + \ No newline at end of file diff --git a/src/views/blood/deptPatient/index.vue b/src/views/blood/deptPatient/index.vue new file mode 100644 index 0000000..c052fa1 --- /dev/null +++ b/src/views/blood/deptPatient/index.vue @@ -0,0 +1,669 @@ +/** +* @file index.vue +* @description: 科室病人 +* @author: w +* @since: 2026-06-03 +*/ + + + + + + \ No newline at end of file diff --git a/src/views/blood/reactionRegist/index.vue b/src/views/blood/reactionRegist/index.vue new file mode 100644 index 0000000..3e96227 --- /dev/null +++ b/src/views/blood/reactionRegist/index.vue @@ -0,0 +1,308 @@ +/** +* @file index.vue +* @description: 反应登记 +* @author: w +* @since: 2026-06-03 +*/ + + + + + + + \ No newline at end of file diff --git a/src/views/blood/receiveBlood/index.vue b/src/views/blood/receiveBlood/index.vue new file mode 100644 index 0000000..cae5f6e --- /dev/null +++ b/src/views/blood/receiveBlood/index.vue @@ -0,0 +1,336 @@ +/** +* @file index.vue +* @description: 接收血液确认 +* @author: w +* @since: 2026-06-08 +*/ + + + + + + \ No newline at end of file diff --git a/src/views/blood/record/index.vue b/src/views/blood/record/index.vue new file mode 100644 index 0000000..24406a4 --- /dev/null +++ b/src/views/blood/record/index.vue @@ -0,0 +1,358 @@ +/** +* @file index.vue +* @description: 输血输注 +* @author: w +* @since: 2026-06-04 +*/ + + + \ No newline at end of file diff --git a/src/views/blood/review/index.vue b/src/views/blood/review/index.vue new file mode 100644 index 0000000..3b0b94d --- /dev/null +++ b/src/views/blood/review/index.vue @@ -0,0 +1,164 @@ +/** +* @file index.vue +* @description: 审核 +* @author: w +* @since: 2026-06-04 +*/ + + + + + + \ No newline at end of file diff --git a/src/views/error/401.vue b/src/views/error/401.vue new file mode 100644 index 0000000..ca11273 --- /dev/null +++ b/src/views/error/401.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/views/error/404.vue b/src/views/error/404.vue new file mode 100644 index 0000000..87b822b --- /dev/null +++ b/src/views/error/404.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/src/views/index.vue b/src/views/index.vue new file mode 100644 index 0000000..40035b7 --- /dev/null +++ b/src/views/index.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/views/login.vue b/src/views/login.vue new file mode 100644 index 0000000..4c4e34d --- /dev/null +++ b/src/views/login.vue @@ -0,0 +1,439 @@ + + + + + \ No newline at end of file diff --git a/src/views/monitor/cache/index.vue b/src/views/monitor/cache/index.vue new file mode 100644 index 0000000..1c33d20 --- /dev/null +++ b/src/views/monitor/cache/index.vue @@ -0,0 +1,132 @@ + + + diff --git a/src/views/monitor/cache/list.vue b/src/views/monitor/cache/list.vue new file mode 100644 index 0000000..7451fc1 --- /dev/null +++ b/src/views/monitor/cache/list.vue @@ -0,0 +1,259 @@ + + + diff --git a/src/views/monitor/druid/index.vue b/src/views/monitor/druid/index.vue new file mode 100644 index 0000000..d688394 --- /dev/null +++ b/src/views/monitor/druid/index.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/views/monitor/job/index.vue b/src/views/monitor/job/index.vue new file mode 100644 index 0000000..f8fef8d --- /dev/null +++ b/src/views/monitor/job/index.vue @@ -0,0 +1,450 @@ + + + diff --git a/src/views/monitor/job/log.vue b/src/views/monitor/job/log.vue new file mode 100644 index 0000000..4c03a08 --- /dev/null +++ b/src/views/monitor/job/log.vue @@ -0,0 +1,285 @@ + + + diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue new file mode 100644 index 0000000..72a0b2c --- /dev/null +++ b/src/views/monitor/logininfor/index.vue @@ -0,0 +1,234 @@ + + + diff --git a/src/views/monitor/online/index.vue b/src/views/monitor/online/index.vue new file mode 100644 index 0000000..8bfc34c --- /dev/null +++ b/src/views/monitor/online/index.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue new file mode 100644 index 0000000..b15e3bb --- /dev/null +++ b/src/views/monitor/operlog/index.vue @@ -0,0 +1,311 @@ + + + diff --git a/src/views/monitor/server/index.vue b/src/views/monitor/server/index.vue new file mode 100644 index 0000000..95209aa --- /dev/null +++ b/src/views/monitor/server/index.vue @@ -0,0 +1,187 @@ + + + diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue new file mode 100644 index 0000000..542ae6a --- /dev/null +++ b/src/views/redirect/index.vue @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/src/views/register.vue b/src/views/register.vue new file mode 100644 index 0000000..0a8b37b --- /dev/null +++ b/src/views/register.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue new file mode 100644 index 0000000..b093ed2 --- /dev/null +++ b/src/views/system/config/index.vue @@ -0,0 +1,262 @@ + + + diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue new file mode 100644 index 0000000..1695b68 --- /dev/null +++ b/src/views/system/dept/index.vue @@ -0,0 +1,254 @@ + + + diff --git a/src/views/system/dict/data.vue b/src/views/system/dict/data.vue new file mode 100644 index 0000000..a7ffafc --- /dev/null +++ b/src/views/system/dict/data.vue @@ -0,0 +1,368 @@ + + + diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue new file mode 100644 index 0000000..dbe36bf --- /dev/null +++ b/src/views/system/dict/index.vue @@ -0,0 +1,265 @@ + + + diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue new file mode 100644 index 0000000..4f2e1bc --- /dev/null +++ b/src/views/system/menu/index.vue @@ -0,0 +1,387 @@ + + + diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue new file mode 100644 index 0000000..fa07b52 --- /dev/null +++ b/src/views/system/notice/index.vue @@ -0,0 +1,246 @@ + + + diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue new file mode 100644 index 0000000..9165f07 --- /dev/null +++ b/src/views/system/post/index.vue @@ -0,0 +1,245 @@ + + + diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue new file mode 100644 index 0000000..64d9cdb --- /dev/null +++ b/src/views/system/role/authUser.vue @@ -0,0 +1,180 @@ + + + + diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue new file mode 100644 index 0000000..1efe12d --- /dev/null +++ b/src/views/system/role/index.vue @@ -0,0 +1,516 @@ + + + diff --git a/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue new file mode 100644 index 0000000..757b87e --- /dev/null +++ b/src/views/system/role/selectUser.vue @@ -0,0 +1,145 @@ + + + diff --git a/src/views/system/user/authRole.vue b/src/views/system/user/authRole.vue new file mode 100644 index 0000000..96ffc34 --- /dev/null +++ b/src/views/system/user/authRole.vue @@ -0,0 +1,130 @@ + + + diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue new file mode 100644 index 0000000..bb400a3 --- /dev/null +++ b/src/views/system/user/index.vue @@ -0,0 +1,596 @@ + + + diff --git a/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue new file mode 100644 index 0000000..e4ab3da --- /dev/null +++ b/src/views/system/user/profile/index.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue new file mode 100644 index 0000000..93a81c7 --- /dev/null +++ b/src/views/system/user/profile/resetPwd.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue new file mode 100644 index 0000000..01cae89 --- /dev/null +++ b/src/views/system/user/profile/userAvatar.vue @@ -0,0 +1,180 @@ + + + + + \ No newline at end of file diff --git a/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue new file mode 100644 index 0000000..d60fc7e --- /dev/null +++ b/src/views/system/user/profile/userInfo.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/views/tool/build/CodeTypeDialog.vue b/src/views/tool/build/CodeTypeDialog.vue new file mode 100644 index 0000000..2b1fef2 --- /dev/null +++ b/src/views/tool/build/CodeTypeDialog.vue @@ -0,0 +1,71 @@ + + + \ No newline at end of file diff --git a/src/views/tool/build/DraggableItem.vue b/src/views/tool/build/DraggableItem.vue new file mode 100644 index 0000000..3b0fe2b --- /dev/null +++ b/src/views/tool/build/DraggableItem.vue @@ -0,0 +1,68 @@ + + diff --git a/src/views/tool/build/IconsDialog.vue b/src/views/tool/build/IconsDialog.vue new file mode 100644 index 0000000..d1b2dac --- /dev/null +++ b/src/views/tool/build/IconsDialog.vue @@ -0,0 +1,116 @@ + + + diff --git a/src/views/tool/build/RightPanel.vue b/src/views/tool/build/RightPanel.vue new file mode 100644 index 0000000..672f63c --- /dev/null +++ b/src/views/tool/build/RightPanel.vue @@ -0,0 +1,923 @@ + + + + + \ No newline at end of file diff --git a/src/views/tool/build/TreeNodeDialog.vue b/src/views/tool/build/TreeNodeDialog.vue new file mode 100644 index 0000000..882c7ad --- /dev/null +++ b/src/views/tool/build/TreeNodeDialog.vue @@ -0,0 +1,95 @@ + + diff --git a/src/views/tool/build/index.vue b/src/views/tool/build/index.vue new file mode 100644 index 0000000..7a06694 --- /dev/null +++ b/src/views/tool/build/index.vue @@ -0,0 +1,663 @@ + + + + + diff --git a/src/views/tool/gen/basicInfoForm.vue b/src/views/tool/gen/basicInfoForm.vue new file mode 100644 index 0000000..4af82a7 --- /dev/null +++ b/src/views/tool/gen/basicInfoForm.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/views/tool/gen/createTable.vue b/src/views/tool/gen/createTable.vue new file mode 100644 index 0000000..5a2250e --- /dev/null +++ b/src/views/tool/gen/createTable.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/views/tool/gen/editTable.vue b/src/views/tool/gen/editTable.vue new file mode 100644 index 0000000..dfae521 --- /dev/null +++ b/src/views/tool/gen/editTable.vue @@ -0,0 +1,216 @@ + + + diff --git a/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue new file mode 100644 index 0000000..db38f29 --- /dev/null +++ b/src/views/tool/gen/genInfoForm.vue @@ -0,0 +1,309 @@ + + + diff --git a/src/views/tool/gen/importTable.vue b/src/views/tool/gen/importTable.vue new file mode 100644 index 0000000..8eaedb5 --- /dev/null +++ b/src/views/tool/gen/importTable.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue new file mode 100644 index 0000000..cf5f5df --- /dev/null +++ b/src/views/tool/gen/index.vue @@ -0,0 +1,309 @@ + + + diff --git a/src/views/tool/swagger/index.vue b/src/views/tool/swagger/index.vue new file mode 100644 index 0000000..02dcbb4 --- /dev/null +++ b/src/views/tool/swagger/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e85d6f8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "moduleResolution": "bundler", + "lib": ["esnext", "dom"], + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + + // 严格性和类型检查相关配置 + "strict": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": false, + // 模块和兼容性相关配置 + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "resolveJsonModule": true, + + // 调试和兼容性相关配置 + "sourceMap": true, + "useDefineForClassFields": true, + "allowJs": true, + "noEmit": true, + + // 类型声明相关配置 + "types": ["vue", "node", "vite/client", "element-plus/global"], + "skipDefaultLibCheck": true + }, + "include": [ + "src/**/*","src/**/*.ts", "src/**/*.vue","src/**/**/*.vue", "src/**/*.tsx", "src/**/*.d.ts", "auto-imports.d.ts" + ], + "exclude": ["node_modules", "dist", "src/**/*.js"] +} + diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..94a86bb --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,80 @@ +import { defineConfig, loadEnv } from "vite"; +import path from "path"; +import createVitePlugins from "./vite/plugins"; + +const baseUrl = "http://localhost:8080"; // 后端接口 + +// https://vitejs.dev/config/ +export default defineConfig(({ mode, command }) => { + const env = loadEnv(mode, process.cwd()); + const { VITE_APP_ENV } = env; + return { + // 部署生产环境和开发环境下的URL。 + // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上 + // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 + base: VITE_APP_ENV === "production" ? "/" : "/", + plugins: createVitePlugins(env, command === "build"), + resolve: { + // https://cn.vitejs.dev/config/#resolve-alias + alias: { + // 设置路径 + "~": path.resolve(__dirname, "./"), + // 设置别名 + "@": path.resolve(__dirname, "./src"), + }, + // https://cn.vitejs.dev/config/#resolve-extensions + extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"], + }, + // 打包配置 + build: { + // https://vite.dev/config/build-options.html + sourcemap: command === "build" ? false : "inline", + outDir: "dist", + assetsDir: "assets", + chunkSizeWarningLimit: 2000, + rollupOptions: { + output: { + chunkFileNames: "static/js/[name]-[hash].js", + entryFileNames: "static/js/[name]-[hash].js", + assetFileNames: "static/[ext]/[name]-[hash].[ext]", + }, + }, + }, + // vite 相关配置 + server: { + port: 5174, + host: true, + open: false, + proxy: { + // https://cn.vitejs.dev/config/#server-proxy + "/dev-api": { + // target: "http://47.97.125.165:8905", + target: "http://47.97.125.165:8907", + changeOrigin: true, + rewrite: (p) => p.replace(/^\/dev-api/, ""), + }, + // springdoc proxy + "^/v3/api-docs/(.*)": { + target: baseUrl, + changeOrigin: true, + }, + }, + }, + css: { + postcss: { + plugins: [ + { + postcssPlugin: "internal:charset-removal", + AtRule: { + charset: (atRule: any) => { + if (atRule.name === "charset") { + atRule.remove(); + } + }, + }, + }, + ], + }, + }, + }; +}); diff --git a/vite/plugins/auto-import.ts b/vite/plugins/auto-import.ts new file mode 100644 index 0000000..c1d0fc4 --- /dev/null +++ b/vite/plugins/auto-import.ts @@ -0,0 +1,13 @@ +import autoImport from 'unplugin-auto-import/vite' + +export default function createAutoImport() { + return autoImport({ + imports: [ + 'vue', + 'vue-router', + 'pinia' + ], + dts: true + }) +} + diff --git a/vite/plugins/compression.ts b/vite/plugins/compression.ts new file mode 100644 index 0000000..3201198 --- /dev/null +++ b/vite/plugins/compression.ts @@ -0,0 +1,29 @@ +import { PluginOption } from 'vite' +import compression from 'vite-plugin-compression' + +export default function createCompression(env: Record) { + const { VITE_BUILD_COMPRESS } = env + const plugin: PluginOption[] = [] + if (VITE_BUILD_COMPRESS) { + const compressList = VITE_BUILD_COMPRESS.split(',') + if (compressList.includes('gzip')) { + // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件 + plugin.push( + compression({ + ext: '.gz', + deleteOriginFile: false + }) + ) + } + if (compressList.includes('brotli')) { + plugin.push( + compression({ + ext: '.br', + algorithm: 'brotliCompress', + deleteOriginFile: false + }) + ) + } + } + return plugin +} diff --git a/vite/plugins/index.ts b/vite/plugins/index.ts new file mode 100644 index 0000000..28874fd --- /dev/null +++ b/vite/plugins/index.ts @@ -0,0 +1,16 @@ +import vue from '@vitejs/plugin-vue' + +import createAutoImport from './auto-import' +import createSvgIcon from './svg-icon' +import createCompression from './compression' +import createSetupExtend from './setup-extend' +import { PluginOption } from 'vite' + +export default function createVitePlugins(viteEnv: Record, isBuild = false) { + const vitePlugins: PluginOption[] = [vue()] + vitePlugins.push(createAutoImport()) + vitePlugins.push(createSetupExtend()) + vitePlugins.push(createSvgIcon(isBuild)) + isBuild && vitePlugins.push(...createCompression(viteEnv)) + return vitePlugins +} diff --git a/vite/plugins/setup-extend.ts b/vite/plugins/setup-extend.ts new file mode 100644 index 0000000..fb70609 --- /dev/null +++ b/vite/plugins/setup-extend.ts @@ -0,0 +1,5 @@ +import setupExtend from 'unplugin-vue-setup-extend-plus/vite' + +export default function createSetupExtend() { + return setupExtend({}) +} diff --git a/vite/plugins/svg-icon.ts b/vite/plugins/svg-icon.ts new file mode 100644 index 0000000..2862a9e --- /dev/null +++ b/vite/plugins/svg-icon.ts @@ -0,0 +1,10 @@ +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' +import path from 'path' + +export default function createSvgIcon(isBuild: boolean) { + return createSvgIconsPlugin({ + iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')], + symbolId: 'icon-[dir]-[name]', + svgoOptions: isBuild + }) +}