From 76c1a8668f492708b1626529e17eddb840ee95c0 Mon Sep 17 00:00:00 2001 From: zhenhui <1276357500@qq.com> Date: Tue, 3 Mar 2026 09:36:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 3 + LICENSE | 21 + README.md | 120 + saiadmin-vue/.env | 5 + saiadmin-vue/.env.development | 7 + saiadmin-vue/.env.production | 7 + saiadmin-vue/.gitignore | 7 + saiadmin-vue/.vscode/settings.json | 54 + saiadmin-vue/LICENSE | 21 + saiadmin-vue/README.md | 49 + saiadmin-vue/index.html | 166 + saiadmin-vue/jsconfig.json | 12 + saiadmin-vue/package.json | 54 + saiadmin-vue/postcss.config.cjs | 6 + saiadmin-vue/public/favicon.ico | Bin 0 -> 119742 bytes saiadmin-vue/src/App.vue | 15 + saiadmin-vue/src/api/common.js | 220 + saiadmin-vue/src/api/login.js | 54 + saiadmin-vue/src/api/system/attachment.js | 27 + saiadmin-vue/src/api/system/config.js | 138 + saiadmin-vue/src/api/system/database.js | 99 + saiadmin-vue/src/api/system/dept.js | 110 + saiadmin-vue/src/api/system/dict.js | 137 + saiadmin-vue/src/api/system/emailLog.js | 30 + saiadmin-vue/src/api/system/loginLog.js | 30 + saiadmin-vue/src/api/system/menu.js | 63 + saiadmin-vue/src/api/system/monitor.js | 17 + saiadmin-vue/src/api/system/notice.js | 77 + saiadmin-vue/src/api/system/operLog.js | 30 + saiadmin-vue/src/api/system/post.js | 77 + saiadmin-vue/src/api/system/role.js | 109 + saiadmin-vue/src/api/system/user.js | 134 + saiadmin-vue/src/api/tool/crontab.js | 113 + saiadmin-vue/src/api/tool/generate.js | 135 + saiadmin-vue/src/api/tool/saipackage.js | 66 + saiadmin-vue/src/assets/404.svg | 176 + saiadmin-vue/src/assets/avatar.jpg | Bin 0 -> 36362 bytes saiadmin-vue/src/assets/image/action.svg | 1 + saiadmin-vue/src/assets/image/attach.svg | 1 + saiadmin-vue/src/assets/image/login.svg | 1 + saiadmin-vue/src/assets/image/user.svg | 1 + saiadmin-vue/src/assets/login_picture.svg | 1 + saiadmin-vue/src/assets/logo.png | Bin 0 -> 18787 bytes saiadmin-vue/src/assets/not-image.png | Bin 0 -> 2527 bytes .../assets/skins-thumb/businessGray/thumb.jpg | Bin 0 -> 1871 bytes .../src/assets/skins-thumb/city/thumb.jpg | Bin 0 -> 6664 bytes .../src/assets/skins-thumb/classics/thumb.jpg | Bin 0 -> 2210 bytes .../src/assets/skins-thumb/mine/thumb.jpg | Bin 0 -> 2010 bytes saiadmin-vue/src/assets/userBanner.jpg | Bin 0 -> 76835 bytes saiadmin-vue/src/components/index.js | 78 + .../src/components/ma-cityLinkage/index.vue | 179 + .../components/ma-cityLinkage/lib/city.json | 1 + .../src/components/ma-codeEditor/index.vue | 108 + .../src/components/ma-colorPicker/index.vue | 77 + .../src/components/ma-verifyCode/index.vue | 110 + .../src/components/ma-wangEditor/index.vue | 194 + .../src/components/sa-chart/index.vue | 38 + .../src/components/sa-checkbox/index.vue | 41 + saiadmin-vue/src/components/sa-dict/index.vue | 62 + .../components/sa-icon-picker/iconify/bi.json | 1 + .../src/components/sa-icon-picker/index.vue | 121 + saiadmin-vue/src/components/sa-icon/index.vue | 29 + .../src/components/sa-pick-image/index.vue | 414 ++ .../src/components/sa-radio/index.vue | 56 + .../src/components/sa-resource/button.vue | 82 + .../src/components/sa-resource/index.vue | 253 ++ .../src/components/sa-select/index.vue | 55 + .../src/components/sa-switch/index.vue | 60 + .../src/components/sa-table/defaultOptions.js | 132 + .../src/components/sa-table/import.vue | 72 + .../src/components/sa-table/index.vue | 778 ++++ .../src/components/sa-treeSlider/index.vue | 120 + .../src/components/sa-upload-chunk/index.vue | 298 ++ .../src/components/sa-upload-file/index.vue | 206 + .../src/components/sa-upload-image/index.vue | 234 ++ saiadmin-vue/src/components/sa-user/index.vue | 159 + saiadmin-vue/src/config/skins.js | 23 + saiadmin-vue/src/directives/auth/auth.js | 8 + saiadmin-vue/src/directives/auth/index.js | 29 + saiadmin-vue/src/directives/copy/index.js | 46 + saiadmin-vue/src/directives/index.js | 12 + saiadmin-vue/src/directives/role/index.js | 32 + saiadmin-vue/src/directives/role/role.js | 8 + saiadmin-vue/src/i18n/en/crud.js | 3 + saiadmin-vue/src/i18n/en/maResource.js | 8 + saiadmin-vue/src/i18n/en/menus.js | 53 + saiadmin-vue/src/i18n/en/skin.js | 14 + saiadmin-vue/src/i18n/en/sys.js | 92 + saiadmin-vue/src/i18n/en/upload.js | 8 + saiadmin-vue/src/i18n/en/user.js | 0 saiadmin-vue/src/i18n/index.js | 50 + saiadmin-vue/src/i18n/zh_CN/crud.js | 3 + saiadmin-vue/src/i18n/zh_CN/maResource.js | 8 + saiadmin-vue/src/i18n/zh_CN/menus.js | 53 + saiadmin-vue/src/i18n/zh_CN/skin.js | 14 + saiadmin-vue/src/i18n/zh_CN/sys.js | 92 + saiadmin-vue/src/i18n/zh_CN/upload.js | 8 + saiadmin-vue/src/i18n/zh_CN/user.js | 4 + saiadmin-vue/src/layout/404.vue | 19 + .../src/layout/components/banner/index.vue | 68 + .../src/layout/components/classic/index.vue | 21 + .../components/classic/ma-classic-header.vue | 18 + .../components/classic/ma-classic-slider.vue | 36 + .../src/layout/components/columns/index.vue | 39 + .../components/columns/ma-columns-header.vue | 18 + .../components/columns/ma-columns-menu.vue | 120 + .../components/components/children-banner.vue | 64 + .../components/components/children-menu.vue | 59 + .../components/components/iframe-view.vue | 38 + .../components/message-notification.vue | 91 + .../layout/components/components/search.vue | 4 + .../src/layout/components/components/skin.vue | 52 + .../layout/components/components/sub-menu.vue | 49 + .../src/layout/components/ma-breadcrumb.vue | 34 + .../src/layout/components/ma-buttonMenu.vue | 35 + .../src/layout/components/ma-menu.vue | 102 + .../src/layout/components/ma-operation.vue | 173 + .../src/layout/components/ma-tags.vue | 478 +++ .../src/layout/components/ma-workerArea.vue | 23 + .../src/layout/components/mixed/index.vue | 132 + .../src/layout/components/mixed/top-menu.vue | 52 + saiadmin-vue/src/layout/empty.vue | 3 + saiadmin-vue/src/layout/index.vue | 66 + saiadmin-vue/src/layout/search.vue | 241 ++ saiadmin-vue/src/layout/setting.vue | 204 + saiadmin-vue/src/main.js | 46 + saiadmin-vue/src/plugin/index.js | 8 + saiadmin-vue/src/router/homePageRoutes.js | 40 + saiadmin-vue/src/router/index.js | 57 + saiadmin-vue/src/router/webRouter.js | 25 + saiadmin-vue/src/store/index.js | 25 + saiadmin-vue/src/store/modules/app.js | 160 + saiadmin-vue/src/store/modules/config.js | 30 + saiadmin-vue/src/store/modules/dict.js | 27 + saiadmin-vue/src/store/modules/iframe.js | 41 + saiadmin-vue/src/store/modules/keepAlive.js | 46 + saiadmin-vue/src/store/modules/message.js | 24 + saiadmin-vue/src/store/modules/tag.js | 71 + saiadmin-vue/src/store/modules/terminal.js | 216 + saiadmin-vue/src/store/modules/user.js | 199 + saiadmin-vue/src/style/animation.less | 56 + saiadmin-vue/src/style/dark.less | 14 + saiadmin-vue/src/style/global.less | 243 ++ saiadmin-vue/src/style/index.css | 4 + saiadmin-vue/src/style/skin.less | 4 + .../src/style/skins/businessGray/index.less | 148 + .../src/style/skins/city/background.jpg | Bin 0 -> 643590 bytes saiadmin-vue/src/style/skins/city/index.less | 146 + .../src/style/skins/classics/index.less | 93 + saiadmin-vue/src/style/skins/mine/index.less | 56 + saiadmin-vue/src/utils/common.js | 261 ++ saiadmin-vue/src/utils/print.js | 135 + saiadmin-vue/src/utils/push-vue.js | 732 ++++ saiadmin-vue/src/utils/request.js | 192 + saiadmin-vue/src/utils/tool.js | 525 +++ .../components/components/st-announced.vue | 56 + .../components/components/st-count.vue | 90 + .../components/components/st-loginChart.vue | 184 + .../components/components/st-saiadmin.vue | 34 + .../components/components/st-welcome.vue | 58 + .../views/dashboard/components/statistics.vue | 18 + .../views/dashboard/components/work-panel.vue | 3 + saiadmin-vue/src/views/dashboard/index.vue | 16 + .../userCenter/components/modifyPassword.vue | 128 + .../userCenter/components/userInfomation.vue | 45 + .../src/views/dashboard/userCenter/index.vue | 113 + saiadmin-vue/src/views/login.vue | 297 ++ .../src/views/system/attachment/index.vue | 285 ++ .../system/config/components/add-group.vue | 95 + .../views/system/config/components/edit.vue | 152 + .../system/config/components/js/inputType.js | 9 + .../config/components/manage-config.vue | 112 + .../src/views/system/config/index.vue | 338 ++ .../src/views/system/database/index.vue | 128 + .../src/views/system/database/recycle.vue | 132 + .../src/views/system/database/struct.vue | 60 + saiadmin-vue/src/views/system/dept/edit.vue | 145 + saiadmin-vue/src/views/system/dept/index.vue | 126 + saiadmin-vue/src/views/system/dept/leader.vue | 105 + .../src/views/system/dict/dataList.vue | 133 + .../src/views/system/dict/edit-data.vue | 130 + saiadmin-vue/src/views/system/dict/edit.vue | 120 + saiadmin-vue/src/views/system/dict/index.vue | 135 + .../src/views/system/logs/emailLog.vue | 110 + .../src/views/system/logs/loginLog.vue | 102 + .../src/views/system/logs/operLog.vue | 89 + saiadmin-vue/src/views/system/menu/edit.vue | 175 + saiadmin-vue/src/views/system/menu/index.vue | 131 + .../src/views/system/monitor/server/index.vue | 126 + saiadmin-vue/src/views/system/notice/edit.vue | 122 + .../src/views/system/notice/index.vue | 98 + saiadmin-vue/src/views/system/post/edit.vue | 124 + saiadmin-vue/src/views/system/post/index.vue | 136 + saiadmin-vue/src/views/system/post/view.vue | 67 + .../system/role/components/menuPermission.vue | 119 + saiadmin-vue/src/views/system/role/edit.vue | 141 + saiadmin-vue/src/views/system/role/index.vue | 132 + saiadmin-vue/src/views/system/user/edit.vue | 229 + saiadmin-vue/src/views/system/user/index.vue | 246 ++ .../views/tool/code/components/editInfo.vue | 704 ++++ .../views/tool/code/components/loadTable.vue | 128 + .../views/tool/code/components/preview.vue | 48 + .../tool/code/components/settingComponent.vue | 120 + saiadmin-vue/src/views/tool/code/index.vue | 178 + saiadmin-vue/src/views/tool/code/js/vars.js | 50 + saiadmin-vue/src/views/tool/crontab/edit.vue | 201 + saiadmin-vue/src/views/tool/crontab/index.vue | 156 + .../src/views/tool/crontab/logList.vue | 89 + saiadmin-vue/src/views/tool/crontab/view.vue | 57 + saiadmin-vue/src/views/tool/install/index.vue | 1013 +++++ .../src/views/tool/install/install-box.vue | 105 + .../src/views/tool/install/terminal.vue | 302 ++ saiadmin-vue/tailwind.config.cjs | 28 + saiadmin-vue/tsconfig.json | 36 + saiadmin-vue/vite.config.js | 60 + saiadmin-vue/yarn.lock | 3734 +++++++++++++++++ webman/.env.example | 23 + webman/.gitignore | 7 + webman/LICENSE | 21 + webman/app/controller/IndexController.php | 13 + webman/app/functions.php | 4 + webman/app/middleware/StaticFile.php | 42 + webman/app/process/Http.php | 10 + webman/app/process/Monitor.php | 305 ++ webman/app/view/index/view.html | 14 + webman/composer.json | 57 + webman/config/app.php | 26 + webman/config/autoload.php | 21 + webman/config/bootstrap.php | 17 + webman/config/cache.php | 18 + webman/config/container.php | 15 + webman/config/dependence.php | 15 + webman/config/exception.php | 17 + webman/config/log.php | 32 + webman/config/middleware.php | 15 + webman/config/process.php | 62 + webman/config/redis.php | 17 + webman/config/route.php | 21 + webman/config/server.php | 23 + webman/config/session.php | 65 + webman/config/static.php | 23 + webman/config/think-orm.php | 42 + webman/config/translation.php | 25 + webman/config/view.php | 22 + webman/public/assets/404-C84wjUkK.js | 1 + webman/public/assets/404-C8qIY0DY.js | 1 + webman/public/assets/404-D3qmwmJf.svg | 176 + webman/public/assets/404-D4vdWXN8.css | 1 + .../public/assets/@arco-design-BiEPdq2w.css | 1 + webman/public/assets/@arco-design-uttiljWv.js | 4 + webman/public/assets/@iconify-BfRLEUc9.js | 1 + webman/public/assets/@intlify-CJ2pDqUV.js | 16 + webman/public/assets/@vue-9ZIPiVZG.js | 18 + webman/public/assets/@wangeditor-Bg8kJaak.js | 186 + webman/public/assets/@wangeditor-nHDhGvq6.css | 1 + webman/public/assets/add-group-B6RsDY0n.js | 1 + webman/public/assets/add-group-D5MnfTKt.js | 1 + webman/public/assets/avatar-DJF9etZw.jpg | Bin 0 -> 36362 bytes webman/public/assets/avatar-DvSZjoFF.js | 1 + webman/public/assets/axios-BOAqGR8s.js | 2 + webman/public/assets/b-tween-BtQQsX34.js | 1 + webman/public/assets/b-validate-DHOn5MGm.js | 1 + webman/public/assets/background-W5wCjb__.jpg | Bin 0 -> 643590 bytes .../call-bind-apply-helpers-CXPkwEps.js | 1 + .../call-bind-apply-helpers-DFdvRtIg.js | 1 + webman/public/assets/call-bound-B36HnitE.js | 1 + webman/public/assets/call-bound-BMZ_xw6V.js | 1 + webman/public/assets/clipboard-ehac6u_s.js | 6 + webman/public/assets/codicon-DcSIACem.ttf | Bin 0 -> 70776 bytes webman/public/assets/color-JIMhKyf3.js | 1 + webman/public/assets/color-name-BQ5IbGbl.js | 1 + webman/public/assets/color-string-Ckj7g19G.js | 1 + .../compute-scroll-into-view-1gs_hJI2.js | 1 + webman/public/assets/config-CFOHD7nk.js | 1 + webman/public/assets/config-ZWMRzLkl.js | 1 + webman/public/assets/crontab-D2UudUxl.js | 1 + webman/public/assets/crontab-DHsN78bF.js | 1 + webman/public/assets/crypto-js-B6um_4t4.js | 14 + webman/public/assets/dataList-BdaY1nZd.js | 1 + webman/public/assets/dataList-tp5sU58K.js | 1 + webman/public/assets/database-C9oinknn.js | 1 + webman/public/assets/database-CTMAb1z4.js | 1 + webman/public/assets/dayjs-DUkVwsK-.js | 1 + webman/public/assets/dept-B7mu9jEv.js | 1 + webman/public/assets/dept-BazEhZT0.js | 1 + webman/public/assets/dict-C6FxRZf9.js | 1 + webman/public/assets/dict-Di-hEQDg.js | 1 + webman/public/assets/dunder-proto-BvNz4iDg.js | 1 + webman/public/assets/dunder-proto-CiSsr-aM.js | 1 + webman/public/assets/echarts-Cz-L25MO.js | 30 + webman/public/assets/edit--su55P8f.js | 1 + webman/public/assets/edit-B2-MKvH2.js | 1 + webman/public/assets/edit-BT4iQK1s.js | 1 + webman/public/assets/edit-BYRBvBoh.js | 1 + webman/public/assets/edit-C410mWZI.js | 1 + webman/public/assets/edit-C4LjrAZO.js | 1 + webman/public/assets/edit-CqvT7GJF.js | 2 + webman/public/assets/edit-CyUWeZne.js | 1 + webman/public/assets/edit-D3WKGVOx.js | 1 + webman/public/assets/edit-D9KKKNcV.js | 1 + webman/public/assets/edit-D_EZLa8V.js | 1 + webman/public/assets/edit-Dj6-BOG2.js | 2 + webman/public/assets/edit-DjscfkpF.js | 1 + webman/public/assets/edit-DyIQuM4D.js | 1 + webman/public/assets/edit-KUYyIVcu.js | 1 + webman/public/assets/edit-a5eHS414.js | 1 + webman/public/assets/edit-data-BixJMCQA.js | 1 + webman/public/assets/edit-data-D-Kheltb.js | 1 + webman/public/assets/edit-l4j53F48.js | 1 + webman/public/assets/edit-xZRcGvRF.js | 1 + webman/public/assets/editInfo-6g9YpDTS.css | 1 + webman/public/assets/editInfo-ChAN-DIk.js | 1 + webman/public/assets/editInfo-DXBGScbZ.js | 1 + webman/public/assets/editInfo-NjiBc5a6.js | 1 + webman/public/assets/editInfo-Y-e0zUFW.css | 1 + webman/public/assets/emailLog-C2m1eBdk.js | 1 + webman/public/assets/emailLog-CBkhYq_H.js | 1 + .../assets/es-define-property-bDCdrV83.js | 1 + webman/public/assets/es-errors-CFxpeikN.js | 1 + .../public/assets/es-object-atoms-Ditt1eQ6.js | 1 + webman/public/assets/file2md5-B4-SI92N.js | 1 + webman/public/assets/formDesign-BDBYukjt.js | 1 + webman/public/assets/formDesign-BSnEilW5.css | 1 + .../public/assets/function-bind-BbkWVFrm.js | 1 + .../public/assets/function-bind-CHqF18-c.js | 1 + webman/public/assets/generate-CUmP6rhy.js | 1 + webman/public/assets/generate-CvHPqnHt.js | 1 + .../public/assets/get-intrinsic-CCph2EoF.js | 1 + .../public/assets/get-intrinsic-CdQ0j820.js | 1 + webman/public/assets/get-proto-CEhLFpt-.js | 1 + webman/public/assets/get-proto-cKMTtFGz.js | 1 + webman/public/assets/gopd-fcd2-aIC.js | 1 + webman/public/assets/has-symbols-BaUvM3gb.js | 1 + webman/public/assets/hasown-C2NEVhna.js | 1 + webman/public/assets/hasown-DwiY0sux.js | 1 + webman/public/assets/index-9ajc8XCP.js | 1 + webman/public/assets/index-B9HpnnY2.js | 1 + webman/public/assets/index-BFIUdcGG.js | 1 + webman/public/assets/index-BZxaLGo4.css | 1 + webman/public/assets/index-B_9N8_8i.js | 1 + webman/public/assets/index-BbRNy9mZ.js | 1 + webman/public/assets/index-Bfucj2gf.css | 1 + webman/public/assets/index-BhCz8zJ3.css | 1 + webman/public/assets/index-Bl1y9N2j.js | 1 + webman/public/assets/index-BlmJTHZZ.js | 1 + webman/public/assets/index-BqLpuig7.js | 1 + webman/public/assets/index-BskNDCu3.js | 1 + webman/public/assets/index-C2WOaPMB.js | 1 + webman/public/assets/index-C4UnJrYE.css | 1 + webman/public/assets/index-C6WqqdCm.js | 1 + webman/public/assets/index-CC62xq0j.css | 1 + webman/public/assets/index-CNx4HHXc.js | 1 + webman/public/assets/index-CYLgbsWO.js | 1 + webman/public/assets/index-CYYsyvFj.css | 1 + webman/public/assets/index-CaZcXSlq.js | 1 + webman/public/assets/index-CgeF7ukd.js | 2 + webman/public/assets/index-ChWaTs2V.js | 1 + webman/public/assets/index-CioU6uju.js | 1 + webman/public/assets/index-CjSAeS3E.js | 1 + webman/public/assets/index-Cjh1bGmI.js | 1 + webman/public/assets/index-D4ERJytk.js | 1 + webman/public/assets/index-D5MGc_nr.css | 1 + webman/public/assets/index-D8t8-Vcv.js | 1 + webman/public/assets/index-DDnFF-c6.js | 1 + webman/public/assets/index-DL3BjnsO.js | 2 + webman/public/assets/index-DM0TYnz_.js | 1 + webman/public/assets/index-DRV136vu.js | 1 + webman/public/assets/index-DYT0L2ga.js | 1 + webman/public/assets/index-DZpgLrrT.js | 1 + webman/public/assets/index-DaXTbXVv.js | 1 + webman/public/assets/index-Dh0mztjy.js | 1 + webman/public/assets/index-DkGLNqVb.js | 12 + webman/public/assets/index-Dp4EISnj.css | 1 + webman/public/assets/index-DpRapO2z.js | 1 + webman/public/assets/index-DqWV4YeH.js | 1 + webman/public/assets/index-DzkS705W.js | 1 + webman/public/assets/index-FIDUFMiE.css | 1 + webman/public/assets/index-SzGozy2_.js | 1 + webman/public/assets/index-XqCN5tvw.js | 1 + webman/public/assets/index-Ymm_9TE1.js | 1 + webman/public/assets/index-i94lRRfC.js | 1 + webman/public/assets/index-kafhfDIe.css | 1 + webman/public/assets/index-lkcZwK3M.js | 1 + webman/public/assets/index-ybrmzYq5.js | 12 + webman/public/assets/install-box-CBgEvQY9.js | 1 + webman/public/assets/install-box-UcToEVc_.js | 1 + webman/public/assets/is-arrayish-BII_q15j.js | 1 + webman/public/assets/leader-CBXB0tWK.js | 1 + webman/public/assets/leader-hmQzSqrT.js | 1 + webman/public/assets/loadTable-BDVe-iv3.js | 1 + webman/public/assets/loadTable-BFTONwXN.js | 1 + webman/public/assets/loadTable-hzlR-U5D.js | 1 + webman/public/assets/lodash-fWIJiXPB.js | 27 + webman/public/assets/lodash.noop-BeiKyXVG.js | 1 + webman/public/assets/logList-DmhpOLmd.js | 1 + webman/public/assets/logList-uYU5rm9Q.js | 1 + webman/public/assets/login-45LPtqKq.css | 1 + webman/public/assets/login-BS9dzljk.js | 1 + webman/public/assets/login-BtLUskZ_.js | 1 + webman/public/assets/loginLog-B1b2avGQ.js | 1 + webman/public/assets/loginLog-BblWFeAK.js | 1 + .../public/assets/login_picture-C4j-88yw.svg | 1 + webman/public/assets/logo-5EOo6F45.png | Bin 0 -> 18787 bytes webman/public/assets/logo-B7uA2Tfd.js | 1 + .../public/assets/manage-config-B0P_8HfQ.js | 1 + .../public/assets/manage-config-DHBeLiDi.js | 1 + .../public/assets/math-intrinsics-Cv-yPkyD.js | 1 + webman/public/assets/menu-CBqt8CnT.js | 1 + webman/public/assets/menu-CgiEA4rB.js | 1 + .../public/assets/menuPermission-0cOEYOYw.js | 1 + .../public/assets/menuPermission-B9LCPnXg.js | 1 + .../public/assets/menuPermission-Dvq43lIN.css | 1 + .../public/assets/modifyPassword-CrighWRv.js | 1 + .../public/assets/modifyPassword-ISylktRO.js | 1 + .../public/assets/monaco-editor-DLvI6UQ2.css | 1 + .../public/assets/monaco-editor-nMXQdunA.js | 657 +++ webman/public/assets/nprogress-CSXic_Zd.css | 1 + webman/public/assets/nprogress-DxiOKil-.js | 2 + .../assets/number-precision-BW_FzNZC.js | 1 + .../public/assets/object-inspect-Pz2pmunN.js | 4 + webman/public/assets/operLog-Ba1fhCTF.js | 1 + webman/public/assets/operLog-CpGgCm9d.js | 1 + webman/public/assets/pinia-CtMvrpix.js | 5 + webman/public/assets/post-CmCXCNyH.js | 1 + webman/public/assets/post-DszuaI2s.js | 1 + webman/public/assets/preview-7AX_8-q4.js | 1 + webman/public/assets/preview-Bqm1bMFJ.js | 1 + webman/public/assets/preview-F38rEx2-.js | 1 + webman/public/assets/preview-R7hQO_hS.css | 1 + webman/public/assets/preview-vHikicIV.css | 1 + webman/public/assets/qs-CGfOb-kZ.js | 1 + webman/public/assets/qs-DkPR50Nj.js | 1 + webman/public/assets/recycle-08ccYGa5.js | 1 + webman/public/assets/recycle-CsDo7zQj.js | 1 + .../public/assets/resize-detector-G6vbKCU7.js | 1 + .../resize-observer-polyfill-B1PUzC5B.js | 1 + webman/public/assets/role-C_2eDkr0.js | 1 + webman/public/assets/role-CkU346eF.js | 1 + .../scroll-into-view-if-needed-SxpMpKWN.js | 1 + .../assets/settingComponent-BZ1sm0m2.js | 1 + .../assets/settingComponent-BvoGVFoj.js | 1 + .../assets/settingComponent-C9EG_z5A.js | 1 + .../assets/settingComponent-CO66zv16.css | 1 + .../assets/settingComponent-jp-QAGGD.css | 1 + webman/public/assets/side-channel-0xN0c_x9.js | 1 + webman/public/assets/side-channel-DLYplXY8.js | 1 + .../assets/side-channel-list-asz5kCf8.js | 1 + .../assets/side-channel-map-Cq5rP8eY.js | 1 + .../assets/side-channel-map-DBz1yoQn.js | 1 + .../assets/side-channel-weakmap-B70DURAT.js | 1 + .../assets/side-channel-weakmap-CMrfu08b.js | 1 + .../public/assets/simple-swizzle-BUB9Iq-C.js | 1 + webman/public/assets/sortablejs-C83syoBY.js | 6 + webman/public/assets/spark-md5-D8tidE2e.js | 1 + webman/public/assets/st-announced-CLQoQ4wT.js | 1 + webman/public/assets/st-announced-DrJqprDO.js | 1 + webman/public/assets/st-count-9mj4Scq-.js | 1 + webman/public/assets/st-count-BYk9DI1y.css | 1 + webman/public/assets/st-count-DHnX2X1-.js | 1 + .../public/assets/st-loginChart-2_NUfV4F.css | 1 + .../public/assets/st-loginChart-Ce9YXVXR.js | 4 + .../public/assets/st-loginChart-DW20RySP.js | 4 + webman/public/assets/st-saiadmin-75xpyoM0.js | 1 + webman/public/assets/st-saiadmin-wsMYFz7O.js | 1 + webman/public/assets/st-welcome-CzRY8ecE.js | 1 + webman/public/assets/st-welcome-DlDaAGsu.css | 1 + webman/public/assets/st-welcome-qOYCIGst.js | 1 + webman/public/assets/statistics-B5GKQmFw.js | 1 + webman/public/assets/statistics-C7hjx8ku.js | 1 + webman/public/assets/struct-BuDD2Spc.js | 1 + webman/public/assets/struct-CEzpDVcZ.js | 1 + webman/public/assets/table-BHRaYvrI.js | 1 + webman/public/assets/table-BjY8BMqW.js | 1 + webman/public/assets/table-CVTajxM4.css | 1 + webman/public/assets/terminal-BsIK5D1b.css | 1 + webman/public/assets/terminal-C7g1OY6E.js | 1 + webman/public/assets/terminal-CmQREFQF.js | 1 + webman/public/assets/terminal-ovG3j2Rs.css | 1 + webman/public/assets/thumb-DX6EaRRA.jpg | Bin 0 -> 6664 bytes webman/public/assets/tslib-BDyQ-Jie.js | 14 + webman/public/assets/user-BW-rYcwt.js | 1 + webman/public/assets/user-pcE09jl3.js | 1 + webman/public/assets/userBanner-CTBkQiTM.jpg | Bin 0 -> 76835 bytes .../public/assets/userInfomation-BuBbQVpX.js | 1 + .../public/assets/userInfomation-DALxJbDz.js | 1 + webman/public/assets/vars-CZGqfX5Y.js | 1 + webman/public/assets/view-CHRVpyaZ.js | 1 + webman/public/assets/view-Df7wOQNg.js | 1 + webman/public/assets/view-DkYlBne4.js | 1 + webman/public/assets/view-JzXCzoqh.js | 1 + webman/public/assets/vue-QIJ1KGct.js | 5 + .../public/assets/vue-clipboard3-DpvFlCWw.js | 1 + .../public/assets/vue-color-kit-dVVLog6c.css | 1 + .../public/assets/vue-color-kit-w75Wyu4C.js | 5 + webman/public/assets/vue-demi-l0sNRNKZ.js | 1 + webman/public/assets/vue-echarts-B-rvonkO.js | 17 + webman/public/assets/vue-i18n-PeqK6azz.js | 5 + webman/public/assets/vue-router-DXldG2q0.js | 5 + webman/public/assets/work-panel-BO2MRm6y.js | 1 + webman/public/assets/work-panel-Bf8dYDN6.js | 1 + webman/public/assets/zrender-xbpiMqDc.js | 18 + webman/public/favicon.ico | Bin 0 -> 119742 bytes webman/public/index.html | 229 + webman/public/npm-install-test/package.json | 16 + webman/start.php | 5 + webman/support/Request.php | 48 + webman/support/Response.php | 24 + webman/support/bootstrap.php | 139 + webman/windows.bat | 3 + webman/windows.php | 136 + 510 files changed, 28241 insertions(+) create mode 100644 .gitmodules create mode 100644 LICENSE create mode 100644 README.md create mode 100644 saiadmin-vue/.env create mode 100644 saiadmin-vue/.env.development create mode 100644 saiadmin-vue/.env.production create mode 100644 saiadmin-vue/.gitignore create mode 100644 saiadmin-vue/.vscode/settings.json create mode 100644 saiadmin-vue/LICENSE create mode 100644 saiadmin-vue/README.md create mode 100644 saiadmin-vue/index.html create mode 100644 saiadmin-vue/jsconfig.json create mode 100644 saiadmin-vue/package.json create mode 100644 saiadmin-vue/postcss.config.cjs create mode 100644 saiadmin-vue/public/favicon.ico create mode 100644 saiadmin-vue/src/App.vue create mode 100644 saiadmin-vue/src/api/common.js create mode 100644 saiadmin-vue/src/api/login.js create mode 100644 saiadmin-vue/src/api/system/attachment.js create mode 100644 saiadmin-vue/src/api/system/config.js create mode 100644 saiadmin-vue/src/api/system/database.js create mode 100644 saiadmin-vue/src/api/system/dept.js create mode 100644 saiadmin-vue/src/api/system/dict.js create mode 100644 saiadmin-vue/src/api/system/emailLog.js create mode 100644 saiadmin-vue/src/api/system/loginLog.js create mode 100644 saiadmin-vue/src/api/system/menu.js create mode 100644 saiadmin-vue/src/api/system/monitor.js create mode 100644 saiadmin-vue/src/api/system/notice.js create mode 100644 saiadmin-vue/src/api/system/operLog.js create mode 100644 saiadmin-vue/src/api/system/post.js create mode 100644 saiadmin-vue/src/api/system/role.js create mode 100644 saiadmin-vue/src/api/system/user.js create mode 100644 saiadmin-vue/src/api/tool/crontab.js create mode 100644 saiadmin-vue/src/api/tool/generate.js create mode 100644 saiadmin-vue/src/api/tool/saipackage.js create mode 100644 saiadmin-vue/src/assets/404.svg create mode 100644 saiadmin-vue/src/assets/avatar.jpg create mode 100644 saiadmin-vue/src/assets/image/action.svg create mode 100644 saiadmin-vue/src/assets/image/attach.svg create mode 100644 saiadmin-vue/src/assets/image/login.svg create mode 100644 saiadmin-vue/src/assets/image/user.svg create mode 100644 saiadmin-vue/src/assets/login_picture.svg create mode 100644 saiadmin-vue/src/assets/logo.png create mode 100644 saiadmin-vue/src/assets/not-image.png create mode 100644 saiadmin-vue/src/assets/skins-thumb/businessGray/thumb.jpg create mode 100644 saiadmin-vue/src/assets/skins-thumb/city/thumb.jpg create mode 100644 saiadmin-vue/src/assets/skins-thumb/classics/thumb.jpg create mode 100644 saiadmin-vue/src/assets/skins-thumb/mine/thumb.jpg create mode 100644 saiadmin-vue/src/assets/userBanner.jpg create mode 100644 saiadmin-vue/src/components/index.js create mode 100644 saiadmin-vue/src/components/ma-cityLinkage/index.vue create mode 100644 saiadmin-vue/src/components/ma-cityLinkage/lib/city.json create mode 100644 saiadmin-vue/src/components/ma-codeEditor/index.vue create mode 100644 saiadmin-vue/src/components/ma-colorPicker/index.vue create mode 100644 saiadmin-vue/src/components/ma-verifyCode/index.vue create mode 100644 saiadmin-vue/src/components/ma-wangEditor/index.vue create mode 100644 saiadmin-vue/src/components/sa-chart/index.vue create mode 100644 saiadmin-vue/src/components/sa-checkbox/index.vue create mode 100644 saiadmin-vue/src/components/sa-dict/index.vue create mode 100644 saiadmin-vue/src/components/sa-icon-picker/iconify/bi.json create mode 100644 saiadmin-vue/src/components/sa-icon-picker/index.vue create mode 100644 saiadmin-vue/src/components/sa-icon/index.vue create mode 100644 saiadmin-vue/src/components/sa-pick-image/index.vue create mode 100644 saiadmin-vue/src/components/sa-radio/index.vue create mode 100644 saiadmin-vue/src/components/sa-resource/button.vue create mode 100644 saiadmin-vue/src/components/sa-resource/index.vue create mode 100644 saiadmin-vue/src/components/sa-select/index.vue create mode 100644 saiadmin-vue/src/components/sa-switch/index.vue create mode 100644 saiadmin-vue/src/components/sa-table/defaultOptions.js create mode 100644 saiadmin-vue/src/components/sa-table/import.vue create mode 100644 saiadmin-vue/src/components/sa-table/index.vue create mode 100644 saiadmin-vue/src/components/sa-treeSlider/index.vue create mode 100644 saiadmin-vue/src/components/sa-upload-chunk/index.vue create mode 100644 saiadmin-vue/src/components/sa-upload-file/index.vue create mode 100644 saiadmin-vue/src/components/sa-upload-image/index.vue create mode 100644 saiadmin-vue/src/components/sa-user/index.vue create mode 100644 saiadmin-vue/src/config/skins.js create mode 100644 saiadmin-vue/src/directives/auth/auth.js create mode 100644 saiadmin-vue/src/directives/auth/index.js create mode 100644 saiadmin-vue/src/directives/copy/index.js create mode 100644 saiadmin-vue/src/directives/index.js create mode 100644 saiadmin-vue/src/directives/role/index.js create mode 100644 saiadmin-vue/src/directives/role/role.js create mode 100644 saiadmin-vue/src/i18n/en/crud.js create mode 100644 saiadmin-vue/src/i18n/en/maResource.js create mode 100644 saiadmin-vue/src/i18n/en/menus.js create mode 100644 saiadmin-vue/src/i18n/en/skin.js create mode 100644 saiadmin-vue/src/i18n/en/sys.js create mode 100644 saiadmin-vue/src/i18n/en/upload.js create mode 100644 saiadmin-vue/src/i18n/en/user.js create mode 100644 saiadmin-vue/src/i18n/index.js create mode 100644 saiadmin-vue/src/i18n/zh_CN/crud.js create mode 100644 saiadmin-vue/src/i18n/zh_CN/maResource.js create mode 100644 saiadmin-vue/src/i18n/zh_CN/menus.js create mode 100644 saiadmin-vue/src/i18n/zh_CN/skin.js create mode 100644 saiadmin-vue/src/i18n/zh_CN/sys.js create mode 100644 saiadmin-vue/src/i18n/zh_CN/upload.js create mode 100644 saiadmin-vue/src/i18n/zh_CN/user.js create mode 100644 saiadmin-vue/src/layout/404.vue create mode 100644 saiadmin-vue/src/layout/components/banner/index.vue create mode 100644 saiadmin-vue/src/layout/components/classic/index.vue create mode 100644 saiadmin-vue/src/layout/components/classic/ma-classic-header.vue create mode 100644 saiadmin-vue/src/layout/components/classic/ma-classic-slider.vue create mode 100644 saiadmin-vue/src/layout/components/columns/index.vue create mode 100644 saiadmin-vue/src/layout/components/columns/ma-columns-header.vue create mode 100644 saiadmin-vue/src/layout/components/columns/ma-columns-menu.vue create mode 100644 saiadmin-vue/src/layout/components/components/children-banner.vue create mode 100644 saiadmin-vue/src/layout/components/components/children-menu.vue create mode 100644 saiadmin-vue/src/layout/components/components/iframe-view.vue create mode 100644 saiadmin-vue/src/layout/components/components/message-notification.vue create mode 100644 saiadmin-vue/src/layout/components/components/search.vue create mode 100644 saiadmin-vue/src/layout/components/components/skin.vue create mode 100644 saiadmin-vue/src/layout/components/components/sub-menu.vue create mode 100644 saiadmin-vue/src/layout/components/ma-breadcrumb.vue create mode 100644 saiadmin-vue/src/layout/components/ma-buttonMenu.vue create mode 100644 saiadmin-vue/src/layout/components/ma-menu.vue create mode 100644 saiadmin-vue/src/layout/components/ma-operation.vue create mode 100644 saiadmin-vue/src/layout/components/ma-tags.vue create mode 100644 saiadmin-vue/src/layout/components/ma-workerArea.vue create mode 100644 saiadmin-vue/src/layout/components/mixed/index.vue create mode 100644 saiadmin-vue/src/layout/components/mixed/top-menu.vue create mode 100644 saiadmin-vue/src/layout/empty.vue create mode 100644 saiadmin-vue/src/layout/index.vue create mode 100644 saiadmin-vue/src/layout/search.vue create mode 100644 saiadmin-vue/src/layout/setting.vue create mode 100644 saiadmin-vue/src/main.js create mode 100644 saiadmin-vue/src/plugin/index.js create mode 100644 saiadmin-vue/src/router/homePageRoutes.js create mode 100644 saiadmin-vue/src/router/index.js create mode 100644 saiadmin-vue/src/router/webRouter.js create mode 100644 saiadmin-vue/src/store/index.js create mode 100644 saiadmin-vue/src/store/modules/app.js create mode 100644 saiadmin-vue/src/store/modules/config.js create mode 100644 saiadmin-vue/src/store/modules/dict.js create mode 100644 saiadmin-vue/src/store/modules/iframe.js create mode 100644 saiadmin-vue/src/store/modules/keepAlive.js create mode 100644 saiadmin-vue/src/store/modules/message.js create mode 100644 saiadmin-vue/src/store/modules/tag.js create mode 100644 saiadmin-vue/src/store/modules/terminal.js create mode 100644 saiadmin-vue/src/store/modules/user.js create mode 100644 saiadmin-vue/src/style/animation.less create mode 100644 saiadmin-vue/src/style/dark.less create mode 100644 saiadmin-vue/src/style/global.less create mode 100644 saiadmin-vue/src/style/index.css create mode 100644 saiadmin-vue/src/style/skin.less create mode 100644 saiadmin-vue/src/style/skins/businessGray/index.less create mode 100644 saiadmin-vue/src/style/skins/city/background.jpg create mode 100644 saiadmin-vue/src/style/skins/city/index.less create mode 100644 saiadmin-vue/src/style/skins/classics/index.less create mode 100644 saiadmin-vue/src/style/skins/mine/index.less create mode 100644 saiadmin-vue/src/utils/common.js create mode 100644 saiadmin-vue/src/utils/print.js create mode 100644 saiadmin-vue/src/utils/push-vue.js create mode 100644 saiadmin-vue/src/utils/request.js create mode 100644 saiadmin-vue/src/utils/tool.js create mode 100644 saiadmin-vue/src/views/dashboard/components/components/st-announced.vue create mode 100644 saiadmin-vue/src/views/dashboard/components/components/st-count.vue create mode 100644 saiadmin-vue/src/views/dashboard/components/components/st-loginChart.vue create mode 100644 saiadmin-vue/src/views/dashboard/components/components/st-saiadmin.vue create mode 100644 saiadmin-vue/src/views/dashboard/components/components/st-welcome.vue create mode 100644 saiadmin-vue/src/views/dashboard/components/statistics.vue create mode 100644 saiadmin-vue/src/views/dashboard/components/work-panel.vue create mode 100644 saiadmin-vue/src/views/dashboard/index.vue create mode 100644 saiadmin-vue/src/views/dashboard/userCenter/components/modifyPassword.vue create mode 100644 saiadmin-vue/src/views/dashboard/userCenter/components/userInfomation.vue create mode 100644 saiadmin-vue/src/views/dashboard/userCenter/index.vue create mode 100644 saiadmin-vue/src/views/login.vue create mode 100644 saiadmin-vue/src/views/system/attachment/index.vue create mode 100644 saiadmin-vue/src/views/system/config/components/add-group.vue create mode 100644 saiadmin-vue/src/views/system/config/components/edit.vue create mode 100644 saiadmin-vue/src/views/system/config/components/js/inputType.js create mode 100644 saiadmin-vue/src/views/system/config/components/manage-config.vue create mode 100644 saiadmin-vue/src/views/system/config/index.vue create mode 100644 saiadmin-vue/src/views/system/database/index.vue create mode 100644 saiadmin-vue/src/views/system/database/recycle.vue create mode 100644 saiadmin-vue/src/views/system/database/struct.vue create mode 100644 saiadmin-vue/src/views/system/dept/edit.vue create mode 100644 saiadmin-vue/src/views/system/dept/index.vue create mode 100644 saiadmin-vue/src/views/system/dept/leader.vue create mode 100644 saiadmin-vue/src/views/system/dict/dataList.vue create mode 100644 saiadmin-vue/src/views/system/dict/edit-data.vue create mode 100644 saiadmin-vue/src/views/system/dict/edit.vue create mode 100644 saiadmin-vue/src/views/system/dict/index.vue create mode 100644 saiadmin-vue/src/views/system/logs/emailLog.vue create mode 100644 saiadmin-vue/src/views/system/logs/loginLog.vue create mode 100644 saiadmin-vue/src/views/system/logs/operLog.vue create mode 100644 saiadmin-vue/src/views/system/menu/edit.vue create mode 100644 saiadmin-vue/src/views/system/menu/index.vue create mode 100644 saiadmin-vue/src/views/system/monitor/server/index.vue create mode 100644 saiadmin-vue/src/views/system/notice/edit.vue create mode 100644 saiadmin-vue/src/views/system/notice/index.vue create mode 100644 saiadmin-vue/src/views/system/post/edit.vue create mode 100644 saiadmin-vue/src/views/system/post/index.vue create mode 100644 saiadmin-vue/src/views/system/post/view.vue create mode 100644 saiadmin-vue/src/views/system/role/components/menuPermission.vue create mode 100644 saiadmin-vue/src/views/system/role/edit.vue create mode 100644 saiadmin-vue/src/views/system/role/index.vue create mode 100644 saiadmin-vue/src/views/system/user/edit.vue create mode 100644 saiadmin-vue/src/views/system/user/index.vue create mode 100644 saiadmin-vue/src/views/tool/code/components/editInfo.vue create mode 100644 saiadmin-vue/src/views/tool/code/components/loadTable.vue create mode 100644 saiadmin-vue/src/views/tool/code/components/preview.vue create mode 100644 saiadmin-vue/src/views/tool/code/components/settingComponent.vue create mode 100644 saiadmin-vue/src/views/tool/code/index.vue create mode 100644 saiadmin-vue/src/views/tool/code/js/vars.js create mode 100644 saiadmin-vue/src/views/tool/crontab/edit.vue create mode 100644 saiadmin-vue/src/views/tool/crontab/index.vue create mode 100644 saiadmin-vue/src/views/tool/crontab/logList.vue create mode 100644 saiadmin-vue/src/views/tool/crontab/view.vue create mode 100644 saiadmin-vue/src/views/tool/install/index.vue create mode 100644 saiadmin-vue/src/views/tool/install/install-box.vue create mode 100644 saiadmin-vue/src/views/tool/install/terminal.vue create mode 100644 saiadmin-vue/tailwind.config.cjs create mode 100644 saiadmin-vue/tsconfig.json create mode 100644 saiadmin-vue/vite.config.js create mode 100644 saiadmin-vue/yarn.lock create mode 100644 webman/.env.example create mode 100644 webman/.gitignore create mode 100644 webman/LICENSE create mode 100644 webman/app/controller/IndexController.php create mode 100644 webman/app/functions.php create mode 100644 webman/app/middleware/StaticFile.php create mode 100644 webman/app/process/Http.php create mode 100644 webman/app/process/Monitor.php create mode 100644 webman/app/view/index/view.html create mode 100644 webman/composer.json create mode 100644 webman/config/app.php create mode 100644 webman/config/autoload.php create mode 100644 webman/config/bootstrap.php create mode 100644 webman/config/cache.php create mode 100644 webman/config/container.php create mode 100644 webman/config/dependence.php create mode 100644 webman/config/exception.php create mode 100644 webman/config/log.php create mode 100644 webman/config/middleware.php create mode 100644 webman/config/process.php create mode 100644 webman/config/redis.php create mode 100644 webman/config/route.php create mode 100644 webman/config/server.php create mode 100644 webman/config/session.php create mode 100644 webman/config/static.php create mode 100644 webman/config/think-orm.php create mode 100644 webman/config/translation.php create mode 100644 webman/config/view.php create mode 100644 webman/public/assets/404-C84wjUkK.js create mode 100644 webman/public/assets/404-C8qIY0DY.js create mode 100644 webman/public/assets/404-D3qmwmJf.svg create mode 100644 webman/public/assets/404-D4vdWXN8.css create mode 100644 webman/public/assets/@arco-design-BiEPdq2w.css create mode 100644 webman/public/assets/@arco-design-uttiljWv.js create mode 100644 webman/public/assets/@iconify-BfRLEUc9.js create mode 100644 webman/public/assets/@intlify-CJ2pDqUV.js create mode 100644 webman/public/assets/@vue-9ZIPiVZG.js create mode 100644 webman/public/assets/@wangeditor-Bg8kJaak.js create mode 100644 webman/public/assets/@wangeditor-nHDhGvq6.css create mode 100644 webman/public/assets/add-group-B6RsDY0n.js create mode 100644 webman/public/assets/add-group-D5MnfTKt.js create mode 100644 webman/public/assets/avatar-DJF9etZw.jpg create mode 100644 webman/public/assets/avatar-DvSZjoFF.js create mode 100644 webman/public/assets/axios-BOAqGR8s.js create mode 100644 webman/public/assets/b-tween-BtQQsX34.js create mode 100644 webman/public/assets/b-validate-DHOn5MGm.js create mode 100644 webman/public/assets/background-W5wCjb__.jpg create mode 100644 webman/public/assets/call-bind-apply-helpers-CXPkwEps.js create mode 100644 webman/public/assets/call-bind-apply-helpers-DFdvRtIg.js create mode 100644 webman/public/assets/call-bound-B36HnitE.js create mode 100644 webman/public/assets/call-bound-BMZ_xw6V.js create mode 100644 webman/public/assets/clipboard-ehac6u_s.js create mode 100644 webman/public/assets/codicon-DcSIACem.ttf create mode 100644 webman/public/assets/color-JIMhKyf3.js create mode 100644 webman/public/assets/color-name-BQ5IbGbl.js create mode 100644 webman/public/assets/color-string-Ckj7g19G.js create mode 100644 webman/public/assets/compute-scroll-into-view-1gs_hJI2.js create mode 100644 webman/public/assets/config-CFOHD7nk.js create mode 100644 webman/public/assets/config-ZWMRzLkl.js create mode 100644 webman/public/assets/crontab-D2UudUxl.js create mode 100644 webman/public/assets/crontab-DHsN78bF.js create mode 100644 webman/public/assets/crypto-js-B6um_4t4.js create mode 100644 webman/public/assets/dataList-BdaY1nZd.js create mode 100644 webman/public/assets/dataList-tp5sU58K.js create mode 100644 webman/public/assets/database-C9oinknn.js create mode 100644 webman/public/assets/database-CTMAb1z4.js create mode 100644 webman/public/assets/dayjs-DUkVwsK-.js create mode 100644 webman/public/assets/dept-B7mu9jEv.js create mode 100644 webman/public/assets/dept-BazEhZT0.js create mode 100644 webman/public/assets/dict-C6FxRZf9.js create mode 100644 webman/public/assets/dict-Di-hEQDg.js create mode 100644 webman/public/assets/dunder-proto-BvNz4iDg.js create mode 100644 webman/public/assets/dunder-proto-CiSsr-aM.js create mode 100644 webman/public/assets/echarts-Cz-L25MO.js create mode 100644 webman/public/assets/edit--su55P8f.js create mode 100644 webman/public/assets/edit-B2-MKvH2.js create mode 100644 webman/public/assets/edit-BT4iQK1s.js create mode 100644 webman/public/assets/edit-BYRBvBoh.js create mode 100644 webman/public/assets/edit-C410mWZI.js create mode 100644 webman/public/assets/edit-C4LjrAZO.js create mode 100644 webman/public/assets/edit-CqvT7GJF.js create mode 100644 webman/public/assets/edit-CyUWeZne.js create mode 100644 webman/public/assets/edit-D3WKGVOx.js create mode 100644 webman/public/assets/edit-D9KKKNcV.js create mode 100644 webman/public/assets/edit-D_EZLa8V.js create mode 100644 webman/public/assets/edit-Dj6-BOG2.js create mode 100644 webman/public/assets/edit-DjscfkpF.js create mode 100644 webman/public/assets/edit-DyIQuM4D.js create mode 100644 webman/public/assets/edit-KUYyIVcu.js create mode 100644 webman/public/assets/edit-a5eHS414.js create mode 100644 webman/public/assets/edit-data-BixJMCQA.js create mode 100644 webman/public/assets/edit-data-D-Kheltb.js create mode 100644 webman/public/assets/edit-l4j53F48.js create mode 100644 webman/public/assets/edit-xZRcGvRF.js create mode 100644 webman/public/assets/editInfo-6g9YpDTS.css create mode 100644 webman/public/assets/editInfo-ChAN-DIk.js create mode 100644 webman/public/assets/editInfo-DXBGScbZ.js create mode 100644 webman/public/assets/editInfo-NjiBc5a6.js create mode 100644 webman/public/assets/editInfo-Y-e0zUFW.css create mode 100644 webman/public/assets/emailLog-C2m1eBdk.js create mode 100644 webman/public/assets/emailLog-CBkhYq_H.js create mode 100644 webman/public/assets/es-define-property-bDCdrV83.js create mode 100644 webman/public/assets/es-errors-CFxpeikN.js create mode 100644 webman/public/assets/es-object-atoms-Ditt1eQ6.js create mode 100644 webman/public/assets/file2md5-B4-SI92N.js create mode 100644 webman/public/assets/formDesign-BDBYukjt.js create mode 100644 webman/public/assets/formDesign-BSnEilW5.css create mode 100644 webman/public/assets/function-bind-BbkWVFrm.js create mode 100644 webman/public/assets/function-bind-CHqF18-c.js create mode 100644 webman/public/assets/generate-CUmP6rhy.js create mode 100644 webman/public/assets/generate-CvHPqnHt.js create mode 100644 webman/public/assets/get-intrinsic-CCph2EoF.js create mode 100644 webman/public/assets/get-intrinsic-CdQ0j820.js create mode 100644 webman/public/assets/get-proto-CEhLFpt-.js create mode 100644 webman/public/assets/get-proto-cKMTtFGz.js create mode 100644 webman/public/assets/gopd-fcd2-aIC.js create mode 100644 webman/public/assets/has-symbols-BaUvM3gb.js create mode 100644 webman/public/assets/hasown-C2NEVhna.js create mode 100644 webman/public/assets/hasown-DwiY0sux.js create mode 100644 webman/public/assets/index-9ajc8XCP.js create mode 100644 webman/public/assets/index-B9HpnnY2.js create mode 100644 webman/public/assets/index-BFIUdcGG.js create mode 100644 webman/public/assets/index-BZxaLGo4.css create mode 100644 webman/public/assets/index-B_9N8_8i.js create mode 100644 webman/public/assets/index-BbRNy9mZ.js create mode 100644 webman/public/assets/index-Bfucj2gf.css create mode 100644 webman/public/assets/index-BhCz8zJ3.css create mode 100644 webman/public/assets/index-Bl1y9N2j.js create mode 100644 webman/public/assets/index-BlmJTHZZ.js create mode 100644 webman/public/assets/index-BqLpuig7.js create mode 100644 webman/public/assets/index-BskNDCu3.js create mode 100644 webman/public/assets/index-C2WOaPMB.js create mode 100644 webman/public/assets/index-C4UnJrYE.css create mode 100644 webman/public/assets/index-C6WqqdCm.js create mode 100644 webman/public/assets/index-CC62xq0j.css create mode 100644 webman/public/assets/index-CNx4HHXc.js create mode 100644 webman/public/assets/index-CYLgbsWO.js create mode 100644 webman/public/assets/index-CYYsyvFj.css create mode 100644 webman/public/assets/index-CaZcXSlq.js create mode 100644 webman/public/assets/index-CgeF7ukd.js create mode 100644 webman/public/assets/index-ChWaTs2V.js create mode 100644 webman/public/assets/index-CioU6uju.js create mode 100644 webman/public/assets/index-CjSAeS3E.js create mode 100644 webman/public/assets/index-Cjh1bGmI.js create mode 100644 webman/public/assets/index-D4ERJytk.js create mode 100644 webman/public/assets/index-D5MGc_nr.css create mode 100644 webman/public/assets/index-D8t8-Vcv.js create mode 100644 webman/public/assets/index-DDnFF-c6.js create mode 100644 webman/public/assets/index-DL3BjnsO.js create mode 100644 webman/public/assets/index-DM0TYnz_.js create mode 100644 webman/public/assets/index-DRV136vu.js create mode 100644 webman/public/assets/index-DYT0L2ga.js create mode 100644 webman/public/assets/index-DZpgLrrT.js create mode 100644 webman/public/assets/index-DaXTbXVv.js create mode 100644 webman/public/assets/index-Dh0mztjy.js create mode 100644 webman/public/assets/index-DkGLNqVb.js create mode 100644 webman/public/assets/index-Dp4EISnj.css create mode 100644 webman/public/assets/index-DpRapO2z.js create mode 100644 webman/public/assets/index-DqWV4YeH.js create mode 100644 webman/public/assets/index-DzkS705W.js create mode 100644 webman/public/assets/index-FIDUFMiE.css create mode 100644 webman/public/assets/index-SzGozy2_.js create mode 100644 webman/public/assets/index-XqCN5tvw.js create mode 100644 webman/public/assets/index-Ymm_9TE1.js create mode 100644 webman/public/assets/index-i94lRRfC.js create mode 100644 webman/public/assets/index-kafhfDIe.css create mode 100644 webman/public/assets/index-lkcZwK3M.js create mode 100644 webman/public/assets/index-ybrmzYq5.js create mode 100644 webman/public/assets/install-box-CBgEvQY9.js create mode 100644 webman/public/assets/install-box-UcToEVc_.js create mode 100644 webman/public/assets/is-arrayish-BII_q15j.js create mode 100644 webman/public/assets/leader-CBXB0tWK.js create mode 100644 webman/public/assets/leader-hmQzSqrT.js create mode 100644 webman/public/assets/loadTable-BDVe-iv3.js create mode 100644 webman/public/assets/loadTable-BFTONwXN.js create mode 100644 webman/public/assets/loadTable-hzlR-U5D.js create mode 100644 webman/public/assets/lodash-fWIJiXPB.js create mode 100644 webman/public/assets/lodash.noop-BeiKyXVG.js create mode 100644 webman/public/assets/logList-DmhpOLmd.js create mode 100644 webman/public/assets/logList-uYU5rm9Q.js create mode 100644 webman/public/assets/login-45LPtqKq.css create mode 100644 webman/public/assets/login-BS9dzljk.js create mode 100644 webman/public/assets/login-BtLUskZ_.js create mode 100644 webman/public/assets/loginLog-B1b2avGQ.js create mode 100644 webman/public/assets/loginLog-BblWFeAK.js create mode 100644 webman/public/assets/login_picture-C4j-88yw.svg create mode 100644 webman/public/assets/logo-5EOo6F45.png create mode 100644 webman/public/assets/logo-B7uA2Tfd.js create mode 100644 webman/public/assets/manage-config-B0P_8HfQ.js create mode 100644 webman/public/assets/manage-config-DHBeLiDi.js create mode 100644 webman/public/assets/math-intrinsics-Cv-yPkyD.js create mode 100644 webman/public/assets/menu-CBqt8CnT.js create mode 100644 webman/public/assets/menu-CgiEA4rB.js create mode 100644 webman/public/assets/menuPermission-0cOEYOYw.js create mode 100644 webman/public/assets/menuPermission-B9LCPnXg.js create mode 100644 webman/public/assets/menuPermission-Dvq43lIN.css create mode 100644 webman/public/assets/modifyPassword-CrighWRv.js create mode 100644 webman/public/assets/modifyPassword-ISylktRO.js create mode 100644 webman/public/assets/monaco-editor-DLvI6UQ2.css create mode 100644 webman/public/assets/monaco-editor-nMXQdunA.js create mode 100644 webman/public/assets/nprogress-CSXic_Zd.css create mode 100644 webman/public/assets/nprogress-DxiOKil-.js create mode 100644 webman/public/assets/number-precision-BW_FzNZC.js create mode 100644 webman/public/assets/object-inspect-Pz2pmunN.js create mode 100644 webman/public/assets/operLog-Ba1fhCTF.js create mode 100644 webman/public/assets/operLog-CpGgCm9d.js create mode 100644 webman/public/assets/pinia-CtMvrpix.js create mode 100644 webman/public/assets/post-CmCXCNyH.js create mode 100644 webman/public/assets/post-DszuaI2s.js create mode 100644 webman/public/assets/preview-7AX_8-q4.js create mode 100644 webman/public/assets/preview-Bqm1bMFJ.js create mode 100644 webman/public/assets/preview-F38rEx2-.js create mode 100644 webman/public/assets/preview-R7hQO_hS.css create mode 100644 webman/public/assets/preview-vHikicIV.css create mode 100644 webman/public/assets/qs-CGfOb-kZ.js create mode 100644 webman/public/assets/qs-DkPR50Nj.js create mode 100644 webman/public/assets/recycle-08ccYGa5.js create mode 100644 webman/public/assets/recycle-CsDo7zQj.js create mode 100644 webman/public/assets/resize-detector-G6vbKCU7.js create mode 100644 webman/public/assets/resize-observer-polyfill-B1PUzC5B.js create mode 100644 webman/public/assets/role-C_2eDkr0.js create mode 100644 webman/public/assets/role-CkU346eF.js create mode 100644 webman/public/assets/scroll-into-view-if-needed-SxpMpKWN.js create mode 100644 webman/public/assets/settingComponent-BZ1sm0m2.js create mode 100644 webman/public/assets/settingComponent-BvoGVFoj.js create mode 100644 webman/public/assets/settingComponent-C9EG_z5A.js create mode 100644 webman/public/assets/settingComponent-CO66zv16.css create mode 100644 webman/public/assets/settingComponent-jp-QAGGD.css create mode 100644 webman/public/assets/side-channel-0xN0c_x9.js create mode 100644 webman/public/assets/side-channel-DLYplXY8.js create mode 100644 webman/public/assets/side-channel-list-asz5kCf8.js create mode 100644 webman/public/assets/side-channel-map-Cq5rP8eY.js create mode 100644 webman/public/assets/side-channel-map-DBz1yoQn.js create mode 100644 webman/public/assets/side-channel-weakmap-B70DURAT.js create mode 100644 webman/public/assets/side-channel-weakmap-CMrfu08b.js create mode 100644 webman/public/assets/simple-swizzle-BUB9Iq-C.js create mode 100644 webman/public/assets/sortablejs-C83syoBY.js create mode 100644 webman/public/assets/spark-md5-D8tidE2e.js create mode 100644 webman/public/assets/st-announced-CLQoQ4wT.js create mode 100644 webman/public/assets/st-announced-DrJqprDO.js create mode 100644 webman/public/assets/st-count-9mj4Scq-.js create mode 100644 webman/public/assets/st-count-BYk9DI1y.css create mode 100644 webman/public/assets/st-count-DHnX2X1-.js create mode 100644 webman/public/assets/st-loginChart-2_NUfV4F.css create mode 100644 webman/public/assets/st-loginChart-Ce9YXVXR.js create mode 100644 webman/public/assets/st-loginChart-DW20RySP.js create mode 100644 webman/public/assets/st-saiadmin-75xpyoM0.js create mode 100644 webman/public/assets/st-saiadmin-wsMYFz7O.js create mode 100644 webman/public/assets/st-welcome-CzRY8ecE.js create mode 100644 webman/public/assets/st-welcome-DlDaAGsu.css create mode 100644 webman/public/assets/st-welcome-qOYCIGst.js create mode 100644 webman/public/assets/statistics-B5GKQmFw.js create mode 100644 webman/public/assets/statistics-C7hjx8ku.js create mode 100644 webman/public/assets/struct-BuDD2Spc.js create mode 100644 webman/public/assets/struct-CEzpDVcZ.js create mode 100644 webman/public/assets/table-BHRaYvrI.js create mode 100644 webman/public/assets/table-BjY8BMqW.js create mode 100644 webman/public/assets/table-CVTajxM4.css create mode 100644 webman/public/assets/terminal-BsIK5D1b.css create mode 100644 webman/public/assets/terminal-C7g1OY6E.js create mode 100644 webman/public/assets/terminal-CmQREFQF.js create mode 100644 webman/public/assets/terminal-ovG3j2Rs.css create mode 100644 webman/public/assets/thumb-DX6EaRRA.jpg create mode 100644 webman/public/assets/tslib-BDyQ-Jie.js create mode 100644 webman/public/assets/user-BW-rYcwt.js create mode 100644 webman/public/assets/user-pcE09jl3.js create mode 100644 webman/public/assets/userBanner-CTBkQiTM.jpg create mode 100644 webman/public/assets/userInfomation-BuBbQVpX.js create mode 100644 webman/public/assets/userInfomation-DALxJbDz.js create mode 100644 webman/public/assets/vars-CZGqfX5Y.js create mode 100644 webman/public/assets/view-CHRVpyaZ.js create mode 100644 webman/public/assets/view-Df7wOQNg.js create mode 100644 webman/public/assets/view-DkYlBne4.js create mode 100644 webman/public/assets/view-JzXCzoqh.js create mode 100644 webman/public/assets/vue-QIJ1KGct.js create mode 100644 webman/public/assets/vue-clipboard3-DpvFlCWw.js create mode 100644 webman/public/assets/vue-color-kit-dVVLog6c.css create mode 100644 webman/public/assets/vue-color-kit-w75Wyu4C.js create mode 100644 webman/public/assets/vue-demi-l0sNRNKZ.js create mode 100644 webman/public/assets/vue-echarts-B-rvonkO.js create mode 100644 webman/public/assets/vue-i18n-PeqK6azz.js create mode 100644 webman/public/assets/vue-router-DXldG2q0.js create mode 100644 webman/public/assets/work-panel-BO2MRm6y.js create mode 100644 webman/public/assets/work-panel-Bf8dYDN6.js create mode 100644 webman/public/assets/zrender-xbpiMqDc.js create mode 100644 webman/public/favicon.ico create mode 100644 webman/public/index.html create mode 100644 webman/public/npm-install-test/package.json create mode 100644 webman/start.php create mode 100644 webman/support/Request.php create mode 100644 webman/support/Response.php create mode 100644 webman/support/bootstrap.php create mode 100644 webman/windows.bat create mode 100644 webman/windows.php diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..b72a604 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "saiadmin-vue"] + path = saiadmin-vue + url = https://gitee.com/saigroup/saiadmin-vue.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..675baa8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 saithink + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..bb6146d --- /dev/null +++ b/README.md @@ -0,0 +1,120 @@ +
+
+
+
+
+
+
+ saiadmin交流群(添加我微信备注"saiadmin") + |
+
|
|
+
+
+
+
+
+
+
%VITE_APP_TITLE%
+ +正在加载资源...
+初次加载资源可能需要较多时间 请耐心等待
+Kc(rOLkw85@DP06)Lv+;_z<;Z|9iK3oF!kCd&+|8TBczU)lyN?(aBns~}{O(Mo$ z#4NEUkPG5Mj9qEoT5h#33-xWvQ**pmIRoI7V|^KNxGTVFiTBQ`vrD5^cGtX;>%F(F z9Z!8VX_@@S?X8$x_m?vz;8n;~tS?P}CUc||uNF?5#gU+cDjz5qwQk8Q6duiWKSyMTEIt+l5;b<7_M6k`WyaHj_-M3i(@x<)q1F6 zRB;Mf$YWY^%Hvz%lyOuQUuE11??+_A?n=K^7G=X1oAPa0czS?@9DYc)CjQHb&cv;F zy>g~{c)`NmhqJI2d8zAqsbU@==F_#F-)G2EGHSPpG|Lu-8UNz*18b01SmBHueaO%P z &)jkf}j0){Fa#dE)U_l6e08k#jNOHGe^z zsl)SatK`t&LudbQW$5uAN@z0l(X{W1l7Sqz$y{57JnGWwafVMykNxUg_Tzc}%kPIk zen*_XSLp!j;(vLzTy`KIpkr|>#VVfFS+VX|M2_dWk|O8TQiJ({O=Ok+Dsrg&O3(+e z9u(u8wKKO!E!Q^3daRAuH`d^xj{wKQ56ktW8DlDk&ne$+E#skbHe_3z9LoB~&b0Gd zEOp2GSl92aqoIw{LjNr(-R+HpDz_KX#P`J_340m5Aud3_y#F}(vA|*w7*z#pHV5Mw zI3bh3Ddex;(^!|}DLfN=a+!EcxgZ{|VttZ#V=wM-ySOetN?z(r9|`iF_NITha#_N& zU=+TmwtV%Pud8ia<@6eyTRsz!`z`pcZj;c&0kSA=f~<&sKekr(bvSoLu?o)RaOMXW z7VeHe=f0-85bNhrXQeJsI|sTY{H!(8@k}6$ RU2;@>R36*spYOip_a|dr-;6GDe ps1V=S1vw2NdjZ~OK9r%I>xDmwKiq%HI56x`}D5{C*LiBCk6`r4J%H(n_a8& ztiJ3}+)Ce1_Eq_zv_G6#x-T}?Wo1PQ)?+X9fKR{+Ye2hT%@X9aa@}(JvRE2jHc2hV zbga2wf?Sef uW|me =<@r`>gEwq;@3+$HQCEvK9BbykmQ)t}4{5neewTLSkbkLn=GKOv zbj4Z)<#O =|L$x+QV^8jqjSvhwP zelvGVNYcF$a$*$n0scPbl58H;6 7EwMYV}tx-b&L!no9Le|iEVJM z$f5jC!^2KIDhtm%AYtkK44X#t*^JS4=%||GPHuycZ?&xGF0m!{fj{gHmCq8KdWQrZ zA0b=P|MeJuTV2uj`W)!bTO^}mtQ^VyQ}y <4oC z;tP^5_kWYv)cw=i7X5&^?{XXYRofdhrii3`_f(mONATgN8k9Z?CKn**DFpWXW%+5^ zH_DFcUQU^R#e6H~S}#10_$uO7;pz8Cz>$Y!Z`NNTM3QglTKDFC=&{_U*4X%_)rq9_ z%dB1U)3E4C6(NZORsJYBU@Vh9BZJfS+dWrueLbJO@>ms1g^zVXE^@2S_7%!k#uuoE zguxHsf8Y^GuAV FFvj{Y`Y$0f!?LiC($k!( zxhjySjH@zk6`pPA%fa|9k=5{&0TLcPsk}rs!86ix`JBDwetsR>ArkxjU0J`|urz7B z1SH-8CXE<7?WK^6+f`AVT5Y9H>YLg=YX4U28{m>UGV@$n*bcOdzoi99BW3-`f89hK z`|Eh0zRA}F*>h`F&7!v!9iP$=jJy)Y)U|J(W39?D$wrQ|$%B5c{d`?HhIj0<7EY-f z)BnIiX2B`tY6NmuL!!smq}KR-D3aOX*v2=Rhu(Vam6$WKIr%q-{G*3SaLQfqQQiT) z4>=(mPtCli5UU*3`|Xvd*L(a`&uenZ92S+wf-M-;aa#VSC|?7Q50TZUesPX*wBFk1 zj&@yN4{(jAwDO?ehaP;UE-Yyf=GVjD17Es5cZvB<$O#D~J7hyM$L&>lvb=Y_$G3S- za%#2%?NT|`IKRr%LhcKh4a@wtM5OkYfP+7jq)Wb^Ib`bf@z7h32B$yRbozt1z+)q@ zo(|^PBkv !2yr`?o(^fduj8X>c(j}~3{taB7FJR1Vi9oJ4Sq+CS9g=*H1RZ{& zF{3f?W0Ck?pYPfJJNC^x60-EJL%E;$(MKMUagRihM~tTna{9`mbFfd46B?Y3IUta& zO83+3T_FcsaH@~vRx`?NXF1iMr`<%oR249a_OL9 UV~AF?XAB)!<~r{|`?nt(INGzdm>En{_3eznLeCeim_ba&gcp$Wp{2 zo8>d({$I{F0UP9_RYpyIn{jKY)1T|eXRYVt=e0~$oLbt)*E|;QtF?h}EbYLs^zTXd z@v)L#5%z2P-o9CP`0H`Cj4ht7_H+)5d0hFT7>6|G+d(#J4%Gd}Yx1EPv9i;h`&LdZ zxzqNxvJN^6Ii)^LzZ%yKVm{T;{MiB2alRgR?wfTLm }gKPre>B~Q=XDn&Q}dey-k8ojF8QVzuie6@i*%Ze?6|2c}43}-cJsR zAEwqOrJbbh5&ONja!OXalgrk=i)~QtF!|KS=-(9HqaDaXPPrCfXu@z=cI4;Dmt@~a zjQwBByydS4k*!~a$cg)x9DnHo*L9A_!n(Q4>%e_xF?a+Enp5&%uh;MQz?N-L?Jzmj zZPJ|TcA{Rz(_jmRBJV4F|7(~_wVTfZaOkM5 q$#ha7#hlC}mp 0=$w@T~zEh5qT*GCKngT zS3h=edh>zJytj~;M=C;)XBwWxbt0Gx&GFK__jcLEG1in{y=i+jPIXKIZB=UlBQ6zj z z)~cZI6oqm%EaiR)+&i)8k{b6N`svL^D)rN)3D2Ha`I>25SC_1s`l)?9y}3ALe3$VG z{ vY!~FhXA0ki(zl_{gv1Y##RuO_FOfYXZnk^mXm6iBoM*B>|F=7XP7Ias zRIJ5=oD&@ T$?>)y)Ro*XVR4KR!*_6@?@Fw#d_u>CVgMR zjy@%+m%@MRu=Q_FPTA^9vVP=OC*Mg9P8ev|{AP~a6`Wdm=t*wb4t~GguW!C)9p2M9 zC~6=1h#^V$$&%RTEBHLBoA)j`S}qcG&+fCo{UYMjD9ksx)5zyUE@v|tN;b5;qB&`c z)%G0I*5})LPoJBd>byg(H=~VQ+n4L6QkM=tgXd5r4v{Yt-cAvTzM*TRI7qs&Jpez= zEm`9KA6(azx?Du2v1U0Lh~T^v*d@$4=A0AG W;Hxe$=3~sc+?}XXvTeR9_XFvc@4p znbWCr{jXpUjA)srS-OJNF6LCpQ}78LwAnLO@ck;L4}b82l;IM3ctZ9CS@gUk|D-!e zy0PCuS##{-M~ecYN2 XZUrt(a^7X7> z $qc zu?^4#I46PfmCvb$EUk6qo^%^R-SR~uhwg~IICBnt;z6gOqhbv_>ZVGbW}3NFn8#s^ z@0aD5-Ik%gsCm6%teW4;^IJL9zaM;m2;K|E+=PIm56Z@r527(vIAm$J5Y&BNQYl*p zt~&KrW>B25o}}WA_LTV?N7^TLP8Ew5UNxh7+mcms#nLI6YT=YJTFX-{Q}LZ4&{qTF z2gt&sQ}c5gmb~NenRXvP-Sthpr-^00|F$gQ)oSLzbL~5|9zJY+#>)*Iv?Xg`=W5Jq zR>@SCa0;IT=RYgInf_k$+)Ac`(-i0}u}{g-0w-sz<=WwA5Or6dJHDr5J;1prTTlOK z*@D<7B=qz>#`<>!&{L@cSh>?Wr`{?#X|khbDz_~^( ^hY@ej$e z<3CBP#PcsY)&q`D-7G!8`EKhHf0gcgbTF8>18a--6+b?26wky7fNe#anrrt3l3mC# z`qn8gDSH){R)(ysc9K!rWn8C4&5Hs5DsK u%y8oW>4G||ttLH_MSNg5gdee}T zWK})i)a2D32e6L)T1V}SEHyv7IQMq(PsZ9&=kAh)nfFRi!UO8r5%HJiggMsay%{O% znl_Wwd|CSY@TiwA1s)kA3sXj_=Zb` wYDzplAr$60RH9^l%cxw7>A)d}zA2Sq Q*80W*_!w-zZZ{+wW35}XqnOxy& ?M3>>_}N2KQ$>w z{6An`V%J`&<7_v355N!5w@g+&vODjCt>H%}fR~3cmvexz)*p0$X1-FZE=qPyoq+yN zj{VJj^(}n?+73fL6m$3J7v*!*@r>x;=*I+WV#OE8;>n0heCKBGQ%C!6Tn|u&rB{dj zdQIFv#RWt?iFL+C;TgTgd;m2k8C=qT#6n-^0@zwCYTslu;tXQ2TvG?WC2q-WL^huZ zfaB;Vz*^9u$;fj~LR{?R2 b`G!t I<;1*yQsou-?UD*zrr#hf74~s8zGH0X+9mYY`W+b4wBXPy83)gP=6_K(jdjH8Zw?-Mdn@^jCdSlr zW!byOi$9N8lk}4utOeM_Imy&xX`crj8!8KvhDn4P%LhnU!eEIwiM3Y~MoMVxLu&r= zq7#$PA1M0I9cRVw&$Qbd&nfBccmC#VA7ieZAHcP%3T5l~?7A=hE1|@5_Mx257VgaW z{qCjFZ=MQ2@Y30!T~l*HcfX$X)zN=Bv_I>!kkpERzagjjC)KiJ81-LAeE#OV|2J!^ z=_4R>WS4V3D`op2`a7#+-%!Sn%Hf}9Jl>Hfdb8ePN4p(8;OGHI4>)?j(F2YiaP)wq z2OK@%=mAF$IC{X*1CAbW^njxW96jLZ0Y?uwdce^GjvjFIfTIV#i9LWg;FW)S`{0=j zt^7IajZW!IKV o#p)4z5K 8!A-D__HnrUh1<@!skM*!ORyIh~edOLi3?Yr2+-;67c zcT)9Juc%km_6yjn&!d`u`2y_qs`-~Mz+SJKfB6FJ^{V-oFTh@()yMd2*&ZCA{$?0& z;H9zSWK`=rV6Qi;^#$m9v-$Q5(Di2X?H8cy&F0%LK-Zhiw_kv+&+4Q9nzs}0n}5ay z;I%ryNmrW}pzH0`<^`Db_U7vgFzfBj*B4;c+ncX1z^u17UtfS(pVjB`pK703kB$9L zT>vWhzLUMy{0*4(mTKbyjCxD+%?mK MY& zdkdzj^Eer&LF@DdG^@u|>I-OAk6zIi(5xOZUSB}7`r$HFUqG|^sdBfzfM)eGn)>NW zY*sG~x9AHn>i4Sl_m!Hy`T}NH`sWr@>I<;e_rpnMm=|EwXQ}htjn7UsFTh$q9F5d> zK-Bq-<9Si~0*rd27iZuc`U0%=>@@QNOdeG4qWSzqsLz^Qsm8JSxYz0!YdxEfVND%l z@~Ill=HnM(?yGjHUT5<)Lgw#6)fo50xB&e-;u+X{UO*Q2jrOa3 (QX$>SR2%6ZUm|mO-}qO58PjeG`~+Laq9#FSuOKJyosF(OSJ$ zIQF6s)t|a7QwXENUavZm?KS?cS&wVxAFq{vd-eIvdaa;bv)=s4U2*)?>a*~r{4>7x z^7m$`+Uu{MVVr2M{-i!nZ>#UB>uq_StM&8s)?eekU%`pV+tuo?;LzmuYV}uee%0TF zlLBRU%YL~0`%>@Nc_3l Qx8n%eB;N31*yWujY^f MvbBjrBbGP_;!Pn!VO9z6SOGA3`rD AVgLXD literal 0 HcmV?d00001 diff --git a/saiadmin-vue/src/App.vue b/saiadmin-vue/src/App.vue new file mode 100644 index 0000000..c9b4d2e --- /dev/null +++ b/saiadmin-vue/src/App.vue @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/saiadmin-vue/src/api/common.js b/saiadmin-vue/src/api/common.js new file mode 100644 index 0000000..06c01ba --- /dev/null +++ b/saiadmin-vue/src/api/common.js @@ -0,0 +1,220 @@ +import { request } from '@/utils/request.js' + +export default { + /** + * 获取用户列表 + * @returns + */ + getUserList(params = {}) { + return request({ + url: '/core/system/getUserList', + method: 'get', + params + }) + }, + + /** + * 通过id 列表获取用户基础信息 + * @returns + */ + getUserInfoByIds(data = {}) { + return request({ + url: '/core/system/getUserInfoByIds', + method: 'post', + data + }) + }, + + /** + * 获取公告列表 + * @returns + */ + getNoticeList(params = {}) { + return request({ + url: '/core/system/notice', + method: 'get', + params + }) + }, + + /** + * 获取基础统计 + * @returns + */ + getStatistics(params = {}) { + return request({ + url: '/core/system/statistics', + method: 'get', + params + }) + }, + + /** + * 获取登录图表统计 + * @returns + */ + loginChart(params = {}) { + return request({ + url: '/core/system/loginChart', + method: 'get', + params + }) + }, + + /** + * 清除所有缓存 + * @returns + */ + clearAllCache() { + return request({ + url: '/core/system/clearAllCache', + method: 'get' + }) + }, + + /** + * 上传图片接口 + * @returns + */ + uploadImage(data = {}) { + return request({ + url: '/core/system/uploadImage', + method: 'post', + timeout: 30000, + // headers: { 'Content-Type': 'multipart/form-data' }, + data + }) + }, + + /** + * 上传文件接口 + * @returns + */ + uploadFile(data = {}) { + return request({ + url: '/core/system/uploadFile', + method: 'post', + timeout: 30000, + // headers: { 'Content-Type': 'multipart/form-data' }, + data + }) + }, + + /** + * 切片上传接口 + * @returns + */ + chunkUpload(data = {}) { + return request({ + url: '/core/system/chunkUpload', + method: 'post', + timeout: 30000, + // headers: { 'Content-Type': 'multipart/form-data' }, + data + }) + }, + + /** + * 保存网络图片 + * @returns + */ + saveNetWorkImage(data = {}) { + return request({ + url: '/core/system/saveNetworkImage', + method: 'post', + data + }) + }, + + /** + * 获取登录日志列表 + */ + getLoginLogList(params = {}) { + return request({ + url: '/core/system/getLoginLogList', + method: 'get', + params + }) + }, + + /** + * 获取操作日志列表 + */ + getOperationLogList(params = {}) { + return request({ + url: '/core/system/getOperationLogList', + method: 'get', + params + }) + }, + + /** + * 获取资源列表 + */ + getResourceList(params = {}) { + return request({ + url: '/core/system/getResourceList', + method: 'get', + params + }) + }, + + /** + * 通用导入Excel + */ + importExcel(url, data) { + return request({ + url, + method: 'post', + data, + timeout: 30 * 1000 + // headers: { 'Content-Type': 'multipart/form-data' }, + }) + }, + + /** + * 下载通用方法 + */ + download(url, method = 'post') { + return request({ url, method, responseType: 'blob' }) + }, + + /** + * GET通用方法 + */ + commonGet(url, params = {}) { + return request({ url, method: 'get', params }) + }, + + /** + * 查询所有字典数据 + */ + dictAll() { + return request({ + url: '/core/system/dictAll', + method: 'get' + }) + }, + + /** + * 根据id下载资源 + */ + downloadById(id) { + return request({ + url: '/core/system/downloadById?id=' + id, + responseType: 'blob', + method: 'get' + }) + }, + + /** + * 根据hash下载资源 + */ + downloadByHash(hash) { + return request({ + url: '/core/system/downloadByHash?hash=' + hash, + responseType: 'blob', + method: 'get' + }) + } +} diff --git a/saiadmin-vue/src/api/login.js b/saiadmin-vue/src/api/login.js new file mode 100644 index 0000000..0a2f495 --- /dev/null +++ b/saiadmin-vue/src/api/login.js @@ -0,0 +1,54 @@ +import { request } from '@/utils/request.js' + +export default { + /** + * 获取验证码 + * @returns + */ + getCaptch() { + // return import.meta.env.VITE_APP_PROXY_PREFIX + '/core/captcha?' + Date.parse(new Date().toString()) + return request({ + url: '/core/captcha', + method: 'get', + }) + }, + + /** + * 用户登录 + * @param {object} params + * @returns + */ + login(params = {}) { + return request({ + url: '/core/login', + method: 'post', + data: params, + }) + }, + + /** + * 用户退出 + * @param {object} params + * @returns + */ + logout(params = {}) { + return request({ + url: '/core/logout', + method: 'post', + data: params, + }) + }, + + /** + * 获取登录用户信息 + * @param {object} params + * @returns + */ + getInfo(params = {}) { + return request({ + url: '/core/system/user', + method: 'get', + data: params, + }) + }, +} diff --git a/saiadmin-vue/src/api/system/attachment.js b/saiadmin-vue/src/api/system/attachment.js new file mode 100644 index 0000000..1164783 --- /dev/null +++ b/saiadmin-vue/src/api/system/attachment.js @@ -0,0 +1,27 @@ +import { request } from '@/utils/request.js' + +export default { + /** + * 获取文件分页列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/attachment/index', + method: 'get', + params + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/attachment/destroy', + method: 'delete', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/config.js b/saiadmin-vue/src/api/system/config.js new file mode 100644 index 0000000..f0b82b6 --- /dev/null +++ b/saiadmin-vue/src/api/system/config.js @@ -0,0 +1,138 @@ +import { request } from '@/utils/request.js' + +/** + * 系统设置接口 + */ +export default { + /** + * 获取配置列表 + * @returns + */ + getConfigList(params) { + return request({ + url: '/core/config/index', + method: 'get', + params + }) + }, + + /** + * 删除配置 + * @returns + */ + destroy(data) { + return request({ + url: '/core/config/destroy', + method: 'delete', + data + }) + }, + + /** + * 保存配置 + * @returns + */ + save(data = {}) { + return request({ + url: '/core/config/save', + method: 'post', + data + }) + }, + + /** + * 修改配置 + * @returns + */ + update(id, data = {}) { + return request({ + url: '/core/config/update?id=' + id, + method: 'put', + data + }) + }, + + /** + * 按 keys 更新配置 + * @returns + */ + updateByKeys(data) { + return request({ + url: '/core/config/updateByKeys', + method: 'post', + data + }) + }, + + /** + * 批量修改配置值 + * @returns + */ + batchUpdate(data) { + return request({ + url: '/core/config/batchUpdate', + method: 'post', + data + }) + }, + + /** + * 获取组列表 + * @returns + */ + getConfigGroupList(params = {}) { + return request({ + url: '/core/configGroup/index', + method: 'get', + params + }) + }, + + /** + * 保存配置组 + * @returns + */ + saveConfigGroup(data = {}) { + return request({ + url: '/core/configGroup/save', + method: 'post', + data + }) + }, + + /** + * 更新配置组 + * @returns + */ + updateConfigGroup(id, data = {}) { + return request({ + url: '/core/configGroup/update?id=' + id, + method: 'put', + data + }) + }, + + /** + * 删除配置组 + * @returns + */ + deleteConfigGroup(data = {}) { + return request({ + url: '/core/configGroup/destroy', + method: 'delete', + data + }) + }, + + /** + * 邮箱测试 + * @returns + */ + testEmail(data = {}) { + return request({ + url: '/core/configGroup/email', + method: 'post', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/database.js b/saiadmin-vue/src/api/system/database.js new file mode 100644 index 0000000..4f04cad --- /dev/null +++ b/saiadmin-vue/src/api/system/database.js @@ -0,0 +1,99 @@ +import { request } from '@/utils/request.js' + +export default { + /** + * 获取数据表分页列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/database/index', + method: 'get', + params + }) + }, + + /** + * 获取数据源 + * @returns + */ + getDataSource(params = {}) { + return request({ + url: '/core/database/dataSource', + method: 'get', + params + }) + }, + + /** + * 获取表字段列表 + * @returns + */ + getDetailed(params = {}) { + return request({ + url: '/core/database/detailed', + method: 'get', + params + }) + }, + + /** + * 获取回收站数据 + * @returns + */ + getRecycle(params = {}) { + return request({ + url: '/core/database/recycle', + method: 'get', + params + }) + }, + + /** + * 销毁数据 + * @returns + */ + delete(data) { + return request({ + url: '/core/database/delete', + method: 'delete', + data + }) + }, + + /** + * 恢复数据 + * @returns + */ + recovery(data) { + return request({ + url: '/core/database/recovery', + method: 'post', + data + }) + }, + + /** + * 优化表 + * @returns + */ + optimize(data = {}) { + return request({ + url: '/core/database/optimize', + method: 'post', + data + }) + }, + + /** + * 清理表碎片 + * @returns + */ + fragment(data = {}) { + return request({ + url: '/core/database/fragment', + method: 'post', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/dept.js b/saiadmin-vue/src/api/system/dept.js new file mode 100644 index 0000000..ef84713 --- /dev/null +++ b/saiadmin-vue/src/api/system/dept.js @@ -0,0 +1,110 @@ +import { request } from '@/utils/request.js' + +export default { + /** + * 获取部门树 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/dept/index', + method: 'get', + params + }) + }, + + /** + * 获取部门领导列表 + * @returns + */ + getLeaderList(params = {}) { + return request({ + url: '/core/dept/leaders', + method: 'get', + params + }) + }, + + /** + * 新增部门领导 + * @returns + */ + addLeader(data = {}) { + return request({ + url: '/core/dept/addLeader', + method: 'post', + data + }) + }, + + /** + * 删除部门领导 + * @returns + */ + delLeader(data = {}) { + return request({ + url: '/core/dept/delLeader', + method: 'delete', + data + }) + }, + + /** + * 获取部门选择树 + * @returns + */ + tree() { + return request({ + url: '/core/dept/index?tree=true', + method: 'get' + }) + }, + + /** + * 添加数据 + * @returns + */ + save(params = {}) { + return request({ + url: '/core/dept/save', + method: 'post', + data: params + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/dept/destroy', + method: 'delete', + data + }) + }, + + /** + * 修改数据 + * @returns + */ + update(id, params = {}) { + return request({ + url: '/core/dept/update?id=' + id, + method: 'put', + data: params + }) + }, + + /** + * 更改状态 + * @returns + */ + changeStatus(data = {}) { + return request({ + url: '/core/dept/changeStatus', + method: 'post', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/dict.js b/saiadmin-vue/src/api/system/dict.js new file mode 100644 index 0000000..ec49c73 --- /dev/null +++ b/saiadmin-vue/src/api/system/dict.js @@ -0,0 +1,137 @@ +import { request } from '@/utils/request.js' + +export const dictType = { + /** + * 获取字典类型,无分页 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/dictType/index', + method: 'get', + params + }) + }, + + /** + * 添加字典类型 + * @returns + */ + save(params = {}) { + return request({ + url: '/core/dictType/save', + method: 'post', + data: params + }) + }, + + /** + * 删除字典类型 + * @returns + */ + destroy(data) { + return request({ + url: '/core/dictType/destroy', + method: 'delete', + data + }) + }, + + /** + * 修改字典类型 + * @returns + */ + update(id, data = {}) { + return request({ + url: '/core/dictType/update?id=' + id, + method: 'put', + data + }) + }, + + /** + * 更改字典类型状态 + * @returns + */ + changeStatus(data = {}) { + return request({ + url: '/core/dictType/changeStatus', + method: 'post', + data + }) + } +} + +export const dict = { + /** + * 快捷查询字典 + * @param {*} params + * @returns + */ + getDict(code) { + return request({ + url: '/core/dataDict/index?code=' + code, + method: 'get' + }) + }, + + /** + * 获取字典数据分页列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/dictData/index', + method: 'get', + params + }) + }, + + /** + * 添加字典数据 + * @returns + */ + addDictData(data = {}) { + return request({ + url: '/core/dictData/save', + method: 'post', + data + }) + }, + + /** + * 删除字典数据 + * @returns + */ + destroyDictData(data) { + return request({ + url: '/core/dictData/destroy', + method: 'delete', + data + }) + }, + + /** + * 更新字典数据 + * @returns + */ + editDictData(id, data = {}) { + return request({ + url: '/core/dictData/update?id=' + id, + method: 'put', + data + }) + }, + + /** + * 更改字典状态 + * @returns + */ + changeStatus(data = {}) { + return request({ + url: '/core/dictData/changeStatus', + method: 'post', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/emailLog.js b/saiadmin-vue/src/api/system/emailLog.js new file mode 100644 index 0000000..eb66a11 --- /dev/null +++ b/saiadmin-vue/src/api/system/emailLog.js @@ -0,0 +1,30 @@ +import { request } from '@/utils/request.js' + +/** + * 邮件日志接口 + */ +export default { + /** + * 数据列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/email/index', + method: 'get', + params + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/email/destroy', + method: 'delete', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/loginLog.js b/saiadmin-vue/src/api/system/loginLog.js new file mode 100644 index 0000000..834b7cc --- /dev/null +++ b/saiadmin-vue/src/api/system/loginLog.js @@ -0,0 +1,30 @@ +import { request } from '@/utils/request.js' + +/** + * 登录日志接口 + */ +export default { + /** + * 数据列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/logs/getLoginLogPageList', + method: 'get', + params + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/logs/deleteLoginLog', + method: 'delete', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/menu.js b/saiadmin-vue/src/api/system/menu.js new file mode 100644 index 0000000..e15b39b --- /dev/null +++ b/saiadmin-vue/src/api/system/menu.js @@ -0,0 +1,63 @@ +import { request } from '@/utils/request.js' + +export default { + /** + * 获取数据 + * @returns + */ + getList(params = {}) { + return request({ + url: '/core/menu/index', + method: 'get', + params + }) + }, + + /** + * 可操作菜单 + * @returns + */ + accessMenu(params = {}) { + return request({ + url: '/core/menu/accessMenu', + method: 'get', + params + }) + }, + + /** + * 添加数据 + * @returns + */ + save(params = {}) { + return request({ + url: '/core/menu/save', + method: 'post', + data: params + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/menu/destroy', + method: 'delete', + data + }) + }, + + /** + * 更新数据 + * @returns + */ + update(id, data = {}) { + return request({ + url: '/core/menu/update?id=' + id, + method: 'put', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/monitor.js b/saiadmin-vue/src/api/system/monitor.js new file mode 100644 index 0000000..2e548d0 --- /dev/null +++ b/saiadmin-vue/src/api/system/monitor.js @@ -0,0 +1,17 @@ +import { request } from '@/utils/request.js' + +/** + * 服务监控接口 + */ +export default { + /** + * 获取服务器信息 + * @returns + */ + getServerInfo() { + return request({ + url: '/core/system/monitor', + method: 'get' + }) + } +} diff --git a/saiadmin-vue/src/api/system/notice.js b/saiadmin-vue/src/api/system/notice.js new file mode 100644 index 0000000..92aa0cf --- /dev/null +++ b/saiadmin-vue/src/api/system/notice.js @@ -0,0 +1,77 @@ +import { request } from '@/utils/request.js' + +/** + * 通知公告接口 + */ +export default { + /** + * 数据列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/notice/index', + method: 'get', + params + }) + }, + + /** + * 添加数据 + * @returns + */ + save(params = {}) { + return request({ + url: '/core/notice/save', + method: 'post', + data: params + }) + }, + + /** + * 读取数据 + * @returns + */ + read(id) { + return request({ + url: '/core/notice/read?id=' + id, + method: 'get' + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/notice/destroy', + method: 'delete', + data + }) + }, + + /** + * 修改数据 + * @returns + */ + update(id, data = {}) { + return request({ + url: '/core/notice/update?id=' + id, + method: 'put', + data + }) + }, + + /** + * 修改状态 + * @returns + */ + changeStatus(data = {}) { + return request({ + url: '/core/notice/changeStatus', + method: 'post', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/operLog.js b/saiadmin-vue/src/api/system/operLog.js new file mode 100644 index 0000000..c8cc459 --- /dev/null +++ b/saiadmin-vue/src/api/system/operLog.js @@ -0,0 +1,30 @@ +import { request } from '@/utils/request.js' + +/** + * 操作日志接口 + */ +export default { + /** + * 数据列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/logs/getOperLogPageList', + method: 'get', + params + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/logs/deleteOperLog', + method: 'delete', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/post.js b/saiadmin-vue/src/api/system/post.js new file mode 100644 index 0000000..31decd6 --- /dev/null +++ b/saiadmin-vue/src/api/system/post.js @@ -0,0 +1,77 @@ +import { request } from '@/utils/request.js' + +/** + * 岗位数据接口 + */ +export default { + /** + * 数据列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/post/index', + method: 'get', + params + }) + }, + + /** + * 读取数据 + * @returns + */ + read(id) { + return request({ + url: '/core/post/read?id=' + id, + method: 'get' + }) + }, + + /** + * 添加数据 + * @returns + */ + save(params = {}) { + return request({ + url: '/core/post/save', + method: 'post', + data: params + }) + }, + + /** + * 修改数据 + * @returns + */ + update(id, data = {}) { + return request({ + url: '/core/post/update?id=' + id, + method: 'put', + data + }) + }, + + /** + * 更改状态 + * @returns + */ + changeStatus(data = {}) { + return request({ + url: '/core/post/changeStatus', + method: 'post', + data + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/post/destroy', + method: 'delete', + data + }) + } +} diff --git a/saiadmin-vue/src/api/system/role.js b/saiadmin-vue/src/api/system/role.js new file mode 100644 index 0000000..7802472 --- /dev/null +++ b/saiadmin-vue/src/api/system/role.js @@ -0,0 +1,109 @@ +import { request } from '@/utils/request.js' + +export default { + /** + * 获取数据列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/role/index', + method: 'get', + params + }) + }, + + /** + * 通过角色获取菜单 + * @returns + */ + getMenuByRole(id) { + return request({ + url: '/core/role/getMenuByRole?id=' + id, + method: 'get' + }) + }, + + /** + * 通过角色获取部门 + * @returns + */ + getDeptByRole(id) { + return request({ + url: '/core/role/getDeptByRole?id=' + id, + method: 'get' + }) + }, + + /** + * 添加数据 + * @returns + */ + save(data = {}) { + return request({ + url: '/core/role/save', + method: 'post', + data + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/role/destroy', + method: 'delete', + data + }) + }, + + /** + * 更新数据 + * @returns + */ + update(id, data = {}) { + return request({ + url: '/core/role/update?id=' + id, + method: 'put', + data + }) + }, + + /** + * 更新菜单权限 + * @returns + */ + updateMenuPermission(id, data) { + return request({ + url: '/core/role/menuPermission?id=' + id, + method: 'post', + data + }) + }, + + /** + * 更新数据权限 + * @returns + */ + updateDataPermission(id, data) { + return request({ + url: '/core/role/dataPermission?id=' + id, + method: 'post', + data + }) + }, + + /** + * 更改数据状态 + * @returns + */ + changeStatus(params = {}) { + return request({ + url: '/core/role/changeStatus', + method: 'post', + data: params + }) + } +} diff --git a/saiadmin-vue/src/api/system/user.js b/saiadmin-vue/src/api/system/user.js new file mode 100644 index 0000000..524a5b6 --- /dev/null +++ b/saiadmin-vue/src/api/system/user.js @@ -0,0 +1,134 @@ +import { request } from '@/utils/request.js' + +export default { + /** + * 获取数据列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/core/user/index', + method: 'get', + params + }) + }, + + /** + * 读取数据 + * @returns + */ + read(id) { + return request({ + url: '/core/user/read?id=' + id, + method: 'get' + }) + }, + + /** + * 添加数据 + * @returns + */ + save(params = {}) { + return request({ + url: '/core/user/save', + method: 'post', + data: params + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/core/user/destroy', + method: 'delete', + data + }) + }, + + /** + * 更新数据 + * @returns + */ + update(id, data = {}) { + return request({ + url: '/core/user/update?id=' + id, + method: 'put', + data + }) + }, + + /** + * 更改数据状态 + * @returns + */ + changeStatus(data = {}) { + return request({ + url: '/core/user/changeStatus', + method: 'post', + data + }) + }, + + /** + * 清除用户缓存 + * @returns + */ + clearCache(params = {}) { + return request({ + url: '/core/user/clearCache', + method: 'post', + data: params + }) + }, + + /** + * 设置用户首页 + * @returns + */ + setHomePage(data = {}) { + return request({ + url: '/core/user/setHomePage', + method: 'post', + data + }) + }, + + /** + * 初始化用户密码 + * @returns + */ + initUserPassword(data) { + return request({ + url: '/core/user/initUserPassword', + method: 'post', + data + }) + }, + + /** + * 用户更新个人资料 + * @returns + */ + updateInfo(data = {}) { + return request({ + url: '/core/user/updateInfo', + method: 'post', + data + }) + }, + + /** + * 用户修改密码 + * @returns + */ + modifyPassword(data = {}) { + return request({ + url: '/core/user/modifyPassword', + method: 'post', + data + }) + } +} diff --git a/saiadmin-vue/src/api/tool/crontab.js b/saiadmin-vue/src/api/tool/crontab.js new file mode 100644 index 0000000..7ca2b9a --- /dev/null +++ b/saiadmin-vue/src/api/tool/crontab.js @@ -0,0 +1,113 @@ +import { request } from '@/utils/request.js' + +/** + * 定时任务接口 + */ +export default { + /** + * 数据列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/tool/crontab/index', + method: 'get', + params + }) + }, + + /** + * 日志列表 + * @returns + */ + getLogPageList(params = {}) { + return request({ + url: '/tool/crontab/logPageList', + method: 'get', + params + }) + }, + + /** + * 删除定时任务日志 + * @returns + */ + deleteLog(data) { + return request({ + url: '/tool/crontab/deleteCrontabLog', + method: 'delete', + data + }) + }, + + /** + * 立刻执行一次定时任务 + * @returns + */ + run(data = {}) { + return request({ + url: '/tool/crontab/run', + method: 'post', + data + }) + }, + + /** + * 读取数据 + * @returns + */ + read(id) { + return request({ + url: '/tool/crontab/read?id=' + id, + method: 'get' + }) + }, + + /** + * 添加 + * @returns + */ + save(data = {}) { + return request({ + url: '/tool/crontab/save', + method: 'post', + data + }) + }, + + /** + * 删除 + * @returns + */ + destroy(data) { + return request({ + url: '/tool/crontab/destroy', + method: 'delete', + data + }) + }, + + /** + * 更新数据 + * @returns + */ + update(id, params = {}) { + return request({ + url: '/tool/crontab/update?id=' + id, + method: 'put', + data: params + }) + }, + + /** + * 更改状态 + * @returns + */ + changeStatus(data = {}) { + return request({ + url: '/tool/crontab/changeStatus', + method: 'post', + data + }) + } +} diff --git a/saiadmin-vue/src/api/tool/generate.js b/saiadmin-vue/src/api/tool/generate.js new file mode 100644 index 0000000..4f0ab17 --- /dev/null +++ b/saiadmin-vue/src/api/tool/generate.js @@ -0,0 +1,135 @@ +import { request } from '@/utils/request.js' + +export default { + /** + * 数据列表 + * @returns + */ + getPageList(params = {}) { + return request({ + url: '/tool/code/index', + method: 'get', + params + }) + }, + + /** + * 删除数据 + * @returns + */ + destroy(data) { + return request({ + url: '/tool/code/destroy', + method: 'delete', + data + }) + }, + + /** + * 编辑信息 + * @returns + */ + update(id, data = {}) { + return request({ + url: '/tool/code/update?id=' + id, + method: 'put', + data + }) + }, + + /** + * 读取信息 + */ + readTable(id) { + return request({ + url: '/tool/code/read?id=' + id, + method: 'get' + }) + }, + + /** + * 生成代码 + * @returns + */ + generateCode(data = {}) { + return request({ + url: '/tool/code/generate', + method: 'post', + responseType: 'blob', + timeout: 20 * 1000, + data + }) + }, + + /** + * 生成到文件 + * @returns + */ + generateFile(data = {}) { + return request({ + url: '/tool/code/generateFile', + method: 'post', + data + }) + }, + + /** + * 装载数据表 + * @returns + */ + loadTable(data = {}) { + return request({ + url: '/tool/code/loadTable', + method: 'post', + data + }) + }, + + /** + * 同步数据表 + * @returns + */ + sync(id) { + return request({ + url: '/tool/code/sync?id=' + id, + method: 'post' + }) + }, + + /** + * 预览代码 + * @returns + */ + preview(id) { + return request({ + url: '/tool/code/preview?id=' + id, + method: 'get' + }) + }, + + // 获取表中字段信息 + getTableColumns(params = {}) { + return request({ + url: '/tool/code/getTableColumns', + method: 'get', + params + }) + }, + + // 获取数据源列表 + getDataSourceList(params = {}) { + return request({ + url: '/tool/code/getDataSourceList', + method: 'get', + params + }) + }, + + // 获取所有模型 + getModels() { + return request({ + url: '/tool/code/getModels', + method: 'get' + }) + } +} diff --git a/saiadmin-vue/src/api/tool/saipackage.js b/saiadmin-vue/src/api/tool/saipackage.js new file mode 100644 index 0000000..8c7c2be --- /dev/null +++ b/saiadmin-vue/src/api/tool/saipackage.js @@ -0,0 +1,66 @@ +import { request } from '@/utils/request.js' + +/** + * saipackage安装器 + */ +export default { + /** + * 数据列表 + * @returns + */ + getAppList(params = {}) { + return request({ + url: '/app/saipackage/install/index', + method: 'get', + params + }) + }, + + /** + * 应用上传 + * @returns + */ + uploadApp(data = {}) { + return request({ + url: '/app/saipackage/install/upload', + method: 'post', + data + }) + }, + + /** + * 应用安装 + * @returns + */ + installApp(data = {}) { + return request({ + url: '/app/saipackage/install/install', + method: 'post', + data + }) + }, + + /** + * 应用卸载 + * @returns + */ + uninstallApp(data = {}) { + return request({ + url: '/app/saipackage/install/uninstall', + method: 'post', + data + }) + }, + + /** + * 重启后端 + * @returns + */ + reloadBackend(data = {}) { + return request({ + url: '/app/saipackage/install/reload', + method: 'post', + data + }) + } +} diff --git a/saiadmin-vue/src/assets/404.svg b/saiadmin-vue/src/assets/404.svg new file mode 100644 index 0000000..e21be4f --- /dev/null +++ b/saiadmin-vue/src/assets/404.svg @@ -0,0 +1,176 @@ + + \ No newline at end of file diff --git a/saiadmin-vue/src/assets/avatar.jpg b/saiadmin-vue/src/assets/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2016a99ebbfa797bc5c42077a52f523e8cdb3d30 GIT binary patch literal 36362 zcmbSyWl&u~)8@qq8r&sZ^diCC3GVI^+~MM`0Rq9@-R%asI0>%7-Q8Ui{Nvr-`nGC+ z?e3g9zs}UDd1ktv?tZ%GZSidr@KH`mRtf+E0|PL5e*kYQ00{sxA|etZ0x}X3(uWVo zC}_CoXsD=YMA$f(xMai>+ Hcn1X3OYU^UUoqi4o>#} z`~>F1hYx6|XoTqKgzTS4Ke7KmkGC!W7Bb8&%q<)Y6#y0s1`Z46tq(u}0Kg!;ul7F+ z{$B$I77iW(5efMN3hMg==tlr73>+LRJRAZ7JpB7?|M%|zcq|0$Pi$g{II3TfsKB`F z!3hP(K=Hb6JhiDyY7SGEkPj&M1cXGyG_-W|3?NP}ZXRAfeu*!VQqnTAa_SnITG~3g zdS>PpmR8m_wytjO9-dy_KB3>j!Xv&%MkOXCr=+H(XJi%@6_=Ejl~+{OH#9< yp zSns%C;o;%nk^X}V2G;Zag~NhJ_{4^YEvAa}6^uj09*m4Do={NN{Q=0Kc8O=|GKGRq z&ACN$^&e>e1KIx_u#o>RWd9B9f8$yPpuxesA08YQKm;)0U@D-ypDG33=L47}`lA~{ z7tTr-lYnQ=o^S)awYK!q-%D6+Y{{At`(knEeyhI$PHODP^aKp& *?PvCPJIke0=1_b`J?F#^DBtT6asRFvUWA&w z&RSVpgs_KF!_$dmaQ$}O9IBPa|JX`LeFi5|qF%aGIjARCeUsOi&&b5ilvp<6I#VXs zX(Lqe1*<=d!poDkO*eo{GIZ}#^a0%{NTjENr?;YzrYLty_7?C407^HcM5j^_@UFS~ zHJ1(9z#i 0i?l@H$4WOTrl2Vbv_h#u`rdA)!t|0(M? zxS0KluEoGwh!V=ebRgfut8290afV61-ULVA-&e6A)Xy<%v9F-zpG_$7=Q%RO71&KR z$fD?{iJZZT 8;32b+iK+a c8eUW9B;U4fEC__?{aK4Q`iLH}`Vx1(gSQ1h{l- zB4GIp>*8FH?yB*e) k=7@Xw5)VsD$K*n^r*$6B+U7rWE52h zM;I2DD D I J@EDEGp53+w(Ne|vAb%MGYi+pPYW z@(O+b3n4XC$Qu2)dmwxV9OF!9m%DZ#bu }SNZJ}1p^liF4Ih|F5KL{ *TVPh}A*QeIMH;Hx8bvao_R%*JWyAE3 zXPr!ItmugJp4J&vqHb_ZthC&prn=^EcLAl|ZWSMGsnl1wPtAm6J$Gd;iRk)09zK ac3GYK3lhg)U*O_F-@N->NcU z?TRoz5&jw1;oVr?q)!+~Up3Z6X;p%Pq$%g;%gWY|(&FF~9-{cPReL|zm@3kq AQLNqZ)Mp|IjbAx^^w+iv z%1%zDz|5J6cR~{eo;fbq{jky|}HjtugH=&GI8isA1t>LvoUN_P>yqa&50GP8QZ zC8^^D`|~0xDe)0)=b;I(A!3FZ^K%t0korz2%-fBeW_F*MMYB+>(UFYp$WS{}(9_d( zTb_&?S2A3D-4$<`SIz5oS5+CKM1ZHD#BaDKDOtP2mo{tb@QjkCn3;i0T1 *Q(OC>q{YW_c#J+QeGEa*NJ92Jb@-} zhA!8$kQ{JL{ab$nC{FLn|M-! S zrnhCRzca2R+)7EKNElM^bz&$WMdo@=P8s*eB^AXoEHL7axa)&ubuW`Ez1JF<%n+z+ zUWu6ut53YF=g;qttolfIK#CkIsTNToM9{|fViKyjr)kWY%<>2jGS{4#Z`qHGkvp~1 z@3raDPCy@qS}D?VCf86ymO7R(VPo}v*DLsIbsK?LPp#@3LgG6J+PV$C4|y{7K5eTG zLPwEHxvGFgL((vU^p=srXf8XV61y!DfbATnpLe9k_MquF)kmPXep&xW=}fS`B|#gl zyk(I5dFI@#tu>MUc7P4}Y<-^OM_eYu$1pU+`Be(uZeSe*z2eI?J&a)*8S7xwuRtn3 zWuK|-t1pBNiT)JBjb &AH~E*5LSBve zkW{Zp9SKGH|1BitC_NNi=U#6Wty3?X^RDx*#TolV$(FQc>}N`+O7U5FFe%SwDtSuC zSkC+nXFJL~dL|K0bMO{iu1#{NkZv#) F=N1 z6*h3%G3uY_S~{?=#bruk 27)1RAsdN|h`!{AmI^?xjA|J$P3o zO!Oto_&1m!{ZIQsAn!wKIZI91>+G*+bH@bz;Nfx18!ndtxT1d*Kr8Wjae4R@9e|Yg zvJz&q>U!&3M#^&Cs*WOau_9}9wY77%u)3Z{E@>PtLC1Je4l~t0-Gi_FTjjTVs$S^JDVR9o==mYn!)J zOwq7Pws~&Re9^+$^Qg{tq&x=$NLnm5^r|TJ3wLaZpUDiRudJF1ZbJyGDCt2a)m8TR zlOWXNcE!lp>b@MIm(`*N>#wtm6rhF?sU@<6CW8iq-0K=WSC!=E!}CnzT>pAM&yHkJ zBg|~4*aDx0EPA&YD7X2#;8KE_Za`|aKh9_aB@&I1P{cLTL965Dq0oaJI?B9}<-^vk zKX|Hn11vz;uh5r=Yu5C2SCt(@lhL|1O|(|iGR>RnKNxM1bB+82L_Y-^1gtUKRqW-d z#w+dx4z{f{?c6%GKWrzRbMWXjHO}nlS4Hl!pLc=y%oa(tIXq1+4JDle+}%ev-6nj_ zp7qO)w7IGMI}2b^LPv>A*cQX!4{odHbe>oIM+f8CF#~U+TEyh`U90GI<3M?fspH72 z(G^{1igN`zDKyymLr>Ye+ciT`_lW>;1j98Uz6vNZP5bm$U6#UdII26rAhG9%eo$Ql zOZ3BzYh*@ui{O3v&C?v7qc5WyR6o>h-7Zxn*BHs>ZlcrbT-b|zE+!_UxQIs!K5#-y z !aKZ8hu;Zt%#_fe?kq^v>R zmU6^$Ktn!lLB-mt7 F-kmzD_klFVxFK7j6~DyWspJ^zs+ zl}jgF1avCMd)ZsYNp2cSTFa`Rs}xw{J{gr={fChUd5v6xuIIZ%PUdWsw2ggsAn2e& zeKYbFw;}6n(oou2E|mBukh~S|)-N(qZYvl ?@l>5gV9LeS9O~rb$0g zG cg?=vQavo8HK_8tS4xMy$fe1^T2Tj|F4S_hIljF;xtqBKcrgL4?>J? z6U=J@98%X_%iAJ(0 +m?qp+T?68}khUrMPLYHeQd9oiU%|Bw&P1jJ f@lt9_ZpoIlHnrWL{+e5^ z_8w5=VlmX((;bx>IA%MJsWO}>o1p4vsy=EmEhF0D%Att7TN5^otXwZ*;3N0N${Vk? zC2r6+dQdG`E<@}0c>%5U&&oT}CYPh}!eiL+oHcJu;*=d7yZ$B6=7&DyZtK$Kiu1?< zQ!Sqr6+K;=5~S)t4K8F8yuvBXI0Ny_gYg+FEr3vw^lI;hN?Bg|p92`80CQqlo-0NI zcPIBqQ{gqVdeWl)5b)%j4i`y`fGUT$%&Erh*9*Nz^%bT71>Xfacwt0o*9+BODP_aX zhvi#A!w*m7ci8nFbt=iJ6-&ubGK-6K9=6j(*)IG2+M~7*gV$XkqH3bAM&1&)hjZgQ zO%uKx4N)j)dYv=Xq BC4A$8Sq8^DUBCQsil1?~9Y&Cg3GOi69$fF+jxWXX#2xNVo!XH1nO__SW=FLSzX zY*eA=cZJo9cHM4Q(4Wo9a=Yv=8{jW{gpToP+itf#)L7ZcdpY9am8Jh4;lCNT%bH!M z&genIHx-48R^=^D32$31rnb)J$0l^6D&vPvN-FMFCI#PBW>Gta@|`kJ#r??v@;#)Z zByWfj-;)C~d*HD3S9qCpGCrXNiu6PkfpJkenCmi%NG;kk8E&{{wFI7q{UBItZ8@=K z;_N=yWqE&4l8k508*?0|Z9Fj9nGdIiYDvj4Df9F`GgEh5k=5%ClDdq2L`M7wTPtGh zvv`$K?5X#D@`68E%&+BHkkMpFcXID02r7B(BwTy>*J|UOjouNF)^4oVivGo0k>9Q% ztjuU^_gLlVGQNcH|Gq3OF{AgjAb`ns)D( IV2ugj@*OI>~g zL|F0?`;_{eIbBv*{<@sIHnlzgMF0q>(H>##f;%qv%SzX?zD2)eIggr~WBZs*SL+`U zq$MKH?=rp9I+In6K<&32&qY7lV=(6xrhQ--mi0QR<;!>tD4w6~4FF&a{vE0{?e(iE zk;eX%sTgsv#27mBc~qJ+czG>$hFbI|QR!()U#*AnW$cj}+F%Xk#bjU%Q|?Fk6vDY_ zv1pSWya ^6%| =K)N8jPqF`)7< z`ha}xsBo>czPVKaI}-YnA8qb}0QBHk8R62$E ?dz5d6)91#^%AMXMnqT`xgUKt?l?68P@rBE(WSx8?xs+VPQj0=a6IhN^H zw2X0{vSB~<$w|`lb~3X)7U@JjSzRF7#-BNN{L<8P1P8(w*69-bi`VMW`y@Oydp!jg zC$|m#Fw%g)=ZPTt?3&q6V^*p#H $1SxaR(DuN3Ab|1g=c=!tkybR{1ujVm8deL`+0Zvb&|K7%WVo zEMS0+?Da`o3M*;h#Aq~sd5J6gdK9IBh+URQ2*Eow|LW+K(zvlK0Z92NrwcwbZ!hyU z4{2@1NO$#ni7raZ_%x>Ndh8>i){1)IPy^OEvPbY@f)Uphi_R$v6i-w%&2du6MK0=| zmM`+EJ@(&`5zbYthcTA4Bj$P-jiA5uZ570mgiY0!<#6+3s*0FMm_cwotETdiZvI{{ zDfxCyuNx9l)SmU}w*)Jb-Rsg=K);kl_eE@ndZ-f@ZRn-4Z7NsUAO#+MTokIrw&IY# zuV$5%qgEcg%vUrdU=1pRfvIz8-h`GXqy}R2iw6A^? E6ndRte*OG2 z9U+4EzE&5?2XD&hTovuM`>3hQVwuF}S?SJcgL67J<78I;q*&6yU|&t94aZjwN393XLE$}P8d2!vs!8$IZI$weV`PYm L$y1e> zAiuKK^5V!M(G|=V-00IG7Q)fbqA>6FwOoOZ2oMD8#`Z^Y37%^qDBQx`R4EM+p%sUB zA2XVXwYJpDmdQqc8t7U&IScKs7FMR7?KuZy_jf$lx)4C+e~af&ds?Y`LJS&Kxcjx5 zkt|Pnj9SkO&Sotw+09d{*wCk7eWUCEyj&QHoyziy5=jnY5ESb+=DV=HaY*$Kx*y+n zP>8ak50D@SI;LZ17tf1d5=CoLQj#14)#JuXryWXKXXlvDzlNw_3}pKi-wv?)9JCZ^ zX8u)5G-UDk-r *7McJm!AR$AT67*(rP+bK(s!UzlZ9!&QtR z_}!Sfon1WE2ji3@&K6WHp4oKZ=?&hs<5#aFJNbmxl@J{7U24aJv!b_R804wH8d6PB z2E5y;akO=|$^0I2s`p11 }0}VHMyW)XGcG`&C;Ke(icSTEr`LtfD3jz zg%qSUDw`F|K+&C4bBtz`c#!j*7L}Ea!kf3^v?eYZvwrf&RLWA6xV{o(J`Ri{OURN| zqBN)W!NnaJ8rD{nkMX43H>)>$jt{iY7BS;+9B5P7Tug8B&76z>#TJ)+1EBmki-C^; zMs8E?>GZA~WzO2I8Q7b*!MnC63?3*eYU{$$1P^z?v)Gguw33#VRY_NNbCnFWTrUxs zrEJ@9WAksq+ErXaPqA%W^uIk65viD10R9R_MW`*fx76sYbdx4IqU7gO)&b+@^PFmq zb5*c)dRSmX4ynd5H*FMs^Gj=ueDw{b=D&1|DyjAqN5o4@L=8>v{hW4Vt|%8{o}dyX zb$bK2X~opmRM1Q-x|eh%)YokgKR-Mlqpo!FlO$Ws)MS(zuy~=lPTb)2gKo_j`3TOm z#Vo#~!!C*+Cn(Z;SlXLlcyTqu%VB?n9V0YC{pfM Q?J3pAwo8Yf(7nKZBn%XAhpOe<}Qx#pcx(2b%n5I7!H~ zilCZ-G7cC6{Tsv~gaOE#R%O5JaCBrgp=P8^^)hfAX+r1%-TYCDGNqz@)YKpO?`zxj z)kPu~Z;`9dn9Ws*lMkYa pfU;sw%2`19-+;5czQy5>#wIw`k|kxS @s~!)m0+@=` gMUsXh6Yuf3-RSAA(%IK8)vu?dzHK52iLqvm*&JK zUNwpOElUx9{@}inYNm!*I7`L2iPyqP;Rg9TW9pp;l?9K{Nqu&i^QJNP;{I({DGM4F zB(VMSfT&^G1#reZFg)nq_bQshb{M|-L^2>ip?48&>k|~vhzxuK 7mOF& x0-g1a8(mPq7QTLgqoM@>a4~N** zf4jU}gb%C`8L6jg2WOLdQ0PVUX~UA?Yo$y~e0v^K&?=er2(`jtq@3B21cC*lZwx8I zwgz&qtu92aYx&h;_#do*cynI1=i~F^%KZDB2`lFfX0UAuJ9vVcq~I~~ewDFNvrZEZ z2k>o89JZl^t2ados4aMoui8J??ozo-jvKDDF?`$szA<&Gb4hK}sT+i8{0i0NzURJT zNaf0YFhgPI&c0UEZl37_aOU}4x1NHmLb!qBdA})PUIhc7I63R#mk~^cBcEABWx6z9 zk1rYE<+EE?1KT?C2B#rdrcvE^vA($?39rc;R8(R?_yZrv0&_vC3XxdI%LOWrW^^|d zeUzkFvA$7}pAsTfWZ|M~l@F2dK#LPGD+X3`B9FJjboi4LTL)#xKCkZPx+`^E;=H#a z^A$BY1Bilu;?9FaGAcA#3Lm dD{}nVLP8}IM zQ~dkEo${kd`^i5ok0t}77SmQb0c}AatINXORA6i5_}mZh{eCg4cTjwZGI;WZQA9a{ zg>ZML6v^jkYjNr NMEJ-f5Nq_X(}-{OGJ082#~@5j$KfLwyWR^h}o*VM)$ zbzSOr3d1s}OPZ>wczQP(LxB?ato>DALcsYJHPIn%=wnm}TkD)N|BOso--?BLh_8u? z_=dWn)JF{*AFXd%iCoM2_$ms%!?)G)t@>wZ`PmGE^F@h<%5tTkJi0cf{=&r dn+b7LI(|@98U4X?+Q*s8IL(L9 gRp^NgjVF^33FG>!X!);izc?mK z;^bS<8-}|Q=}@}|1&OaaQAE?Ki(d{mkggzdomUHC=eNE&0 B%t}hLD0PUg@@9@|+z?C4JP{a*H zS)$)Y-b}7NQ8ieS+1?y3%8PJ6UcGxe2m>q^!CO>bM&Ff>G(C-?J{`m=Xhj*$|49X;xxF6+syr(z(<3id8rLt(lt% zp8bjne|*}<^jAQ |Dkouu+CxQ$p?3NXvhl0 1Xk- Pe5nUA)r)@WmxzLhU(!xL`OY`(=#Gx6LE%x{v)9H%fhc1s(r?rFNDCup<(dwmeF zzz3P2g*cZdB7{>q3*ek+3(7)}w|wQLM{%Hw eb#i}ncYL*xCbps`88ZI)kwK!-&Vty(KGC6b zOuQ-w%q1!^Vl@{SqLqJvd6)I`PZl=m^mOsILQ}CAI*$v2WuE5l>SYc(184?&!vW84 zfV&&D-cm*9)>s0Iaa33UMWmoc-2@7MUYheJdhr`Tulc3yqXFdd4S*Az*P9q9Crdz^ zfa?QilJUiBP%w3(1sIjAqbDxj07=j7$~#efQeN&t6i8E_2>^(Qf@FHW0c|8HR^dc8 z8NXN#X27|l*Le+%vz^Pr;Zfw+k(RyCyek^T6qE06Sk??9C}pSoMq6Y{VX-Q1jRS6m z((GA8&y?oriz{}OU{I{s4n_Ql%8ws~2P28=F1~?P;D2Bl( W_?C8|%^n=Wekax*< z-T*b)i`Cyb5<+K04xV43MrJthPHkRzv~64!f5yWwW};(@JxdzJ|FT_mQRbC6Oqe;b zjlTrl I?LKa|5w#YUv;=P^nPGr)(Is_* z_FRhKC{l1M5&7XH@hLbAm0L8 zHJ)w$#eK$ SFME! znas8^m4QV(p41)jXO;2Nk(sSqYwwfom@+%X)9%d9ynS9UD}{=r<)|gr&mjaw2Maic zHA31#!U&-lnh2St*kcCa-KY%-< bo2KvemF}aGX=&Odp z#70e(33OMF`8iXY64FwZoRQ{RU)Tr!c2CEM?=R1fcYlwyF;8yD&gFMIfI5oRtRVpq zn3Rx4H9Krd|AiV{J}pX`OtU5E+ty+t2}48EpsC*%(w4->V&|P$?nc9As#$8N;qhgz z#Vmo8=L7E*3vCfpK~;NHXw)B{*Q4&57gWgwH)H&M56<@R73^BW4@9V;M)_PTePRbI zg}KjIa(=UoG7O^`)_yylTPG(34Bi%;)PerUFLv#d0Uvv-4(I<)ugeo tFrq7*RauOXn}GQ zP6#W6ncT^3KL=2>s&FPQ ymoDXWD;qCk%gi*jHAu8!~TbYsl_rQj=ivUPT6p)mYDl$v2uA zFH6W<>!$T)hJId?NP2lR_3~BGMjA1GI#rjdD_l210_ZWk zGad9Z(U{?(Fgj@|edo5)MbTL&X%9iDEi= 6dy`NK3gaGsoPS(HKzm-b59*#XHg_^iELJriflkC zj&iXpXtjbY&gq!3aGJ?Hm5K~Q1slVQjPJRtI{mYm4Q~4>5z%gFT!|++MHCSkJ~x6a z2t0fgZ8anOt1 IMPwkzk`S|$m0mXYEwJ20(I){dH zMbJeV%`WxaEKQ~jO^Ax_4p+N^?p-FN5|YwV0VlNFNPf0|!d#Soh${$5`1BA*l^5q@ zd3OU? 5_zpoA4pU{stFIkH+roJDtetoe#gf__R?XHS#ob@B$J&X(Ww` zmBnTE>xI-vz$`jlye5Bg%GxLMXDI#hdii`zo#ENC%KtdK>cPZkQXC=zG6K(P+Rzy@ z|N1&JpL73hS@`S2oB@*y1@5l(GXY1e+$hn`%ce+;$ssGJ9!+6xDXa3%n1i2^dscTd zsF-41@(oagU#)kPs~FY-S1kV=_TgAiHhfR0!b-!Vs7K%T^7N{$#SSO4z zx~eJ7!Ftf#{3xm^Q|cTN*Ar`w&pPMawZO4Waz7)eTGm$g!39l;V Nz>?fo8p7Amr)=N{Hx%?aw)XuXt!t0zVmLEg$F0z^1W$jyBMrsaVBpevO zn#$ty6jE>iM<-~oaOUxiMv79%U8T$lnz8t0jjrWyCW^kgLCU?>Xxw7&uVzVMbzGHH zvYQhTwAg%r3u%%Td<1a7<;E=@Rs`4sYM+I8Yo1@M4q7 jp2$*v3pP!mHXAv^6e8 z5w2<#<0R~@v-9Pr%deMgR9lDvP`SNY7Bl)82%U)60{LVA)>Elm6>UxVy$#ZqY+GuB zNfGKAaNcdqh~5ETAdO}r8sfv^uCv!_DYZrfFu8-UHn+^OQnz-p4sP&H?CH;|_og^C za^~Oi5sIW}*Jtlo)nP6TXn*z(5kKvUOHZ0FmS?Z#*} $YO9|5z!eI&KGimjr64 zErZG3?N8y#@2f%Ls(K_dRrsfaU!?su-Ae5AWk-q5wvs#zhcIk2AFkr*RLa_7q3)E4 zhXI@B5cTEO#FW#Ry-~Y{_dL2Qmv}+5hI)o7Tvzz44+Ss&J ;Q8^-3NlwP5wKM^ z)nl8sD1}Kw3hp7rr{YT=N#Q<`=E+?{qH;N!JDby_8dC|J7ZXBZ`$BW_1Ca?27NYK~ z`K0ij)JLlbM|_wu$=svH GCX412zE@3X zm|LT0Sn^Bn#e3`}Hv{D%5%Z7%9=Z(1-P~0=pZVdW90alDy(`!d?L+}@8b0*KOIeZE z1`VZ>Z|?EPTM5N*RWhu3A#o>pB|0)3;od~)aUK4h2s%wstWmJ#WPrh&DxmeAHuc{L z gfb_s55}|Dd0lyFPBxQb3bRKP!`rd;5|q%#74i|i`8$2+PN^hQXS*@ zn*JN;?Zw!5v8_%-Sk^Hk&pVignk%!Ywe+;TroU>YF@4pkyo7o1@BEdVo`g4mYL=?L z(o#S=;0aO6@zJoDcz26*f55pU1r?Uxq2RK{Xg#WS wDSJkge zsW`hT{na1o(YYG!8sWfbbGK)^dUEt>l)Zv@e`+pO+rA0)KOGcB%82do*Crrf6U@YA z!i!z$6<2rDl$HH^ybs$Jarv58(si@qw9#z6y0p1~uu~P2`T@h+V?d}X7t*OpqW;&W zA%3QDu%nrs#hJuO;T~68dn-%4jme?;qRvqfH~S9P#@b(@?*q;TRZ;5WJmy_9>)`86 zun~njWWyMn1yYtA=+?UO;8wY94wt_VS^m`r5?VUj(VuSq$VH;?F6LRh0f=+BP#FT} z*1FyR=R@dTsyV(`Djg$IvbdcMr#zCL!oe{+ZU}M-vB;$(Ro9oomyq1)YkAK#_zN7L zfj)}qMrJ?b+GSRT3Pq|A-h}431%9B<4jqa2#`9E(_3&Dx&UIs(El>Z-*}#>rx<4vb+7n3YghkpZAq3XU zS=ADmz~*{cI8H#^p0WmTd2e<*iXi^92Udwx-DFO;rv+-y3h#IF%C*}gfZg7Q_49U+ zi<3ida75qX5u1TqGtRz#R(|J&?DqxqePc5(bj@F88K8sfbVzvn>l7C4E~7XgT6Rxz z=v)<8XGGEZhpMuc&1mI>P?ZFw*4ncnx=ZGLs9mjrzR;#+EUXSCFPi^}ohNRX{Jdgw zMYWnfVcN8$%~whlEKOFxnZfB}b>aTtP<$n*K4K6l7Od}c8ZT&PZ^$D{Rf`GEwadLy zKzI6z(BBf&k}j1H39wHH9xTDKy=N}7%SijnVqwo`pDTNzVU`d{nn|rKg?!*j56Dwj z(mb^LBEd3nUiCMYVPNlSJ^=$4PW3nS)YsKm-)1=23Zc{dy!6?m=p;>)OS>=M?X%8i ze)bAW7u2kQ#?70WGHMr#mn>p lwEv9$BYVkw%9j82{&v_x$+%e80CCklx%ZJS3sAk}~e z`_v#h$uH=tvwm82`b|J#o4Z2>7u{7)C-FBxw4ViYH7$vid5ilexm?jZ2xg{X0|zBZ zoVuRgdL8p_$+DEC@N;wX&uUecYrbK;4xoiApR7Gsp5Q^A-ba&Nwe+W0|9(DoI#S|# z2N&zBwO8BD51VFXW-9vq(E+D { z2aU49g~`6JXcw@hZ6Z%8*5(|LgB`%@F9&36V{QA>O*C6F <}rX9kaqH!p4r%?@4Ap$Uc5Nc51^m!D6>fszEI&Ec^A3ju4{c( z!`fmp>TBCc$X-N9cW!EC+W1!ON3koUtrxGdA!H(tb4lJfk_?QKS0_>Hvk9(f{Q+vM zV<&l+-6Am-#zp9mW4@i+!5Q3h+UQ{dKi_bq{G*8yCIR;LdJJa_2G5W`)x2LH)Lih| z9N~b#V+NR`4V2K7-zSarxgD?~k9`Z}$i~z#xp#Yk=oea329!t>3Moe;bqCkLYlvoq zdd%?4`pjL)pZH=ZyL%(s^4B0DuI+XH)*CKD6C?pKuG4kuwi}c07yv#9>Rj5Bc0UAh z8^$? 5j$vw#;$=HEY|Dd__5&ASES1l(OKquu3GPX86I;9F9C$%`c2j)5dHS zG0T)+cO|aav{aw*^TSQ(>p$FHX1YxOK)sy ~|;u%ey){kBl%Qw9Q zO#`$k8N8auiwAf+iMoc4+vDIny?foVn4Pal)2(*V-Vx1QQ%dbV91K(XMZw%WIo12m z73g701I)DK(3N`PuM+ycQWitt!k)h(%*nsyGFKF5iAD3wObIu`Yg;~5HDQ@59{k)+ zD(8YdPx?xp^OY1CKxy&)+)h?eTcTeM-O^e{nYY}DmUX2GlUn1)@R*e?wj;F%Zg}*l zyhqEt!^Y_PNbM5c4BX=a+s+Zh(Mfyg`wxA5ax*$_5<>ES@B!}aWDii^lbAl_BAr=` z>OWo-BNc{H&BR*d68F9Y*drr>^JCe~n<9DBjY@yU^%~L=7387ygwA4T>QymSQ8kbi zXl?}uhN&l0*(AAlxoHbpMW{H_lKQoV!V+zI;&X0kg3`9l_i#0VIW0lWjLPh9J0&_9 zsH8(M=XMp)PhXddf*2DJGPk+JQki&bi ?^9>6r16upt zvVH5s 4j48VLOv33sa}W`)bl?og8EGT;aR(_p#j1c{MiOj@m!@ zc7&>wHYEMvm?DtMDKU@j^j751x}-1*%x34ctt1mU&T4+t7x9-P!PgBic1$s!eTvj1 z ^czO74FTudI5DDl47!c { zAn}pzCdAE_+efS4 tozNRPV3Z#O0k)YMkgP)uHv$*g~bjx(2>O5j|1!Hvnym z*1wd3;KAjU*QIwhK8n~5k1qP*+xs3h8edgwe(+#i9&FtR>8+s1VcCf-x`7BdMP=$d zHSt88GzRL`eD2TEAW{UGay+XAzkoWwJ)ti5-LCyRr@!$(8KwT$h#PH#l$-ba4RC6U z^skxMo;EQr`rr)^S#*43dVeWouY~JfhMI6<#Q6rm=YmBxE1i z&X`(cVkN(tw^>VB2s>ClLGBFAL@YBGGk(?^_iR v r>K zxW=Z55iinU(w6k%R&Kt`JLoKuq7vniXef?5WV0;bK3GQcThy+kB_2VN!d-)&;yYeu zOp%Av_`|Y35dr=iVCgE7E+NXThg|wVLJ@Io{`$`cGHR8;6r Y*)VB bU)t4bdZI&J?<$*VH`%qfDvww{?PQ%fTuwZ6MKp&P?5 z-*~AvPX(^d`2$*N1vEchjF>-HR$^``WztsFGXlAVp#f8RvLDG>UBd`ZG?H_=q}Ucc zYhtKYjgBq3w5X_=WQ2rHr0bGdmRzoLWHjGng3t7HrCuNwpLOIy~nK>>&?eq_Fhd0(= zYizw?#s4i{7QS0*!VTv}X6lDLNG0|R4!T4Rmn7g)ZD z$pvY=E_Zn1J-tap8fha&Z6!}sXq-|qEp1G`jV-k!!&5~fLvcTgSV=!X%C@8PxL4E0 zhd7=M3P2&g{!FaDFJ *J#GxL>+ex8>24tk)69SHS;Hl@-tU>Sh1lw3bo LE&5)clZX1O~j~~9A@NQC-r1`4{$0k`5b+t3O|mPDQFRn46H5L7JNhQ zUv6)UJchqW;fC2$xzS(0O6plt803s}paG?S156q`Vm%+xmCNz7hb^1(lFTRSumuvE zU1(-)iZn3ik>`!%d2t_eJDtQGXk}zcQq-q)deto#^IP;}=TAWOw}k?8*?&(%)x>g> zvolmfEG{Cfhqt|oQd#PLNnqOEqsnX}iUO5L-vG!E_RCg}`AzOk0{C;f`kl<%ED73& zP`n}gt6Mw_Lq$Fx0$mlfFctqW7vF%v?Pf|-fkm;Q*T<{px(98QiG-*!nhvJpGvZX` zHkn;5wUp6ldk%M!3RiM)LY|z@z_)8gTI=|(%}k%{xo^!1=JaLWAdo$q>88fYRaAuI zRCoF4Pf9F3T8S^y!nP@cYg`sFT6xpq-Big55k|bWeRH(d%(Q680`E6F*>p4K>e`?> zvsO&(zQO9mnL3Ure+4&0Gj-h=GfI%Kuton0V$N_)a}8X>9LsdQ*l{y{;Jk0~He=jZ z7|T{VhqSkI0+iu12C zs{Pr&){WX%^7!b9w@Kzu{34~K$xYW&awQN^)UFCx|8PS_omMJQ(I!G(y7Ts+)kLPlwd75xi^sv-m=sUgzPFlexM|NcfNhX9b=PB)u(5;A4!X2}o z9dw6X?!I6){p0$drp)<{Ri9CB3l7-_KbObUIAhm(o}rAH+_b4_9{?-$cZ23ggJh@J zWm@kIFIMJa_(Vy_#68&?l7@T;!kT+s@(DyF7e*(v;cxTT;|63;)?Eq?+C=&J6Y^^Z zdOFUfK;=RET} q~+D zMV5D^DO)7r{wz1(_50M{&z@Por24pJmYrclB+cPW0>oSkNpAnH+kW+dk3?|7I5oiE za{BGiPf bu|NO?cT4F9RG_(g3Y!NI*+ym_h@Zx~gfMz m_33@}rGA&|7EMQmtn=QN(2V=u4#!Gi#r^ zPFzT9SeSNPKPUj7b=M2DeQBG1!QLh)p6=a{pquwC;i8bFH$NppS?WI5#bl+CNysp! z{Ip!tm3w{{Iz*3y@wu}5lgjDcTtSHWDT?16%Qc({339Tf>TZ=h-%@*kwvxC-qxZ^< zi4;=t$N9K{gkB5psJ-G`HuJWEayh{Gm3p7~zc0=*Huz#%YI)@{cf4Q!0~k_b3PnHu znwR-e^0EyEgAaOpyIhu6C=#aTY#RD0G^qA)E*8YJZDfyrTeN)Pg-#G>&JYdn6K7y) zY1S&=vc7pxU%DgSYvP)d<0${bLn>0cQ-)BY1^N9VUhM7(j)FG)eEvjv%U6t|HtszI z6N#Mm^hHrtu*{FhHZVw6(Ykv2&wT%XfcFn@hKbI*>ZFCnZ&)48UoR-Wd$O8#V$-zG z`kj_`lSe+XwaE N>4ImlCd%$pMEiOg*s(X=TPLVq!#x<32yn7vx55 zBI5Hd{;YZpm?>S-mr4EA#n8Zo0@(tw0k*GQr?cF^cs w*_Wr?zTbEx+3BCLPk%KVX%3KU{WUkFuBUXI1K$6ggdO z6TY```%;0xGtR#BLITjM%HQ^Fyt(LAR_L=Q%x0LJ*IC~Z0Qa<`qWkrUCjV@Tgj87p zEi`QuaE7>Q)$QltP4HIx2RkYyl>8>p(k53~bSHi8@x~ h5%mrM$+@fTBz^^8HY$7XcH zyIMmU3OvHMRf3dz?d2|MEqTHSO-Z>P(O2Yn4NZ6#r98s 1|fJwV`k z_GqV}$)X&7 FZDC(@wF zrt??@B|($Ls~G;r%G3Kcl%s#ok^ U_iB4ZXC-eg zb}tR&hyLs)Vj2oUL5r#{*iNm6DssZ-UJBwrj^xBB3tpU8+Og_ok!*|nNZ)o6xuKjc zm-H1K35dSjeZ+HmxR9p!m3oT3MNSr1exZ`3VDdHU{gd>`rDY|x) t3q0PkOcFwCWnVb6dc^)%`VQcgeS{^#cYvny@?%=emEzf+P$C&VC&z_Va7 zrWHZG 9Xgv1h&Rw}1_1!K zJWavL(^FIW<{GnB(=22); #G3ZR;f->9QvK^s3uC?N0dWB(D0yq;zF}=F}pu^P2;;RV8{*jPwD~jc? zm L^m$;X#6g zOxt)tgj$h@n8HWncG!x?fz7n3I^s0`TO4iFhI;1aEMs9F%yv=W1pQ8tGCDHN(0ePF zl|*uOSs6l$*-_?gS#9}M#%_t)d^a~gGyfO7K0_BYGp}9eEEM}CY1*eu2%N92_NlXz z2Zpy*V$Utd6Xa!J!MJc+tvTT%g)C*Wh1BX~sm8RJ#b(Tjdd&f8NjDu3v`7R_e6VaQ zr@_FA-8pnwp#2^%V%^x{bVh}W3Ghr@@T@=@b82~vlS5?g6b+ln+GZmj{rwhYtNe|6 zVg9nOM9xp5;(sAt+?|>67C76MqGXXXsXzB=yc|hzG~ VF*8;h zcMEK+{dF(9_2f zZ+}BDHy?tC_4#eh5;|IM-A1DDi3*1DlOHviRNel)+qM7Iu$l_}4sn zmwjoS;1-+4885m{NoJBvs##!sk|)Od7p?Xzs{fj8qinhpM#C+PQ0Z|mADJ{X2Ullq z3=*83*GS%37w5X|+fuKz4q;a0cL%;6kt~iBmbay 2#G}~JcZjfx}0emp=S!d;M0lkM{v#=rfFg3fG z*Ikb%HC&`Diz~y!g`U5~uX?CMANhdKSQMqocQzwm5&l_$xs~uO4bAt+6khbOrZmJd z?ajWd%ePn+BCamKE9q~8r?nY+N;C8vrC*vUP{$_dlwGHW)ZbPrw8mx9{U#K3t8!y1 zA5rhr0 )`@zfVOFp<8%?LN|UZoY$zBLYXxUAg m;f>Re}H_mu{mF9#}Oo^FWV1GZU0>CAjBUpW(0m-|MJ*3<2K~=r$LpJ z>-;(9G+$ve1+RySBC33D0=jc7_e2?D1z4Yui6zrm0AfcmICQQzfqZ#<@-A%ybKK8r zc-yXPIEsrXOSPy$g2^u?<-0HI^tIeupgUtev-^HqNlrgeXW8u}>sBWQHd17UOJUFh z)%1@AAw`+DH&aQC9Vk4NvH5suVO%(Od Z~#r zwu3}`-JGJB ^t0N-Mf!xbYuMX5=pAn+a#8&w0?achxXx3idQ0g0 zRlB#==pZ#9Sc;n3cW_O)C$Mg)(|>c*C?^ii~j z02jda@ajO5#5Bkb+g9+hom*j!h1#M8b$%9F`sra?F`FV*TJ~n(tDo*?Lcv~#>eaeG zAG)P{3Tq!|jh^K~*hcu!@U`Q* gO5M% 3o z8Ch}X3#0M={se1m^LL+Dt1>|cX-s0ZmMHrlOOgjqcjHalpozoIa|6bNA0HCro5jWM z>4^hNm6lQZlmu})%WCOj!Yjj9Y;m~_e~4UGyXhQSk3QTaHUFF(mRN2Xm8OB;p4?0j zr@4r0!+k~jvR*)*NNrcvT!v@NiR`RhMNm(lS3G07P)r;eJT5m!eepsY2-$iK*RDNU zcsQoVHFRxojgpS}5AcSjqx;AwShm60@0dcI@CUPzRQ_y}pvpV^d>x$}r}76}lxO+r z?iVm>I=oYvw27q#7TlH>C3$KTFW=(*&)a3J?x1Zk0E=`nCO2~J9i}awX%sTh#)= zWYUU(pj59T&Bzy 9&KSsqQl^c{QrzD ?GSdN-i{=onHA4~f?8Q)4Fyt`isnPG2gJqDRvmV+D@i|y>MNqR6|x|*s#UOr<_ zFOO0nyvpHR@WAAVA1glm{0YNCArLOH(-a=PSXR#Rb G&VbnRW}5oGm9q@}l#f$LJFmUMN&;V4`EjjKP4z@D zo)Oww1>mLoSW*RSNZ;a})#iy?usvjgX0ujJJo9@yCTDf)%Krh(MOz&3`y#vs!4nZJ zKfR{)`UI1f7NZ#N!qfPy>H^DH`yBK4)L{D4Hc>$Oi_)VAC%nC688=_Xon=BO@a(E$ zM*cQV?PW+Wamt;rhJqdM=VMWVZdxlMm+qyzpUZ}U{ o$l!n3TfYA!+aLLz?haK@b#1>CqPw|s8IP&W+WaTl7iQ4sNjmhlux2$n#ukhQ zBBpL|p5syPb?le$TAir02 5i)zGDS{k7Em^My1{~kNY%Bw%&Jp z_u;t~7Kr??)E-F}6ufNral`(UNAV(QpFay4B-h()()`*w$9<*)nBNI*V@|?vx;MlY zmKw>f63=BDiTZBNWX>OKLZ0_17i`W%MbW@p?=(doOFPp?5IE$b&`aQcN_YgJ1cmt) z1Xw|vLD to=dxk zkIQqOS6l(d14;;!l?auz$GT |GxGchA3qSN1WC zfy8sy#=cla>+@R5+n5Eo=c<8abzW_P^=*G(2R-tcRx|&lXj%IHmfd7sNcVj}2t4k+ z{u_;s%ysTt%IcakLHT@|&cm&)Bip2mSFJ4(nx0~H>tZR9@bkL*o|~X0hMeAB^)I4K zi13@Owl&ISZT^*1ui{LCoDxXEzVK_USON8yUGd?inrotUkF_4n@6w!Tjp-rRDff&B zs)A?esU46Bo)<-#3DkLpz}ZSgfBsKv48Arh(${r)+gdH{lc+DdL`n)ET?_P(AbY z9IrmWFKmbQm3YnMGt1$WO_9u#&eyry-8zNM{C?%Y38qkz&DA>=_UQU5yYi8_)+QiX z_i;U2%KTH>yK)|fI^9b(_t&{&ZC|{aMY#kI0RKDd(_mgH*$j=5$=W`vf1w^D zI8?I_?;hUKGu8er$bRqBiEd9=Qn(JMp5P4Sp-^8PW(DUKRdSS Q25!Ae zDr>ng3myk{jA-EB6N?MOCJE28x84`G<{l>T(be2NwbCzN2+m}*9_T##Lb4nq^6P~! zy-`$^kduHd!9_I}w8BUXLwU@z?4_A-p;Q`+U;FwCXzTe@zYwo;PI5$;s5hNMLYl7W z&`+9MRSypl?vYd5-uu_#8q-}=shXt~<0_&y2hYozvMD{7M_+ymW>i#OKj69iK2zKg ztJ~rUbQFCQ{6$1>VxO-zWR`h_(bXM7(jN9_pHOI$nTHktkJqlXFtE()x>!=nj)a!W zI2a~FBINnBgCbo6=>zUu&VYII1>auElHI3O67ePfAf~Duyo!O|Ofz}fMvR0CxVl)? zqU+>wrhtdKQ*_*U6TiAn0JuYRGLb^{`P@L@nEL|7F(e2v*(Taf{e=9%P=|n&dtHot zKISvyB~{yi@ICw`gV+SvzmifiJ5JT|Tbc$AiSK(E$;n6nxDn=~boV}63TQ0Ar%Zt5 zn8aF+8t*j1)2p8V;Lnu%A0SOs6|k9a=B3vip)ww gc%%3QOF9Uxg7 zYkGD10qcP4JIE&TUW{wa-IVkPqfbn{opsxz 7@?In7GJoq9#k^Ff3bsLnM@lJW6Zo&ctmg3f7w z+rtXxTC2awtE$ayA*~DTp1fTRan?djYIwX8{#6a8HHZ=q?|~}eW@Q$1xOY)tqf^Ed z#VhtuO^c7;GaA9^innmfNPb FzIBdQ^-^Ej7*$qs{c5y$&PI3 znptfR04bF=$XCmEW@}@EPXxHE$T1nOYg)X1yaHf)Wy@47TAkF&B{ls^fEZRf##(|J z;uFKC;j-)|)03|H*gC6muneNDX@Eg>WXkep@m9=~b`}(0HH((*4;A6fN}VO7&dfvr zui%EcM)V^E-;d>L?RX5pzFVK;Gn8h0KeL*g%s 0xPv*;T5MxqyDT+9SQ{ zgd+pN^e6PS41_CiI;OUoX2@)_&nQFbMNiSgRe8?C&m{?mky?UB`qpZBq2Edso< L**%V QUhj9Yw+cp1-IE7;@OaJ~c_Jaebr%i#-(<_0tL6!VVf6L6h~wWCikfoJ(}BsG zC6abwjJrcL|ET*3Wy1c75E~5*N$Ew~$nOfvk?Ro=kseIuzDw*aBNQe;T$H=(WL*{z zsR?yu?ya`fQ(-oDCUG(N?_^AYdp8bWIc<}Pw1YNpb)waYtb~6zwrGcho6*f~zo4mS znyirnKbHi()tGJmQrZ0SQ_rBh$w?Z7ojhp!+x5}4VacLbV)vcw|IGC}rs?i=6 hAV9tOueRBWN~Je8I4EQ!BX#dpfY78My+8Twv~ITF0{pr zuyeXvXfYi)ObJ1Q|0C~Beo(g1uBXe7BE*s?0gC2!P=uthabI%~c2&naAk>s#-TX;$ zSy?(rKz8ygcU|$TUEb&!QKz>Z#%1%x)k#o3VjJTB0G81P+6v7n-rVEf5{BniFh)f? zv&XLsDDMMmX;)fp%V!Z!lRimpUsOL#ZXJ}aLXi`%y4kMX-r#=gDO*d>P!qtC&}Sfb zd0v@GwpHEb9~z{Ohv7*Zd{gUfDfaEuXCB8s)MKR9aVX}sFqrzl(ir<%;lOM^mU7gS z3l$oC-w{R=os^zJWTQ5{{?4=k#+ltzC$~8%qVZ`Ezj|m{|9yKa tpD5h0W!@5CskdT~=$POP%fXVAQ-DfO+q-J>7@oiCKfmxl2{))=yS5V?BkS zgU~xJ`BOyF6b*%P`5QGGs&SCE8i4(mr>sQJbdm7lvQkhY==Ye%=#uTCtlFrro&{43 zk|_RhuoY={591*261_0+dW$-+z7xI=A82;?=t{Yw&2*tAS3=9eJc!HPN$&{_L+A&= zPn#fCCGlSK(_*e|2L2n(tnUw@1;h)#BhE3`x2}eahA_-8(-S2MGQackF~0`oVQ}ya z)$sOLLxOne>ZG|_bLSGJF=2Y g{9)$tBx6 zs*TBlzOqa%H^q$#A5FB62Nv9d^VV>{-Lml5?cc3^Ng@4;FxA)`bPxCKJUw3{RqW;s z61TUO=7T`>=e4p#D*`8ZS*hGv-$Su$@#iC<2?Zzzn7GeYJ+CL7Plbc#Pn;Wlj1SaC zB&jF-VlYxkNqM&Zd$*P28f^{(m@K=U=3O1^s9*5$7c{<>pw5pWOi-4VG5^tO4hw-N zTtm_E^ jw^Ae@&kk5mj& zYFq!|`pKb@lwd{eKL9WcSpLg`;PS{_xL-sGMsZ*-Enl G{aT5!lqM|% zj-`;r!p#&@kRHlW#!>nSGM?Mw)yF&}p~@(2>BH_NWULAuT}gV)
BKTqeW)sQF@Xos|}P^h?K_G{IFy3 AanSR~rc;VLoz`H@{o@JDH03
ZzRkIyv{hXlWR(IKa?>AOcE!J(CCl=XVZh19x;JLy)bzf=6S}YWPIR+GLT#V%{&D za%JH7=qzNRXUF7ed^&x{AAqp|dvLP1u-P0uu}&<1103dSu*#ZPDXj{LZyg}s 6LZ!6=S#0`MpV9>@x<{p+i?bRzm=2pnmDoJdi1LH<|i5-}}nF36P7$5&L;J zBcTZOZv^@rXA)p1OAM@{*yzzBy??&FnAvC*y$GW(Z;U7RRQF>V$VL?j_N)ipIpHO5 z)@ggp ft(qK% VtrR>Y3RL;<| z1kPJtSzL`fL!Rh5`YbYNPM^$1ba+r}2J^S<6%rF{^`5XHUp_n9Osd?p#mR%LwlyLE z)2w@ZJN9;im$c xi>{McSenQ?uKuCVw zuwou~8le 3i9!lqm|-|Zxuz=@Zsb}%F?l}cqtr*D~Ta~oP2c13?36v{<0Yr$-$ zfm%mRe+#gR@A#)j%aq!Usu)yTzYQ#{aB3!r(f>Vs?HR7{`X8BZ%{K~D{>vC&I%WaQ zUYX+j9fg@kOk({R(FLNKtXi2BB=kc&rcXh{j5`WUTZJp}AT!Oa%#W