From ca90144a53291ab66ed3576de9832a295657d6c2 Mon Sep 17 00:00:00 2001 From: ProjectFrameWork2025 Date: Sun, 9 Nov 2025 14:47:10 +0800 Subject: [PATCH] chore(repo): initialize monorepo (framework + business-css + docs) --- business-css/README.md | 19 + business-css/frontend/README.md | 6 + business-css/pom.xml | 51 + .../src/main/resources/application-dev.yml | 11 + framework/.gitignore | 104 + framework/.husky/pre-commit | 7 + framework/Dockerfile | 21 + framework/docs/前后端整合.md | 52 + framework/docs/技术文档.md | 161 + framework/frontend/.editorconfig | 15 + framework/frontend/.env.development | 8 + framework/frontend/.env.production | 6 + framework/frontend/.env.staging | 6 + framework/frontend/.eslintignore | 16 + framework/frontend/.eslintrc.js | 32 + framework/frontend/.gitignore | 17 + framework/frontend/.npmrc | 3 + framework/frontend/.prettierignore | 9 + framework/frontend/.prettierrc.js | 36 + framework/frontend/LICENSE | 21 + framework/frontend/commitlint.config.js | 26 + framework/frontend/index.html | 15 + framework/frontend/npminstall-debug.log | 208 + framework/frontend/package.json | 66 + framework/frontend/pnpm-lock.yaml | 6776 +++++++++++++++++ framework/frontend/postcss.config.js | 6 + framework/frontend/public/favicon.ico | Bin 0 -> 4286 bytes framework/frontend/readme.md | 1 + framework/frontend/src/App.vue | 11 + framework/frontend/src/api/auth/index.ts | 36 + framework/frontend/src/api/auth/types.ts | 34 + framework/frontend/src/api/dept/index.ts | 139 + framework/frontend/src/api/dept/types.ts | 34 + framework/frontend/src/api/dict/index.ts | 242 + framework/frontend/src/api/dict/types.ts | 84 + framework/frontend/src/api/file/index.ts | 34 + framework/frontend/src/api/file/types.ts | 7 + framework/frontend/src/api/menu/index.ts | 159 + framework/frontend/src/api/menu/types.ts | 105 + framework/frontend/src/api/message/index.ts | 28 + framework/frontend/src/api/record/index.ts | 18 + framework/frontend/src/api/role/index.ts | 196 + framework/frontend/src/api/role/types.ts | 40 + .../frontend/src/api/taxkSetting/index.ts | 51 + framework/frontend/src/api/user/index.ts | 238 + framework/frontend/src/api/user/types.ts | 67 + .../frontend/src/assets/401_images/401.gif | Bin 0 -> 164227 bytes .../frontend/src/assets/404_images/404.png | Bin 0 -> 98071 bytes .../src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes .../frontend/src/assets/MenuIcon/bq_gb.png | Bin 0 -> 243 bytes .../frontend/src/assets/MenuIcon/bq_gb1.png | Bin 0 -> 189 bytes .../frontend/src/assets/MenuIcon/czan_xz.png | Bin 0 -> 160 bytes .../frontend/src/assets/MenuIcon/dh_jt.png | Bin 0 -> 253 bytes .../frontend/src/assets/MenuIcon/dh_jt1.png | Bin 0 -> 1047 bytes .../frontend/src/assets/MenuIcon/dh_qy.png | Bin 0 -> 528 bytes .../frontend/src/assets/MenuIcon/dh_qy1.png | Bin 0 -> 491 bytes .../frontend/src/assets/MenuIcon/dh_qz.png | Bin 0 -> 640 bytes .../frontend/src/assets/MenuIcon/dh_qz1.png | Bin 0 -> 642 bytes .../frontend/src/assets/MenuIcon/dh_sq.png | Bin 0 -> 366 bytes .../frontend/src/assets/MenuIcon/dh_sq1.png | Bin 0 -> 1165 bytes .../frontend/src/assets/MenuIcon/dh_sy.png | Bin 0 -> 564 bytes .../frontend/src/assets/MenuIcon/dh_sy1.png | Bin 0 -> 537 bytes .../frontend/src/assets/MenuIcon/dh_sz.png | Bin 0 -> 520 bytes .../frontend/src/assets/MenuIcon/dh_sz1.png | Bin 0 -> 527 bytes .../frontend/src/assets/MenuIcon/dh_xm.png | Bin 0 -> 677 bytes .../frontend/src/assets/MenuIcon/dh_xm1.png | Bin 0 -> 655 bytes .../frontend/src/assets/MenuIcon/dh_xx.png | Bin 0 -> 469 bytes .../frontend/src/assets/MenuIcon/dh_xx1.png | Bin 0 -> 462 bytes framework/frontend/src/assets/MenuIcon/gb.png | Bin 0 -> 14959 bytes .../frontend/src/assets/MenuIcon/grzx_tx.png | Bin 0 -> 1897 bytes .../frontend/src/assets/MenuIcon/grzx_xg.png | Bin 0 -> 385 bytes .../frontend/src/assets/MenuIcon/jscz_rl.png | Bin 0 -> 372 bytes .../frontend/src/assets/MenuIcon/jscz_sc.png | Bin 0 -> 289 bytes .../frontend/src/assets/MenuIcon/jscz_sc1.png | Bin 0 -> 317 bytes .../src/assets/MenuIcon/jscz_scdc.png | Bin 0 -> 313 bytes .../frontend/src/assets/MenuIcon/jscz_xz.png | Bin 0 -> 156 bytes .../frontend/src/assets/MenuIcon/lbcz_an.png | Bin 0 -> 401 bytes .../frontend/src/assets/MenuIcon/lbcz_an1.png | Bin 0 -> 427 bytes .../frontend/src/assets/MenuIcon/lbcz_cd.png | Bin 0 -> 223 bytes .../frontend/src/assets/MenuIcon/lbcz_cd1.png | Bin 0 -> 233 bytes .../src/assets/MenuIcon/lbcz_czmm.png | Bin 0 -> 513 bytes .../frontend/src/assets/MenuIcon/lbcz_jt.png | Bin 0 -> 299 bytes .../frontend/src/assets/MenuIcon/lbcz_jt1.png | Bin 0 -> 1107 bytes .../frontend/src/assets/MenuIcon/lbcz_qx.png | Bin 0 -> 662 bytes .../frontend/src/assets/MenuIcon/lbcz_sc.png | Bin 0 -> 485 bytes .../frontend/src/assets/MenuIcon/lbcz_sc1.png | Bin 0 -> 448 bytes .../frontend/src/assets/MenuIcon/lbcz_sc2.png | Bin 0 -> 359 bytes .../frontend/src/assets/MenuIcon/lbcz_td.png | Bin 0 -> 173 bytes .../frontend/src/assets/MenuIcon/lbcz_td1.png | Bin 0 -> 171 bytes .../frontend/src/assets/MenuIcon/lbcz_td2.png | Bin 0 -> 162 bytes .../frontend/src/assets/MenuIcon/lbcz_xg.png | Bin 0 -> 506 bytes .../frontend/src/assets/MenuIcon/lbcz_xg1.png | Bin 0 -> 460 bytes .../frontend/src/assets/MenuIcon/lbcz_xg2.png | Bin 0 -> 394 bytes .../frontend/src/assets/MenuIcon/lbcz_zml.png | Bin 0 -> 440 bytes .../src/assets/MenuIcon/lbcz_zml1.png | Bin 0 -> 459 bytes .../frontend/src/assets/MenuIcon/lbcz_zyw.png | Bin 0 -> 450 bytes .../frontend/src/assets/MenuIcon/lbcz_zz.png | Bin 0 -> 521 bytes .../frontend/src/assets/MenuIcon/top_qp.png | Bin 0 -> 425 bytes .../frontend/src/assets/MenuIcon/top_qp1.png | Bin 0 -> 384 bytes .../frontend/src/assets/MenuIcon/top_ss.png | Bin 0 -> 490 bytes .../frontend/src/assets/MenuIcon/top_tx.png | Bin 0 -> 28367 bytes .../frontend/src/assets/MenuIcon/top_zh.png | Bin 0 -> 238 bytes framework/frontend/src/assets/MenuIcon/ts.png | Bin 0 -> 562 bytes .../src/assets/MenuIcon/u117_mouseOver.png | Bin 0 -> 652 bytes .../frontend/src/assets/MenuIcon/u119.png | Bin 0 -> 630 bytes .../frontend/src/assets/MenuIcon/u241.png | Bin 0 -> 200 bytes .../frontend/src/assets/MenuIcon/u343.png | Bin 0 -> 521 bytes .../frontend/src/assets/MenuIcon/u697.png | Bin 0 -> 472 bytes .../frontend/src/assets/MenuIcon/u81.png | Bin 0 -> 520 bytes .../frontend/src/assets/MenuIcon/xqing.png | Bin 0 -> 549 bytes .../frontend/src/assets/icons/advert.svg | 1 + framework/frontend/src/assets/icons/brand.svg | 1 + framework/frontend/src/assets/icons/bug.svg | 1 + .../frontend/src/assets/icons/cascader.svg | 1 + framework/frontend/src/assets/icons/chart.svg | 1 + .../frontend/src/assets/icons/client.svg | 1 + framework/frontend/src/assets/icons/close.svg | 1 + .../frontend/src/assets/icons/close_all.svg | 1 + .../frontend/src/assets/icons/close_left.svg | 1 + .../frontend/src/assets/icons/close_other.svg | 1 + .../frontend/src/assets/icons/close_right.svg | 1 + .../frontend/src/assets/icons/coupon.svg | 1 + .../frontend/src/assets/icons/dashboard.svg | 1 + framework/frontend/src/assets/icons/dict.svg | 18 + .../frontend/src/assets/icons/dict_item.svg | 12 + .../frontend/src/assets/icons/download.svg | 1 + framework/frontend/src/assets/icons/drag.svg | 1 + framework/frontend/src/assets/icons/edit.svg | 1 + .../src/assets/icons/exit-fullscreen.svg | 1 + .../frontend/src/assets/icons/eye-open.svg | 1 + framework/frontend/src/assets/icons/eye.svg | 1 + .../frontend/src/assets/icons/fullscreen.svg | 1 + .../frontend/src/assets/icons/github.svg | 1 + .../frontend/src/assets/icons/goods-list.svg | 1 + framework/frontend/src/assets/icons/goods.svg | 1 + framework/frontend/src/assets/icons/guide.svg | 1 + .../frontend/src/assets/icons/homepage.svg | 1 + framework/frontend/src/assets/icons/lab.svg | 1 + .../frontend/src/assets/icons/language.svg | 1 + framework/frontend/src/assets/icons/link.svg | 1 + .../src/assets/icons/locationIcon.png | Bin 0 -> 162 bytes framework/frontend/src/assets/icons/menu.svg | 1 + .../frontend/src/assets/icons/message.svg | 1 + framework/frontend/src/assets/icons/money.svg | 1 + .../frontend/src/assets/icons/monitor.svg | 2 + .../frontend/src/assets/icons/nested.svg | 1 + .../frontend/src/assets/icons/number.svg | 1 + framework/frontend/src/assets/icons/order.svg | 1 + .../frontend/src/assets/icons/password.svg | 1 + .../frontend/src/assets/icons/peoples.svg | 1 + framework/frontend/src/assets/icons/perm.svg | 1 + .../frontend/src/assets/icons/publish.svg | 1 + framework/frontend/src/assets/icons/qq.svg | 1 + .../frontend/src/assets/icons/rabbitmq.svg | 1 + framework/frontend/src/assets/icons/rate.svg | 1 + framework/frontend/src/assets/icons/redis.svg | 1 + .../frontend/src/assets/icons/refresh.svg | 1 + framework/frontend/src/assets/icons/role.svg | 1 + .../frontend/src/assets/icons/security.svg | 1 + .../frontend/src/assets/icons/shopping.svg | 1 + framework/frontend/src/assets/icons/size.svg | 1 + framework/frontend/src/assets/icons/skill.svg | 1 + .../frontend/src/assets/icons/system.svg | 1 + framework/frontend/src/assets/icons/theme.svg | 1 + framework/frontend/src/assets/icons/tree.svg | 1 + framework/frontend/src/assets/icons/user.svg | 1 + framework/frontend/src/assets/icons/uv.svg | 1 + .../frontend/src/assets/icons/valid_code.svg | 9 + .../frontend/src/assets/icons/wechat.svg | 1 + .../frontend/src/assets/images/linefeed.png | Bin 0 -> 173 bytes .../assets/images/linefeed.png_mouseOver.png | Bin 0 -> 171 bytes framework/frontend/src/assets/images/u287.gif | Bin 0 -> 246181 bytes .../frontend/src/assets/images/u3127.png | Bin 0 -> 569 bytes .../frontend/src/assets/images/u3139.png | Bin 0 -> 409 bytes .../frontend/src/assets/index/indicator.png | Bin 0 -> 341643 bytes framework/frontend/src/assets/logo.png | Bin 0 -> 6849 bytes framework/frontend/src/components.d.ts | 9 + .../src/components/Breadcrumb/index.vue | 105 + .../src/components/GithubCorner/index.vue | 59 + .../src/components/Hamburger/index.vue | 41 + .../src/components/IconSelect/index.vue | 93 + .../src/components/LangSelect/index.vue | 44 + .../src/components/Pagination/index.vue | 102 + .../src/components/Pagination/page.vue | 131 + .../src/components/RightPanel/index.vue | 160 + .../src/components/Screenfull/index.vue | 18 + .../src/components/SizeSelect/index.vue | 38 + .../frontend/src/components/SvgIcon/index.vue | 40 + .../src/components/ThemePicker/index.vue | 38 + .../src/components/Upload/MultiUpload.vue | 143 + .../src/components/Upload/SingleUpload.vue | 97 + .../src/components/WangEditor/index.vue | 79 + framework/frontend/src/directive/index.ts | 2 + .../src/directive/permission/index.ts | 54 + .../frontend/src/directive/utils/index.ts | 15 + framework/frontend/src/env.d.ts | 19 + framework/frontend/src/lang/en.ts | 29 + framework/frontend/src/lang/index.ts | 46 + framework/frontend/src/lang/zh-cn.ts | 28 + .../src/layout/components/AppMain.vue | 49 + .../frontend/src/layout/components/Navbar.vue | 166 + .../src/layout/components/Settings/index.vue | 198 + .../src/layout/components/Sidebar/Link.vue | 37 + .../src/layout/components/Sidebar/Logo.vue | 33 + .../src/layout/components/Sidebar/MixNav.vue | 157 + .../layout/components/Sidebar/SidebarItem.vue | 125 + .../src/layout/components/Sidebar/index.vue | 43 + .../layout/components/TagsView/ScrollPane.vue | 130 + .../src/layout/components/TagsView/index.vue | 356 + .../frontend/src/layout/components/index.ts | 4 + .../frontend/src/layout/components/news.vue | 257 + framework/frontend/src/layout/index.vue | 134 + framework/frontend/src/main.ts | 42 + framework/frontend/src/permission.ts | 63 + framework/frontend/src/router/index.ts | 77 + framework/frontend/src/settings.ts | 23 + framework/frontend/src/shims.d.ts | 2 + framework/frontend/src/store/index.ts | 11 + framework/frontend/src/store/modules/app.ts | 97 + .../frontend/src/store/modules/permission.ts | 82 + .../frontend/src/store/modules/settings.ts | 64 + .../frontend/src/store/modules/tagsView.ts | 214 + framework/frontend/src/store/modules/user.ts | 103 + .../frontend/src/styles/element-plus.scss | 59 + framework/frontend/src/styles/index.scss | 39 + framework/frontend/src/styles/mixin.scss | 28 + framework/frontend/src/styles/sidebar.scss | 253 + framework/frontend/src/styles/tailwind.scss | 4 + .../frontend/src/styles/variables.module.css | 11 + .../src/styles/variables.module.css.map | 9 + .../frontend/src/styles/variables.module.scss | 25 + framework/frontend/src/utils/auth.ts | 15 + framework/frontend/src/utils/filter.ts | 80 + framework/frontend/src/utils/i18n.ts | 12 + framework/frontend/src/utils/index.ts | 97 + framework/frontend/src/utils/localStorage.ts | 53 + framework/frontend/src/utils/request.ts | 87 + framework/frontend/src/utils/resize.ts | 73 + framework/frontend/src/utils/rsaEncrypt.ts | 29 + framework/frontend/src/utils/scroll-to.ts | 69 + .../frontend/src/utils/sessionStorage.ts | 22 + framework/frontend/src/utils/validate.ts | 12 + .../frontend/src/views/TaskSetting/index.vue | 1288 ++++ .../frontend/src/views/component/editor.vue | 22 + .../frontend/src/views/component/uploader.vue | 33 + .../dashboard/components/Chart/BarChart.vue | 174 + .../components/Chart/FunnelChart.vue | 131 + .../dashboard/components/Chart/PieChart.vue | 113 + .../dashboard/components/Chart/RadarChart.vue | 132 + .../dashboard/components/Project/index.vue | 119 + .../views/dashboard/components/Team/index.vue | 240 + .../frontend/src/views/dashboard/index.vue | 19 + .../frontend/src/views/error-page/401.vue | 114 + .../frontend/src/views/error-page/404.vue | 280 + framework/frontend/src/views/login/index.vue | 513 ++ .../src/views/nested/level1/index.vue | 7 + .../src/views/nested/level1/level2/index.vue | 7 + .../nested/level1/level2/level3/index1.vue | 5 + .../nested/level1/level2/level3/index2.vue | 5 + .../frontend/src/views/redirect/index.vue | 15 + .../frontend/src/views/system/dept/index.vue | 638 ++ .../frontend/src/views/system/dict/index.vue | 708 ++ .../frontend/src/views/system/menu/index.vue | 832 ++ .../src/views/system/record/index.vue | 207 + .../frontend/src/views/system/role/index.vue | 510 ++ .../frontend/src/views/system/user/index.vue | 559 ++ .../src/views/system/user/personalCenter.vue | 289 + framework/frontend/tailwind.config.js | 15 + framework/frontend/tsconfig.json | 29 + framework/frontend/types/components.d.ts | 9 + framework/frontend/types/env.d.ts | 19 + framework/frontend/types/global.d.ts | 23 + framework/frontend/vite.config.ts | 44 + framework/pom.xml | 464 ++ .../com/yfd/platform/PlatformApplication.java | 45 + .../com/yfd/platform/ServletInitializer.java | 13 + .../platform/annotation/AnonymousAccess.java | 30 + .../java/com/yfd/platform/annotation/Log.java | 20 + .../annotation/rest/AnonymousGetMapping.java | 86 + .../com/yfd/platform/aspect/LogAspect.java | 93 + .../component/ServerSendEventServer.java | 147 + .../platform/component/WebSocketServer.java | 106 + .../yfd/platform/config/FileProperties.java | 59 + .../platform/config/FileSpaceProperties.java | 17 + .../config/GlobalExceptionHandler.java | 24 + .../com/yfd/platform/config/JobRunner.java | 56 + .../config/JwtAuthenticationTokenFilter.java | 83 + .../yfd/platform/config/MessageConfig.java | 50 + .../yfd/platform/config/MybitsPlusConfig.java | 24 + .../platform/config/ProdApiPrefixFilter.java | 44 + .../com/yfd/platform/config/QuartzConfig.java | 77 + .../yfd/platform/config/ResponseResult.java | 57 + .../yfd/platform/config/SecurityConfig.java | 91 + .../yfd/platform/config/SwaggerConfig.java | 50 + .../com/yfd/platform/config/WebConfig.java | 58 + .../yfd/platform/config/WebSocketConfig.java | 16 + .../yfd/platform/config/bean/LoginCode.java | 61 + .../platform/config/bean/LoginCodeEnum.java | 43 + .../platform/config/bean/LoginProperties.java | 110 + .../config/thread/AsyncTaskExecutePool.java | 70 + .../config/thread/AsyncTaskProperties.java | 39 + .../config/thread/TheadFactoryName.java | 62 + .../config/thread/ThreadPoolExecutorUtil.java | 44 + .../com/yfd/platform/constant/Constant.java | 42 + .../yfd/platform/datasource/DataSource.java | 17 + .../platform/datasource/DataSourceAspect.java | 55 + .../datasource/DynamicDataSource.java | 40 + .../datasource/DynamicDataSourceConfig.java | 38 + .../exception/AccessDeniedHandExcetion.java | 27 + .../exception/AuthenticationException.java | 32 + .../exception/BadConfigurationException.java | 98 + .../exception/BadRequestException.java | 41 + .../exception/ChildrenExistException.java | 20 + .../exception/EntityExistException.java | 34 + .../exception/EntityNotFoundException.java | 34 + .../controller/DataSourceController.java | 42 + .../system/controller/LoginController.java | 238 + .../system/controller/MessageController.java | 150 + .../controller/QuartzJobController.java | 183 + .../system/controller/SSEController.java | 59 + .../controller/SysConfigController.java | 68 + .../controller/SysDictionaryController.java | 142 + .../SysDictionaryItemsController.java | 201 + .../system/controller/SysLogController.java | 74 + .../system/controller/SysMenuController.java | 308 + .../controller/SysOrganizationController.java | 210 + .../system/controller/SysRoleController.java | 324 + .../system/controller/UserController.java | 188 + .../platform/system/domain/Dictionary.java | 78 + .../yfd/platform/system/domain/LoginUser.java | 76 + .../yfd/platform/system/domain/Message.java | 117 + .../yfd/platform/system/domain/QuartzJob.java | 118 + .../yfd/platform/system/domain/SysConfig.java | 78 + .../platform/system/domain/SysDictionary.java | 71 + .../system/domain/SysDictionaryItems.java | 77 + .../yfd/platform/system/domain/SysLog.java | 92 + .../yfd/platform/system/domain/SysMenu.java | 114 + .../system/domain/SysOrganization.java | 93 + .../yfd/platform/system/domain/SysRole.java | 98 + .../yfd/platform/system/domain/SysUser.java | 116 + .../platform/system/mapper/MessageMapper.java | 16 + .../system/mapper/QuartzJobMapper.java | 16 + .../system/mapper/SysConfigMapper.java | 17 + .../mapper/SysDictionaryItemsMapper.java | 17 + .../system/mapper/SysDictionaryMapper.java | 22 + .../platform/system/mapper/SysLogMapper.java | 16 + .../platform/system/mapper/SysMenuMapper.java | 59 + .../system/mapper/SysOrganizationMapper.java | 33 + .../platform/system/mapper/SysRoleMapper.java | 89 + .../platform/system/mapper/SysUserMapper.java | 96 + .../system/service/IMessageService.java | 16 + .../system/service/IQuartzJobService.java | 43 + .../system/service/ISysConfigService.java | 22 + .../service/ISysDictionaryItemsService.java | 47 + .../system/service/ISysDictionaryService.java | 45 + .../system/service/ISysLogService.java | 52 + .../system/service/ISysMenuService.java | 101 + .../service/ISysOrganizationService.java | 60 + .../system/service/ISysRoleService.java | 66 + .../platform/system/service/IUserService.java | 143 + .../service/impl/MessageServiceImpl.java | 20 + .../service/impl/QuartzJobServiceImpl.java | 114 + .../service/impl/SysConfigServiceImpl.java | 34 + .../impl/SysDictionaryItemsServiceImpl.java | 123 + .../impl/SysDictionaryServiceImpl.java | 114 + .../service/impl/SysLogServiceImpl.java | 219 + .../service/impl/SysMenuServiceImpl.java | 674 ++ .../impl/SysOrganizationServiceImpl.java | 338 + .../service/impl/SysRoleServiceImpl.java | 163 + .../service/impl/UserDetailsServiceImpl.java | 52 + .../system/service/impl/UserServiceImpl.java | 550 ++ .../com/yfd/platform/task/TaskMessage.java | 57 + .../java/com/yfd/platform/utils/CallBack.java | 43 + .../com/yfd/platform/utils/CodeGenerator.java | 75 + .../yfd/platform/utils/EncryptConfigUtil.java | 28 + .../com/yfd/platform/utils/EncryptUtils.java | 100 + .../com/yfd/platform/utils/ExecutionJob.java | 103 + .../java/com/yfd/platform/utils/FileUtil.java | 398 + .../com/yfd/platform/utils/MpGenerator.java | 79 + .../yfd/platform/utils/PropertiesUtils.java | 29 + .../com/yfd/platform/utils/QuartzManage.java | 187 + .../yfd/platform/utils/QuartzRunnable.java | 58 + .../com/yfd/platform/utils/RequestHolder.java | 34 + .../java/com/yfd/platform/utils/RsaUtils.java | 181 + .../com/yfd/platform/utils/SecurityUtils.java | 84 + .../platform/utils/SpringContextHolder.java | 145 + .../com/yfd/platform/utils/StringUtils.java | 305 + .../src/main/resources/all-application.yml | 168 + .../src/main/resources/application-dev.yml | 84 + .../src/main/resources/application-server.yml | 43 + framework/src/main/resources/application.yml | 36 + framework/src/main/resources/banner.txt | 8 + .../src/main/resources/ip2region/ip2region.db | 0 .../main/resources/log4jdbc.log4j2.properties | 4 + .../src/main/resources/logback-spring.xml | 38 + framework/src/main/resources/logback.xml | 45 + .../mapper/system/DictionaryMapper.xml | 5 + .../resources/mapper/system/MessageMapper.xml | 5 + .../resources/mapper/system/Model3dMapper.xml | 5 + .../mapper/system/QuartzJobMapper.xml | 5 + .../mapper/system/SysConfigMapper.xml | 5 + .../system/SysDictionaryItemsMapper.xml | 5 + .../mapper/system/SysDictionaryMapper.xml | 15 + .../resources/mapper/system/SysLogMapper.xml | 5 + .../resources/mapper/system/SysMenuMapper.xml | 103 + .../mapper/system/SysMessageMapper.xml | 5 + .../mapper/system/SysOrganizationMapper.xml | 14 + .../mapper/system/SysQuartzJobMapper.xml | 5 + .../resources/mapper/system/SysRoleMapper.xml | 116 + .../resources/mapper/system/SysUserMapper.xml | 114 + .../src/main/resources/quartz.properties | 21 + .../resources/static/assets/401-485a4475.js | 1 + .../resources/static/assets/404-ae343fa7.js | 1 + .../static/assets/BarChart-a4765ae3.js | 1 + .../static/assets/FunnelChart-8e41d306.js | 1 + .../static/assets/PieChart-f0d9d351.js | 1 + .../static/assets/RadarChart-94b1112a.js | 1 + .../static/assets/editor-ec3491e5.js | 186 + .../resources/static/assets/index-0985e541.js | 1 + .../resources/static/assets/index-09ad406e.js | 1 + .../resources/static/assets/index-175944b3.js | 18 + .../resources/static/assets/index-1e7d81fe.js | 1 + .../resources/static/assets/index-2be13ce1.js | 1 + .../resources/static/assets/index-373114d3.js | 1 + .../resources/static/assets/index-5682e1da.js | 1 + .../resources/static/assets/index-5c62e6c4.js | 83 + .../resources/static/assets/index-86feac6e.js | 1 + .../resources/static/assets/index-a59640f3.js | 1 + .../static/assets/index-b5bae886.css | 1 + .../static/assets/index-b5bb9b55.css | 1 + .../resources/static/assets/index-bcf8ef0f.js | 1 + .../resources/static/assets/index-ca91e236.js | 1 + .../resources/static/assets/index-cbe38f69.js | 1 + .../resources/static/assets/index-de9a584a.js | 1 + .../resources/static/assets/index-eb03182a.js | 1 + .../resources/static/assets/index-f43bf226.js | 1 + .../resources/static/assets/index-f88fe59a.js | 1 + .../resources/static/assets/index-fa740669.js | 1 + .../resources/static/assets/index-fc9ca505.js | 1 + .../static/assets/index1-ac4606af.js | 1 + .../static/assets/index2-46aebe19.js | 1 + ...ue_type_script_setup_true_lang-42348387.js | 1 + .../static/assets/personalCenter-a1e83f26.js | 1 + .../static/assets/resize-9f0962b6.js | 60 + .../static/assets/tagsView-319ee48a.js | 1 + .../static/assets/uploader-343a71b2.js | 1 + .../icon/0312cfde741a47ad9dfd2b6379c24229.png | Bin 0 -> 630 bytes .../icon/1376916838a345799b96ac1eacc8608f.png | Bin 0 -> 520 bytes .../icon/1449347c56414681a321dc3c84302b00.png | Bin 0 -> 630 bytes .../icon/56b7117b688a40699246aa378119c005.png | Bin 0 -> 520 bytes .../icon/78e0a2de1f8e4354ad4bc46101ff7b1d.png | Bin 0 -> 570 bytes .../icon/88d05ff3ffa74bcd9f80584c9edf300d.png | Bin 0 -> 630 bytes .../icon/91a883092f2a40ee84b135aea9640fd1.png | Bin 0 -> 431 bytes .../icon/aff16e96f9164e5196942b3738c55c10.png | Bin 0 -> 630 bytes .../icon/beaea0bdfd514f61b451d400e93f81b4.png | Bin 0 -> 498 bytes .../icon/c6cdc92296c24d168c8c08aa2009d7ca.png | Bin 0 -> 527 bytes .../icon/cc9abc741e7d444e9d8736056d76cb49.png | Bin 0 -> 414 bytes .../icon/cf3e2b0ace7a42a7b627cdd4929b21d1.png | Bin 0 -> 640 bytes .../platform/PlatformApplicationTests.java | 49 + .../test/java/com/yfd/platform/TestGuaVA.java | 73 + git管理方案.md | 420 + pom.xml | 22 + scripts/sync-frontend.ps1 | 20 + 463 files changed, 34281 insertions(+) create mode 100644 business-css/README.md create mode 100644 business-css/frontend/README.md create mode 100644 business-css/pom.xml create mode 100644 business-css/src/main/resources/application-dev.yml create mode 100644 framework/.gitignore create mode 100644 framework/.husky/pre-commit create mode 100644 framework/Dockerfile create mode 100644 framework/docs/前后端整合.md create mode 100644 framework/docs/技术文档.md create mode 100644 framework/frontend/.editorconfig create mode 100644 framework/frontend/.env.development create mode 100644 framework/frontend/.env.production create mode 100644 framework/frontend/.env.staging create mode 100644 framework/frontend/.eslintignore create mode 100644 framework/frontend/.eslintrc.js create mode 100644 framework/frontend/.gitignore create mode 100644 framework/frontend/.npmrc create mode 100644 framework/frontend/.prettierignore create mode 100644 framework/frontend/.prettierrc.js create mode 100644 framework/frontend/LICENSE create mode 100644 framework/frontend/commitlint.config.js create mode 100644 framework/frontend/index.html create mode 100644 framework/frontend/npminstall-debug.log create mode 100644 framework/frontend/package.json create mode 100644 framework/frontend/pnpm-lock.yaml create mode 100644 framework/frontend/postcss.config.js create mode 100644 framework/frontend/public/favicon.ico create mode 100644 framework/frontend/readme.md create mode 100644 framework/frontend/src/App.vue create mode 100644 framework/frontend/src/api/auth/index.ts create mode 100644 framework/frontend/src/api/auth/types.ts create mode 100644 framework/frontend/src/api/dept/index.ts create mode 100644 framework/frontend/src/api/dept/types.ts create mode 100644 framework/frontend/src/api/dict/index.ts create mode 100644 framework/frontend/src/api/dict/types.ts create mode 100644 framework/frontend/src/api/file/index.ts create mode 100644 framework/frontend/src/api/file/types.ts create mode 100644 framework/frontend/src/api/menu/index.ts create mode 100644 framework/frontend/src/api/menu/types.ts create mode 100644 framework/frontend/src/api/message/index.ts create mode 100644 framework/frontend/src/api/record/index.ts create mode 100644 framework/frontend/src/api/role/index.ts create mode 100644 framework/frontend/src/api/role/types.ts create mode 100644 framework/frontend/src/api/taxkSetting/index.ts create mode 100644 framework/frontend/src/api/user/index.ts create mode 100644 framework/frontend/src/api/user/types.ts create mode 100644 framework/frontend/src/assets/401_images/401.gif create mode 100644 framework/frontend/src/assets/404_images/404.png create mode 100644 framework/frontend/src/assets/404_images/404_cloud.png create mode 100644 framework/frontend/src/assets/MenuIcon/bq_gb.png create mode 100644 framework/frontend/src/assets/MenuIcon/bq_gb1.png create mode 100644 framework/frontend/src/assets/MenuIcon/czan_xz.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_jt.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_jt1.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_qy.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_qy1.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_qz.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_qz1.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_sq.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_sq1.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_sy.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_sy1.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_sz.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_sz1.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_xm.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_xm1.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_xx.png create mode 100644 framework/frontend/src/assets/MenuIcon/dh_xx1.png create mode 100644 framework/frontend/src/assets/MenuIcon/gb.png create mode 100644 framework/frontend/src/assets/MenuIcon/grzx_tx.png create mode 100644 framework/frontend/src/assets/MenuIcon/grzx_xg.png create mode 100644 framework/frontend/src/assets/MenuIcon/jscz_rl.png create mode 100644 framework/frontend/src/assets/MenuIcon/jscz_sc.png create mode 100644 framework/frontend/src/assets/MenuIcon/jscz_sc1.png create mode 100644 framework/frontend/src/assets/MenuIcon/jscz_scdc.png create mode 100644 framework/frontend/src/assets/MenuIcon/jscz_xz.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_an.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_an1.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_cd.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_cd1.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_czmm.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_jt.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_jt1.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_qx.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_sc.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_sc1.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_sc2.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_td.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_td1.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_td2.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_xg.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_xg1.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_xg2.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_zml.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_zml1.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_zyw.png create mode 100644 framework/frontend/src/assets/MenuIcon/lbcz_zz.png create mode 100644 framework/frontend/src/assets/MenuIcon/top_qp.png create mode 100644 framework/frontend/src/assets/MenuIcon/top_qp1.png create mode 100644 framework/frontend/src/assets/MenuIcon/top_ss.png create mode 100644 framework/frontend/src/assets/MenuIcon/top_tx.png create mode 100644 framework/frontend/src/assets/MenuIcon/top_zh.png create mode 100644 framework/frontend/src/assets/MenuIcon/ts.png create mode 100644 framework/frontend/src/assets/MenuIcon/u117_mouseOver.png create mode 100644 framework/frontend/src/assets/MenuIcon/u119.png create mode 100644 framework/frontend/src/assets/MenuIcon/u241.png create mode 100644 framework/frontend/src/assets/MenuIcon/u343.png create mode 100644 framework/frontend/src/assets/MenuIcon/u697.png create mode 100644 framework/frontend/src/assets/MenuIcon/u81.png create mode 100644 framework/frontend/src/assets/MenuIcon/xqing.png create mode 100644 framework/frontend/src/assets/icons/advert.svg create mode 100644 framework/frontend/src/assets/icons/brand.svg create mode 100644 framework/frontend/src/assets/icons/bug.svg create mode 100644 framework/frontend/src/assets/icons/cascader.svg create mode 100644 framework/frontend/src/assets/icons/chart.svg create mode 100644 framework/frontend/src/assets/icons/client.svg create mode 100644 framework/frontend/src/assets/icons/close.svg create mode 100644 framework/frontend/src/assets/icons/close_all.svg create mode 100644 framework/frontend/src/assets/icons/close_left.svg create mode 100644 framework/frontend/src/assets/icons/close_other.svg create mode 100644 framework/frontend/src/assets/icons/close_right.svg create mode 100644 framework/frontend/src/assets/icons/coupon.svg create mode 100644 framework/frontend/src/assets/icons/dashboard.svg create mode 100644 framework/frontend/src/assets/icons/dict.svg create mode 100644 framework/frontend/src/assets/icons/dict_item.svg create mode 100644 framework/frontend/src/assets/icons/download.svg create mode 100644 framework/frontend/src/assets/icons/drag.svg create mode 100644 framework/frontend/src/assets/icons/edit.svg create mode 100644 framework/frontend/src/assets/icons/exit-fullscreen.svg create mode 100644 framework/frontend/src/assets/icons/eye-open.svg create mode 100644 framework/frontend/src/assets/icons/eye.svg create mode 100644 framework/frontend/src/assets/icons/fullscreen.svg create mode 100644 framework/frontend/src/assets/icons/github.svg create mode 100644 framework/frontend/src/assets/icons/goods-list.svg create mode 100644 framework/frontend/src/assets/icons/goods.svg create mode 100644 framework/frontend/src/assets/icons/guide.svg create mode 100644 framework/frontend/src/assets/icons/homepage.svg create mode 100644 framework/frontend/src/assets/icons/lab.svg create mode 100644 framework/frontend/src/assets/icons/language.svg create mode 100644 framework/frontend/src/assets/icons/link.svg create mode 100644 framework/frontend/src/assets/icons/locationIcon.png create mode 100644 framework/frontend/src/assets/icons/menu.svg create mode 100644 framework/frontend/src/assets/icons/message.svg create mode 100644 framework/frontend/src/assets/icons/money.svg create mode 100644 framework/frontend/src/assets/icons/monitor.svg create mode 100644 framework/frontend/src/assets/icons/nested.svg create mode 100644 framework/frontend/src/assets/icons/number.svg create mode 100644 framework/frontend/src/assets/icons/order.svg create mode 100644 framework/frontend/src/assets/icons/password.svg create mode 100644 framework/frontend/src/assets/icons/peoples.svg create mode 100644 framework/frontend/src/assets/icons/perm.svg create mode 100644 framework/frontend/src/assets/icons/publish.svg create mode 100644 framework/frontend/src/assets/icons/qq.svg create mode 100644 framework/frontend/src/assets/icons/rabbitmq.svg create mode 100644 framework/frontend/src/assets/icons/rate.svg create mode 100644 framework/frontend/src/assets/icons/redis.svg create mode 100644 framework/frontend/src/assets/icons/refresh.svg create mode 100644 framework/frontend/src/assets/icons/role.svg create mode 100644 framework/frontend/src/assets/icons/security.svg create mode 100644 framework/frontend/src/assets/icons/shopping.svg create mode 100644 framework/frontend/src/assets/icons/size.svg create mode 100644 framework/frontend/src/assets/icons/skill.svg create mode 100644 framework/frontend/src/assets/icons/system.svg create mode 100644 framework/frontend/src/assets/icons/theme.svg create mode 100644 framework/frontend/src/assets/icons/tree.svg create mode 100644 framework/frontend/src/assets/icons/user.svg create mode 100644 framework/frontend/src/assets/icons/uv.svg create mode 100644 framework/frontend/src/assets/icons/valid_code.svg create mode 100644 framework/frontend/src/assets/icons/wechat.svg create mode 100644 framework/frontend/src/assets/images/linefeed.png create mode 100644 framework/frontend/src/assets/images/linefeed.png_mouseOver.png create mode 100644 framework/frontend/src/assets/images/u287.gif create mode 100644 framework/frontend/src/assets/images/u3127.png create mode 100644 framework/frontend/src/assets/images/u3139.png create mode 100644 framework/frontend/src/assets/index/indicator.png create mode 100644 framework/frontend/src/assets/logo.png create mode 100644 framework/frontend/src/components.d.ts create mode 100644 framework/frontend/src/components/Breadcrumb/index.vue create mode 100644 framework/frontend/src/components/GithubCorner/index.vue create mode 100644 framework/frontend/src/components/Hamburger/index.vue create mode 100644 framework/frontend/src/components/IconSelect/index.vue create mode 100644 framework/frontend/src/components/LangSelect/index.vue create mode 100644 framework/frontend/src/components/Pagination/index.vue create mode 100644 framework/frontend/src/components/Pagination/page.vue create mode 100644 framework/frontend/src/components/RightPanel/index.vue create mode 100644 framework/frontend/src/components/Screenfull/index.vue create mode 100644 framework/frontend/src/components/SizeSelect/index.vue create mode 100644 framework/frontend/src/components/SvgIcon/index.vue create mode 100644 framework/frontend/src/components/ThemePicker/index.vue create mode 100644 framework/frontend/src/components/Upload/MultiUpload.vue create mode 100644 framework/frontend/src/components/Upload/SingleUpload.vue create mode 100644 framework/frontend/src/components/WangEditor/index.vue create mode 100644 framework/frontend/src/directive/index.ts create mode 100644 framework/frontend/src/directive/permission/index.ts create mode 100644 framework/frontend/src/directive/utils/index.ts create mode 100644 framework/frontend/src/env.d.ts create mode 100644 framework/frontend/src/lang/en.ts create mode 100644 framework/frontend/src/lang/index.ts create mode 100644 framework/frontend/src/lang/zh-cn.ts create mode 100644 framework/frontend/src/layout/components/AppMain.vue create mode 100644 framework/frontend/src/layout/components/Navbar.vue create mode 100644 framework/frontend/src/layout/components/Settings/index.vue create mode 100644 framework/frontend/src/layout/components/Sidebar/Link.vue create mode 100644 framework/frontend/src/layout/components/Sidebar/Logo.vue create mode 100644 framework/frontend/src/layout/components/Sidebar/MixNav.vue create mode 100644 framework/frontend/src/layout/components/Sidebar/SidebarItem.vue create mode 100644 framework/frontend/src/layout/components/Sidebar/index.vue create mode 100644 framework/frontend/src/layout/components/TagsView/ScrollPane.vue create mode 100644 framework/frontend/src/layout/components/TagsView/index.vue create mode 100644 framework/frontend/src/layout/components/index.ts create mode 100644 framework/frontend/src/layout/components/news.vue create mode 100644 framework/frontend/src/layout/index.vue create mode 100644 framework/frontend/src/main.ts create mode 100644 framework/frontend/src/permission.ts create mode 100644 framework/frontend/src/router/index.ts create mode 100644 framework/frontend/src/settings.ts create mode 100644 framework/frontend/src/shims.d.ts create mode 100644 framework/frontend/src/store/index.ts create mode 100644 framework/frontend/src/store/modules/app.ts create mode 100644 framework/frontend/src/store/modules/permission.ts create mode 100644 framework/frontend/src/store/modules/settings.ts create mode 100644 framework/frontend/src/store/modules/tagsView.ts create mode 100644 framework/frontend/src/store/modules/user.ts create mode 100644 framework/frontend/src/styles/element-plus.scss create mode 100644 framework/frontend/src/styles/index.scss create mode 100644 framework/frontend/src/styles/mixin.scss create mode 100644 framework/frontend/src/styles/sidebar.scss create mode 100644 framework/frontend/src/styles/tailwind.scss create mode 100644 framework/frontend/src/styles/variables.module.css create mode 100644 framework/frontend/src/styles/variables.module.css.map create mode 100644 framework/frontend/src/styles/variables.module.scss create mode 100644 framework/frontend/src/utils/auth.ts create mode 100644 framework/frontend/src/utils/filter.ts create mode 100644 framework/frontend/src/utils/i18n.ts create mode 100644 framework/frontend/src/utils/index.ts create mode 100644 framework/frontend/src/utils/localStorage.ts create mode 100644 framework/frontend/src/utils/request.ts create mode 100644 framework/frontend/src/utils/resize.ts create mode 100644 framework/frontend/src/utils/rsaEncrypt.ts create mode 100644 framework/frontend/src/utils/scroll-to.ts create mode 100644 framework/frontend/src/utils/sessionStorage.ts create mode 100644 framework/frontend/src/utils/validate.ts create mode 100644 framework/frontend/src/views/TaskSetting/index.vue create mode 100644 framework/frontend/src/views/component/editor.vue create mode 100644 framework/frontend/src/views/component/uploader.vue create mode 100644 framework/frontend/src/views/dashboard/components/Chart/BarChart.vue create mode 100644 framework/frontend/src/views/dashboard/components/Chart/FunnelChart.vue create mode 100644 framework/frontend/src/views/dashboard/components/Chart/PieChart.vue create mode 100644 framework/frontend/src/views/dashboard/components/Chart/RadarChart.vue create mode 100644 framework/frontend/src/views/dashboard/components/Project/index.vue create mode 100644 framework/frontend/src/views/dashboard/components/Team/index.vue create mode 100644 framework/frontend/src/views/dashboard/index.vue create mode 100644 framework/frontend/src/views/error-page/401.vue create mode 100644 framework/frontend/src/views/error-page/404.vue create mode 100644 framework/frontend/src/views/login/index.vue create mode 100644 framework/frontend/src/views/nested/level1/index.vue create mode 100644 framework/frontend/src/views/nested/level1/level2/index.vue create mode 100644 framework/frontend/src/views/nested/level1/level2/level3/index1.vue create mode 100644 framework/frontend/src/views/nested/level1/level2/level3/index2.vue create mode 100644 framework/frontend/src/views/redirect/index.vue create mode 100644 framework/frontend/src/views/system/dept/index.vue create mode 100644 framework/frontend/src/views/system/dict/index.vue create mode 100644 framework/frontend/src/views/system/menu/index.vue create mode 100644 framework/frontend/src/views/system/record/index.vue create mode 100644 framework/frontend/src/views/system/role/index.vue create mode 100644 framework/frontend/src/views/system/user/index.vue create mode 100644 framework/frontend/src/views/system/user/personalCenter.vue create mode 100644 framework/frontend/tailwind.config.js create mode 100644 framework/frontend/tsconfig.json create mode 100644 framework/frontend/types/components.d.ts create mode 100644 framework/frontend/types/env.d.ts create mode 100644 framework/frontend/types/global.d.ts create mode 100644 framework/frontend/vite.config.ts create mode 100644 framework/pom.xml create mode 100644 framework/src/main/java/com/yfd/platform/PlatformApplication.java create mode 100644 framework/src/main/java/com/yfd/platform/ServletInitializer.java create mode 100644 framework/src/main/java/com/yfd/platform/annotation/AnonymousAccess.java create mode 100644 framework/src/main/java/com/yfd/platform/annotation/Log.java create mode 100644 framework/src/main/java/com/yfd/platform/annotation/rest/AnonymousGetMapping.java create mode 100644 framework/src/main/java/com/yfd/platform/aspect/LogAspect.java create mode 100644 framework/src/main/java/com/yfd/platform/component/ServerSendEventServer.java create mode 100644 framework/src/main/java/com/yfd/platform/component/WebSocketServer.java create mode 100644 framework/src/main/java/com/yfd/platform/config/FileProperties.java create mode 100644 framework/src/main/java/com/yfd/platform/config/FileSpaceProperties.java create mode 100644 framework/src/main/java/com/yfd/platform/config/GlobalExceptionHandler.java create mode 100644 framework/src/main/java/com/yfd/platform/config/JobRunner.java create mode 100644 framework/src/main/java/com/yfd/platform/config/JwtAuthenticationTokenFilter.java create mode 100644 framework/src/main/java/com/yfd/platform/config/MessageConfig.java create mode 100644 framework/src/main/java/com/yfd/platform/config/MybitsPlusConfig.java create mode 100644 framework/src/main/java/com/yfd/platform/config/ProdApiPrefixFilter.java create mode 100644 framework/src/main/java/com/yfd/platform/config/QuartzConfig.java create mode 100644 framework/src/main/java/com/yfd/platform/config/ResponseResult.java create mode 100644 framework/src/main/java/com/yfd/platform/config/SecurityConfig.java create mode 100644 framework/src/main/java/com/yfd/platform/config/SwaggerConfig.java create mode 100644 framework/src/main/java/com/yfd/platform/config/WebConfig.java create mode 100644 framework/src/main/java/com/yfd/platform/config/WebSocketConfig.java create mode 100644 framework/src/main/java/com/yfd/platform/config/bean/LoginCode.java create mode 100644 framework/src/main/java/com/yfd/platform/config/bean/LoginCodeEnum.java create mode 100644 framework/src/main/java/com/yfd/platform/config/bean/LoginProperties.java create mode 100644 framework/src/main/java/com/yfd/platform/config/thread/AsyncTaskExecutePool.java create mode 100644 framework/src/main/java/com/yfd/platform/config/thread/AsyncTaskProperties.java create mode 100644 framework/src/main/java/com/yfd/platform/config/thread/TheadFactoryName.java create mode 100644 framework/src/main/java/com/yfd/platform/config/thread/ThreadPoolExecutorUtil.java create mode 100644 framework/src/main/java/com/yfd/platform/constant/Constant.java create mode 100644 framework/src/main/java/com/yfd/platform/datasource/DataSource.java create mode 100644 framework/src/main/java/com/yfd/platform/datasource/DataSourceAspect.java create mode 100644 framework/src/main/java/com/yfd/platform/datasource/DynamicDataSource.java create mode 100644 framework/src/main/java/com/yfd/platform/datasource/DynamicDataSourceConfig.java create mode 100644 framework/src/main/java/com/yfd/platform/exception/AccessDeniedHandExcetion.java create mode 100644 framework/src/main/java/com/yfd/platform/exception/AuthenticationException.java create mode 100644 framework/src/main/java/com/yfd/platform/exception/BadConfigurationException.java create mode 100644 framework/src/main/java/com/yfd/platform/exception/BadRequestException.java create mode 100644 framework/src/main/java/com/yfd/platform/exception/ChildrenExistException.java create mode 100644 framework/src/main/java/com/yfd/platform/exception/EntityExistException.java create mode 100644 framework/src/main/java/com/yfd/platform/exception/EntityNotFoundException.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/DataSourceController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/LoginController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/MessageController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/QuartzJobController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/SSEController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/SysConfigController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/SysDictionaryController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/SysDictionaryItemsController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/SysLogController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/SysMenuController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/SysOrganizationController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/SysRoleController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/controller/UserController.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/Dictionary.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/LoginUser.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/Message.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/QuartzJob.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/SysConfig.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/SysDictionary.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/SysDictionaryItems.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/SysLog.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/SysMenu.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/SysOrganization.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/SysRole.java create mode 100644 framework/src/main/java/com/yfd/platform/system/domain/SysUser.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/MessageMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/QuartzJobMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/SysConfigMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/SysDictionaryItemsMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/SysDictionaryMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/SysLogMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/SysOrganizationMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/IMessageService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/IQuartzJobService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/ISysConfigService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/ISysDictionaryItemsService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/ISysDictionaryService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/ISysLogService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/ISysMenuService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/ISysOrganizationService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/ISysRoleService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/IUserService.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/MessageServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/QuartzJobServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/SysConfigServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryItemsServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/SysLogServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/UserDetailsServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java create mode 100644 framework/src/main/java/com/yfd/platform/task/TaskMessage.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/CallBack.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/CodeGenerator.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/EncryptConfigUtil.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/EncryptUtils.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/ExecutionJob.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/FileUtil.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/MpGenerator.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/PropertiesUtils.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/QuartzManage.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/QuartzRunnable.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/RequestHolder.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/RsaUtils.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/SecurityUtils.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/SpringContextHolder.java create mode 100644 framework/src/main/java/com/yfd/platform/utils/StringUtils.java create mode 100644 framework/src/main/resources/all-application.yml create mode 100644 framework/src/main/resources/application-dev.yml create mode 100644 framework/src/main/resources/application-server.yml create mode 100644 framework/src/main/resources/application.yml create mode 100644 framework/src/main/resources/banner.txt create mode 100644 framework/src/main/resources/ip2region/ip2region.db create mode 100644 framework/src/main/resources/log4jdbc.log4j2.properties create mode 100644 framework/src/main/resources/logback-spring.xml create mode 100644 framework/src/main/resources/logback.xml create mode 100644 framework/src/main/resources/mapper/system/DictionaryMapper.xml create mode 100644 framework/src/main/resources/mapper/system/MessageMapper.xml create mode 100644 framework/src/main/resources/mapper/system/Model3dMapper.xml create mode 100644 framework/src/main/resources/mapper/system/QuartzJobMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysConfigMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysDictionaryItemsMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysDictionaryMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysLogMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysMenuMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysMessageMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysOrganizationMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysQuartzJobMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysRoleMapper.xml create mode 100644 framework/src/main/resources/mapper/system/SysUserMapper.xml create mode 100644 framework/src/main/resources/quartz.properties create mode 100644 framework/src/main/resources/static/assets/401-485a4475.js create mode 100644 framework/src/main/resources/static/assets/404-ae343fa7.js create mode 100644 framework/src/main/resources/static/assets/BarChart-a4765ae3.js create mode 100644 framework/src/main/resources/static/assets/FunnelChart-8e41d306.js create mode 100644 framework/src/main/resources/static/assets/PieChart-f0d9d351.js create mode 100644 framework/src/main/resources/static/assets/RadarChart-94b1112a.js create mode 100644 framework/src/main/resources/static/assets/editor-ec3491e5.js create mode 100644 framework/src/main/resources/static/assets/index-0985e541.js create mode 100644 framework/src/main/resources/static/assets/index-09ad406e.js create mode 100644 framework/src/main/resources/static/assets/index-175944b3.js create mode 100644 framework/src/main/resources/static/assets/index-1e7d81fe.js create mode 100644 framework/src/main/resources/static/assets/index-2be13ce1.js create mode 100644 framework/src/main/resources/static/assets/index-373114d3.js create mode 100644 framework/src/main/resources/static/assets/index-5682e1da.js create mode 100644 framework/src/main/resources/static/assets/index-5c62e6c4.js create mode 100644 framework/src/main/resources/static/assets/index-86feac6e.js create mode 100644 framework/src/main/resources/static/assets/index-a59640f3.js create mode 100644 framework/src/main/resources/static/assets/index-b5bae886.css create mode 100644 framework/src/main/resources/static/assets/index-b5bb9b55.css create mode 100644 framework/src/main/resources/static/assets/index-bcf8ef0f.js create mode 100644 framework/src/main/resources/static/assets/index-ca91e236.js create mode 100644 framework/src/main/resources/static/assets/index-cbe38f69.js create mode 100644 framework/src/main/resources/static/assets/index-de9a584a.js create mode 100644 framework/src/main/resources/static/assets/index-eb03182a.js create mode 100644 framework/src/main/resources/static/assets/index-f43bf226.js create mode 100644 framework/src/main/resources/static/assets/index-f88fe59a.js create mode 100644 framework/src/main/resources/static/assets/index-fa740669.js create mode 100644 framework/src/main/resources/static/assets/index-fc9ca505.js create mode 100644 framework/src/main/resources/static/assets/index1-ac4606af.js create mode 100644 framework/src/main/resources/static/assets/index2-46aebe19.js create mode 100644 framework/src/main/resources/static/assets/page.vue_vue_type_script_setup_true_lang-42348387.js create mode 100644 framework/src/main/resources/static/assets/personalCenter-a1e83f26.js create mode 100644 framework/src/main/resources/static/assets/resize-9f0962b6.js create mode 100644 framework/src/main/resources/static/assets/tagsView-319ee48a.js create mode 100644 framework/src/main/resources/static/assets/uploader-343a71b2.js create mode 100644 framework/src/main/resources/static/icon/0312cfde741a47ad9dfd2b6379c24229.png create mode 100644 framework/src/main/resources/static/icon/1376916838a345799b96ac1eacc8608f.png create mode 100644 framework/src/main/resources/static/icon/1449347c56414681a321dc3c84302b00.png create mode 100644 framework/src/main/resources/static/icon/56b7117b688a40699246aa378119c005.png create mode 100644 framework/src/main/resources/static/icon/78e0a2de1f8e4354ad4bc46101ff7b1d.png create mode 100644 framework/src/main/resources/static/icon/88d05ff3ffa74bcd9f80584c9edf300d.png create mode 100644 framework/src/main/resources/static/icon/91a883092f2a40ee84b135aea9640fd1.png create mode 100644 framework/src/main/resources/static/icon/aff16e96f9164e5196942b3738c55c10.png create mode 100644 framework/src/main/resources/static/icon/beaea0bdfd514f61b451d400e93f81b4.png create mode 100644 framework/src/main/resources/static/icon/c6cdc92296c24d168c8c08aa2009d7ca.png create mode 100644 framework/src/main/resources/static/icon/cc9abc741e7d444e9d8736056d76cb49.png create mode 100644 framework/src/main/resources/static/icon/cf3e2b0ace7a42a7b627cdd4929b21d1.png create mode 100644 framework/src/test/java/com/yfd/platform/PlatformApplicationTests.java create mode 100644 framework/src/test/java/com/yfd/platform/TestGuaVA.java create mode 100644 git管理方案.md create mode 100644 pom.xml create mode 100644 scripts/sync-frontend.ps1 diff --git a/business-css/README.md b/business-css/README.md new file mode 100644 index 0000000..5fafa92 --- /dev/null +++ b/business-css/README.md @@ -0,0 +1,19 @@ +# Critical Scenario Simulator (CSS) + +临界事故情景分析模拟系统(CSS)业务模块。 + +## 后端模块 +- Maven 模块路径:`business-css/` +- 依赖复用:依赖 `framework` 生成的 classes JAR(`com.yfd:platform:1.0`)。 +- 按需添加业务领域代码(实体、服务、控制器)。 + +## 前端模块 +- 目录:`business-css/frontend/` +- 初始化方式:从 `framework/frontend` 复制基线前端后进行业务化开发。 +- 同步机制:使用 `scripts/sync-frontend.ps1` 从基线前端同步公共目录(排除环境配置)。 + +## 初始化步骤 +1. 执行前端同步脚本,初始化 `business-css/frontend`。 +2. 安装前端依赖:`pnpm i` 或 `npm ci`。 +3. 启动前端:`pnpm dev` 或 `npm run dev`。 +4. 后端模块使用 `mvn -pl business-css -am clean verify` 构建与测试。 \ No newline at end of file diff --git a/business-css/frontend/README.md b/business-css/frontend/README.md new file mode 100644 index 0000000..44dd73f --- /dev/null +++ b/business-css/frontend/README.md @@ -0,0 +1,6 @@ +# CSS 前端(占位) + +初始化指引: +- 运行 `scripts/sync-frontend.ps1` 将 `framework/frontend` 基线复制到此目录。 +- 在本目录执行 `pnpm i` 或 `npm ci` 安装依赖。 +- 更新 `.env.*`、路由与页面以适配 CSS 业务需求。 \ No newline at end of file diff --git a/business-css/pom.xml b/business-css/pom.xml new file mode 100644 index 0000000..72ae4eb --- /dev/null +++ b/business-css/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + + com.yfd + JavaProjectParent + 1.0 + ../pom.xml + + + com.yfd.css + css-backend + 1.0.0-SNAPSHOT + war + + Critical Scenario Simulator (CSS) Backend + 临界事故情景分析模拟系统 - 后端模块 + + + 17 + + + + + + com.yfd + framework + 1.0 + jar + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-test + test + + + + \ No newline at end of file diff --git a/business-css/src/main/resources/application-dev.yml b/business-css/src/main/resources/application-dev.yml new file mode 100644 index 0000000..b9aca6b --- /dev/null +++ b/business-css/src/main/resources/application-dev.yml @@ -0,0 +1,11 @@ +server: + port: 8098 + +spring: + application: + name: css-backend + +css: + scenario: + defaultRiskLevel: MEDIUM + simulationMaxSteps: 1000 \ No newline at end of file diff --git a/framework/.gitignore b/framework/.gitignore new file mode 100644 index 0000000..d5bd64e --- /dev/null +++ b/framework/.gitignore @@ -0,0 +1,104 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +/logs/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ +src/main/resources/static/favicon.ico +src/main/resources/static/index.html +src/main/resources/static/assets/401-88639a9f.js +src/main/resources/static/assets/401-a61ddb94.gif +src/main/resources/static/assets/401-d244ab29.css +src/main/resources/static/assets/404_cloud-98e7ac66.png +src/main/resources/static/assets/404-7ca1fe28.css +src/main/resources/static/assets/404-7d365cf6.js +src/main/resources/static/assets/404-538aa4d7.png +src/main/resources/static/assets/BarChart-4fa92581.js +src/main/resources/static/assets/BarChart.vue_vue_type_script_setup_true_lang-2e88c556.js +src/main/resources/static/assets/editor-1fcae90e.js +src/main/resources/static/assets/editor-501cf061.css +src/main/resources/static/assets/FunnelChart-54cd9c1c.js +src/main/resources/static/assets/index-0c0fc4d5.js +src/main/resources/static/assets/index-0c6de5c4.css +src/main/resources/static/assets/index-0e353610.js +src/main/resources/static/assets/index-0fdbb0c3.css +src/main/resources/static/assets/index-2a2e686f.js +src/main/resources/static/assets/index-2d8a94de.js +src/main/resources/static/assets/index-3c8b576d.js +src/main/resources/static/assets/index-3e4e0c0c.css +src/main/resources/static/assets/index-3ea31a03.css +src/main/resources/static/assets/index-4a40522c.js +src/main/resources/static/assets/index-4af6c095.js +src/main/resources/static/assets/index-4b2c54eb.css +src/main/resources/static/assets/index-4e9a4a3c.css +src/main/resources/static/assets/index-4e36f11e.css +src/main/resources/static/assets/index-5b909b30.js +src/main/resources/static/assets/index-6cfbc6e9.js +src/main/resources/static/assets/index-6d369684.js +src/main/resources/static/assets/index-9cdf102e.js +src/main/resources/static/assets/index-013c92bf.css +src/main/resources/static/assets/index-45b24ee3.js +src/main/resources/static/assets/index-58b7edbc.css +src/main/resources/static/assets/index-97e2e5d7.js +src/main/resources/static/assets/index-336eb0cd.js +src/main/resources/static/assets/index-1124a30a.js +src/main/resources/static/assets/index-5736aae9.js +src/main/resources/static/assets/index-23665d45.js +src/main/resources/static/assets/index-35744cd0.css +src/main/resources/static/assets/index-49408471.js +src/main/resources/static/assets/index-a7bce641.css +src/main/resources/static/assets/index-adef366f.js +src/main/resources/static/assets/index-dd0c8cf0.css +src/main/resources/static/assets/index-dd267244.js +src/main/resources/static/assets/index-de40e6e9.css +src/main/resources/static/assets/index-f9a887b2.css +src/main/resources/static/assets/index1-f104bedb.js +src/main/resources/static/assets/index2-8960589f.js +src/main/resources/static/assets/indicator-5b15d0d1.png +src/main/resources/static/assets/lbcz_sc-0ed76926.js +src/main/resources/static/assets/lbcz_td-b5984317.js +src/main/resources/static/assets/lbcz_xg-aaaefba0.js +src/main/resources/static/assets/logo-03d6d6da.png +src/main/resources/static/assets/page.vue_vue_type_script_setup_true_lang-b61c9f0c.js +src/main/resources/static/assets/personalCenter-035ae2fa.js +src/main/resources/static/assets/personalCenter-ad68cb91.css +src/main/resources/static/assets/PieChart-24d7f015.js +src/main/resources/static/assets/PieChart.vue_vue_type_script_setup_true_lang-d4bdc783.js +src/main/resources/static/assets/RadarChart-f3f7d950.js +src/main/resources/static/assets/RadarChart.vue_vue_type_script_setup_true_lang-c1ab7800.js +src/main/resources/static/assets/resize-76420810.js +src/main/resources/static/assets/rsaEncrypt-96cab0ea.js +src/main/resources/static/assets/sortable.esm-be94e56d.js +src/main/resources/static/assets/tagsView-23de2998.js +src/main/resources/static/assets/top_tx-3cab94c6.png +src/main/resources/static/assets/u287-9a3328bc.gif +src/main/resources/static/assets/uploader-769f4f98.js +src/main/resources/static/assets/uploader-ccfd78f9.css diff --git a/framework/.husky/pre-commit b/framework/.husky/pre-commit new file mode 100644 index 0000000..5c7d4f1 --- /dev/null +++ b/framework/.husky/pre-commit @@ -0,0 +1,7 @@ +#!/usr/bin/env sh + +# Basic pre-commit hook initialized at repo root. +# Add your checks below (lint/test/etc.). + +echo "husky pre-commit: no checks configured yet" +exit 0 \ No newline at end of file diff --git a/framework/Dockerfile b/framework/Dockerfile new file mode 100644 index 0000000..ca2a05f --- /dev/null +++ b/framework/Dockerfile @@ -0,0 +1,21 @@ +# syntax=docker/dockerfile:1 +FROM eclipse-temurin:17-jre-alpine + +LABEL maintainer="platform-team" + +ENV TZ=Asia/Shanghai \ + LANG=zh_CN.UTF-8 \ + JAVA_OPTS="-Dfile.encoding=UTF-8" \ + SPRING_PROFILES_ACTIVE=dev + +RUN apk add --no-cache tzdata && \ + ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +WORKDIR /app + +# 注意:在构建镜像前先执行 `mvn -DskipTests package` 生成 WAR +COPY target/platform-1.0.war /app/app.war + +EXPOSE 8093 + +ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.war --spring.profiles.active=$SPRING_PROFILES_ACTIVE"] \ No newline at end of file diff --git a/framework/docs/前后端整合.md b/framework/docs/前后端整合.md new file mode 100644 index 0000000..4bab797 --- /dev/null +++ b/framework/docs/前后端整合.md @@ -0,0 +1,52 @@ +# 前后端一体化构建与打包说明 + +本文档说明如何在 Maven 构建流程中,先编译前端(pnpm),再编译后端(Java),并在 `package` 阶段将两者一起打包,使生成的可运行 `jar/war` 直接可以访问前端首页 `index.html`。 + +## 前置要求 +- 已安装 JDK(推荐 17+)和 Maven(3.6.3+)。 +- 已安装 Node.js(推荐 18+)与 pnpm(全局):`npm i -g pnpm`。 +- 当前项目结构: + - 后端(Spring Boot):`app/pom.xml`,源码在 `app/src/main/java` 与资源在 `app/src/main/resources`。 + - 前端(Vite/Vue):位于 `app/frontend`,构建输出目录默认是 `app/frontend/dist`。 + +## 构建流程概览 +在 `pom.xml` 中集成了以下步骤: +1. `generate-resources` 阶段:进入 `frontend` 目录,执行 `pnpm install --frozen-lockfile` 与 `pnpm run build`。 +2. `process-resources` 阶段:将前端构建产物从 `frontend/dist` 复制到后端资源目录 `src/main/resources/static`。 +3. 随后执行后端 Java 编译与打包,最终产出可运行的 `jar/war`。 + +这样在运行后端时,Spring Boot 会从类路径的 `static` 目录自动提供 `index.html` 作为欢迎页入口(访问根路径 `/` 即可看到前端页面)。 + +## 关键 POM 配置(摘要) +已经在 `app/pom.xml` 的 `` 中加入: +- `exec-maven-plugin`:在 Java 编译前执行 pnpm 安装与构建。 +- `maven-resources-plugin`:复制前端构建产物到 `src/main/resources/static`。 + +无需手动改动目录,只需按下述命令执行即可。 + +## 常用命令 +- 开发运行(跳过测试):`mvn -DskipTests spring-boot:run` + - 如需指定开发配置:`mvn -DskipTests -Dspring-boot.run.profiles=dev spring-boot:run` +- 构建打包(跳过测试):`mvn -DskipTests package` + - 构建过程中会自动执行前端构建并拷贝到后端资源。 + +## 运行与访问 +- 运行可执行包(以 `war` 为例,`artifactId=platform`,`version=1.0`): + - 默认运行:`java -jar target/platform-1.0.war` + - 指定 dev 配置:`java -Dspring.profiles.active=dev -jar target/platform-1.0.war` +- 访问: + - 若启用 `dev` 配置并端口为 `8093`:`http://localhost:8093/` + - 若使用默认端口(例如 `18080`):`http://localhost:18080/` + +> 说明:Spring Boot 会自动将 `classpath:/static/index.html` 作为欢迎页,访问根路径即可进入前端入口页面。 + +## 注意事项 +- 请确保 `pnpm` 可在构建机/开发机的环境变量中直接调用。 +- 若前端构建输出目录(`dist`)有自定义,请同步更新 POM 中的复制路径。 +- 如前端使用路由的 `history` 模式并期望后端兜底到 `index.html`,可按需添加后端控制器或使用前端服务器侧配置(当前方案以静态欢迎页为主)。 + +## 故障排查 +- 构建失败(找不到 `pnpm`):确认已安装并可在命令行执行 `pnpm -v`。 +- 页面乱码:已在 POM 配置统一 JVM 编码为 `UTF-8`;在 Windows PowerShell 终端也应设置为 `UTF-8`。 + +完成上述配置后,只需使用 Maven 的标准命令,即可实现前后端一体化构建和打包运行。 \ No newline at end of file diff --git a/framework/docs/技术文档.md b/framework/docs/技术文档.md new file mode 100644 index 0000000..57b8448 --- /dev/null +++ b/framework/docs/技术文档.md @@ -0,0 +1,161 @@ +# 项目技术文档 + +> 项目:ProjectFrameWork2025(模块:`app` / Java 后端) +> 运行环境:Windows,Java 21(兼容 17+),Spring Boot 3.x + +## 概述 +- 平台型后端服务,采用 `Spring Boot 3.x`,区分 `dev` / `server` 两种运行配置。 +- 数据访问使用 `MyBatis-Plus 3.5.6` 与 `MyBatis 3.5.16`,连接池为 `Druid`。 +- 任务调度使用 `Quartz 2.3.2`;API 文档采用 `springdoc-openapi` / Swagger UI。 +- 支持 WAR 包运行,亦可容器化部署;默认开发端口 `8093`(`server` 可使用 `8090`)。 + +## 目录结构 +- 仓库根(当前工作目录):`D:\Trae_space\ProjectFrameWork2025\app` +- 主要结构: +``` +app/ +├── .gitignore +├── Dockerfile +├── frontend/ # 前端说明或资源 +│ └── readme.md +├── pom.xml # Maven 构建管理 +└── src/ + ├── main/ + │ ├── java/ # 业务代码(入口类在 com.yfd.platform.*) + │ └── resources/ # 配置与静态资源 + └── test/ + └── java/ # 测试代码 +``` + +## 快速开始 +- 前置要求: + - 安装 `JDK 21`(兼容 17+),`Maven 3.9+`,`Git`。 + - Windows 终端执行 `chcp 65001`,确保 UTF-8 编码输出。 +- 构建后端: + - `mvn clean package -DskipTests` +- 本地运行(dev): + - `java -jar target/platform-1.0.war --spring.profiles.active=dev` +- 运行(server): + - `java -jar target/platform-1.0.war --spring.profiles.active=server` +- API 文档: + - 默认访问 `http://localhost:8093/swagger-ui/index.html`(以实际配置为准) + +## 配置说明 +- Profile 切换: + - 通过 `--spring.profiles.active=` 激活环境。 +- 关键属性: + - `file-space.system`:文件根路径,需在激活的 profile 中配置。 + - `spring.datasource.druid.*`:数据库连接参数与池化配置。 + - `server.port`:端口(`dev` 默认 8093,`server` 可使用 8090)。 +- VS Code/终端编码建议: + - 启动参数加入 `-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8`。 + - 终端执行 `chcp 65001`,PowerShell 输出设置为 UTF-8。 + +## 依赖与版本 +- `Spring Boot 3.x` +- `MyBatis-Plus 3.5.6`(依赖 `MyBatis 3.5.16+`,需有 `Configuration.parsePendingResultMaps(boolean)`) +- `Druid` 数据源 +- `Quartz 2.3.2` +- `springdoc-openapi` / Swagger UI +- 日志:`Logback`(UTF-8 输出,`logback-spring.xml`) + +## 数据库配置 +- MySQL 连接示例: +```yaml +spring: + datasource: + druid: + master: + url: jdbc:mysql://:3306/?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&useSSL=false&allowPublicKeyRetrieval=true + username: + password: +``` +- 远程授权建议: +```sql +CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPassword!'; +GRANT ALL PRIVILEGES ON .* TO 'appuser'@'%'; +FLUSH PRIVILEGES; +``` +- Druid 健壮性: +```yaml +spring: + datasource: + druid: + initial-size: 0 + test-on-borrow: false + test-while-idle: true + validation-query: SELECT 1 +``` + +## 日志 +- 控制台与文件统一 UTF-8 输出: + - 控制台 `ConsoleAppender`,文件 `RollingFileAppender`(按日滚动,保留 30 天)。 + - 推荐日志格式:`%d [%thread] %-5level %logger{50} - %msg%n`。 + +## 定时任务 +- 默认 `RAMJobStore`(非集群、内存存储)。 +- 如需持久化与集群,改用 `JdbcJobStore` 并配置数据源与表结构。 + +## 安全与鉴权 +- 使用 `JWT` 过滤器进行鉴权(如 `jwtAuthenticationTokenFilter`)。 +- 敏感配置(`jwt.secret`、数据库密码)建议通过环境变量或外部密钥管理。 +- 生产环境必须启用 HTTPS 并使用强密钥。 + +## API 文档 +- 启用 `swagger-ui.enabled: true`。 +- 访问路径通常为 `http://:/swagger-ui/index.html`。 + +## Docker 部署 +- `Dockerfile` 已暴露端口 `8093`: + - 构建镜像:`docker build -t projectframework2025-app:latest .` + - 运行(开发环境): + - `docker run -d --name platform-app -p 8093:8093 -e SPRING_PROFILES_ACTIVE=dev projectframework2025-app:latest` + - 运行(服务器环境): + - `docker run -d --name platform-app -p 8090:8090 -e SPRING_PROFILES_ACTIVE=server projectframework2025-app:latest` +- 如需挂载文件空间: + - `-v D:/data/file-space:/data/file-space -e FILE_SPACE_SYSTEM=/data/file-space` + +## 前端 +- 前端说明见 `frontend/readme.md`。如需联调,请统一跨域与鉴权策略。 + +## Git 使用 +- 远程仓库:`http://121.37.111.42:3000/ThbTech/ProjectFrameWork2025.git` +- 主分支:`main` +- 常用命令: + - `git pull`、`git add .`、`git commit -m ""`、`git push` +- 提交署名: + - `git config user.name ""` + - `git config user.email ""` + +## 常见问题 +- 中文乱码: + - 执行 `chcp 65001`,确保 `logback-spring.xml` 使用 UTF-8。 +- `NoSuchMethodError`(MyBatis): + - 升级 `MyBatis` 至 `3.5.16+` 并与 MP 版本匹配。 +- 数据库 `Access denied`: + - 校验账户密码与远程授权;必要时新建业务账户并放开 `3306`。 +- 端口占用/启动失败: + - 检查 `server.port` 与冲突端口;查看应用日志定位根因。 + +## 运维与监控 +- 建议接入 `Spring Boot Actuator`:`/actuator/health`。 +- 配合日志轮转与集中采集(ELK/Vector),区分环境日志路径。 +- 监控数据库与线程池指标(Druid/Quartz)。 + +## CI/CD 建议 +- 在 CI 阶段执行: + - `mvn -B -DskipTests clean package` + - 单元测试与安全扫描(依赖检查、代码质量) +- 在 CD 阶段: + - 推送镜像到私有仓库,环境变量注入敏感信息。 + +## 变更日志(示例模板) +- `feat:` 新增功能说明 +- `fix:` 缺陷修复说明 +- `docs:` 文档更新说明 +- `refactor:` 重构说明 +- `perf:` 性能优化说明 + +--- + +如需扩展专题文档(接口规范、部署拓扑、参数字典等),建议在 `docs/` 目录继续维护并与版本管理同步。 \ No newline at end of file diff --git a/framework/frontend/.editorconfig b/framework/frontend/.editorconfig new file mode 100644 index 0000000..3c3960b --- /dev/null +++ b/framework/frontend/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org + +root = true + +[*] # 表示所有文件适用 +charset = utf-8 # 设置文件字符集为 utf-8 +indent_style = space # 缩进风格(tab | space) +indent_size = 2 # 缩进大小 +end_of_line = lf # 控制换行类型(lf | cr | crlf) +trim_trailing_whitespace = true # 去除行首的任意空白字符 +insert_final_newline = true # 始终在文件末尾插入一个新行 + +[*.md] # 表示仅 md 文件适用以下规则 +max_line_length = off +trim_trailing_whitespace = false \ No newline at end of file diff --git a/framework/frontend/.env.development b/framework/frontend/.env.development new file mode 100644 index 0000000..282c646 --- /dev/null +++ b/framework/frontend/.env.development @@ -0,0 +1,8 @@ +## 开发环境 + +# 变量必须以 VITE_ 为前缀才能暴露给外部读取 +NODE_ENV='development' + +VITE_APP_TITLE = '公司开发平台框架' +VITE_APP_PORT = 3000 +VITE_APP_BASE_API = '/dev-api' diff --git a/framework/frontend/.env.production b/framework/frontend/.env.production new file mode 100644 index 0000000..728f41a --- /dev/null +++ b/framework/frontend/.env.production @@ -0,0 +1,6 @@ +## 生产环境 +NODE_ENV='production' + +VITE_APP_TITLE = 'NewFrameWork2023-WEB' +VITE_APP_PORT = 3000 +VITE_APP_BASE_API = '/prod-api' diff --git a/framework/frontend/.env.staging b/framework/frontend/.env.staging new file mode 100644 index 0000000..c192ef8 --- /dev/null +++ b/framework/frontend/.env.staging @@ -0,0 +1,6 @@ +## 模拟环境 +NODE_ENV='staging' + +VITE_APP_TITLE = 'NewFrameWork2023-WEB' +VITE_APP_PORT = 3000 +VITE_APP_BASE_API = '/prod--api' diff --git a/framework/frontend/.eslintignore b/framework/frontend/.eslintignore new file mode 100644 index 0000000..46d4b17 --- /dev/null +++ b/framework/frontend/.eslintignore @@ -0,0 +1,16 @@ +*.sh +node_modules +*.md +*.woff +*.ttf +.vscode +.idea +dist +/public +/docs +.husky +.local +/bin +.eslintrc.js +prettier.config.js +src/assets \ No newline at end of file diff --git a/framework/frontend/.eslintrc.js b/framework/frontend/.eslintrc.js new file mode 100644 index 0000000..d7878cc --- /dev/null +++ b/framework/frontend/.eslintrc.js @@ -0,0 +1,32 @@ +module.exports = { + env: { + browser: true, + es2021: true, + node: true + }, + globals: { + defineProps: 'readonly', + defineEmits: 'readonly', + defineExpose: 'readonly', + DialogType: "readonly", + OptionType: "readonly", + }, + parser: 'vue-eslint-parser', + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-essential', + 'plugin:@typescript-eslint/recommended' + ], + parserOptions: { + ecmaVersion: 'latest', + parser: '@typescript-eslint/parser', + sourceType: 'module' + }, + plugins: ['vue', '@typescript-eslint'], + rules: { + 'vue/multi-word-component-names': 'off', + '@typescript-eslint/no-empty-function': 'off', // 关闭空方法检查 + '@typescript-eslint/no-explicit-any': 'off', // 关闭any类型的警告 + 'vue/no-v-model-argument': 'off' + } +}; diff --git a/framework/frontend/.gitignore b/framework/frontend/.gitignore new file mode 100644 index 0000000..1da66c1 --- /dev/null +++ b/framework/frontend/.gitignore @@ -0,0 +1,17 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock \ No newline at end of file diff --git a/framework/frontend/.npmrc b/framework/frontend/.npmrc new file mode 100644 index 0000000..b3db441 --- /dev/null +++ b/framework/frontend/.npmrc @@ -0,0 +1,3 @@ +registry=https://registry.npmjs.org +fetch-retries=5 +strict-peer-dependencies=false \ No newline at end of file diff --git a/framework/frontend/.prettierignore b/framework/frontend/.prettierignore new file mode 100644 index 0000000..d251d2e --- /dev/null +++ b/framework/frontend/.prettierignore @@ -0,0 +1,9 @@ +/dist/* +.local +.output.js +/node_modules/** + +**/*.svg +**/*.sh + +/public/* \ No newline at end of file diff --git a/framework/frontend/.prettierrc.js b/framework/frontend/.prettierrc.js new file mode 100644 index 0000000..7a42426 --- /dev/null +++ b/framework/frontend/.prettierrc.js @@ -0,0 +1,36 @@ +/** + * 代码格式化配置 + */ +module.exports = { + // 指定每个缩进级别的空格数 + tabWidth: 2, + // 使用制表符而不是空格缩进行 + useTabs: false, + // 在语句末尾打印分号 + semi: true, + // 使用单引号而不是双引号 + singleQuote: true, + // 更改引用对象属性的时间 可选值"" + quoteProps: 'as-needed', + // 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"",默认none + trailingComma: 'none', + // 在对象文字中的括号之间打印空格 + bracketSpacing: true, + // 在单独的箭头函数参数周围包括括号 always:(x) => x \ avoid:x => x + arrowParens: 'avoid', + // 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码 + rangeStart: 0, + rangeEnd: Infinity, + // 指定要使用的解析器,不需要写文件开头的 @prettier + requirePragma: false, + // 不需要自动在文件开头插入 @prettier + insertPragma: false, + // 换行设置 always\never\preserve + proseWrap: 'never', + // 指定HTML文件的全局空格敏感度 css\strict\ignore + htmlWhitespaceSensitivity: 'css', + // Vue文件脚本和样式标签缩进 + vueIndentScriptAndStyle: false, + // 换行符使用 lf 结尾是 可选值"" + endOfLine: 'lf' +}; diff --git a/framework/frontend/LICENSE b/framework/frontend/LICENSE new file mode 100644 index 0000000..2660254 --- /dev/null +++ b/framework/frontend/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 有来开源组织 + +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/framework/frontend/commitlint.config.js b/framework/frontend/commitlint.config.js new file mode 100644 index 0000000..efff054 --- /dev/null +++ b/framework/frontend/commitlint.config.js @@ -0,0 +1,26 @@ +module.exports = { + // 继承的规则 + extends: ['@commitlint/config-conventional'], + // 定义规则类型 + rules: { + // type 类型定义,表示 git 提交的 type 必须在以下类型范围内 + 'type-enum': [ + 2, + 'always', + [ + 'feat', // 新功能 feature + 'fix', // 修复 bug + 'docs', // 文档注释 + 'style', // 代码格式(不影响代码运行的变动) + 'refactor', // 重构(既不增加新功能,也不是修复bug) + 'perf', // 性能优化 + 'test', // 增加测试 + 'chore', // 构建过程或辅助工具的变动 + 'revert', // 回退 + 'build' // 打包 + ] + ], + // subject 大小写不做校验 + 'subject-case': [0] + } +}; diff --git a/framework/frontend/index.html b/framework/frontend/index.html new file mode 100644 index 0000000..c48809f --- /dev/null +++ b/framework/frontend/index.html @@ -0,0 +1,15 @@ + + + + + + + + + 公司开发平台框架 + + +
+ + + diff --git a/framework/frontend/npminstall-debug.log b/framework/frontend/npminstall-debug.log new file mode 100644 index 0000000..05326b7 --- /dev/null +++ b/framework/frontend/npminstall-debug.log @@ -0,0 +1,208 @@ +{ + root: 'D:\\Trae_space\\ProjectFrameWork2025\\app\\frontend', + registry: 'https://registry.npmmirror.com', + pkgs: [], + production: false, + cacheStrict: false, + cacheDir: 'C:\\Users\\13910\\.npminstall_tarball', + env: { + npm_config_registry: 'https://registry.npmmirror.com', + npm_config_argv: '{"remain":[],"cooked":["--fix-bug-versions","--china","--userconfig=C:\\\\Users\\\\13910\\\\.cnpmrc","--disturl=https://cdn.npmmirror.com/binaries/node","--registry=https://registry.npmmirror.com"],"original":["--fix-bug-versions","--china","--userconfig=C:\\\\Users\\\\13910\\\\.cnpmrc","--disturl=https://cdn.npmmirror.com/binaries/node","--registry=https://registry.npmmirror.com"]}', + npm_config_user_agent: 'npminstall/7.9.0 npm/? node/v20.19.2 win32 x64', + npm_config_cache: 'C:\\Users\\13910\\.npminstall_tarball', + NODE: 'C:\\Program Files\\nodejs\\node.exe', + npm_node_execpath: 'C:\\Program Files\\nodejs\\node.exe', + npm_execpath: 'C:\\Users\\13910\\AppData\\Roaming\\npm\\node_modules\\cnpm\\node_modules\\npminstall\\bin\\install.js', + npm_config_userconfig: 'C:\\Users\\13910\\.cnpmrc', + npm_config_disturl: 'https://cdn.npmmirror.com/binaries/node', + npm_config_r: 'https://registry.npmmirror.com', + COREPACK_NPM_REGISTRY: 'https://registry.npmmirror.com', + EDGEDRIVER_CDNURL: 'https://npmmirror.com/mirrors/edgedriver', + NODEJS_ORG_MIRROR: 'https://cdn.npmmirror.com/binaries/node', + NVM_NODEJS_ORG_MIRROR: 'https://cdn.npmmirror.com/binaries/node', + PHANTOMJS_CDNURL: 'https://cdn.npmmirror.com/binaries/phantomjs', + CHROMEDRIVER_CDNURL: 'https://cdn.npmmirror.com/binaries/chromedriver', + OPERADRIVER_CDNURL: 'https://cdn.npmmirror.com/binaries/operadriver', + CYPRESS_DOWNLOAD_PATH_TEMPLATE: 'https://cdn.npmmirror.com/binaries/cypress/${version}/${platform}-${arch}/cypress.zip', + ELECTRON_MIRROR: 'https://cdn.npmmirror.com/binaries/electron/', + ELECTRON_BUILDER_BINARIES_MIRROR: 'https://cdn.npmmirror.com/binaries/electron-builder-binaries/', + SASS_BINARY_SITE: 'https://cdn.npmmirror.com/binaries/node-sass', + SWC_BINARY_SITE: 'https://cdn.npmmirror.com/binaries/node-swc', + NWJS_URLBASE: 'https://cdn.npmmirror.com/binaries/nwjs/v', + PUPPETEER_DOWNLOAD_HOST: 'https://cdn.npmmirror.com/binaries/chrome-for-testing', + PUPPETEER_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing', + PUPPETEER_CHROME_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing', + PUPPETEER_CHROME_HEADLESS_SHELL_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing', + PLAYWRIGHT_DOWNLOAD_HOST: 'https://cdn.npmmirror.com/binaries/playwright', + SENTRYCLI_CDNURL: 'https://cdn.npmmirror.com/binaries/sentry-cli', + SAUCECTL_INSTALL_BINARY_MIRROR: 'https://cdn.npmmirror.com/binaries/saucectl', + RE2_DOWNLOAD_MIRROR: 'https://cdn.npmmirror.com/binaries/node-re2', + RE2_DOWNLOAD_SKIP_PATH: 'true', + PRISMA_ENGINES_MIRROR: 'https://cdn.npmmirror.com/binaries/prisma', + npm_config_better_sqlite3_binary_host: 'https://cdn.npmmirror.com/binaries/better-sqlite3', + npm_config_keytar_binary_host: 'https://cdn.npmmirror.com/binaries/keytar', + npm_config_sharp_binary_host: 'https://cdn.npmmirror.com/binaries/sharp', + npm_config_sharp_libvips_binary_host: 'https://cdn.npmmirror.com/binaries/sharp-libvips', + npm_config_robotjs_binary_host: 'https://cdn.npmmirror.com/binaries/robotjs', + npm_config_gl_binary_host: 'https://cdn.npmmirror.com/binaries/gl', + RIPGREP_PREBUILT_BINARIES_MIRROR: 'https://registry.npmmirror.com/-/binary/ripgrep-prebuilt', + npm_rootpath: 'D:\\Trae_space\\ProjectFrameWork2025\\app\\frontend', + INIT_CWD: 'D:\\Trae_space\\ProjectFrameWork2025\\app\\frontend' + }, + binaryMirrors: { + ENVS: { + COREPACK_NPM_REGISTRY: 'https://registry.npmmirror.com', + EDGEDRIVER_CDNURL: 'https://npmmirror.com/mirrors/edgedriver', + NODEJS_ORG_MIRROR: 'https://cdn.npmmirror.com/binaries/node', + NVM_NODEJS_ORG_MIRROR: 'https://cdn.npmmirror.com/binaries/node', + PHANTOMJS_CDNURL: 'https://cdn.npmmirror.com/binaries/phantomjs', + CHROMEDRIVER_CDNURL: 'https://cdn.npmmirror.com/binaries/chromedriver', + OPERADRIVER_CDNURL: 'https://cdn.npmmirror.com/binaries/operadriver', + CYPRESS_DOWNLOAD_PATH_TEMPLATE: 'https://cdn.npmmirror.com/binaries/cypress/${version}/${platform}-${arch}/cypress.zip', + ELECTRON_MIRROR: 'https://cdn.npmmirror.com/binaries/electron/', + ELECTRON_BUILDER_BINARIES_MIRROR: 'https://cdn.npmmirror.com/binaries/electron-builder-binaries/', + SASS_BINARY_SITE: 'https://cdn.npmmirror.com/binaries/node-sass', + SWC_BINARY_SITE: 'https://cdn.npmmirror.com/binaries/node-swc', + NWJS_URLBASE: 'https://cdn.npmmirror.com/binaries/nwjs/v', + PUPPETEER_DOWNLOAD_HOST: 'https://cdn.npmmirror.com/binaries/chrome-for-testing', + PUPPETEER_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing', + PUPPETEER_CHROME_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing', + PUPPETEER_CHROME_HEADLESS_SHELL_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing', + PLAYWRIGHT_DOWNLOAD_HOST: 'https://cdn.npmmirror.com/binaries/playwright', + SENTRYCLI_CDNURL: 'https://cdn.npmmirror.com/binaries/sentry-cli', + SAUCECTL_INSTALL_BINARY_MIRROR: 'https://cdn.npmmirror.com/binaries/saucectl', + RE2_DOWNLOAD_MIRROR: 'https://cdn.npmmirror.com/binaries/node-re2', + RE2_DOWNLOAD_SKIP_PATH: 'true', + PRISMA_ENGINES_MIRROR: 'https://cdn.npmmirror.com/binaries/prisma', + npm_config_better_sqlite3_binary_host: 'https://cdn.npmmirror.com/binaries/better-sqlite3', + npm_config_keytar_binary_host: 'https://cdn.npmmirror.com/binaries/keytar', + npm_config_sharp_binary_host: 'https://cdn.npmmirror.com/binaries/sharp', + npm_config_sharp_libvips_binary_host: 'https://cdn.npmmirror.com/binaries/sharp-libvips', + npm_config_robotjs_binary_host: 'https://cdn.npmmirror.com/binaries/robotjs', + npm_config_gl_binary_host: 'https://cdn.npmmirror.com/binaries/gl', + RIPGREP_PREBUILT_BINARIES_MIRROR: 'https://registry.npmmirror.com/-/binary/ripgrep-prebuilt' + }, + '@ali/s2': { host: 'https://cdn.npmmirror.com/binaries/looksgood-s2' }, + sharp: { replaceHostFiles: [Array], replaceHostMap: [Object] }, + '@tensorflow/tfjs-node': { + replaceHostFiles: [Array], + replaceHostRegExpMap: [Object], + replaceHostMap: [Object] + }, + cypress: { + host: 'https://cdn.npmmirror.com/binaries/cypress', + newPlatforms: [Object] + }, + 'utf-8-validate': { + host: 'https://cdn.npmmirror.com/binaries/utf-8-validate/v{version}' + }, + xprofiler: { + remote_path: './xprofiler/v{version}/', + host: 'https://cdn.npmmirror.com/binaries' + }, + leveldown: { host: 'https://cdn.npmmirror.com/binaries/leveldown/v{version}' }, + couchbase: { host: 'https://cdn.npmmirror.com/binaries/couchbase/v{version}' }, + gl: { host: 'https://cdn.npmmirror.com/binaries/gl/v{version}' }, + sqlite3: { + host: 'https://cdn.npmmirror.com/binaries/sqlite3', + remote_path: 'v{version}' + }, + '@journeyapps/sqlcipher': { host: 'https://cdn.npmmirror.com/binaries' }, + grpc: { + host: 'https://cdn.npmmirror.com/binaries', + remote_path: '{name}/v{version}' + }, + 'grpc-tools': { host: 'https://cdn.npmmirror.com/binaries' }, + wrtc: { + host: 'https://cdn.npmmirror.com/binaries', + remote_path: '{name}/v{version}' + }, + fsevents: { host: 'https://cdn.npmmirror.com/binaries/fsevents' }, + nodejieba: { host: 'https://cdn.npmmirror.com/binaries/nodejieba' }, + canvas: { + host: 'https://cdn.npmmirror.com/binaries/canvas', + remote_path: 'v{version}' + }, + 'skia-canvas': { host: 'https://cdn.npmmirror.com/binaries/skia-canvas' }, + 'flow-bin': { + replaceHost: 'https://github.com/facebook/flow/releases/download/v', + host: 'https://cdn.npmmirror.com/binaries/flow/v' + }, + 'jpegtran-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/jpegtran-bin' + }, + 'cwebp-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/cwebp-bin' + }, + 'zopflipng-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/zopflipng-bin' + }, + 'optipng-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/optipng-bin' + }, + mozjpeg: { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/mozjpeg-bin' + }, + gifsicle: { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/gifsicle-bin' + }, + 'pngquant-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/pngquant-bin', + replaceHostMap: [Object] + }, + 'pngcrush-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/pngcrush-bin' + }, + 'jpeg-recompress-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/jpeg-recompress-bin' + }, + 'advpng-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/advpng-bin' + }, + 'pngout-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/pngout-bin' + }, + 'jpegoptim-bin': { + replaceHost: [Array], + host: 'https://cdn.npmmirror.com/binaries/jpegoptim-bin' + }, + argon2: { host: 'https://cdn.npmmirror.com/binaries/argon2' }, + 'ali-zeromq': { host: 'https://cdn.npmmirror.com/binaries/ali-zeromq' }, + 'ali-usb_ctl': { host: 'https://cdn.npmmirror.com/binaries/ali-usb_ctl' }, + 'gdal-async': { host: 'https://cdn.npmmirror.com/binaries/node-gdal-async' }, + 'libpg-query': { host: 'https://cdn.npmmirror.com/binaries' } + }, + forbiddenLicenses: null, + flatten: false, + proxy: undefined, + prune: false, + disableFallbackStore: false, + workspacesMap: Map(0) {}, + enableWorkspace: false, + workspaceRoot: 'D:\\Trae_space\\ProjectFrameWork2025\\app\\frontend', + isWorkspaceRoot: true, + isWorkspacePackage: false, + offline: false, + strictSSL: true, + ignoreScripts: false, + foregroundScripts: false, + ignoreOptionalDependencies: false, + detail: false, + forceLinkLatest: false, + trace: false, + engineStrict: false, + registryOnly: false, + client: false, + autoFixVersion: [Function: autoFixVersion] +} \ No newline at end of file diff --git a/framework/frontend/package.json b/framework/frontend/package.json new file mode 100644 index 0000000..7b20367 --- /dev/null +++ b/framework/frontend/package.json @@ -0,0 +1,66 @@ +{ + "name": "NewFrameWork2023-WEB", + "version": "1.2.0", + "scripts": { + "dev": "vite serve --mode development", + "build:prod": "vue-tsc --noEmit && vite build --mode production", + "build:mvn": "vite build --mode production", + "serve": "vite preview", + "lint": "eslint src/**/*.{ts,js,vue} --fix", + "prettier": "prettier --write ." + }, + "dependencies": { + "@element-plus/icons-vue": "^2.0.10", + "@types/js-cookie": "^3.0.2", + "@vueuse/core": "^9.1.1", + "@wangeditor/editor": "^5.0.0", + "@wangeditor/editor-for-vue": "^5.1.10", + "axios": "^1.2.0", + "better-scroll": "^2.4.2", + "default-passive-events": "^2.0.0", + "echarts": "^5.2.2", + "element-plus": "^2.2.27", + "js-base64": "^3.7.5", + "js-cookie": "^3.0.1", + "jsencrypt": "^3.3.2", + "nprogress": "^0.2.0", + "path-browserify": "^1.0.1", + "path-to-regexp": "^6.2.0", + "pinia": "^2.0.12", + "screenfull": "^6.0.0", + "sortablejs": "^1.14.0", + "vue": "^3.2.40", + "vue-i18n": "^9.1.9", + "vue-router": "^4.1.6", + "vuedraggable": "^2.24.3" + }, + "devDependencies": { + "@commitlint/cli": "^16.2.3", + "@commitlint/config-conventional": "^16.2.1", + "@types/node": "^16.11.7", + "@types/nprogress": "^0.2.0", + "@types/path-browserify": "^1.0.0", + "@typescript-eslint/eslint-plugin": "^5.19.0", + "@typescript-eslint/parser": "^5.19.0", + "@vitejs/plugin-vue": "^4.0.0", + "autoprefixer": "^10.4.13", + "eslint": "^8.14.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-vue": "^8.6.0", + "fast-glob": "^3.2.11", + "husky": "^7.0.4", + "postcss": "^8.4.20", + "prettier": "^2.6.2", + "sass": "^1.53.0", + "tailwindcss": "^3.2.4", + "typescript": "^4.7.4", + "vite": "^4.0.3", + "vite-plugin-svg-icons": "^2.0.1", + "vue-tsc": "^0.35.0" + }, + "repository": "https://gitee.com/youlaiorg/vue3-element-admin.git", + "author": "有来开源组织", + "license": "MIT", + "__npminstall_done": false +} diff --git a/framework/frontend/pnpm-lock.yaml b/framework/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..f2b2b91 --- /dev/null +++ b/framework/frontend/pnpm-lock.yaml @@ -0,0 +1,6776 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@element-plus/icons-vue': + specifier: ^2.0.10 + version: 2.3.2(vue@3.5.24(typescript@4.9.5)) + '@types/js-cookie': + specifier: ^3.0.2 + version: 3.0.6 + '@vueuse/core': + specifier: ^9.1.1 + version: 9.13.0(vue@3.5.24(typescript@4.9.5)) + '@wangeditor/editor': + specifier: ^5.0.0 + version: 5.1.23 + '@wangeditor/editor-for-vue': + specifier: ^5.1.10 + version: 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.24(typescript@4.9.5)) + axios: + specifier: ^1.2.0 + version: 1.13.2 + better-scroll: + specifier: ^2.4.2 + version: 2.5.1 + default-passive-events: + specifier: ^2.0.0 + version: 2.0.0 + echarts: + specifier: ^5.2.2 + version: 5.6.0 + element-plus: + specifier: ^2.2.27 + version: 2.11.7(vue@3.5.24(typescript@4.9.5)) + js-base64: + specifier: ^3.7.5 + version: 3.7.8 + js-cookie: + specifier: ^3.0.1 + version: 3.0.5 + jsencrypt: + specifier: ^3.3.2 + version: 3.5.4 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + path-browserify: + specifier: ^1.0.1 + version: 1.0.1 + path-to-regexp: + specifier: ^6.2.0 + version: 6.3.0 + pinia: + specifier: ^2.0.12 + version: 2.3.1(typescript@4.9.5)(vue@3.5.24(typescript@4.9.5)) + screenfull: + specifier: ^6.0.0 + version: 6.0.2 + sortablejs: + specifier: ^1.14.0 + version: 1.15.6 + vue: + specifier: ^3.2.40 + version: 3.5.24(typescript@4.9.5) + vue-i18n: + specifier: ^9.1.9 + version: 9.14.5(vue@3.5.24(typescript@4.9.5)) + vue-router: + specifier: ^4.1.6 + version: 4.6.3(vue@3.5.24(typescript@4.9.5)) + vuedraggable: + specifier: ^2.24.3 + version: 2.24.3 + devDependencies: + '@commitlint/cli': + specifier: ^16.2.3 + version: 16.3.0 + '@commitlint/config-conventional': + specifier: ^16.2.1 + version: 16.2.4 + '@types/node': + specifier: ^16.11.7 + version: 16.18.126 + '@types/nprogress': + specifier: ^0.2.0 + version: 0.2.3 + '@types/path-browserify': + specifier: ^1.0.0 + version: 1.0.3 + '@typescript-eslint/eslint-plugin': + specifier: ^5.19.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.19.0 + version: 5.62.0(eslint@8.57.1)(typescript@4.9.5) + '@vitejs/plugin-vue': + specifier: ^4.0.0 + version: 4.6.2(vite@4.5.14(@types/node@16.18.126)(sass@1.93.3))(vue@3.5.24(typescript@4.9.5)) + autoprefixer: + specifier: ^10.4.13 + version: 10.4.21(postcss@8.5.6) + eslint: + specifier: ^8.14.0 + version: 8.57.1 + eslint-config-prettier: + specifier: ^8.5.0 + version: 8.10.2(eslint@8.57.1) + eslint-plugin-prettier: + specifier: ^4.0.0 + version: 4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8) + eslint-plugin-vue: + specifier: ^8.6.0 + version: 8.7.1(eslint@8.57.1) + fast-glob: + specifier: ^3.2.11 + version: 3.3.3 + husky: + specifier: ^7.0.4 + version: 7.0.4 + postcss: + specifier: ^8.4.20 + version: 8.5.6 + prettier: + specifier: ^2.6.2 + version: 2.8.8 + sass: + specifier: ^1.53.0 + version: 1.93.3 + tailwindcss: + specifier: ^3.2.4 + version: 3.4.18 + typescript: + specifier: ^4.7.4 + version: 4.9.5 + vite: + specifier: ^4.0.3 + version: 4.5.14(@types/node@16.18.126)(sass@1.93.3) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@4.5.14(@types/node@16.18.126)(sass@1.93.3)) + vue-tsc: + specifier: ^0.35.0 + version: 0.35.2(typescript@4.9.5) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@better-scroll/core@2.5.1': + resolution: {integrity: sha512-koKOuYA55dQ04FJRIVUpMGDr1hbCfWmfX0MGp1hKagkQSWSRpwblqACiwtggVauoj9aaJRJZ9hDsTM4weaavlg==} + + '@better-scroll/indicators@2.5.1': + resolution: {integrity: sha512-Hk+Y00pR6fTsu6C9HGg1yYZtsu1gAcTgcs4C9aM5h6fQANX/T2YIYrOSjZmdL+js2PTcXJWZS8VM4Xjoi1PbfQ==} + + '@better-scroll/infinity@2.5.1': + resolution: {integrity: sha512-GKHrrasIh0KlGzhASHDo5hEEBJcDFpP4XaZGPH9Ey8+QBH6/O1ykAXS2ixkVAOTkBrv+KgFXoCUr4oN1xWeM+g==} + + '@better-scroll/mouse-wheel@2.5.1': + resolution: {integrity: sha512-DGnrirRMY6zMM7xwgx09D/cA9A//3J1/uDkq8iBVEyE5p0sEr/keQpjEfFHGkBRa505BnbBwdbN6f5lugEDSPw==} + + '@better-scroll/movable@2.5.1': + resolution: {integrity: sha512-8bLPRY15bbK4K5+tjrtdaKsFFKmJx72wRdg+xz3xQGFcTD940HFkJiORSOcz8Ufue7eOJfcmreQJBw6XY+TqTw==} + + '@better-scroll/nested-scroll@2.5.1': + resolution: {integrity: sha512-3cRsARxf9tq1VWBq7YAaET0xGAmgY1ERMmnXDo2gHFrmsJoNOionlpAeHdZvKQp2jG7JrzJ1O27nGCXf40gnkw==} + + '@better-scroll/observe-dom@2.5.1': + resolution: {integrity: sha512-TCMGFLRfpXBPIwtUV/efliUmfmrhSNI7NXdSyjdWjsLOS7dh3eFkmcom5ERVWMaXVELSmujGXLqobT+dT0C/jg==} + + '@better-scroll/observe-image@2.5.1': + resolution: {integrity: sha512-0Lhfj83o8EESwOxr8bfStCzNOokTm3KB7JeyMS8u/xl+3tyTuls9889cyAukYk4Yly1cS49pCGfj2P8YOiwtUg==} + + '@better-scroll/pull-down@2.5.1': + resolution: {integrity: sha512-Y6XcGu2NlevPg3k9VBRRFvpmfoTA+rO96JGdog2qKHclIPNXnsVwsIHtZfAm9weE/f9UuC4BnB+VUFRlucfupg==} + + '@better-scroll/pull-up@2.5.1': + resolution: {integrity: sha512-1hu3xSMxdB8T391KffpNZ7g93lMwZEHjfb1F1Y4KvIkciDt8nXqkGpqrZF+YwR+EJTgYcWqUO8kgmI6XXu7Pkg==} + + '@better-scroll/scroll-bar@2.5.1': + resolution: {integrity: sha512-i6r60pWG/ztkFK2j5Gj54I0LJb2jGh5TWJNQBoW0gUkp28B+0JvBFTwZn9tF7beZCBorKR7Hvvu4O9A1TJy94Q==} + + '@better-scroll/shared-utils@2.5.1': + resolution: {integrity: sha512-AplkfSjXVYP9LZiD6JsKgmgQJ/mG4uuLmBuwLz8W5OsYc7AYTfN8kw6GqZ5OwCGoXkVhBGyd8NeC4xwYItp0aw==} + + '@better-scroll/slide@2.5.1': + resolution: {integrity: sha512-aDOrfsmjAcz6DXN7mDX3tPieAn195R43Yn9e3waI19TIEok/mQlI1a/kb5quqWOoxkiaZQ8xe3vx5ZTj9C+F6Q==} + + '@better-scroll/wheel@2.5.1': + resolution: {integrity: sha512-fYLcEvkh88Z/2L+P5/+SGMunuc+HzAjGOiORIa/x21qb/knO2RFH4A/V1Rt3OIW4QluWzuFnU6jJRPlsQVZ4fg==} + + '@better-scroll/zoom@2.5.1': + resolution: {integrity: sha512-aGvFY5ooeZWS4RcxQLD+pGLpQHQxpPy0sMZV3yadcd2QK53PK9gS4Dp+BYfRv8lZ4/P2LoNEhr6Wq1DN6+uPlA==} + + '@commitlint/cli@16.3.0': + resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} + engines: {node: '>=v12'} + hasBin: true + + '@commitlint/config-conventional@16.2.4': + resolution: {integrity: sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==} + engines: {node: '>=v12'} + + '@commitlint/config-validator@16.2.1': + resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} + engines: {node: '>=v12'} + + '@commitlint/ensure@16.2.1': + resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} + engines: {node: '>=v12'} + + '@commitlint/execute-rule@16.2.1': + resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} + engines: {node: '>=v12'} + + '@commitlint/format@16.2.1': + resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} + engines: {node: '>=v12'} + + '@commitlint/is-ignored@16.2.4': + resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==} + engines: {node: '>=v12'} + + '@commitlint/lint@16.2.4': + resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==} + engines: {node: '>=v12'} + + '@commitlint/load@16.3.0': + resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} + engines: {node: '>=v12'} + + '@commitlint/message@16.2.1': + resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} + engines: {node: '>=v12'} + + '@commitlint/parse@16.2.1': + resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} + engines: {node: '>=v12'} + + '@commitlint/read@16.2.1': + resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} + engines: {node: '>=v12'} + + '@commitlint/resolve-extends@16.2.1': + resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} + engines: {node: '>=v12'} + + '@commitlint/rules@16.2.4': + resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==} + engines: {node: '>=v12'} + + '@commitlint/to-lines@16.2.1': + resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} + engines: {node: '>=v12'} + + '@commitlint/top-level@16.2.1': + resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} + engines: {node: '>=v12'} + + '@commitlint/types@16.2.1': + resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} + engines: {node: '>=v12'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@element-plus/icons-vue@2.3.2': + resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==} + peerDependencies: + vue: ^3.2.0 + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@intlify/core-base@9.14.5': + resolution: {integrity: sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@9.14.5': + resolution: {integrity: sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==} + engines: {node: '>= 16'} + + '@intlify/shared@9.14.5': + resolution: {integrity: sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==} + engines: {node: '>= 16'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@transloadit/prettier-bytes@0.0.7': + resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/event-emitter@0.3.5': + resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==} + + '@types/js-cookie@3.0.6': + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@16.18.126': + resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/nprogress@0.2.3': + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/path-browserify@1.0.3': + resolution: {integrity: sha512-ZmHivEbNCBtAfcrFeBCiTjdIc2dey0l7oCGNGpSuRTy8jP6UVND7oUowlvDujBy8r2Hoa8bfFUOCiPWfmtkfxw==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/svgo@2.6.4': + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@uppy/companion-client@2.2.2': + resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==} + + '@uppy/core@2.3.4': + resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==} + + '@uppy/store-default@2.1.1': + resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==} + + '@uppy/utils@4.1.3': + resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==} + + '@uppy/xhr-upload@2.1.3': + resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==} + peerDependencies: + '@uppy/core': ^2.3.3 + + '@vitejs/plugin-vue@4.6.2': + resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.2.25 + + '@volar/code-gen@0.35.2': + resolution: {integrity: sha512-MoZHuNnPfUWnCNkQUI5+U+gvLTxrU+XlCTusdNOTFYUUAa+M68MH0RxFIS9Ybj4uAUWTcZx0Ow1q5t/PZozo+Q==} + + '@volar/source-map@0.35.2': + resolution: {integrity: sha512-PFHh9wN/qMkOWYyvmB8ckvIzolrpNOvK5EBdxxdTpiPJhfYjW82rMDBnYf6RxCe7yQxrUrmve6BWVO7flxWNVQ==} + + '@volar/vue-code-gen@0.35.2': + resolution: {integrity: sha512-8H6P8EtN06eSVGjtcJhGqZzFIg6/nWoHVOlnhc5vKqC7tXwpqPbyMQae0tO7pLBd5qSb/dYU5GQcBAHsi2jgyA==} + deprecated: 'WARNING: This project has been renamed to @vue/language-core. Install using @vue/language-core instead.' + + '@volar/vue-typescript@0.35.2': + resolution: {integrity: sha512-PZI6Urb+Vr5Dvgf9xysM8X7TP09inWDy1wjDtprBoBhxS7r0Dg3V0qZuJa7sSGz7M0QMa5R/CBaZPhlxFCfJBw==} + deprecated: 'WARNING: This project has been renamed to @vue/typescript. Install using @vue/typescript instead.' + + '@vue/compiler-core@3.5.24': + resolution: {integrity: sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==} + + '@vue/compiler-dom@3.5.24': + resolution: {integrity: sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==} + + '@vue/compiler-sfc@3.5.24': + resolution: {integrity: sha512-8EG5YPRgmTB+YxYBM3VXy8zHD9SWHUJLIGPhDovo3Z8VOgvP+O7UP5vl0J4BBPWYD9vxtBabzW1EuEZ+Cqs14g==} + + '@vue/compiler-ssr@3.5.24': + resolution: {integrity: sha512-trOvMWNBMQ/odMRHW7Ae1CdfYx+7MuiQu62Jtu36gMLXcaoqKvAyh+P73sYG9ll+6jLB6QPovqoKGGZROzkFFg==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/reactivity@3.5.24': + resolution: {integrity: sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==} + + '@vue/runtime-core@3.5.24': + resolution: {integrity: sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==} + + '@vue/runtime-dom@3.5.24': + resolution: {integrity: sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==} + + '@vue/server-renderer@3.5.24': + resolution: {integrity: sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==} + peerDependencies: + vue: 3.5.24 + + '@vue/shared@3.5.24': + resolution: {integrity: sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + '@wangeditor/basic-modules@1.1.7': + resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/code-highlight@1.0.3': + resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/core@1.1.19': + resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==} + peerDependencies: + '@uppy/core': ^2.1.1 + '@uppy/xhr-upload': ^2.0.3 + dom7: ^3.0.0 + is-hotkey: ^0.2.0 + lodash.camelcase: ^4.3.0 + lodash.clonedeep: ^4.5.0 + lodash.debounce: ^4.0.8 + lodash.foreach: ^4.5.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + lodash.toarray: ^4.4.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/editor-for-vue@5.1.12': + resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==} + peerDependencies: + '@wangeditor/editor': '>=5.1.0' + vue: ^3.0.5 + + '@wangeditor/editor@5.1.23': + resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==} + + '@wangeditor/list-module@1.0.5': + resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/table-module@1.1.4': + resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/upload-image-module@1.0.2': + resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==} + peerDependencies: + '@uppy/core': ^2.0.3 + '@uppy/xhr-upload': ^2.0.3 + '@wangeditor/basic-modules': 1.x + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.foreach: ^4.5.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/video-module@1.1.4': + resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==} + peerDependencies: + '@uppy/core': ^2.1.4 + '@uppy/xhr-upload': ^2.0.7 + '@wangeditor/core': 1.x + dom7: ^3.0.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + baseline-browser-mapping@2.8.25: + resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} + hasBin: true + + better-scroll@2.5.1: + resolution: {integrity: sha512-OiF3cQroRfTzf+CRQH2z1G52ZAlNHINI6lCAvDmyFu0o0nRuTaV9F+fmBGIU2BL5p5IplUQ4E7sYa1TLfZarzQ==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001754: + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + + conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + + conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig-typescript-loader@2.0.2: + resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + typescript: '>=3' + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-passive-events@2.0.0: + resolution: {integrity: sha512-eMtt76GpDVngZQ3ocgvRcNCklUMwID1PaNbCNxfpDXuiOXttSh0HzBbda1HU9SIUsDc02vb7g9+3I5tlqe/qMQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom7@3.0.0: + resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==} + + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + electron-to-chromium@1.5.248: + resolution: {integrity: sha512-zsur2yunphlyAO4gIubdJEXCK6KOVvtpiuDfCIqbM9FjcnMYiyn0ICa3hWfPr0nc41zcLWobgy1iL7VvoOyA2Q==} + + element-plus@2.11.7: + resolution: {integrity: sha512-Bh47wuzsqaNBNDkbtlOlZER1cGcOB8GsXp/+C9b95MOrk0wvoHUV4NKKK7xMkfYNFYdYysQ752oMhnExgAL6+g==} + peerDependencies: + vue: ^3.2.0 + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@8.10.2: + resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@4.2.5: + resolution: {integrity: sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + + eslint-plugin-vue@8.7.1: + resolution: {integrity: sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + + htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + husky@7.0.4: + resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} + engines: {node: '>=12'} + hasBin: true + + i18next@20.6.1: + resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsencrypt@3.5.4: + resolution: {integrity: sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.foreach@4.5.0: + resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash.toarray@4.4.0: + resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-match@1.0.2: + resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + namespace-emitter@2.0.1: + resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-prefix-selector@1.16.1: + resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==} + peerDependencies: + postcss: '>4 <9' + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + + posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + + posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + + posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + + posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + + preact@10.27.2: + resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + + query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + sass@1.93.3: + resolution: {integrity: sha512-elOcIZRTM76dvxNAjqYrucTSI0teAF/L2Lv0s6f6b7FOwcwIuA357bIE871580AjHJuSvLIRUosgV+lIWx6Rgg==} + engines: {node: '>=14.0.0'} + hasBin: true + + screenfull@6.0.2: + resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==} + engines: {node: ^14.13.1 || >=16.0.0} + + scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slate-history@0.66.0: + resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==} + peerDependencies: + slate: '>=0.65.3' + + slate@0.72.8: + resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==} + + snabbdom@3.6.3: + resolution: {integrity: sha512-W2lHLLw2qR2Vv0DcMmcxXqcfdBaIcoN+y/86SmHv8fn4DazEQSH6KN3TjZcWvwujW56OHiiirsbHWZb4vx/0fg==} + engines: {node: '>=12.17.0'} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + sortablejs@1.10.2: + resolution: {integrity: sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==} + + sortablejs@1.15.6: + resolution: {integrity: sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + ssr-window@3.0.0: + resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + tailwindcss@3.4.18: + resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + traverse@0.6.11: + resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} + engines: {node: '>= 0.4'} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} + engines: {node: '>= 0.4'} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-plugin-svg-icons@2.0.1: + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + + vite@4.5.14: + resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@8.3.0: + resolution: {integrity: sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-i18n@9.14.5: + resolution: {integrity: sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-router@4.6.3: + resolution: {integrity: sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==} + peerDependencies: + vue: ^3.5.0 + + vue-tsc@0.35.2: + resolution: {integrity: sha512-aqY16VlODHzqtKGUkqdumNpH+s5ABCkufRyvMKQlL/mua+N2DfSVnHufzSNNUMr7vmOO0YsNg27jsspBMq4iGA==} + hasBin: true + peerDependencies: + typescript: '*' + + vue@3.5.24: + resolution: {integrity: sha512-uTHDOpVQTMjcGgrqFPSb8iO2m1DUvo+WbGqoXQz8Y1CeBYQ0FXf2z1gLRaBtHjlRz7zZUBHxjVB5VTLzYkvftg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vuedraggable@2.24.3: + resolution: {integrity: sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@1.1.2: + resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/runtime@7.28.4': {} + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@better-scroll/core@2.5.1': + dependencies: + '@better-scroll/shared-utils': 2.5.1 + + '@better-scroll/indicators@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/infinity@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/mouse-wheel@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/movable@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/nested-scroll@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/observe-dom@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/observe-image@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/pull-down@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/pull-up@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/scroll-bar@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/shared-utils@2.5.1': {} + + '@better-scroll/slide@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/wheel@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/zoom@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@commitlint/cli@16.3.0': + dependencies: + '@commitlint/format': 16.2.1 + '@commitlint/lint': 16.2.4 + '@commitlint/load': 16.3.0 + '@commitlint/read': 16.2.1 + '@commitlint/types': 16.2.1 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + '@commitlint/config-conventional@16.2.4': + dependencies: + conventional-changelog-conventionalcommits: 4.6.3 + + '@commitlint/config-validator@16.2.1': + dependencies: + '@commitlint/types': 16.2.1 + ajv: 6.12.6 + + '@commitlint/ensure@16.2.1': + dependencies: + '@commitlint/types': 16.2.1 + lodash: 4.17.21 + + '@commitlint/execute-rule@16.2.1': {} + + '@commitlint/format@16.2.1': + dependencies: + '@commitlint/types': 16.2.1 + chalk: 4.1.2 + + '@commitlint/is-ignored@16.2.4': + dependencies: + '@commitlint/types': 16.2.1 + semver: 7.3.7 + + '@commitlint/lint@16.2.4': + dependencies: + '@commitlint/is-ignored': 16.2.4 + '@commitlint/parse': 16.2.1 + '@commitlint/rules': 16.2.4 + '@commitlint/types': 16.2.1 + + '@commitlint/load@16.3.0': + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/execute-rule': 16.2.1 + '@commitlint/resolve-extends': 16.2.1 + '@commitlint/types': 16.2.1 + '@types/node': 16.18.126 + chalk: 4.1.2 + cosmiconfig: 7.1.0 + cosmiconfig-typescript-loader: 2.0.2(@types/node@16.18.126)(cosmiconfig@7.1.0)(typescript@4.9.5) + lodash: 4.17.21 + resolve-from: 5.0.0 + typescript: 4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + '@commitlint/message@16.2.1': {} + + '@commitlint/parse@16.2.1': + dependencies: + '@commitlint/types': 16.2.1 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + + '@commitlint/read@16.2.1': + dependencies: + '@commitlint/top-level': 16.2.1 + '@commitlint/types': 16.2.1 + fs-extra: 10.1.0 + git-raw-commits: 2.0.11 + + '@commitlint/resolve-extends@16.2.1': + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/types': 16.2.1 + import-fresh: 3.3.1 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + + '@commitlint/rules@16.2.4': + dependencies: + '@commitlint/ensure': 16.2.1 + '@commitlint/message': 16.2.1 + '@commitlint/to-lines': 16.2.1 + '@commitlint/types': 16.2.1 + execa: 5.1.1 + + '@commitlint/to-lines@16.2.1': {} + + '@commitlint/top-level@16.2.1': + dependencies: + find-up: 5.0.0 + + '@commitlint/types@16.2.1': + dependencies: + chalk: 4.1.2 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@2.3.2(vue@3.5.24(typescript@4.9.5))': + dependencies: + vue: 3.5.24(typescript@4.9.5) + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@intlify/core-base@9.14.5': + dependencies: + '@intlify/message-compiler': 9.14.5 + '@intlify/shared': 9.14.5 + + '@intlify/message-compiler@9.14.5': + dependencies: + '@intlify/shared': 9.14.5 + source-map-js: 1.2.1 + + '@intlify/shared@9.14.5': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@sxzz/popperjs-es@2.11.7': {} + + '@transloadit/prettier-bytes@0.0.7': {} + + '@trysound/sax@0.2.0': {} + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/event-emitter@0.3.5': {} + + '@types/js-cookie@3.0.6': {} + + '@types/json-schema@7.0.15': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.20 + + '@types/lodash@4.17.20': {} + + '@types/minimist@1.2.5': {} + + '@types/node@16.18.126': {} + + '@types/normalize-package-data@2.4.4': {} + + '@types/nprogress@0.2.3': {} + + '@types/parse-json@4.0.2': {} + + '@types/path-browserify@1.0.3': {} + + '@types/semver@7.7.1': {} + + '@types/svgo@2.6.4': + dependencies: + '@types/node': 16.18.126 + + '@types/web-bluetooth@0.0.16': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) + debug: 4.4.3 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.3 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + debug: 4.4.3 + eslint: 8.57.1 + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) + debug: 4.4.3 + eslint: 8.57.1 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.3 + tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@uppy/companion-client@2.2.2': + dependencies: + '@uppy/utils': 4.1.3 + namespace-emitter: 2.0.1 + + '@uppy/core@2.3.4': + dependencies: + '@transloadit/prettier-bytes': 0.0.7 + '@uppy/store-default': 2.1.1 + '@uppy/utils': 4.1.3 + lodash.throttle: 4.1.1 + mime-match: 1.0.2 + namespace-emitter: 2.0.1 + nanoid: 3.3.11 + preact: 10.27.2 + + '@uppy/store-default@2.1.1': {} + + '@uppy/utils@4.1.3': + dependencies: + lodash.throttle: 4.1.1 + + '@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)': + dependencies: + '@uppy/companion-client': 2.2.2 + '@uppy/core': 2.3.4 + '@uppy/utils': 4.1.3 + nanoid: 3.3.11 + + '@vitejs/plugin-vue@4.6.2(vite@4.5.14(@types/node@16.18.126)(sass@1.93.3))(vue@3.5.24(typescript@4.9.5))': + dependencies: + vite: 4.5.14(@types/node@16.18.126)(sass@1.93.3) + vue: 3.5.24(typescript@4.9.5) + + '@volar/code-gen@0.35.2': + dependencies: + '@volar/source-map': 0.35.2 + + '@volar/source-map@0.35.2': {} + + '@volar/vue-code-gen@0.35.2': + dependencies: + '@volar/code-gen': 0.35.2 + '@volar/source-map': 0.35.2 + '@vue/compiler-core': 3.5.24 + '@vue/compiler-dom': 3.5.24 + '@vue/shared': 3.5.24 + + '@volar/vue-typescript@0.35.2': + dependencies: + '@volar/code-gen': 0.35.2 + '@volar/source-map': 0.35.2 + '@volar/vue-code-gen': 0.35.2 + '@vue/compiler-sfc': 3.5.24 + '@vue/reactivity': 3.5.24 + + '@vue/compiler-core@3.5.24': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.24 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.24': + dependencies: + '@vue/compiler-core': 3.5.24 + '@vue/shared': 3.5.24 + + '@vue/compiler-sfc@3.5.24': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.24 + '@vue/compiler-dom': 3.5.24 + '@vue/compiler-ssr': 3.5.24 + '@vue/shared': 3.5.24 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.24': + dependencies: + '@vue/compiler-dom': 3.5.24 + '@vue/shared': 3.5.24 + + '@vue/devtools-api@6.6.4': {} + + '@vue/reactivity@3.5.24': + dependencies: + '@vue/shared': 3.5.24 + + '@vue/runtime-core@3.5.24': + dependencies: + '@vue/reactivity': 3.5.24 + '@vue/shared': 3.5.24 + + '@vue/runtime-dom@3.5.24': + dependencies: + '@vue/reactivity': 3.5.24 + '@vue/runtime-core': 3.5.24 + '@vue/shared': 3.5.24 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.24(vue@3.5.24(typescript@4.9.5))': + dependencies: + '@vue/compiler-ssr': 3.5.24 + '@vue/shared': 3.5.24 + vue: 3.5.24(typescript@4.9.5) + + '@vue/shared@3.5.24': {} + + '@vueuse/core@9.13.0(vue@3.5.24(typescript@4.9.5))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.24(typescript@4.9.5)) + vue-demi: 0.14.10(vue@3.5.24(typescript@4.9.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@9.13.0(vue@3.5.24(typescript@4.9.5))': + dependencies: + vue-demi: 0.14.10(vue@3.5.24(typescript@4.9.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + is-url: 1.2.4 + lodash.throttle: 4.1.1 + nanoid: 3.3.11 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + prismjs: 1.30.0 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@types/event-emitter': 0.3.5 + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + dom7: 3.0.0 + event-emitter: 0.3.5 + html-void-elements: 2.0.1 + i18next: 20.6.1 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.11 + scroll-into-view-if-needed: 2.2.31 + slate: 0.72.8 + slate-history: 0.66.0(slate@0.72.8) + snabbdom: 3.6.3 + + '@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.24(typescript@4.9.5))': + dependencies: + '@wangeditor/editor': 5.1.23 + vue: 3.5.24(typescript@4.9.5) + + '@wangeditor/editor@5.1.23': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.11 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + nanoid: 3.3.11 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + lodash.foreach: 4.5.0 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + nanoid: 3.3.11 + slate: 0.72.8 + snabbdom: 3.6.3 + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@2.2.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + arg@5.0.2: {} + + argparse@2.0.1: {} + + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-ify@1.0.0: {} + + array-union@2.1.0: {} + + array-unique@0.3.2: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + arrify@1.0.1: {} + + assign-symbols@1.0.0: {} + + async-function@1.0.0: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + atob@2.1.2: {} + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.27.0 + caniuse-lite: 1.0.30001754 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.13.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + baseline-browser-mapping@2.8.25: {} + + better-scroll@2.5.1: + dependencies: + '@better-scroll/core': 2.5.1 + '@better-scroll/indicators': 2.5.1 + '@better-scroll/infinity': 2.5.1 + '@better-scroll/mouse-wheel': 2.5.1 + '@better-scroll/movable': 2.5.1 + '@better-scroll/nested-scroll': 2.5.1 + '@better-scroll/observe-dom': 2.5.1 + '@better-scroll/observe-image': 2.5.1 + '@better-scroll/pull-down': 2.5.1 + '@better-scroll/pull-up': 2.5.1 + '@better-scroll/scroll-bar': 2.5.1 + '@better-scroll/slide': 2.5.1 + '@better-scroll/wheel': 2.5.1 + '@better-scroll/zoom': 2.5.1 + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + bluebird@3.7.2: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.27.0: + dependencies: + baseline-browser-mapping: 2.8.25 + caniuse-lite: 1.0.30001754 + electron-to-chromium: 1.5.248 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.27.0) + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001754: {} + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@4.1.1: {} + + commander@7.2.0: {} + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + component-emitter@1.3.1: {} + + compute-scroll-into-view@1.0.20: {} + + concat-map@0.0.1: {} + + conventional-changelog-angular@5.0.13: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-conventionalcommits@4.6.3: + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + + conventional-commits-parser@3.2.4: + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + copy-descriptor@0.1.1: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig-typescript-loader@2.0.2(@types/node@16.18.126)(cosmiconfig@7.1.0)(typescript@4.9.5): + dependencies: + '@types/node': 16.18.126 + cosmiconfig: 7.1.0 + ts-node: 10.9.2(@types/node@16.18.126)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + create-require@1.1.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csstype@3.1.3: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dargs@7.0.0: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dayjs@1.11.19: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decode-uri-component@0.2.2: {} + + deep-is@0.1.4: {} + + default-passive-events@2.0.0: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + delayed-stream@1.0.0: {} + + detect-libc@1.0.3: + optional: true + + didyoumean@1.2.2: {} + + diff@4.0.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-serializer@0.2.2: + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom7@3.0.0: + dependencies: + ssr-window: 3.0.0 + + domelementtype@1.3.1: {} + + domelementtype@2.3.0: {} + + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@1.7.0: + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + electron-to-chromium@1.5.248: {} + + element-plus@2.11.7(vue@3.5.24(typescript@4.9.5)): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.2(vue@3.5.24(typescript@4.9.5)) + '@floating-ui/dom': 1.7.4 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.20 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.24(typescript@4.9.5)) + async-validator: 4.2.5 + dayjs: 1.11.19 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.24(typescript@4.9.5) + transitivePeerDependencies: + - '@vue/composition-api' + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + entities@1.1.2: {} + + entities@2.2.0: {} + + entities@4.5.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@8.10.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-prettier@4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8): + dependencies: + eslint: 8.57.1 + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + optionalDependencies: + eslint-config-prettier: 8.10.2(eslint@8.57.1) + + eslint-plugin-vue@8.7.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-utils: 3.0.0(eslint@8.57.1) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.3 + vue-eslint-parser: 8.3.0(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@3.0.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extglob@2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + follow-redirects@1.15.11: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fraction.js@4.3.7: {} + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-value@2.0.6: {} + + git-raw-commits@2.0.11: + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-dirs@0.1.1: + dependencies: + ini: 1.3.8 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + hard-rejection@2.1.0: {} + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.1.0: {} + + has-flag@1.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + html-void-elements@2.0.1: {} + + htmlparser2@3.10.1: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + + human-signals@2.1.0: {} + + husky@7.0.4: {} + + i18next@20.6.1: + dependencies: + '@babel/runtime': 7.28.4 + + ignore@5.3.2: {} + + image-size@0.5.5: {} + + immer@9.0.21: {} + + immutable@5.1.4: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hotkey@0.2.0: {} + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@1.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-plain-object@5.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-text-path@1.0.1: + dependencies: + text-extensions: 1.9.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-url@1.2.4: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-windows@1.0.2: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.7: {} + + js-base64@2.6.4: {} + + js-base64@3.7.8: {} + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsencrypt@3.5.4: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + loader-utils@1.4.2: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.debounce@4.0.8: {} + + lodash.foreach@4.5.0: {} + + lodash.isequal@4.5.0: {} + + lodash.merge@4.6.2: {} + + lodash.throttle@4.1.1: {} + + lodash.toarray@4.4.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-error@1.3.6: {} + + map-cache@0.2.2: {} + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + math-intrinsics@1.1.0: {} + + mdn-data@2.0.14: {} + + memoize-one@6.0.0: {} + + meow@8.1.2: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + merge-options@1.0.1: + dependencies: + is-plain-obj: 1.1.0 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@3.1.0: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-match@1.0.2: + dependencies: + wildcard: 1.1.2 + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + ms@2.0.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + namespace-emitter@2.0.1: {} + + nanoid@3.3.11: {} + + nanomatch@1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + next-tick@1.1.0: {} + + node-addon-api@7.1.1: + optional: true + + node-releases@2.0.27: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.11 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.1 + semver: 7.7.3 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-wheel-es@1.2.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + pascalcase@0.1.1: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@6.3.0: {} + + path-type@4.0.0: {} + + pathe@0.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pinia@2.3.1(typescript@4.9.5)(vue@3.5.24(typescript@4.9.5)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.24(typescript@4.9.5) + vue-demi: 0.14.10(vue@3.5.24(typescript@4.9.5)) + optionalDependencies: + typescript: 4.9.5 + transitivePeerDependencies: + - '@vue/composition-api' + + pirates@4.0.7: {} + + posix-character-classes@0.1.1: {} + + possible-typed-array-names@1.1.0: {} + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.11 + + postcss-js@4.1.0(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.6 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-prefix-selector@1.16.1(postcss@5.2.18): + dependencies: + postcss: 5.2.18 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@5.2.18: + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + posthtml-parser@0.2.1: + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + + posthtml-rename-id@1.0.12: + dependencies: + escape-string-regexp: 1.0.5 + + posthtml-render@1.4.0: {} + + posthtml-svg-mode@1.0.3: + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + posthtml@0.9.2: + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + preact@10.27.2: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@2.8.8: {} + + prismjs@1.30.0: {} + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + q@1.5.1: {} + + query-string@4.3.4: + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + queue-microtask@1.2.3: {} + + quick-lru@4.0.1: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-global@1.0.0: + dependencies: + global-dirs: 0.1.1 + + resolve-url@0.2.1: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + ret@0.1.15: {} + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + sass@1.93.3: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + screenfull@6.0.2: {} + + scroll-into-view-if-needed@2.2.31: + dependencies: + compute-scroll-into-view: 1.0.20 + + semver@5.7.2: {} + + semver@7.3.7: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.3: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slate-history@0.66.0(slate@0.72.8): + dependencies: + is-plain-object: 5.0.0 + slate: 0.72.8 + + slate@0.72.8: + dependencies: + immer: 9.0.21 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + + snabbdom@3.6.3: {} + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + sortablejs@1.10.2: {} + + sortablejs@1.15.6: {} + + source-map-js@1.2.1: {} + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-url@0.4.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + ssr-window@3.0.0: {} + + stable@0.1.8: {} + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + strict-uri-encode@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-final-newline@2.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@2.0.0: {} + + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-baker@1.7.0: + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.1(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.11 + transitivePeerDependencies: + - supports-color + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + tailwindcss@3.4.18: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.11 + sucrase: 3.35.0 + transitivePeerDependencies: + - tsx + - yaml + + text-extensions@1.9.0: {} + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + through@2.3.8: {} + + tiny-warning@1.0.3: {} + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + traverse@0.6.11: + dependencies: + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.19 + + trim-newlines@3.0.1: {} + + ts-interface-checker@0.1.13: {} + + ts-node@10.9.2(@types/node@16.18.126)(typescript@4.9.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.126 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@1.14.1: {} + + tslib@2.3.0: {} + + tsutils@3.21.0(typescript@4.9.5): + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.18.1: {} + + type-fest@0.20.2: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type@2.7.3: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typedarray.prototype.slice@1.0.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 + + typescript@4.9.5: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + universalify@2.0.1: {} + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + update-browserslist-db@1.1.4(browserslist@4.27.0): + dependencies: + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urix@0.1.0: {} + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + v8-compile-cache-lib@3.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vary@1.1.2: {} + + vite-plugin-svg-icons@2.0.1(vite@4.5.14(@types/node@16.18.126)(sass@1.93.3)): + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.5 + debug: 4.4.3 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.0 + vite: 4.5.14(@types/node@16.18.126)(sass@1.93.3) + transitivePeerDependencies: + - supports-color + + vite@4.5.14(@types/node@16.18.126)(sass@1.93.3): + dependencies: + esbuild: 0.18.20 + postcss: 8.5.6 + rollup: 3.29.5 + optionalDependencies: + '@types/node': 16.18.126 + fsevents: 2.3.3 + sass: 1.93.3 + + vue-demi@0.14.10(vue@3.5.24(typescript@4.9.5)): + dependencies: + vue: 3.5.24(typescript@4.9.5) + + vue-eslint-parser@8.3.0(eslint@8.57.1): + dependencies: + debug: 4.4.3 + eslint: 8.57.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + vue-i18n@9.14.5(vue@3.5.24(typescript@4.9.5)): + dependencies: + '@intlify/core-base': 9.14.5 + '@intlify/shared': 9.14.5 + '@vue/devtools-api': 6.6.4 + vue: 3.5.24(typescript@4.9.5) + + vue-router@4.6.3(vue@3.5.24(typescript@4.9.5)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.24(typescript@4.9.5) + + vue-tsc@0.35.2(typescript@4.9.5): + dependencies: + '@volar/vue-typescript': 0.35.2 + typescript: 4.9.5 + + vue@3.5.24(typescript@4.9.5): + dependencies: + '@vue/compiler-dom': 3.5.24 + '@vue/compiler-sfc': 3.5.24 + '@vue/runtime-dom': 3.5.24 + '@vue/server-renderer': 3.5.24(vue@3.5.24(typescript@4.9.5)) + '@vue/shared': 3.5.24 + optionalDependencies: + typescript: 4.9.5 + + vuedraggable@2.24.3: + dependencies: + sortablejs: 1.10.2 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@1.1.2: {} + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 diff --git a/framework/frontend/postcss.config.js b/framework/frontend/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/framework/frontend/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/framework/frontend/public/favicon.ico b/framework/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/framework/frontend/readme.md b/framework/frontend/readme.md new file mode 100644 index 0000000..dfaf36f --- /dev/null +++ b/framework/frontend/readme.md @@ -0,0 +1 @@ +这里放置前端项目的readme文件 \ No newline at end of file diff --git a/framework/frontend/src/App.vue b/framework/frontend/src/App.vue new file mode 100644 index 0000000..9fb00e0 --- /dev/null +++ b/framework/frontend/src/App.vue @@ -0,0 +1,11 @@ + + + diff --git a/framework/frontend/src/api/auth/index.ts b/framework/frontend/src/api/auth/index.ts new file mode 100644 index 0000000..2a98388 --- /dev/null +++ b/framework/frontend/src/api/auth/index.ts @@ -0,0 +1,36 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { LoginData, TokenResult, VerifyCode } from './types'; + +/** + * + * @param data {LoginForm} + * @returns + */ +export function loginApi(data: LoginData): AxiosPromise { + return request({ + url: '/user/login', + method: 'post', + params: data + }); +} + +/** + * 注销 + */ +export function logoutApi() { + return request({ + url: '/user/logout', + method: 'post' + }); +} + +/** + * 获取图片验证码 + */ +export function getCaptcha(): AxiosPromise { + return request({ + url: '/user/code?t=' + new Date().getTime().toString(), + method: 'get' + }); +} diff --git a/framework/frontend/src/api/auth/types.ts b/framework/frontend/src/api/auth/types.ts new file mode 100644 index 0000000..f6b18ef --- /dev/null +++ b/framework/frontend/src/api/auth/types.ts @@ -0,0 +1,34 @@ +/** + * 登录数据类型 + */ +export interface LoginData { + username: string; + password: string; + code: string; + uuid: string; + /** + * 验证码Code + */ + //verifyCode: string; + /** + * 验证码Code服务端缓存key(UUID) + */ + // verifyCodeKey: string; +} + +/** + * Token响应类型 + */ +export interface TokenResult { + token: string; + refreshToken: string; + expires: number; +} + +/** + * 验证码类型 + */ +export interface VerifyCode { + verifyCodeImg: string; + verifyCodeKey: string; +} diff --git a/framework/frontend/src/api/dept/index.ts b/framework/frontend/src/api/dept/index.ts new file mode 100644 index 0000000..4ab23f1 --- /dev/null +++ b/framework/frontend/src/api/dept/index.ts @@ -0,0 +1,139 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { DeptForm, DeptQuery, Dept } from './types'; + + +//获取组织架构 + +export function getTreelist(queryParams:any) { + return request({ + url: '/system/organization/getOrgTree', + method: 'POST', + params: queryParams + }); +} +//新增企业或部门 + +export function addTreelist(queryParams:any) { + return request({ + url: '/system/organization/addOrg', + method: 'POST', + data: queryParams + }); +} +// 修改企业部门 + +export function updataTreelist(queryParams:any) { + return request({ + url: '/system/organization/updateById', + method: 'POST', + data: queryParams + }); +} +//删除企业 +export function delTreelist(queryParams:any) { + return request({ + url: '/system/organization/deleteById', + method: 'POST', + params: queryParams + }); +} +//获取部门信息 +export function gettableData(queryParams:any) { + return request({ + url: '/system/organization/getOrganizationById', + method: 'POST', + params: queryParams + }); +} +//部门是否有效 +export function deptIsVaild(queryParams:any) { + return request({ + url: '/system/organization/setIsValid', + method: 'POST', + params: queryParams + }); +} + +//修改部门信息 +export function reviseDepartment(queryParams:any) { + return request({ + url: '/system/organization/updateById', + method: 'POST', + data: queryParams + }); +} + +/** + * 部门树形表格 + * + * @param queryParams + */ +export function listDepartments(queryParams?: DeptQuery): AxiosPromise { + return request({ + url: '/api/v1/dept', + method: 'get', + params: queryParams + }); +} + +/** + * 部门下拉列表 + */ +export function listDeptOptions(): AxiosPromise { + return request({ + url: '/api/v1/dept/options', + method: 'get' + }); +} + +/** + * 获取部门详情 + * + * @param id + */ +export function getDeptForm(id: string): AxiosPromise { + return request({ + url: '/api/v1/dept/' + id + '/form', + method: 'get' + }); +} + +/** + * 新增部门 + * + * @param data + */ +export function addDept(data: DeptForm) { + return request({ + url: '/api/v1/dept', + method: 'post', + data: data + }); +} + +/** + * 修改部门 + * + * @param id + * @param data + */ +export function updateDept(id: string, data: DeptForm) { + return request({ + url: '/api/v1/dept/' + id, + method: 'put', + data: data + }); +} + +/** + * 删除部门 + * + * @param ids + */ +export function deleteDept(ids: string) { + return request({ + url: '/api/v1/dept/' + ids, + method: 'delete' + }); +} diff --git a/framework/frontend/src/api/dept/types.ts b/framework/frontend/src/api/dept/types.ts new file mode 100644 index 0000000..b99f819 --- /dev/null +++ b/framework/frontend/src/api/dept/types.ts @@ -0,0 +1,34 @@ +/** + * 部门查询参数 + */ +export interface DeptQuery { + keywords: string | undefined; + status: number | undefined; +} + +/** + * 部门类型 + */ +export interface Dept { + id: string; + name: string; + parentId: string; + treePath: string; + sort: number; + status: number; + leader?: string; + mobile?: string; + email?: string; + children: Dept[]; +} + +/** + * 部门表单类型 + */ +export interface DeptForm { + id?: string; + parentId: string; + name: string; + sort: number; + status: number; +} diff --git a/framework/frontend/src/api/dict/index.ts b/framework/frontend/src/api/dict/index.ts new file mode 100644 index 0000000..7730676 --- /dev/null +++ b/framework/frontend/src/api/dict/index.ts @@ -0,0 +1,242 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { + DictQuery, + DictPageResult, + DictTypeForm, + DictItemQuery, + DictItemPageResult, + DictItemForm +} from './types'; +// 查询字典 +export function getTreelist(params:any) { + return request({ + url: '/system/dictionary/dictList', + method: 'get', + params: params + }); +} + +// 新增字典 +export function addDict(params:any) { + return request({ + url: '/system/dictionary/addDict', + method: 'post', + data: params + }); +} + +// 修改字典 +export function updateDict(params:any) { + return request({ + url: '/system/dictionary/updateDict', + method: 'post', + data: params + }); +} +// 删除字典 +export function deleteById(params:any) { + return request({ + url: '/system/dictionary/deleteById', + method: 'post', + params: params + }); +} +// 字典排序 +export function changeDictOrder(params:any) { + return request({ + url: '/system/dictionary/changeDictOrder', + method: 'post', + params: params + }); +} +// 查询字典项 +export function getDictItemById(params:any) { + return request({ + url: '/system/dictionaryItems/page', + method: 'get', + params: params + }); +} + +// 新增字典项 +export function addDictionaryItem(params:any) { + return request({ + url: '/system/dictionaryItems/addDictionaryItem', + method: 'post', + data: params + }); +} + +// 修改字典项 +export function updateDictionaryItem(params:any) { + return request({ + url: '/system/dictionaryItems/updateDictionaryItem', + method: 'post', + data: params + }); +} +// 删除字典项 +export function deleteDictItemById(params:any) { + return request({ + url: '/system/dictionaryItems/deleteDictItemById', + method: 'post', + params: params + }); +} +// 批量删除字典项 +export function deleteDictItemByIds(params:any) { + return request({ + url: '/system/dictionaryItems/deleteDictItemByIds', + method: 'post', + params: params + }); +} + +// 字典项排序 +export function changeItemOrder(params:any) { + return request({ + url: '/system/dictionaryItems/changeItemOrder', + method: 'post', + params: params + }); +} +/** + * 获取字典类型分页列表 + * + * @param queryParams + */ +export function listDictTypePages( + queryParams: DictQuery +): AxiosPromise { + return request({ + url: '/api/v1/dict/types/pages', + method: 'get', + params: queryParams + }); +} + +/** + * 获取字典类型表单数据 + * + * @param id + */ +export function getDictTypeForm(id: number): AxiosPromise { + return request({ + url: '/api/v1/dict/types/' + id + '/form', + method: 'get' + }); +} + +/** + * 新增字典类型 + * + * @param data + */ +export function addDictType(data: DictTypeForm) { + return request({ + url: '/api/v1/dict/types', + method: 'post', + data: data + }); +} + +/** + * 修改字典类型 + * + * @param id + * @param data + */ +export function updateDictType(id: number, data: DictTypeForm) { + return request({ + url: '/api/v1/dict/types/' + id, + method: 'put', + data: data + }); +} + +/** + * 删除字典类型 + */ +export function deleteDictTypes(ids: string) { + return request({ + url: '/api/v1/dict/types/' + ids, + method: 'delete' + }); +} + +/** + * 获取字典类型的数据项 + * + * @param typeCode 字典类型编码 + */ +export function getDictionaries(typeCode: string): AxiosPromise { + return request({ + url: '/api/v1/dict/types/' + typeCode + '/items', + method: 'get' + }); +} + +/** + * 获取字典项分页列表 + */ +export function listDictItemPages( + queryParams: DictItemQuery +): AxiosPromise { + return request({ + url: '/api/v1/dict/items/pages', + method: 'get', + params: queryParams + }); +} + +/** + * 获取字典数据项表单数据 + * + * @param id + */ +export function getDictItemData(id: number): AxiosPromise { + return request({ + url: '/api/v1/dict/items/' + id + '/form', + method: 'get' + }); +} + +/** + * 新增字典项 + * + * @param data + */ +export function saveDictItem(data: DictItemForm) { + return request({ + url: '/api/v1/dict/items', + method: 'post', + data: data + }); +} + +/** + * 修改字典项 + * + * @param id + * @param data + */ +export function updateDictItem(id: number, data: DictItemForm) { + return request({ + url: '/api/v1/dict/items/' + id, + method: 'put', + data: data + }); +} + +/** + * 批量删除字典数据项 + * + * @param ids 字典项ID,多个以英文逗号(,)分割 + */ +export function deleteDictItems(ids: string) { + return request({ + url: '/api/v1/dict/items/' + ids, + method: 'delete' + }); +} diff --git a/framework/frontend/src/api/dict/types.ts b/framework/frontend/src/api/dict/types.ts new file mode 100644 index 0000000..3e301f2 --- /dev/null +++ b/framework/frontend/src/api/dict/types.ts @@ -0,0 +1,84 @@ +/** + * 字典查询参数 + */ +export interface DictQuery extends PageQuery { + /** + * 字典名称 + */ + name?: string; +} + +/** + * 字典类型 + */ +export interface Dict { + id: number; + code: string; + name: string; + status: number; + remark: string; +} + +/** + * 字典分页项类型声明 + */ +export type DictPageResult = PageResult; + +/** + * 字典表单类型声明 + */ +export interface DictTypeForm { + id: number | undefined; + name: string; + code: string; + status: number; + remark: string; +} + +/** + * 字典项查询参数类型声明 + */ +export interface DictItemQuery extends PageQuery { + /** + * 字典项名称 + */ + name?: string; + /** + * 字典类型编码 + */ + typeCode?: string; +} + +/** + * 字典数据项类型 + */ +export interface DictItem { + id: number; + name: string; + value: string; + typeCode: string; + sort: number; + status: number; + defaulted: number; + remark?: string; +} + +/** + * 字典分页项类型声明 + */ +export type DictItemPageResult = PageResult; + +/** + * 字典表单类型声明 + */ +export interface DictItemForm { + id?: number; + typeCode?: string; + typeName?: string; + name: string; + code: string; + value: string; + status: number; + sort: number; + remark: string; +} diff --git a/framework/frontend/src/api/file/index.ts b/framework/frontend/src/api/file/index.ts new file mode 100644 index 0000000..350ce7d --- /dev/null +++ b/framework/frontend/src/api/file/index.ts @@ -0,0 +1,34 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { FileInfo } from './types'; + +/** + * 上传文件 + * + * @param file + */ +export function uploadFileApi(file: File): AxiosPromise { + const formData = new FormData(); + formData.append('file', file); + return request({ + url: '/api/v1/files', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }); +} + +/** + * 删除文件 + * + * @param filePath 文件完整路径 + */ +export function deleteFileApi(filePath?: string) { + return request({ + url: '/api/v1/files', + method: 'delete', + params: { filePath: filePath } + }); +} diff --git a/framework/frontend/src/api/file/types.ts b/framework/frontend/src/api/file/types.ts new file mode 100644 index 0000000..22b2be5 --- /dev/null +++ b/framework/frontend/src/api/file/types.ts @@ -0,0 +1,7 @@ +/** + * 文件API类型声明 + */ +export interface FileInfo { + name: string; + url: string; +} diff --git a/framework/frontend/src/api/menu/index.ts b/framework/frontend/src/api/menu/index.ts new file mode 100644 index 0000000..fae4404 --- /dev/null +++ b/framework/frontend/src/api/menu/index.ts @@ -0,0 +1,159 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { MenuQuery, Menu, Resource, MenuForm } from './types'; + +//获取菜单表格 +export function getdata(queryParams:any) { + return request({ + url: '/system/menu/getMenuButtonTree', + method: 'post', + params: queryParams + }); +} +//新增目录 +export function addmenu(queryParams:any) { + return request({ + url: '/system/menu/addMenu', + method: 'post', + data: queryParams + }); +} +//修改目录 +export function editmenu(queryParams:any) { + return request({ + url: '/system/menu/updateById', + method: 'post', + data: queryParams + }); +} +//删除 +export function deltmenu(queryParams:any) { + return request({ + url: '/system/menu/deleteById', + method: 'post', + params: queryParams + }); +} +//排序 +export function moveOrderno(params:any) { + return request({ + url: '/system/menu/changeMenuOrder', + method: 'post', + params: params + }); +} +//上传图标之前获取ID + +//上传单个图标 +export function uploadIcon (data:any) { + return request({ + headers: { + 'Content-Type': 'multipart/form-data' + }, + url: '/system/menu/uploadIcon', + method: 'POST', + data + }); +} +//删除单个图标 +export function moveIcon(params:any) { + return request({ + url: '/system/menu/deleteIcon', + method: 'post', + params: params + }); +} + + +/** + * 获取路由列表 + */ +export function listRoutes() { + return request({ + url: 'system/menu/treeRoutes', + method: 'get', + }); +} + +/** + * 获取菜单表格列表 + * + * @param queryParams + */ +export function listMenus(queryParams: MenuQuery): AxiosPromise { + return request({ + url: '/api/v1/menus', + method: 'get', + params: queryParams + }); +} + +/** + * 获取菜单下拉树形列表 + */ +export function listMenuOptions(): AxiosPromise { + return request({ + url: '/api/v1/menus/options', + method: 'get' + }); +} + +/** + * 获取资源(菜单+权限)树形列表 + */ +export function listResources(): AxiosPromise { + return request({ + url: '/api/v1/menus/resources', + method: 'get' + }); +} + +/** + * 获取菜单详情 + * @param id + */ +export function getMenuDetail(id: string): AxiosPromise { + return request({ + url: '/api/v1/menus/' + id, + method: 'get' + }); +} + +/** + * 添加菜单 + * + * @param data + */ +export function addMenu(data: MenuForm) { + return request({ + url: '/api/v1/menus', + method: 'post', + data: data + }); +} + +/** + * 修改菜单 + * + * @param id + * @param data + */ +export function updateMenu(id: string, data: MenuForm) { + return request({ + url: '/api/v1/menus/' + id, + method: 'put', + data: data + }); +} + +/** + * 批量删除菜单 + * + * @param ids 菜单ID,多个以英文逗号(,)分割 + */ +export function deleteMenus(ids: string) { + return request({ + url: '/api/v1/menus/' + ids, + method: 'delete' + }); +} diff --git a/framework/frontend/src/api/menu/types.ts b/framework/frontend/src/api/menu/types.ts new file mode 100644 index 0000000..8de7056 --- /dev/null +++ b/framework/frontend/src/api/menu/types.ts @@ -0,0 +1,105 @@ +/** + * 菜单查询参数类型声明 + */ +export interface MenuQuery { + keywords?: string; +} + +/** + * 菜单分页列表项声明 + */ + +export interface Menu { + id?: number; + parentId: number; + type?: string | 'CATEGORY' | 'MENU' | 'EXTLINK'; + createTime: string; + updateTime: string; + name: string; + icon: string; + component: string; + sort: number; + visible: number; + children: Menu[]; +} + +/** + * 菜单表单类型声明 + */ +export interface MenuForm { + /** + * 菜单ID + */ + id?: string; + /** + * 父菜单ID + */ + parentId: string; + /** + * 菜单名称 + */ + name: string; + /** + * 菜单是否可见(1:是;0:否;) + */ + visible: number; + icon?: string; + /** + * 排序 + */ + sort: number; + /** + * 组件路径 + */ + component?: string; + /** + * 路由路径 + */ + path: string; + /** + * 跳转路由路径 + */ + redirect?: string; + + /** + * 菜单类型 + */ + type: string; + + /** + * 权限标识 + */ + perm?: string; +} + +/** + * 资源(菜单+权限)类型 + */ +export interface Resource { + /** + * 菜单值 + */ + value: string; + /** + * 菜单文本 + */ + label: string; + /** + * 子菜单 + */ + children: Resource[]; +} + +/** + * 权限类型 + */ +export interface Permission { + /** + * 权限值 + */ + value: string; + /** + * 权限文本 + */ + label: string; +} diff --git a/framework/frontend/src/api/message/index.ts b/framework/frontend/src/api/message/index.ts new file mode 100644 index 0000000..0280648 --- /dev/null +++ b/framework/frontend/src/api/message/index.ts @@ -0,0 +1,28 @@ +import request from '@/utils/request'; + +export function getMessageList(params:any) { + return request({ + url: '/system/message/getMessageList', + method: 'get', + params + }); +} +export function setMessageStatus(data:any) { + return request({ + url: '/system/message/setMessageStatus?id=' + data, + method: 'post' + }); +} +export function setAllMessageStatus() { + return request({ + url: '/system/message/setAllMessageStatus', + method: 'post' + }); +} +export function deleteMessageById(data:any) { + return request({ + url: '/system/message/deleteMessageById?id=' + data, + method: 'post', + data + }); +} \ No newline at end of file diff --git a/framework/frontend/src/api/record/index.ts b/framework/frontend/src/api/record/index.ts new file mode 100644 index 0000000..9f263b1 --- /dev/null +++ b/framework/frontend/src/api/record/index.ts @@ -0,0 +1,18 @@ +import request from '@/utils/request'; + +//获取所有角色 +export function getLogList(params:any){ + return request({ + url: '/system/log/getLogList' , + method: 'post', + params: params + }); +} +export function exportExcel(queryParams: any) { + return request({ + url: '/system/log/exportExcel', + method: 'get', + params: queryParams, + responseType: 'arraybuffer' + }); +} diff --git a/framework/frontend/src/api/role/index.ts b/framework/frontend/src/api/role/index.ts new file mode 100644 index 0000000..e6420bf --- /dev/null +++ b/framework/frontend/src/api/role/index.ts @@ -0,0 +1,196 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { RoleQuery, RoleForm } from './types'; + +//获取所有角色 +export function listRolePages(queryParams:any){ + return request({ + url: '/system/role/list' , + method: 'post', + params:queryParams + }); +} +//角色是否有效 +export function isvaildTo(queryParams:any){ + return request({ + url: '/system/role/setIsvaild' , + method: 'post', + params:queryParams + }); +} +//新增角色 +export function addDept(queryParams:any){ + return request({ + url:'/system/role/addRole' , + method: 'post', + data: queryParams + }); +} +//更新角色信息 +export function renewDept (queryParams:any){ + return request({ + url:'/system/role/updateById' , + method: 'post', + data: queryParams + }); +} +//单个删除角色 +export function deleDept (queryParams:any){ + return request({ + url:'/system/role/deleteById' , + method: 'post', + params: queryParams + }); +} + +//获取分配权限 +export function assignmentPer (queryParams:any){ + return request({ + url:'/system/menu/permissionAssignment' , + method: 'post', + params: queryParams + }); +} +//发出分配权限 +export function setMenuById (queryParams:any){ + return request({ + url:'/system/role/setMenuById' , + method: 'post', + params: queryParams + }); +} +////获取组织范围 +export function setOrgscope (queryParams:any){ + return request({ + url:'/system/organization/getOrgScopeTree' , + method: 'post', + params: queryParams + }); +} +//修改组织范围 +export function postOrgscope (queryParams:any){ + return request({ + url:'/system/role/setOrgscope' , + method: 'post', + params: queryParams + }); +} + + +//删除角色 +// export function delDept(queryParams:any){ +// return request({ +// url:'/system/role/addRole' , +// method: 'post', +// data: queryParams +// }); +// } + +/** + * 获取角色分页数据 + * + * @param queryParam + */ +// export function listRolePages( +// queryParams?: RoleQuery +// ): AxiosPromise { +// return request({ +// url: '/system/role/list', +// method: 'post', +// params: queryParams +// }); +// } + +/** + * 获取角色下拉数据 + * + * @param queryParams + */ +export function listRoleOptions( + queryParams?: RoleQuery +): AxiosPromise { + return request({ + url: '/api/v1/roles/options', + method: 'get', + params: queryParams + }); +} + +/** + * 获取角色拥有的资源ID集合 + * + * @param queryParams + */ +export function getRoleMenuIds(roleId: string): AxiosPromise { + return request({ + url: '/api/v1/roles/' + roleId + '/menuIds', + method: 'get' + }); +} + +/** + * 修改角色资源权限 + * + * @param queryParams + */ +export function updateRoleMenus( + roleId: string, + data: number[] +): AxiosPromise { + return request({ + url: '/api/v1/roles/' + roleId + '/menus', + method: 'put', + data: data + }); +} + +/** + * 获取角色详情 + * + * @param id + */ +export function getRoleDetail(id: number): AxiosPromise { + return request({ + url: '/api/v1/roles/' + id, + method: 'get' + }); +} + +/** + * 添加角色 + * + * @param data + */ +export function addRole(data: RoleForm) { + return request({ + url: '/api/v1/roles', + method: 'post', + data: data + }); +} + +/** + * 更新角色 + * + * @param id + * @param data + */ +export function updateRole(id: number, data: RoleForm) { + return request({ + url: '/api/v1/roles/' + id, + method: 'put', + data: data + }); +} + +/** + * 批量删除角色,多个以英文逗号(,)分割 + * + * @param ids + */ +export function deleteRoles(ids: string) { + return request({ + url: '/api/v1/roles/' + ids, + method: 'delete' + }); +} diff --git a/framework/frontend/src/api/role/types.ts b/framework/frontend/src/api/role/types.ts new file mode 100644 index 0000000..4684c3b --- /dev/null +++ b/framework/frontend/src/api/role/types.ts @@ -0,0 +1,40 @@ +/** + * 角色查询参数类型 + */ +export interface RoleQuery extends PageQuery { + keywords?: string; +} + +/** + * 角色分页列表项 + */ +export interface Role { + id: string; + name: string; + code: string; + sort: number; + status: number; + deleted: number; + menuIds?: any; + permissionIds?: any; +} + +/** + * 角色分页项类型 + */ +export type RolePageResult = PageResult; + +/** + * 角色表单 + */ +export interface RoleForm { + id?: number; + name: string; + code: string; + sort: number; + status: number; + /** + * 数据权限 + */ + dataScope: number; +} diff --git a/framework/frontend/src/api/taxkSetting/index.ts b/framework/frontend/src/api/taxkSetting/index.ts new file mode 100644 index 0000000..28ec26d --- /dev/null +++ b/framework/frontend/src/api/taxkSetting/index.ts @@ -0,0 +1,51 @@ +import request from '@/utils/request'; + +//获取表格内容 +export function getTaskList(params: any) { + return request({ + url: '/system/quartzjob/getQuartzJobList', + method: 'get', + params: params + }); +} +//新增表格内容 +export function addTaskList(params: any) { + return request({ + url: '/system/quartzjob/addQuartzJob', + method: 'post', + data: params + }); +} + +//删除定时任务 +export function delTaskList(params: any) { + return request({ + url: '/system/quartzjob/deleteQuartzJob', + method: 'post', + params: params + }); +} +//修改定时任务 +export function updataTaskList(params: any) { + return request({ + url: '/system/quartzjob/updateQuartzJob', + method: 'post', + data: params + }); +} +//定时任务是否有效 +export function setTaskList(params: any) { + return request({ + url: '/system/quartzjob/setQuartzStatus', + method: 'post', + params: params + }); +} +//拖拽 +export function changeItemOrder(params: any) { + return request({ + url: '/system/quartzjob/changeDictOrder', + method: 'post', + params: params + }); +} \ No newline at end of file diff --git a/framework/frontend/src/api/user/index.ts b/framework/frontend/src/api/user/index.ts new file mode 100644 index 0000000..367454c --- /dev/null +++ b/framework/frontend/src/api/user/index.ts @@ -0,0 +1,238 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { UserForm, UserInfo, UserPageResult, UserQuery } from './types'; +//获取企业树 数据 +export function getTreelist(queryParams:any) { + return request({ + url: '/system/organization/getOrgTree', + method: 'POST', + params: queryParams + }); +} +//获取用户列表信息 +export function gettableData(queryParams:any) { + return request({ + url: '/system/user/queryUsers', + method: 'get', + params: queryParams + }); +} +//用户-禁用,启用 +export function DataStatus (queryParams:any) { + return request({ + url: '/system/user/setStatus', + method: 'POST', + params: queryParams + }); +} +//删除用户 +export function deltableData (queryParams:any) { + return request({ + url: '/system/user/deleteById', + method: 'POST', + params: queryParams + }); +} +//批量删除 +export function delChoise (queryParams:any) { + return request({ + url: '/system/user/deleteUserByIds', + method: 'POST', + params: queryParams + }); +} +//获取角色 +export function getRole (queryParams:any) { + return request({ + url: '/system/role/list', + method: 'POST', + params: queryParams + }); +} +//新建用户 +export function addUsers (queryParams:any,roleids:any) { + return request({ + url: '/system/user/addUser?'+'roleids='+roleids, + method: 'POST', + data: queryParams, + }); +} +//更改用户 +export function updataUser (queryParams:any,roleids:any) { + return request({ + url: '/system/user/updateUser?'+'roleids='+roleids, + method: 'POST', + data: queryParams, + }); +} +//更改用户 +export function updatePersonalInfo (queryParams:any) { + return request({ + url: '/user/updatePersonalInfo', + method: 'POST', + data: queryParams, + }); +} +//更改头像 +export function updateAvatar (data:any) { + return request({ + headers: { + 'Content-Type': 'multipart/form-data' + }, + url: '/system/user/updateAvatar', + method: 'POST', + data + }); +} + + +//重置密码 +export function setpass (queryParams:any) { + return request({ + url: '/system/user/resetPassword', + method: 'POST', + params: queryParams, + }); +} + +export function updatePassword (queryParams:any) { + return request({ + url: '/user/updatePassword', + method: 'GET', + params: queryParams, + }); +} + +/** + * 登录成功后获取用户信息(昵称、头像、权限集合和角色集合) + */ +export function getUserInfo(): AxiosPromise { + return request({ + url: '/user/me', + method: 'get' + }); +} + +/** + * 获取用户分页列表 + * + * @param queryParams + */ +export function listUserPages( + queryParams: UserQuery +): AxiosPromise { + return request({ + url: '/api/v1/users/pages', + method: 'get', + params: queryParams + }); +} + +/** + * 获取用户表单详情 + * + * @param userId + */ +export function getUserForm(userId: number): AxiosPromise { + return request({ + url: '/api/v1/users/' + userId + '/form', + method: 'get' + }); +} + +/** + * 添加用户 + * + * @param data + */ +export function addUser(data: any) { + return request({ + url: '/api/v1/users', + method: 'post', + data: data + }); +} + +/** + * 修改用户 + * + * @param id + * @param data + */ +export function updateUser(id: number, data: UserForm) { + return request({ + url: '/api/v1/users/' + id, + method: 'put', + data: data + }); +} + +/** + * 修改用户状态 + * + * @param id + * @param status + */ +export function updateUserStatus(id: number, status: number) { + return request({ + url: '/api/v1/users/' + id + '/status', + method: 'patch', + params: { status: status } + }); +} + +/** + * 修改用户密码 + * + * @param id + * @param password + */ +export function updateUserPassword(id: number, password: string) { + return request({ + url: '/api/v1/users/' + id + '/password', + method: 'patch', + params: { password: password } + }); +} + +/** + * 删除用户 + * + * @param ids + */ +export function deleteUsers(ids: string) { + return request({ + url: '/api/v1/users/' + ids, + method: 'delete' + }); +} + +/** + * 下载用户导入模板 + * + * @returns + */ +export function downloadTemplate() { + return request({ + url: '/api/v1/users/template', + method: 'get', + responseType: 'arraybuffer' + }); +} + +/** + * 导出用户 + * + * @param queryParams + * @returns + */ +export function exportUser(queryParams: UserQuery) { + return request({ + url: '/api/v1/users/_export', + method: 'get', + params: queryParams, + responseType: 'arraybuffer' + }); +} + + diff --git a/framework/frontend/src/api/user/types.ts b/framework/frontend/src/api/user/types.ts new file mode 100644 index 0000000..07b734b --- /dev/null +++ b/framework/frontend/src/api/user/types.ts @@ -0,0 +1,67 @@ +/** + * 登录用户信息 + */ +export interface UserInfo { + permissions: string[]; + userInfo: any; + nickname: string; + avatar: string; + roles: string[]; + perms: string[]; +} + +/** + * 用户查询参数 + */ +export interface UserQuery extends PageQuery { + keywords: string; + status: number; + deptId: number; +} + +/** + * 用户分页列表项声明 + */ +export interface UserType { + id: string; + username: string; + nickname: string; + mobile: string; + gender: number; + avatar: string; + email: string; + status: number; + deptName: string; + roleNames: string; + createTime: string; +} + +/** + * 用户分页项类型声明 + */ +export type UserPageResult = PageResult; + +/** + * 用户表单类型声明 + */ +export interface UserForm { + id: number | undefined; + deptId: number; + username: string; + nickname: string; + password: string; + mobile: string; + email: string; + gender: number; + status: number; + remark: string; + roleIds: number[]; +} + +/** + * 用户导入表单类型声明 + */ +export interface UserImportData { + deptId: number; + roleIds: number[]; +} diff --git a/framework/frontend/src/assets/401_images/401.gif b/framework/frontend/src/assets/401_images/401.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd6e0d9433421b3f29d0ec0c40f755e354728000 GIT binary patch literal 164227 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⋘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 GY5fOuZZib{ literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/404_images/404.png b/framework/frontend/src/assets/404_images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8e2305cc973ad2121403aee4bf08728f76c461 GIT binary patch literal 98071 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 literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/404_images/404_cloud.png b/framework/frontend/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..c6281d09013e0a2c5f8e699a0a6038d9480291e5 GIT binary patch literal 4766 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 literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/bq_gb.png b/framework/frontend/src/assets/MenuIcon/bq_gb.png new file mode 100644 index 0000000000000000000000000000000000000000..092115b2f7f80150061c4093fdca78e167b6b1d5 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!46Ls#}JKR-@c2yhZT5SvdhIoIz@Lmu_iGe zTWREC=HL;j`2Xh;=MvV%zvcuK+VA_!eEYk=p=W#Tqq6VcUNYs kpClNW#u01Rec}@{=S=54e@|4Z0Nupk>FVdQ&MBb@0LLCx?*IS* literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/bq_gb1.png b/framework/frontend/src/assets/MenuIcon/bq_gb1.png new file mode 100644 index 0000000000000000000000000000000000000000..fd22718420585fb0fbb38ede4948673bb1eb6b56 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!5~i;#}JL+)c%9K3>ru6{1-oD!M!lvI6;>1s;*bKn;gMnDKc2iWH!rsi%u$h=qUh0alr3|90~q3eaOqXu71*JaNH9 z!SoY`Mkg9x{^#*OU?Qb(+igyQiQLI+Ck`+$gmm)n;&Pm|3upj?r>mdKI;Vst03P-( A@&Et; literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_jt.png b/framework/frontend/src/assets/MenuIcon/dh_jt.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ace573ad543ffc1894998d7b6a623a8fa1ccce GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^AT}EZ8<70&U>c zv7h@-A}f&3S>O>_%)r2R7=#&*=dVZs3QqELaSV|NPo86xda90%t?kyFIdha9q?mnX znRqsLc4k@$Pp}p3FlRQs(U3ZU!9!44`SHL1|NrNwuy8Vnwlb`|`TyVF&1X)Z-pwdF znIUL-V^>viaj|-XXw!iwCnp;>gxCfg63n>Dt{|Oq$!ozPwh1;diX050;tXrG*o^iw ueB@iOoBN>94TgY1<_ov#G{m_iBp6r>ET+UPzkLMgItEWyKbLh*2~7Y`hEse1 literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_jt1.png b/framework/frontend/src/assets/MenuIcon/dh_jt1.png new file mode 100644 index 0000000000000000000000000000000000000000..3055566bfd9f0338e2b5b8ed9f2016cddc7a1590 GIT binary patch literal 1047 zcmaJ=O-K|`9G~(dSz7577?r~)QsmCZuDk0DZn`_O>S80ZF1U2j*_pTQu+F?`=B>L5 zfeK+khlD^69z28{g21{21qF3bPaT3t=n|c}NZ=_+d$aDY9oh!oybpfA-~Z$N-h;8x zA+P6>had=VVpvMzxfu^ni~C<~Wde9=L-8~khgnoqY(PXcm;q$MP^Li=DB9ee9neP* z4PAOFjneWhL4^jbxEQ)*SeQ)^ef=d%QS$(i88EGz5o-VSTZ+`R2sIIuS=kanP9L7P z!T9`WN}bQEyhiokB>PGN7BB!($dWN*IzlNzm30NYc8?i~EJIK}LY*X)md8jD+JFqw zA)m?xddV-_uR{SuVt|Jj3<)SWaMhf#t}`N8xC;mKBoHU?mpbMW`G?mcTH@ zVv#NeXlPF}9MAI%>u3CaA4d3`ITI-*pXqc|6(r!Owr(LEnxw0!WMBbBD4gj@35HdZ zHJwVEaKo6AVlf=ex+PVCviyIjVbstLN`ljT|0(RG<}AP@fddP+iZ3qP;fAsV(FO{F zb_&9oY8S_H5J4vgEm9QSu7$~K6S}FvqI12>k!2xaI!G~9kdPu2R-tuW6a0gGFcgT! zL@pfSxVXf}Ls6a&#lrD;j~EccRjvfpf&ola$0my*g@{HW?j6gnID+g@iw-0cJddCpT%-Qil$0? znRP$dJvu%Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0i{VqK~y+Tl~S=w z0$~)tI}dg94ni6n5?Uggbuc6-Xiz*ML8zfMT3Q^#p&;5D9207CI1d*`q5c4&28RZR z28V_d8bnU7-+O+3^hrxUc=vnn_q})Dd-qP)fJ&v33d8UQZVeVEP2damm`Eh9Tdme~ zDXB2%LB+bRPv`Ub9{lvmpdH{iKbcI#bU$RY?gsLK*2p} zU=ul)uw8@~$_vB@${6KxnP`mL`YZsYQfU;4MBd=4FTgf(=;By}S~MDMq678|g@S2W z))j7kM-Gj{+u|+!f+d)Nt;jf;Ovdpos7T3CI&fXL2O^We2sz?*yZsHi71|atL3u&3 zSlqyD^wAi;@4pI{fo)vcbRIxt z5@>gu7$b~9M?#Y$$R7!`j~#zfyoM8Wlf_wG#2Vrh=mnasqu52@@X5cS4SoPVcbrrz S*>RQt0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0f0$FK~y+TrIIaA zLopPF-*a;zlaN4ySolbA49x_jBS9b$h$WaI5CjAUNhT14f57L4z!Uz#2>gI0ASMtK z2m}JTgsq3SUALtp2*Q)}-k!JTqo=KamMBBYjlz~+A>6?s zU2-CNLeEB!+X~#X)mygpnFg^-2Q?LG2a8QHD1#h>>(o!ZW|1=C9*Zr|+Km!C>?E)J zxzWd5u^#ZwYBetqw%e2h&z!~yOx5OLWj&bgh|jnyk11=489ku=!aX#2JN~x(E%a$) zEX;Zg>`5PxVLQV<-9t20oegFLTPO|Rg7bATZXUOAt`ivLq4j9uDa<_PTHTvy2GbL_ zFrr0KE%yedkq;}b>J(4E%#y_*4fszBgNLM8;eOtn9ih5OrzO4vKB|C4Rs@fHeB;9G hcg(X9mi~rn{Ttv#oQ8i6?6Uv>002ovPDHLkV1lx|&hY>M literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_qz.png b/framework/frontend/src/assets/MenuIcon/dh_qz.png new file mode 100644 index 0000000000000000000000000000000000000000..54ce7e40808c30e19936f321cb48d39745e3c49f GIT binary patch literal 640 zcmV-`0)PF9P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0u@O_K~y+TeUm?E z6LA#BbLS=8P)Gt2Iyg8exOB6SEp;mx@&_8MQwky~C~c7zxR9Z<=rnvXbgoyVYb)nZ4Cy4 zq_|-iP0#aQHyVxKe!>)t3S_g{n_T!p=uzNn~*CaCi<)1$SN7oh5CR_%qG6hPQ$OsZ`3sEnqw2<5nt_3)~L2*lxGa zW3kw63T)79GoQ~dD#tIt!3@sEeu_^(nw3Z->{6-ZI*zjqcl!PQeI5D*7}uflH!436 zA4i~lWtz@V@!?^A6lioGB<|yO8SR|7B#kbQaLW|Wi)S*KCC;*No3kTnS3YAdmpjC* z4A}?=wOZ{li(BCGNuZU{9xCt)Xo>N7{5|0c)jK5mpNTk0to4|U!s4M z<`0?69!E!=bubN_ujBM0SBHwP{es`nXS{=*U5-5s`pmd9Ou1K}0=K9%?Ey_f@4!x{ z)7KgQm^-iFO#||SV1|+O4*rE}*qR!#`FURM8r+LSB4sTx$H5+g{w)8)1$pcI6UzYy aq0nD$`RytcLhEz@0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0vAa{K~y+TZBjjJ zR6!IyXIyZREi4pLh)JPflg@zMTf2aT2?)l{7$pjk7$k@gu}G;!Bt=;Ag&??~Kfumi z5M0nAgGB7^73r;0x={Vn2J&n=K~Pfbq+$v&rWrzd+5@@K|Qk^2vVY&@g6{|D-an_Ep9c0yNr zspov4Yj>#Ni#pfbkUXy+gdNdvPkFm?ehkCr>lA@aCL1=PZfkOSsK_4-vwi(g3+Hq)$07*qoM6N<$g6_p60{{R3 literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_sq.png b/framework/frontend/src/assets/MenuIcon/dh_sq.png new file mode 100644 index 0000000000000000000000000000000000000000..adf9805a4c60c90c8c5f1e44f7d406e248f53fa2 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0*}aI1_r*vAk26?e?2L;@BjOs|0^b| zgmft!n3dCzDV#Ec{X%NJ#6M%3My|z7Zf(5mlV)%&v}roo#_ZK>Vt1hJ|Nrzq9HEU& z8+Hlk{!vrd%_4r_^`U0Vp7?+D$zNEc%2+Zo8V}#8zZ;<0#E`DDSn8Ajlb|Y(+h?Pv z4T2KQ=Ora1RTtE79sIBF^IuXjtMTS*=8zVq5C2d9|If3P;rPAMoG&X@qyoc;!PC{x JWt~$(69Cs$lTH8t literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_sq1.png b/framework/frontend/src/assets/MenuIcon/dh_sq1.png new file mode 100644 index 0000000000000000000000000000000000000000..57e151415104cdfd81e23ca08257fcb2221bdd0c GIT binary patch literal 1165 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cX0^{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v(@i!swoov))H5`- zv@kN!Q7|$vG}AY*)HgKIH88X?u(UETRDc2{plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OML?)eIp}XpbFjM%Dj@q3f;V7Wta&rsl~}fnFS@8`FRQ;6BCp2 zOG|8(fG&l2A-4c-Y+f-mn1BJMUy)d#Z>VPg@)As;uP=V3xw&xF#U(+h2=`(&xHzP; zAXPsowK%`DC>a=WY04n03ap%qQWHz^i$e1Ab6}wukda@KU!0L&py2Eb3N>>DjquF8 zl>G8yO|TwcUn|eN;*!L?R>5jY1#(|8M`_!?U!9@AJRfWj7337V1YNw8?rf?V8N= zz~KG=dNwyVPBk{I=7aeP+!qr~zTdB9b8A!ozu&M*?o8qzCtmS&jBX2fm9PJQ`z`q2 z=YX6CjVa555_ZjSI1#WWZrl9d`x_^I+;7`=;PgNwa^PyAxDEc)I$ztaD0e0su>fl0pCg literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_sy.png b/framework/frontend/src/assets/MenuIcon/dh_sy.png new file mode 100644 index 0000000000000000000000000000000000000000..248c5903d312307e9e3ad82b8cf05ab591af3237 GIT binary patch literal 564 zcmV-40?Yl0P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0m(^3K~y+TjZ?o% zLQxdH@1>&95F+Z*&=4dvL=ZG6<`B4~A~`ha-VoB%7%uJo2@MW{pbilYA`KD>Eg}yR z5^8YDCpgG6weQ?}@kc(T56-*ip6{G<&pq#4g{?p^7_>N@&ilz^VzFAS>0BQ6an9yokO$PG&~+p*5Pm*VteQF`Q9~6YbcROj2AT!x4K<8(X`TY*f6-hl%>jV|F-V`Ntc>jo^bfKLb`hotfNMw{ zr|gVIqh082B)jCyADAY9^FD%KQDVDPDz%_L!ED;#RTcajJb}$-qp2G}Qu3~5e`8B> zDG2%Uhs6`nsA9QA=~uFGOOFOPAdY-+r5o`w8T$os8@N;%zaEPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0j^0zK~y+Tl~cbj zLs1ky=jl+1!C-e5yo}AIFVa7Nf8-eiUml{dUBP98M$ux z?=TZ_uhSGcQ^k3>7tL8-!(ue6Dn~qL84o0H>$_w8f$V;COlls$dcbQa@FOLvlQJZI zzUNoOMrz(-Zd?dB@&qExyQ)aquYbYy05V0d1_Jj$x;oFyozmuw8D_Chw-Csay^D@_ zVDP3sD&(AFUeNhF%lUE}5(P-!;8KRlFg`HCxW?RyEB-*D0B>Xr&?}BuD=i0Ah@LQ; zXmGN?Kky|`p{;Kc$$~#?r)iL0S7VRs6>&e76L3#ebXx^$W*jfLPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0i8)iK~y+T#gjis z0&x__?~YSK925#04ICT_S^|f{p~mD+Xv?NtBpMu|F+v)`LWP2&rNcQ+p&=-U$icm! zga(I#g2HnXIkeAD5nTKO4L$hs{r=wXz4v>+-@B7FP19vrPD_#$0ApLb-F^m1S=aR! z)@2qC-L0{0nS+BWB1rOKu~@w9`o}Xm7qqB!R)4VnFCgAvq(vf;fTAcSkLCt9rfDWx ztyT%WGqgZ78l5F@jleJuEk>8aon~?k^oM0x*`Ze;=z`=eq#vDRQd#(nwfJ^Y9*-wB zuz>i$ppe7in6qtrfh(-zdm^z?C=_Pc+XtzE1)NT28M2zqW=vJpI64FjkfD$t)+lx- z-arIya<4Glvx>{*%GT@k20=bx)A}cs9(=W0Z55v83dis% zm>@9^A29{-ADpA(3dwFn162F)<@I{6;Ww^uOK_fPY*TCs-w)m1ledfiq*tK-^iBtc zVTkrO&{sgrKSQw<^d9;Z&M}1p88Om$w0Y=J9LA|7#<|qpk)&TK`>Cdc+#`(u0000< KMNUMnLSTX-)8CB% literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_sz1.png b/framework/frontend/src/assets/MenuIcon/dh_sz1.png new file mode 100644 index 0000000000000000000000000000000000000000..1a13ddd9e1ed7c8a98e70800df990ff422a21755 GIT binary patch literal 527 zcmV+q0`UEbP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0i;PpK~y+T)lxqw z^f5Hq4BzMePJstK0y6?>s@Qn}SO9ph9yBn> z^fIe~bqj1)Z)Ku9i&C_x_c7Tw;Y-DCQb3=JhSne^r}|hGv$K;v*YxTEUI4TiwQ920 RB2@qY002ovPDHLkV1h0D>R12( literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_xm.png b/framework/frontend/src/assets/MenuIcon/dh_xm.png new file mode 100644 index 0000000000000000000000000000000000000000..a750b0226c4a7d9e1f1abd1291655979ec1e59c7 GIT binary patch literal 677 zcmV;W0$TlvP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0y;@VK~y+TZIe%k z5^)sA9Y-x8a)b^ZIwS;UCp+mOaDxs@_%Ba;Sdx~YqJ<5XtwV)$5Rzqy$faF~HerJn z14q3Et*4Hyu(v#{;2|PpWcQGe+UL0=sLX@M`}2F>@9(|$n^9~QlF4Mw8iw&eQIz`< z4~N5TP1ClD#p2&l!Guf^M59p$h06e+5}p9eVGZIe)<>M5B^nW!z(oq5Ni0A**sa&= z|0EVkCX*>EBE>vd=imgJ?{qp}CV{h(N~L0$RrDf6YYK^<1Wk{}bK7c0E0K=9Uhg~H zn?i6MX9qoJHRGhrj4JgH)o?icyVvWTAra%?7XH0JAkdFQA_t8|V>F5YL!r~XBanGEu^%Z|#6Chb=?E*YAU8_9+3)uYs;bImE95RYNXqhL^X+Q2 zYLG05n#+~%z=6JDNAJg@B@&6YU=TwwKN@*^d5MF;V36x}ySmj&KsraAJmnl07U<@s z>i7HSNlJ@$bRYi-vo5iRW1r7=*lM)~(oHZJ+~MpwHAkoq|0;ScptoofM!&A>cg3Qg zIDE~|<@QSnLAJTEnAYfk-4CebQH za`O>@HT*x)A@MxA3otK0{E3OH%g__uhWXL*lhm+lB^WkBjXl<00000 LNkvXXu0mjf)?qA1 literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_xm1.png b/framework/frontend/src/assets/MenuIcon/dh_xm1.png new file mode 100644 index 0000000000000000000000000000000000000000..aead610ee5dd7834cd89fb986baf11b6d363421e GIT binary patch literal 655 zcmV;A0&x9_P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0whU9K~y+TZBj97 zQ&AK?=jI6x4jCLAYOTv+8Bolf)4!w zf_+oRb|`dc2C*GFba+Dshj>4~bMpd8cptoX@45G!@1F0RqmqNTh3n$+f|m2 zx05;j8yp5OL=aaH$vBpHxXzmnyjFRfs-nX67Kv)3M1dd#-j=dDyfQlkp37dcpefDQG+E9Ixr!fzfv5w;tx6>Lo zai6KRn8A%aje{7HYW~ng?NwY>Nb-gyi3GSDB^s`gPO?fSvCgb(CgB&2G3wu9&=(Sv z74nj2#Xtm2v*H%{;+Ax!E(Kv7u*|cGh`$a$!v$YVxz_E=in}0+h(sSmbvK#MGHT+& zRwC_5fc0M42^`b8Dt~l8uM_kwDXf)RqHi5t-Ef?^=`e9X%BeW!en;=%lo`wh?H0&v zN=<)AX(pE?fMrsaYnXKm_(-D-r*{wL-JGq|`jr~rljtY}I(#QNTP^qK^T2#)|Fo>x zM!!Om3J*?L)z_@Ufjts8a8n|oG!*bp8p(4PbjLe>QVaAKnPDs6_C~pdVrZqXvPR@} zGkL1}cGm}erl^0NK{NFEM$&5X%(VkSA4a4eHl|DbenWIkoLq&%K_2pK4_;~(X#R#F pf<8tv;&90}b#GGMW#*DWPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0cuG^K~y+Tl~X-P z!%z^;iwSWMx^!^p;ARE~M+HR$1&2U>AfTH|!Buc`(%DIIa#XMoAwR1wL7^Q4J1Asy zb5O{Vp)`{E-D?bOX~cYReBXO__wKmkF<}aHU0+~~T@407Al|kzW+{fgrcHpnhhj9LaxD@aU8eM;vEw9 za9%?7wq;o=#S)4{1YCd;S(Z0F&$|i3@SE;Y#jDk7>yWSL;Fj(Pyj9z_=hHO(fMXj~ z9=K-$7}zqZzQ9&p*X{6%{eGXfpeRa*cp6Z-i>?wp&SQBZUTF|Jj*}3Vfu@|xVIp3V z_^ASl;Z((MVjb2S%0EGST_iDs{q2G;Vdqg4-P2_mR8^%doPs}@VHhzEbFe3J{sSv8 ziD5rS5R_O2N!jn%$LKdmW8!bv;Td;~plqtN>@DyPxI4TWg&_O@BQAh8DaZ^|00000 LNkvXXu0mjfZdbxH literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/dh_xx1.png b/framework/frontend/src/assets/MenuIcon/dh_xx1.png new file mode 100644 index 0000000000000000000000000000000000000000..535abe1a3df464cf97b9db4837faa605facace6b GIT binary patch literal 462 zcmV;<0WtoGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0b@x-K~y+Tm6EY9 zLs1mQ&$%k;VC-P%U}G?_kw{)8B>n_8Rgw-CNjHVqsa7>wnm922y+((rkOdJ!a#da*4YNVqR zBu)$tk<($CAZ3VbFx6(m8N2FG-3g2O9Cdb`7#!KWW^h9}=S?qK4@>48&=uw;ImI1U znDEWy`@}-cUNGeGuJhrhwxVnV4O#Ad$w_k8B{S`E-pInJLS6w`3`=_Da=ox;iaifd z%!WnN=!_bT@F5K!Q{aA&B528{`rgQBk$0hY#9u&~v5Jk*jF0~y^&JNxG8*IrXnWnC zwi=8(VS=h%=GE>}@4G}lpmM-ap{J~c6Z^(T8DZkqSN{Ss!~Tp0HCy4QoN;gzt;E0D zA*f=Ny97@2_j?N0%$_fFk$$T~!pD{cx|TSN(>;iM0b+l6HtQP2UH||907*qoM6N<$ Eg5AN$W&i*H literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/gb.png b/framework/frontend/src/assets/MenuIcon/gb.png new file mode 100644 index 0000000000000000000000000000000000000000..b276de270b9dc202d672778a5d2e79f27d0d0e4c GIT binary patch literal 14959 zcmeI3du$X%9LEO?P)aHoh$!;7E?_{s+ugff+uK}EN)PM-huBv8P?YW7v|W0)yWQQ= zYl({0Xe9U#2myJ#>y=UCpL5CG z{yOvh{(iHcd368TmzFPkFeiITHUJDt%Z(gL_=x-ybnY*QEG&ytrphHN)gk0EIEu$+^1I_*edH(C`_jM^1rW<1G2 z9zQfBUDixlRcuyXu~uz1ix|c#l>8*_E21R}DMo@FqR2)?jpZF2o5>WCk{+#D566ZU zl2{mq5vZ63^6?pcT7zn;MuR#`$z=Dih0&Y@gUQ+%#~X=cENz$zS0e-oq#2z?MXLtc zGH9sHx&#-lMz=CE)7_hLU21X$WwLsP9XpK5!`Q5zxGlC6;xpt$_bQa=P&8G&LRG`Q z_$pgIfY4S_Vy&tI+nh>S38^i{TrZn$NzHdE8}y4N^f@`F%g(v%ysLsQ5O}mC^XGAe z0>@!V;>xrfK{X`TwPw!YD#UYO%Jdv)|Aa(S{6|@EEtV%F33aL-5lx>Q5$hqVDfM19 z)rcvRt4b(Q!>W#k1${0ro2eOd#a5aSPz+O4BpC4fP=iC3Ljn)Eyt;hJX?MDul0D?g zbJ}b3c{keePRZ@A>>tVhmz1h}(yx_N!8}wObOYL;o^0W*?IJAzel%ofyV6*69Cj zi419mlq!`Cv_4z0b&FPS>?|vXO@mtpI>K`7OwvT%fYy#HVg|Nc@(@d&QI;pRa|Kbd zPBWimZ3r0hvV&Sv!%8|6Hu=9!U_3u&AHGIQ15|Fcq2j4xs^OCuYMt34>ae&Tt%-lK z*W+0S+tSl}S?lx<%Y!E(-a2@G23G9Q`Se#M9e4L8U1 z1x^lqSl;?gSn=+3YxS+Icz3!r<$OeuO`kJSEv*@IStoD&SSUvi3DB4CcDvkOHoZCB zv0RSAaFt(1``55mC7+-0q<3UARu5;yIugeCRAK+lV>20VMGp(;IfYF=s0^OuL`1lN z;=*YVV~UH22p3RXI1OSar$LNwi7Pwx>K|0l`+hCx#lG(M+ZUmi0&P-hSrCA>*#NA44uGpS(e)w#%^Uzf zuLMBY0>ET-!;>9IJE9}tFRqB5dt>9i#*M{yb?)kWFJR32VM^ACW4mq5hSqfYO=j!V z!>cEBjJ`SY<*J(ErZ1{zKQ{R-rhU@nF=LkWT~^k$Z|UvV&mQUS|K;)DkGb!?^N+jF zf8Y20g;q~?E&zXB_X#_e^{m;&tUEJh@t)}O6WW26H}&>ouU(aynoq`#&E0;R7Fhf# zSUI!x*GUBL+MG1E)u?#;^e zt?9k~&dTnZes5p{d*)mYXe{Sm*qfdE=ZAgUW=|S7-~VFk&ZA3v@{F#W1zGoOzcTKQ zYn^M3PIN7CjqLC|Q#q;QRLFU#M>*KbcYefoZf-nquCe!e&sR@;*}mU5=S^S!w$C>y z2fu#%?4_4me_b$QtqV9-y*saZ^HclJ-1u($`B|@Bm^iBE`1B8I-uf2#-pU%6!^T(?Z=J2EYe;fT+*~xo)$|KzuFMM3n&jdEi=-e`5t#)~R*~t~T{=;DO v9b11t(RJvF12s8d{sr~gS?*f>)8oOO8|RxQ>afdtB{Z;bng6{7E8G7D4k3Hp literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/grzx_tx.png b/framework/frontend/src/assets/MenuIcon/grzx_tx.png new file mode 100644 index 0000000000000000000000000000000000000000..0f21833b3682c8b3514c287a2e6a359c294fdb01 GIT binary patch literal 1897 zcmV-v2bTDWP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2L4GzK~#8N?VR6l zR7DiW&)ogpuDi5AX=%%^7Fm9X#ef({P$1P9W1{iJM0oJ;@QKJPk3RY01Bp*2#y9Xc z5re6TL|QCTpwL2p(RSNzyFc$8XYS5ItGnG_bMKtG^GP;)&h2*h?tJH*IWu?m5)eFI zq%kn8Png-q4j#%M)i?_sCO`&rrg^D5>c7E{*n*5N?dPf*?Z+ zf($JPGPEGb(1IWX;R1yqs?rF? z^wsb)^_9e;uyCMUkb$4B2ulsuuY4mc94HrLVeYB0G#urEP^x|!ba&_vVX3F##}Llw z@Q|?7vtb1B7zXTWYk`A1wt?U45l7c@WcPMB|HhGLk3fmnVMh7VNx9PVXm1zn@7gN7 z+PFUa5bjUT39mT)ADk1GT2M#Gx!3#Z7K3v#wiDhzeo%P0K`Y2dr}}`9XPfiuCLHp^ ziP#R|;RU52vCgev81lp@(9^zISa?Ax$g#a$!jcbQh7*w|6Lf;S>R@yf zXbRxnB%xf8aCDQf^1Qfxi?E#Iz2p0Zg%9O|yms~-VYvsNWMW16nYAvD3Cmr2I-XZt zd-ffG_SqrWyf`Y3s6(kByb%KFC3~5J)6?E+KfA$+eb474Cp!Z6voE_0ZS#NIwknhf z!o^q(7lkjAxJ{um6fmr;u+)GmnU-2Kbc(lM*(WSK;2qsuU`wP)Sa?t-NIHmfCn0rs zVpI-%w(JMbuu@QYy&gW?a`Ordrj{;FU)R7lrpsl~{%s zP3J(f`<>%4v#@319uVrzzT3IzZpe6XRa&UV5YyvhX(J{)XWHSw3nyp=aVl+1x8hq+Tn*|$UH05y zX476_;RUrI99g0)Ga15S<)^CNF`Opx#Pa6&}`J9ZU%R;7vyk_vimmC&A@uhz1A* z*$1qCe{7&iS=*XeL=iM1?<+FD-x{0$doXOz|VJn$=x*ON|kkg z(tt!tIAwUN+O@<~0_dGzZPPB1tJrxsw+t{)!7mVav2kdpJC&H@5ps+5vP#9^T&eOd z7t1vN73LzHRf)l=L=29_x~y9%%+XKbU!s=qyH>$ZG%U-4M-z`>Ha>6r$-oP?&mWag zt?(TC`#79W922CT9+hNO&TkKdQ-raJCon#>b`^K^7EmtA#7ybI;k(LWFLBY&pk~os>uFYEkFS3dpt=YJ0QPps6-BBbZd4+?km_KwcH_gS*c#PPnlcEGo5Iy7h5{Kha;ABS zQo7Ebbd6h3LO(OQqy8I|!Ub_mqX-Icxhw4b!XDJSBHoLHTBn)$3k90s$22a$#taq= jzgs{*?hJd*0|5L3BX2A{*0=l400000NkvXXu0mjf9@KnF literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/grzx_xg.png b/framework/frontend/src/assets/MenuIcon/grzx_xg.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c8977a168a2d9186b07c87138c410d7526080c GIT binary patch literal 385 zcmV-{0e=38P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0TxL_K~y+Tm6D-u z0znXlyB7qa4^V+XAP|*^3Lc@72k0Xp5J(avqOzi*56}mwL?9{<7!v9b2oN{~g5;KO zHve&Zfn1L-ncJOz=AYfW+(Q+-_w6)I7px;m)xp>yw#1qNp7mX&|DnH&;XrKIKeF~K z4~fj%*c1)<42`#-_)3_0Mz5Vb$%e4l;3F|tdl3pf;zWGYT$dc5Y_%2JCzW!dCNtM0 z2gtLN!>uIel$p`&R+m?joP#)&`ReP+Y}cONG#eDx#E;So7~W*Qx>W%U_);1m&tB=H z)NE*gozk>mKajcFUq_?;=LOKlDwpEyL36`7*9r>Y-zQ13R9cF|{EWGy{4O}?&j$Q5 f;6>V9c<*;-(=J+d(eNE+00000NkvXXu0mjftX`s& literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/jscz_rl.png b/framework/frontend/src/assets/MenuIcon/jscz_rl.png new file mode 100644 index 0000000000000000000000000000000000000000..22a323d01693b0964e33777175c3d5fb622408eb GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWHy*PEQxd5DWjML56;Z9R%+1ZWGZI5zz~J!lp=g3+X?zhZZXc+ES`VoN2bd5$&LCySq^&ZVCkDsx678zTX|9m`GbYG{3@sAFj zzy;ZVzFjc>+Ut0|?W=*D{Dbe>tIhnr*%i)}b=vSX#MJognPr6&?YF$1yDaW~ZIbeb zxgYnhnEihv-v#5`2f=-duBCqX*W$}pG(~#zDhcCn%zIcpmMt~gTe~DWM4f+T)Xa literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/jscz_sc.png b/framework/frontend/src/assets/MenuIcon/jscz_sc.png new file mode 100644 index 0000000000000000000000000000000000000000..674cf09f629dd7bb0c7c4546d182f7cc41cf769f GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH#WHcuDF5DWig2e$wJ|C|5#{{DWkLN8N8()z|5 z%&T~KW-Kt_VPW{lr4Z(F*t@|(rbCb+<5Jd&gD%Vq=DqH5h+2=h_&*9N3tal5&N?aKRQ+D`~b1rb4`I zagXISc$rVsh*-J_FmlB!uzD%lJJcj3>|x;Ye2~z5RViCVm9asG@%ZJU328|T0dM~T coeA{B{`B)wp^1F1Kp!x8y85}Sb4q9e0Q1LRH2?qr literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/jscz_sc1.png b/framework/frontend/src/assets/MenuIcon/jscz_sc1.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2e0ca5cc53e08cd50dacb1916bdbd8f7a0ebe9 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH#WB~KT}5DWk06bB}C|9K`q{{R19=H}+cxk5mK z;pjbvqe*Aao-KE1m6)->golMebj^?N@8>HSv32P(J}OutWstyfYm<~myTcBbX6c^i z=jV(6`1<;K^@5Yz92(UH3hy*@cD}TmV8rrUFynRogvmO(y7CP_elYmxcF8w3X&&#F z?`PQPXwuPtu8mQo_W;8NHY-==BWxEH?5w2OE;vukFgPI9xbQ3cDHi4wyInF>53Vq+ zloXIV%%dScmzV9tM~@OFhNH?pkBbyo`|OntH0R&nm&wEsYLz2!lvI6;>1s;*bKn;gMnDKc2iWH#WIZqeI5DWk0AK%~4=M%{P*U!@M=e7JIY47llP2nHY)6Wbm1r*-$i*Pe^HnKP>FrGQc z+#uG%@G)P(j^~oY6gL&$zYbgZ6nI%om9m>Yr8ZR9#r3|J6~Lg^>u}W0!jzFwc*-$0 zmIlQer;Z#6;dpwO@q!ZTA|`f8hS&tAB2GK$jZ6!)D;j3Brt}&(Y;y~kWX-c=KEvAi zoPvk=8y-I7U&7?TBfa3+=?4l*Obl1={r~^Jo`K=*oIfSY6-*+5K4b87^>bP0l+XkK DEMaKH literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/jscz_xz.png b/framework/frontend/src/assets/MenuIcon/jscz_xz.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2a892e0a0473bf31bf47996937c54203b1f1bc GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rp{I*uh=qUh0oH$if0xU*ER5kfz_QenP1#Xd wdESJ{jhFlvm~biFcAJx6B6srIi31D_dj2Azw~kM~0o2Uk>FVdQ&MBb@07w=r?f?J) literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_an.png b/framework/frontend/src/assets/MenuIcon/lbcz_an.png new file mode 100644 index 0000000000000000000000000000000000000000..3177fafcac9b82b6905ff957b5c6ff2fa8f766fa GIT binary patch literal 401 zcmV;C0dD?@P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0VYXAK~y+TrIVpf z#6S>+|9^`>AV@$U5XW1bA*~@GFbF&p1cryWM<5*Pjyu5%Adzh#!GcEI2@*~s5F{Ks zOt+Iunwl&9#BAr^-I>kbUB*K>p_2i?6*NNT0`!>N`U%L6sm&1iW-<~HkE8sY_a-kz zJoa4*pIyizyo9k4oE5Pw(1O+lD$XY({{z9hda}oeZzii(>NaE}J9C%1<}pj%u1(cW zFazA>ggDlg`<5>d z&sV)TS9+A9$%2}R6x_)#ZY(wAQzyRi)b;iI$;3c;k%*oAlvC4|A|6Xen@w8(#tjPC#|`zhL+Wprl;78`*i900000NkvXXu0mjfmYbw! literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_an1.png b/framework/frontend/src/assets/MenuIcon/lbcz_an1.png new file mode 100644 index 0000000000000000000000000000000000000000..81e544c9ee810836d06d67a9c3531a959b8a7804 GIT binary patch literal 427 zcmV;c0aX5pP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0YFJaK~y+TrIR5~ z13?gl-^}&e27(1uBncKA1d^6u2@(ElBnw*)Y9%zc6Wv_ix5J VZzFuu31k2O002ovPDHLkV1giXt{VUV literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_cd.png b/framework/frontend/src/assets/MenuIcon/lbcz_cd.png new file mode 100644 index 0000000000000000000000000000000000000000..25b8ecc21dc46e5c4cee8b743003bd8672a966c6 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!4gjw#}Etuf#Y;f!R|Md)MwW$@w z2JIiYXZSKn@Lcp*DBi}%(Avm6rS@@x(qnFgc%~EA8aM>mm}Pr;co>3LS^li_xu*}b OpTX1B&t;ucLK6T6W=Z$} literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_cd1.png b/framework/frontend/src/assets/MenuIcon/lbcz_cd1.png new file mode 100644 index 0000000000000000000000000000000000000000..19aaa855610cf223ee18de6fdab8e2c48ccfff73 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!8%VD#}Etumxzaf3Tpl$60#0SM;O#Je9aPAZgM1TFf!b8L-6#MlgS_L_uc<5p>kl8GP6O{*`LR`lm7fU z{o`?t)#LmP8k`9NF3L;eB-k1*rk=Cc6nOkM{uuuOgCA)&pY5kBe6DBQpd*;DVDZF8 aMh3?o`|H;xuM-Bkgu&C*&t;ucLK6U^KvPTr literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_czmm.png b/framework/frontend/src/assets/MenuIcon/lbcz_czmm.png new file mode 100644 index 0000000000000000000000000000000000000000..8f5b131cc36ffa927540aec26ff6e00fbc37cec5 GIT binary patch literal 513 zcmV+c0{;DpP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0hUQbK~y+Tjg!4g zf>9L4pJNIQ4Gp$LgHVHiKwC>f(LWHh1TBU|?HL8q=1^0CnGOy{LqjwMLNo|1Z7qRA zQ#b?#2?^RgJ@>vBKhVe@ocG>)&Ux;~x%U+ef#;;a1!X z)x0NQTVDA+p{={Irz_5D6e4l7@!&oEh&<9Jabae>r$=ls;ad6QOor21ekAN#!cCe( zwg(iA2d)uNZBkjX;%^SiP^kuy5fEMAV#%;u(V)trlzhmaU-zJhGxLcn)zOx6=bCbA z_nhpnw&hHDcD?6>OU$TJxWff<7{k2J=rAabP^6fnU>PaN(o^IFMP@z+30(%oP+Pbr zS~Sa6XrJ}CR8jNOG7~ZRU z)BHjD5mr`trYyI1=Y9Vpy26^I?L8ORNqYC_s8)Uf7RG;Z%0|7900000NkvXXu0mjf DEMnaB literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_jt.png b/framework/frontend/src/assets/MenuIcon/lbcz_jt.png new file mode 100644 index 0000000000000000000000000000000000000000..68620fbcbde60230c2147bdb3d62c58067f21444 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CG!3HG1zpHNqQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*0l^E{-7@!O1q2pPnSSxgE2Q-(PpOw4~(E zp$67B_xI0lojkeNXu`?^U;h99-|aAmLF5Mi6&=RFCI*M2HZd_Vs~g+W7(Vj4O?c2L ztnSn>=c&W9X8ZboKcb?e?=y5d^G5I`R{*45EbYcOqK2nc2fxSX`$2)_c~pYQMQ zON)t3JL{mys&LNK+9zx`vsYn4H;c3ZnQj z6%-VG@cQ6`FA6?52j19JWFiQA(5bJ2il88f2!fu>b^2fpoSX~a_x+dio&Idg#yK_1 zYbc7Eli4Ka$UK9L+FAZT+4hVf(=wbc;BBag%c=vZq>efv$e3yu%t2M}-8TZ`6g72~ zkuTtavQ^ZO$*4Yt@l2brDJs6fvsJAdV$cb@3@br@zVm(&IF-mo6TJ&_2Q5Uap5_gb##CFpTok*xh=mImVx+?}9*Csk0gKtc`#jZ7q{ z@!=SV3Jl*U#6k^gL5SlcEGMvhLy+S|P7paBOnfwn=IBK+CpS;TBD(}#!q^sBwp=bV zn zqD`b>tf$&6&v1T86`-R0A8MMDXcy<;pM3u*?B;uI$mXDndK`^hTruE>vPH>(Dn?Eo zp}mzZW=jYow}fmUNq*O&V0D{e>8R|k8Rsa9n6X@}S{lsA37V)dhM|kGa55ZCMLCI& zMtD9gC&Q6snoouJRAW?#ZkO&K+)AB>%M9PSy2alO3vlNmIiRI52I&ybDtg4+XgTQ(&+ueKOnsmQs$74cxt) z9aY-P;fvqbb$^K;TCUa1e>Kvv!y6j-D5m>%?S6TltJQKdYgfd+&fc?q`_oH9^S^Cg zSa-XrfAGc4`sY6ih0phXc+!#g*KaL((p4y?hCl4SVZLd(#~Yu3Z20^IRY{=H8#X^WgNQ)S+3$fyHXg3jdjB(k=3h HRL7BDKUit9 literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_qx.png b/framework/frontend/src/assets/MenuIcon/lbcz_qx.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4d05e9cf763d077762c0d08d1ba71e59fb6e26 GIT binary patch literal 662 zcmV;H0%`q;P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0xL;GK~y+Tb(1@2 zlTj4M|L5k>e2ujUO=~TQu}UL_;;4(8I1~|D5JVRd+D05Y>L>-FOF<~UzC>_RbaHS} zQ4tlzgh$=L znZk^E>q0E;#37$g)d;gc1eq|Q-XnOR0#sXN8LtU#>LK|U1@fU~T3DK+HA>|8X_c|J zNeFHxy!Qm>OIdZv)w3jhnW&M>>7rxC)^V>1zQ_RNUR2?DVOo`K6iGQK1mKZkz3grm!Qdhqi%kysMZPSsM zYRMh}sc4YK%QI>+3|aRW2c5f(3X8NDh&vm_DRn;rseNxs!8}#_R5(nRof~>Z3G-DU zMO7AzSkmq3?5AsUy?|{=SW>8(AH@dv45+Orq^U_dvfWs5~(ER-7m(_pu(}@w7O;V4N|`B`wDp&1lIZ$GNu)~4s(04 zPc+g?c)rYZbHL|2HbXP$^I{3|#3K~?!j#@Pl#YMLR^972#=H((2>=y+pF8`33tzHo w)`eI)5)FC?nHAu13-IDXhl*Kx=3EZoH~9wL_C7~mN&o-=07*qoM6N<$g1cfL5C8xG literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_sc.png b/framework/frontend/src/assets/MenuIcon/lbcz_sc.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca9d72d6f6618f36757f47f9c486cb0adba5868 GIT binary patch literal 485 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0eVS9K~y+T%~L%~ z13?gda~xtJn8LzB#6rO$MM?|h&Q7qkur$ULqC&t*5G=&nQiOaJwt}S~;vKd^{y@Ok zS*Eel?D+Pwo(3;SIv?!L$G)A}-I)~(K~OUl5tN{qfFM$lqqr!qZaIbLW#p6^^2+?9!V@4{MH+Lc+Rvq*!+Lh|sq1t{c4T zI)iM{(PXw4x0(qNo#b30_eK@h$s_V^A&>o_f>l0LlrV>Y+&OZe)u0&fNHhBp8(MI3 z+Kxo8ntX7gzSV!?R{*=28Cv~JdLc$ngG-$f4=v1M$H4w1H9qM_5-yp>s;fwXK6c7t>RtVebP6+9;K7aMho%2XZxU-*ua&Oh)Q1B%AjFb z3AT^uhqcq+7}iXS)(kVAL8a^5gYeX6iTB8x=kHvwzcUTMx-Z(gGiK;qL!fQ#;UF%1 bw*c@7lURyFM;m9Y00000NkvXXu0mjf4A$Bx literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_sc1.png b/framework/frontend/src/assets/MenuIcon/lbcz_sc1.png new file mode 100644 index 0000000000000000000000000000000000000000..c831998d60a0b242e5996c93db32f3a39f19278d GIT binary patch literal 448 zcmV;x0YCnUP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0aZyvK~y+T#Zo;> z13?ho+1$aQ5e_0~X-n zwBFJpZDI~SEUS}p%zcdWyx8yWb5-DT~}>Ic!q;x?de1;B-UZKVaqyvh8yG$vA=UR}!vDL}hHvy-A3_!ysAg qF4T1WvcP7&Blv2eRNALrZ~6)CRgkQ_$x@~O0000!lvI6;>1s;*bKn;gMnDKc2iWH#WA5Ry@5DWjKlh*S!1&FloJmX*>z~k0@@c^>~ z&%VZkkF;;7+^Au0KH6(pD|noHM`R8Q_rbFZ&OSQuKIWZ-lF{t_Z$JOp%We_A+RJm2 z&jSuYoy#Vq^&+j$+#WwU(b?~?ScA7A}%mA&kf$L}S?lm5tlW0Afwz36Az)IR|d2~KOy3-L|T z?w%D>$FMK=cJ^G6jd?$l-AzKeZZSXU+7W%ait(!Ru6fsl_^g28z~JfX=d#Wzp$PyG CbB^o) literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_td.png b/framework/frontend/src/assets/MenuIcon/lbcz_td.png new file mode 100644 index 0000000000000000000000000000000000000000..54ebc81973d4914e74a7ffc33dc35da2c6bf68d3 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)J!3HGPOa~60+7BevL9R^{>_E)J!3HGPOa~60+7BevL9R^{>ommcXPYm+}Wf5 z=J|i|gg^i5&6$}G^QtXqVVbb;z=!Ad{1ez1`4rkZF0%1Rvm0tKFxbXxnOD@=EeD## N;OXk;vd$@?2>^Y%F-!me literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_td2.png b/framework/frontend/src/assets/MenuIcon/lbcz_td2.png new file mode 100644 index 0000000000000000000000000000000000000000..6d0a88c48c98cce5a214d82a02abf3bc5db1570c GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)J!3HGPOa~60+7BevL9R^{>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0gp*UK~y+Tl~cbj zLs1z0&J&BtAJCD+Kw_xGAgRS5(XEROl~@c6O)P?t7)W%c)v*H!Cf({K5(Wu_!G^7a zv7tk~&$;*A{?KZpXL352m;Nk;L1;8+m$Um_w9&SCWw+;lmWRWM{JS?h*jhpeneTA;Z&Dk~qk`v5&!DT^#8GjY!o1~Yj-ArLKk2m(>=KL=K zl6e4UTwdxs=KV!f!j6HvS>&FsCfF;PYF)sQX;IHDc?VV3a;_K&@}QrXHLhHXC4vLn zpzVE<(>F^Vtv28y<+;2iIo?b*unr))LUN&voY4hGHj(T+!cGItGq9Ozu#r5;ahYk2 z)C?PeZ~AKU0V!KmO+aw)SEN?d1Re#j?^=iI9-nX1?K&bH;&Bj>ehk@)!MA?+%igow wbp`mdjPet8``*x}FQEN9+Mjf#-k@6g0jaOGMNN`VL;wH)07*qoM6N<$f-FJfO8@`> literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_xg1.png b/framework/frontend/src/assets/MenuIcon/lbcz_xg1.png new file mode 100644 index 0000000000000000000000000000000000000000..0548fbcd897e03fbfe5e5e921f1a89640b200810 GIT binary patch literal 460 zcmV;-0WPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0bxl*K~y+Tjgh}g z!$1_r-yIe@B;erCu|tOrb!urcL}YlZ2F4Q65 zV8Nw>LqQ=FGW3Vvyc|dx3;n>$z4z|E`6llKZNm3Uv|K)s5EEJ~ZpgB}^bRBSnkEPg zho7cqun*TR*P5)*Fxs?Q72&v#$|2M2A>Tzl z<$XxJ&D5l_(b-Vt}YLo^r^@RCnNTX!-@n#~-Zpb!R6G!7{{*y~fR zcAFf_A|a^YKVA`sJVDcZ;GHl`4PzaNw_8|!#53Xu;b8n{)NDq`HzM$FA8;)pS8#nq z{(?_T-PwN#Ozj-&lybS`3bx}XcI?9CR5!MS-hKf(Ky)!JTCY|B0000!lvI6;>1s;*bKn;gMnDKc2iWHy*c~2L|5DWjQ6K(yN0!3OSojemA9TN>(SzEu& z@LAN`sit?JsfjgWSF>geL-&FOGn!ZfA{>}HTMfl#d8l)$%!=@Ey!S(PkF(Jag@Q?w zi|fzL{e5rtAvKHVeF^eqmrT}1Rkkk5NnJx`*BQtI;3nBLPiw6*#g^UDQr- z&<&h-&|E@Uv8u^!g_-;T$uG>oldXMA?N6UR;{SnJPS5xCffB#Z?7eH2umOffynRMolFvo4MdG@G_6N2_?%^=FvoJk? z->9u>?}YmWjL(n6Wd!_xGt-yb#O?SC%{eoU^RvYpzFy&6;T^H@T3E(o-uUYu@BQ<# ke&{VNoO_4;+|J|iPnen8A6}iz1Pnh0Pgg&ebxsLQ0IQ&v00000 literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/lbcz_zml.png b/framework/frontend/src/assets/MenuIcon/lbcz_zml.png new file mode 100644 index 0000000000000000000000000000000000000000..b3528688dba7761f79f57e95e33a889b2bdd54c9 GIT binary patch literal 440 zcmV;p0Z0CcP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0ZmCnK~y+T#Z#e9 z1VIdKCo2#L1OkCTAWk3nmjZSf#kfs*fuc?*{|7lgTl?J+-b)5!z~+ySBC zbrIUfHnyUJr#PeI(LE4qpww$Mc`PA%(vvZ<9^NZ*w9HI<$XL}XK+q+~Pf%w*MRfaw zUhu5wO@^u?FJ;M}sW@|O-?P_46(F;rPH>WR(|=>z&4O_2dsdS|hL}e)IYhf*o^fSO i5UxB)rR&MIH2rs_uzOS{*vYj30000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0bof)K~y+T#ge^B zLqQOQ&&0aN zj=P%;Bt~4Y@q=OK?A|lX++Bi)wY(ZvgoRk)qYhjba$I&t7FyX?8!rD5VT|g}!j_QY z*)E^h+`(?O#6%+|oU{-ja47_673!dCgmyQlIX<=J*s&-Fy@!4Y!cIqfQC)zyPZxa zWNZCU4SEZdUS(F__K+0;ZaE?6Ce?)oq6V_P?|_kx72UfnFw2B4&~MB^B##oJu7oBL zV@?SgT^&RLicqKokW@R`ua8Np#vC%5CU<-Kp?X-(t3@-j6=no&RuL^3DIyQve~?V# zjvzHFOxw<^?afcYmA3;!Ca+SVAlrG3#$3p8`3ohki^wPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0ar;xK~y+TrIRgB z13?gmXO@Zz1hNuQQHem*-5CVo7gUgNiXce%E2tCnBLvkT8YHe&kRTv|gbIEDvI2o9 z`|{4-LZCF|3Quw$GqdmP?Ch?}49SVF>x$(3O+~a)croQ`2-U+;rsKj_;Ntg_C|-xi z0lZ}4;lKIRqZbB!Aykm`u*O*$G^+}n)79o|mlpeg;vJ4YqJK-gOgZ%ftC=XpDT4!1 zWs)TTCakWdX~$nN^9wWYGUIa$FNBlUSZOYhruAThYwVX58#WeRFIaWW@l_SC*5yB; zX%{TuA6SBZ;>$*J>d=8Y}~Mj&M5r00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0iH=jK~y+Tl~cb< zf>9K`_p896!J$Dx$o>Nd2ZKP}8X8(1g3KuzB&eaSh={16r6n?#wt~jSl!hD{goYX# zY|7D5D8JKr?|mwkh8@uR?z#8fU+;b@Ly#^bq`-rSCLMz(yz6{*PrsbrhZo47NSVv< zk%LOs28v58unk~T0EY>!Rr6X2w4oRg0B!TnHjXowe%Vr=_*K5a&>0wHO8!2@5jB`&4#klEro25e?vzOl+X3S%S{q30fRu+xj=O~z0kQvo;#r#Ze&z^BssKe zay9yfOj3^-Bk**SeP(H>)7cmz{0aG-Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0X|7YK~y+TV+;rg zc+SAUAOXa1@c;k+D;qa%)P-`v0I2Rbkg|aA;NS-nkN|1E0Myh7!;FlKGr`iRU?EH% z$i4#+V&DL|;6ISDV8ezDi4ZaTz~A4$0BAu!(4a3sng`?pq5)8I2}m=LxdwSBOuRG?gtrS?F|ff4BR&p-|jL>Lb405g{=lnn+zb(ewabf8=)VE6+7NeYF` TIm(Ny00000NkvXXu0mjf(ubvU literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/top_qp1.png b/framework/frontend/src/assets/MenuIcon/top_qp1.png new file mode 100644 index 0000000000000000000000000000000000000000..dda0cc9f15008a1d17813735fab91ef409b725e9 GIT binary patch literal 384 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 literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/ts.png b/framework/frontend/src/assets/MenuIcon/ts.png new file mode 100644 index 0000000000000000000000000000000000000000..f5787ca429668b7c1d897ae646f5cfa08a481d15 GIT binary patch literal 562 zcmV-20?qx2P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0mn&1K~y+Tt&}ZK z13?gm-`#$21!R9fB?41-0s)Fb1(5U);Bf?jLSXA4L1Ia8Bqc?GL^MGlsH{XbghE5; zE$?iHk8*buQXbLWnd{EZ&X++7y>o=tqUsD5D3*p=bazEsB5cxdM^zrHtEYE?T5bw=V}f<)W+HS| zj6u%>UU=*-k+qV|-^A<}gikM6w^ACam>6rYX0^`#1;#Rz7`_+n>u;a2meTqW;18kZl^go9Krv?umsQ6dv zg=Or>#(OBtRB$L$LmFLGV-e4|)Pp>BhZ>zWU+Fh7CymbSk4cc2$unnGajhy(%%C7s zPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0wGC6K~y+TjZ;lX zR8bT@=b}*IqJ@iD4Af#4EnJL?AkcUdv?wSDqIKCwwy1>*X%l3)NQj6i&~lt9vR&ZD zK#<4>MnMJ&f-VL^7$K;|>?iFTRZS%0 z7)-|eg?Ma2?Uj^pMIEjRBqyq81o%qJpWx8|B+qx9`X$N>aQYxX0iX`h2ASbtY-Ux}Mg;xL=0oo3yCIR=OU;7pR`K>@hZg)SklY zV%n>(lM0R~@C%S0EtCPMoMXUj^gR@K@ec+*Y>8)K){J@#vCO7!Kaj%b^rkDtqqz7L z*+Q07)|hqmpvSn!i1)m#dMFBEtVdB`D?3<2Rh-Vz|EJlS2`I0Km)oY?2IkYEo8tVt zRq!@an`Z?lDd$L~->B?R@RH-GPBb1mW|LPwOL>yk33$0^Bb+U|PHf3Fg*>!D$cZ{EiKru|~4%b5sqRo|KPs6OGygr{F8hlxOz4+=`kx z1Z-e4z2$2BSMGE7AJAu%3BQX&mghctEMZkIYw{B9+KMqME|KW2E#!DRdGi7*IM06c mF-eCl4=3^=?RBFfB7Xr0@)YXy8tuOT0000JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0t-n*K~y+Tjgvh{ zTVWK2?~ON!Lxv6x4gotzkYGRuK`?@XOCikgYpc~Xw>ELc(#2$Upkx3 zmP~gYp-^br>-9G3x}Gy#b*S<~FboZ!lvI6;>1s;*bKn;gMnDKc2iWHz=tfz}(h=qUh0oFIq|9UefYKSu%IA-!3IB_6> z_fUWy+kur61tgrLBpnsol?8GZd=b>(W&bZJ(Pw1%CtalRQz!e6FBWHho6EN>jNvg5 oTEx8k*#G~M`Ar5>y4fTo7-lXIm!5u68sugMPgg&ebxsLQ00uNWm;e9( literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/u343.png b/framework/frontend/src/assets/MenuIcon/u343.png new file mode 100644 index 0000000000000000000000000000000000000000..36eb52a272d73a6e83516acaea20ec718d5c0d1a GIT binary patch literal 521 zcmV+k0`~ohP)5r00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0iH=jK~y+Tl~cb< zf>9K`_p896!J$Dx$o>Nd2ZKP}8X8(1g3KuzB&eaSh={16r6n?#wt~jSl!hD{goYX# zY|7D5D8JKr?|mwkh8@uR?z#8fU+;b@Ly#^bq`-rSCLMz(yz6{*PrsbrhZo47NSVv< zk%LOs28v58unk~T0EY>!Rr6X2w4oRg0B!TnHjXowe%Vr=_*K5a&>0wHO8!2@5jB`&4#klEro25e?vzOl+X3S%S{q30fRu+xj=O~z0kQvo;#r#Ze&z^BssKe zay9yfOj3^-Bk**SeP(H>)7cmz{0aG-6P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0c}Y{K~y+TWs)IJ z13?gl?=}?`h{_5a27y471aYDX;E?wNz#)*3;JD-jO)w+~1cD!ctT=o_5Rf1$iYq9@ zK|qjHlpK6-m|O}>@@3!7o87(Hz36XLRkZ};FAwxH!@Apb1Ru3vUSk}`DZ?CWJMWOd z|6s=h-~C=Ez?oaxFo!oNye3yZMz>*%K7l5@a%vAgRe;xE*kfE^e1b!~743KdBQLN( zFOwU9zF^1G7R>ulsK*YdkCq!L3vZE+a0kcaHsz65jrvbi*ntt8%VfNPOKAng8S`>R z>kd`}->aQpz;2aLpZWp|iludmwEF(AHLO-IdMmqfbP7|@ZSKmG_Ju9Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0i8)iK~y+T#gjis z0&x__?~YSK925#04ICT_S^|f{p~mD+Xv?NtBpMu|F+v)`LWP2&rNcQ+p&=-U$icm! zga(I#g2HnXIkeAD5nTKO4L$hs{r=wXz4v>+-@B7FP19vrPD_#$0ApLb-F^m1S=aR! z)@2qC-L0{0nS+BWB1rOKu~@w9`o}Xm7qqB!R)4VnFCgAvq(vf;fTAcSkLCt9rfDWx ztyT%WGqgZ78l5F@jleJuEk>8aon~?k^oM0x*`Ze;=z`=eq#vDRQd#(nwfJ^Y9*-wB zuz>i$ppe7in6qtrfh(-zdm^z?C=_Pc+XtzE1)NT28M2zqW=vJpI64FjkfD$t)+lx- z-arIya<4Glvx>{*%GT@k20=bx)A}cs9(=W0Z55v83dis% zm>@9^A29{-ADpA(3dwFn162F)<@I{6;Ww^uOK_fPY*TCs-w)m1ledfiq*tK-^iBtc zVTkrO&{sgrKSQw<^d9;Z&M}1p88Om$w0Y=J9LA|7#<|qpk)&TK`>Cdc+#`(u0000< KMNUMnLSTX-)8CB% literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/MenuIcon/xqing.png b/framework/frontend/src/assets/MenuIcon/xqing.png new file mode 100644 index 0000000000000000000000000000000000000000..d54255b6a393178a52e621b2cbf0c2290c15af5f GIT binary patch literal 549 zcmV+=0^0qFP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0lG;{DXvJ7!Xko2gn)(V6!wHG?6gp@Ns;6V8^I=Z2(b_>B#6YAJ7XgjvA4~_ z6)DoCND~kw;1w1rgamT_=iBV(f}D7V5B|>lnVtDFZ-)81c$FDm0epzDp{|7WVkvxP z<9+-DVMfFoME27k{{(~XTQt?j4K_OQ)WJ`S#n7(YqmgfGn!;Dd-3=hGjQjH6kR>@l z-igmh+)URBLf<`a7Ok+KECYlj2XOE$i|IcOaovu(^&yxT$2l-aK#~QzQ3aftZg-vxQ+puivoYzKjz#6=DI>I+RciCqb z{r|$UJrl^(7>C3&b28y!UhEK}-vb>F5N n@)c!nW7cY~ \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/brand.svg b/framework/frontend/src/assets/icons/brand.svg new file mode 100644 index 0000000..e4b7cee --- /dev/null +++ b/framework/frontend/src/assets/icons/brand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/bug.svg b/framework/frontend/src/assets/icons/bug.svg new file mode 100644 index 0000000..05a150d --- /dev/null +++ b/framework/frontend/src/assets/icons/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/cascader.svg b/framework/frontend/src/assets/icons/cascader.svg new file mode 100644 index 0000000..e256024 --- /dev/null +++ b/framework/frontend/src/assets/icons/cascader.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/chart.svg b/framework/frontend/src/assets/icons/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/framework/frontend/src/assets/icons/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/client.svg b/framework/frontend/src/assets/icons/client.svg new file mode 100644 index 0000000..ad4bc15 --- /dev/null +++ b/framework/frontend/src/assets/icons/client.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/close.svg b/framework/frontend/src/assets/icons/close.svg new file mode 100644 index 0000000..5b5057f --- /dev/null +++ b/framework/frontend/src/assets/icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/close_all.svg b/framework/frontend/src/assets/icons/close_all.svg new file mode 100644 index 0000000..aa13cd7 --- /dev/null +++ b/framework/frontend/src/assets/icons/close_all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/close_left.svg b/framework/frontend/src/assets/icons/close_left.svg new file mode 100644 index 0000000..e5708ea --- /dev/null +++ b/framework/frontend/src/assets/icons/close_left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/close_other.svg b/framework/frontend/src/assets/icons/close_other.svg new file mode 100644 index 0000000..212e6c2 --- /dev/null +++ b/framework/frontend/src/assets/icons/close_other.svg @@ -0,0 +1 @@ + diff --git a/framework/frontend/src/assets/icons/close_right.svg b/framework/frontend/src/assets/icons/close_right.svg new file mode 100644 index 0000000..14d3cf3 --- /dev/null +++ b/framework/frontend/src/assets/icons/close_right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/coupon.svg b/framework/frontend/src/assets/icons/coupon.svg new file mode 100644 index 0000000..2f952b2 --- /dev/null +++ b/framework/frontend/src/assets/icons/coupon.svg @@ -0,0 +1 @@ + diff --git a/framework/frontend/src/assets/icons/dashboard.svg b/framework/frontend/src/assets/icons/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/framework/frontend/src/assets/icons/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/dict.svg b/framework/frontend/src/assets/icons/dict.svg new file mode 100644 index 0000000..22a8278 --- /dev/null +++ b/framework/frontend/src/assets/icons/dict.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/framework/frontend/src/assets/icons/dict_item.svg b/framework/frontend/src/assets/icons/dict_item.svg new file mode 100644 index 0000000..903109a --- /dev/null +++ b/framework/frontend/src/assets/icons/dict_item.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/framework/frontend/src/assets/icons/download.svg b/framework/frontend/src/assets/icons/download.svg new file mode 100644 index 0000000..c896951 --- /dev/null +++ b/framework/frontend/src/assets/icons/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/drag.svg b/framework/frontend/src/assets/icons/drag.svg new file mode 100644 index 0000000..4185d3c --- /dev/null +++ b/framework/frontend/src/assets/icons/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/edit.svg b/framework/frontend/src/assets/icons/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/framework/frontend/src/assets/icons/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/exit-fullscreen.svg b/framework/frontend/src/assets/icons/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/framework/frontend/src/assets/icons/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/eye-open.svg b/framework/frontend/src/assets/icons/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/framework/frontend/src/assets/icons/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/eye.svg b/framework/frontend/src/assets/icons/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/framework/frontend/src/assets/icons/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/fullscreen.svg b/framework/frontend/src/assets/icons/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/framework/frontend/src/assets/icons/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/github.svg b/framework/frontend/src/assets/icons/github.svg new file mode 100644 index 0000000..db0a0d4 --- /dev/null +++ b/framework/frontend/src/assets/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/goods-list.svg b/framework/frontend/src/assets/icons/goods-list.svg new file mode 100644 index 0000000..fcb971e --- /dev/null +++ b/framework/frontend/src/assets/icons/goods-list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/goods.svg b/framework/frontend/src/assets/icons/goods.svg new file mode 100644 index 0000000..60c1c73 --- /dev/null +++ b/framework/frontend/src/assets/icons/goods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/guide.svg b/framework/frontend/src/assets/icons/guide.svg new file mode 100644 index 0000000..b271001 --- /dev/null +++ b/framework/frontend/src/assets/icons/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/homepage.svg b/framework/frontend/src/assets/icons/homepage.svg new file mode 100644 index 0000000..48f4e24 --- /dev/null +++ b/framework/frontend/src/assets/icons/homepage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/lab.svg b/framework/frontend/src/assets/icons/lab.svg new file mode 100644 index 0000000..d4d60aa --- /dev/null +++ b/framework/frontend/src/assets/icons/lab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/language.svg b/framework/frontend/src/assets/icons/language.svg new file mode 100644 index 0000000..0082b57 --- /dev/null +++ b/framework/frontend/src/assets/icons/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/link.svg b/framework/frontend/src/assets/icons/link.svg new file mode 100644 index 0000000..d3f9e5a --- /dev/null +++ b/framework/frontend/src/assets/icons/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/locationIcon.png b/framework/frontend/src/assets/icons/locationIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc01013d3e82dcf4ca750d327b5fe4890f78102a GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rxu=U`h=qUh0oJ-de~RT>7RK-#U|H(PrtGM! zyl%qp|Nr;%bfl%E)G&!TFsIz^5bimqd{atNf?>0zxX6)X&ldoVVDNPHb6Mw<&;$Th CdoHm6 literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/icons/menu.svg b/framework/frontend/src/assets/icons/menu.svg new file mode 100644 index 0000000..92c364c --- /dev/null +++ b/framework/frontend/src/assets/icons/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/message.svg b/framework/frontend/src/assets/icons/message.svg new file mode 100644 index 0000000..ea1ddef --- /dev/null +++ b/framework/frontend/src/assets/icons/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/money.svg b/framework/frontend/src/assets/icons/money.svg new file mode 100644 index 0000000..60f7acf --- /dev/null +++ b/framework/frontend/src/assets/icons/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/monitor.svg b/framework/frontend/src/assets/icons/monitor.svg new file mode 100644 index 0000000..bc308cb --- /dev/null +++ b/framework/frontend/src/assets/icons/monitor.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/nested.svg b/framework/frontend/src/assets/icons/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/framework/frontend/src/assets/icons/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/number.svg b/framework/frontend/src/assets/icons/number.svg new file mode 100644 index 0000000..ad5ce9a --- /dev/null +++ b/framework/frontend/src/assets/icons/number.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/order.svg b/framework/frontend/src/assets/icons/order.svg new file mode 100644 index 0000000..8f2107e --- /dev/null +++ b/framework/frontend/src/assets/icons/order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/password.svg b/framework/frontend/src/assets/icons/password.svg new file mode 100644 index 0000000..6c64def --- /dev/null +++ b/framework/frontend/src/assets/icons/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/peoples.svg b/framework/frontend/src/assets/icons/peoples.svg new file mode 100644 index 0000000..383b82d --- /dev/null +++ b/framework/frontend/src/assets/icons/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/perm.svg b/framework/frontend/src/assets/icons/perm.svg new file mode 100644 index 0000000..b38d065 --- /dev/null +++ b/framework/frontend/src/assets/icons/perm.svg @@ -0,0 +1 @@ + diff --git a/framework/frontend/src/assets/icons/publish.svg b/framework/frontend/src/assets/icons/publish.svg new file mode 100644 index 0000000..e9b489c --- /dev/null +++ b/framework/frontend/src/assets/icons/publish.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/qq.svg b/framework/frontend/src/assets/icons/qq.svg new file mode 100644 index 0000000..98da395 --- /dev/null +++ b/framework/frontend/src/assets/icons/qq.svg @@ -0,0 +1 @@ + diff --git a/framework/frontend/src/assets/icons/rabbitmq.svg b/framework/frontend/src/assets/icons/rabbitmq.svg new file mode 100644 index 0000000..65aa198 --- /dev/null +++ b/framework/frontend/src/assets/icons/rabbitmq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/rate.svg b/framework/frontend/src/assets/icons/rate.svg new file mode 100644 index 0000000..aa3b14d --- /dev/null +++ b/framework/frontend/src/assets/icons/rate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/redis.svg b/framework/frontend/src/assets/icons/redis.svg new file mode 100644 index 0000000..2f1d62d --- /dev/null +++ b/framework/frontend/src/assets/icons/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/refresh.svg b/framework/frontend/src/assets/icons/refresh.svg new file mode 100644 index 0000000..1f549f1 --- /dev/null +++ b/framework/frontend/src/assets/icons/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/role.svg b/framework/frontend/src/assets/icons/role.svg new file mode 100644 index 0000000..c484b13 --- /dev/null +++ b/framework/frontend/src/assets/icons/role.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/security.svg b/framework/frontend/src/assets/icons/security.svg new file mode 100644 index 0000000..bcd9d2e --- /dev/null +++ b/framework/frontend/src/assets/icons/security.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/shopping.svg b/framework/frontend/src/assets/icons/shopping.svg new file mode 100644 index 0000000..8d2b4bf --- /dev/null +++ b/framework/frontend/src/assets/icons/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/size.svg b/framework/frontend/src/assets/icons/size.svg new file mode 100644 index 0000000..ddb25b8 --- /dev/null +++ b/framework/frontend/src/assets/icons/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/skill.svg b/framework/frontend/src/assets/icons/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/framework/frontend/src/assets/icons/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/system.svg b/framework/frontend/src/assets/icons/system.svg new file mode 100644 index 0000000..63feb20 --- /dev/null +++ b/framework/frontend/src/assets/icons/system.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/theme.svg b/framework/frontend/src/assets/icons/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/framework/frontend/src/assets/icons/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/tree.svg b/framework/frontend/src/assets/icons/tree.svg new file mode 100644 index 0000000..d40a414 --- /dev/null +++ b/framework/frontend/src/assets/icons/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/user.svg b/framework/frontend/src/assets/icons/user.svg new file mode 100644 index 0000000..e4c7b38 --- /dev/null +++ b/framework/frontend/src/assets/icons/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/uv.svg b/framework/frontend/src/assets/icons/uv.svg new file mode 100644 index 0000000..ca4c301 --- /dev/null +++ b/framework/frontend/src/assets/icons/uv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/frontend/src/assets/icons/valid_code.svg b/framework/frontend/src/assets/icons/valid_code.svg new file mode 100644 index 0000000..39bf478 --- /dev/null +++ b/framework/frontend/src/assets/icons/valid_code.svg @@ -0,0 +1,9 @@ + + + + diff --git a/framework/frontend/src/assets/icons/wechat.svg b/framework/frontend/src/assets/icons/wechat.svg new file mode 100644 index 0000000..35de4bc --- /dev/null +++ b/framework/frontend/src/assets/icons/wechat.svg @@ -0,0 +1 @@ + diff --git a/framework/frontend/src/assets/images/linefeed.png b/framework/frontend/src/assets/images/linefeed.png new file mode 100644 index 0000000000000000000000000000000000000000..54ebc81973d4914e74a7ffc33dc35da2c6bf68d3 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)J!3HGPOa~60+7BevL9R^{>_E)J!3HGPOa~60+7BevL9R^{>ommcXPYm+}Wf5 z=J|i|gg^i5&6$}G^QtXqVVbb;z=!Ad{1ez1`4rkZF0%1Rvm0tKFxbXxnOD@=EeD## N;OXk;vd$@?2>^Y%F-!me literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/images/u287.gif b/framework/frontend/src/assets/images/u287.gif new file mode 100644 index 0000000000000000000000000000000000000000..89bcf89ffc7fd285801d835b2a21e31f1bef9e01 GIT binary patch literal 246181 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 z zSNQOfkFv#$n**)dxNYAehwG`rbn4ZuU&o$Z`}7M?dxT{Uy=#F)mRn3lANk(n|Hq9P zD~5kqK4AeK3QjthFb2bh5F<*g2!~`eB9NnxKoW^0lTK2FrIucDX(pL&s!1oEc=`z_ zp@1mLD5U0MN<0z2N^7kVPjm__th7S0#R8TKE1ed%qH8YV?$T?szHX5Oh8PGVOg>o@ zTLXp0*i#R^@+xa10v(^^%s1KgVPKxmbgM1PEMp5zOD|U|4Kx`_P^~xLe7Nz(GcqY+ z#;u%-OGO#o+)BFb?!+_C3P==-&ZlTu@;oKgV~+**ii9sQAq@kvnJx^{Z$E|{@^2!F zEW$`50}l*Ii;>PKi9wYdgfK!0X`&D(3o*=aLk^2Nimq1tMD9hmXoc>q{}OQ>@w*sV zF4HAeoLhO%T)tQF8E#QUN#>)tfBbDMJl~>M+*1X5DwIAkdn#X0HU+ znXH@BDu8ERhpnsFV>Mf*m`ERnq1nZZWURdhAb=ni^ek)g+9$JZ_p@}%1zWUn`w5%2 zZm(2VG%MRh6JEPkk)vi^C&&S=pC@>(XQ%$t9xtT zIjjO$oLg`|iRJ*_qx}kO=^vSu&)Fjvp_*!|1HDXZ9l357%d){9`+9NB?B`q6&TjWz zw;vg$=DYJI>vr7z>AQXHJlQJWx^WHTp7ah^*gb|(Sd{6(9M=zj`co+YRYYS2${d0` zrJ$3Lj8vs^hZ7_)LDQv*Wj%4(23Q9x*ChpZwNnxL*7p=!(QbrQkrS{|^ebEePk5S< z#18hOpJgHMFhqhH8Dh~q=Ut6SPLiHxsOKB+X|G(_Gvd0||K=?ffQfr-E7lo)Pzjw0 zZ7eA~A^Y67#p=M1E9#>a5hjzc_UKP>{d-t5eDt`;5wL)k+t{Ww7qZT!q+}<^9#^@P7Dq8SW%9Mhaeq*=tm10LXE z)u?5eAZ})eph;U2zl201g0CN_QO&tNGbY?fNqje&SIw|kmPR6yi@&TucXD?tKb>V6 zkRYR>%$O)NHg1gpY~#fWD4@%AEP+4R90M72M+oY1k3O&<%QC1zL2{6gdJDqrAelug zE;5nrl!_wVB*`>Uk}qPoqyQ5FgJvAhhKNbbEFSPl|4@RmdCv<})=K%8Q+7#};bLXk z!gM7veXo|?Ya(y7)wbaf3hNx~TM z5;^-Dv^^-yp{v|O_ERz+cR z(O0VLiN6_6Cd#+3mJ+ipU|eKLxd@jMt}{+ueM%S*w@k&@lxb>YV>Ef1vCGjwjtb=5 z$W+0x2_ChZOAP=4DD+gQmQ$)7n(}6KrZY zRo5!pdWbGZ*cafkvem|laI1jB+lWS57UK>_64Y33S{Jg`f0986_L*)$=Q_&DXg9B2 z^X_*Y+E>C_Z(S-76M9Lb-p|}p1FHZlo#bb?<(POzU^ygN?0aA2l$gpuvmGRq`5tCA zvr*549Dk;e;AtL^V;%!)HX+QQ1x#21|225+9y7c$an=@Q<^<7*aW%Ur*Dk+(0UzuR75Sd%Nd%{jEY!F#%gsgvtW>b98XuS1{LKfv+HB-26>g>^-_703?{uUyXc` zw=VPvhdrZ1XL&3w9s|AWZSUpkbD#c%!4w{aV}9!x)Ck2I5CvZ9f^P}cv?)QW9lpfw zDLL&5XL3I@p|_C7Z#hX9Pt&0y+^%%o<9hO$B-hBmKla|wJQsXN~@pEvxIs0N*?{wTc92%Ttu^cuKB4;Jj7PBgrPf)r!G zeSmOqZ%prVFvEBhLAcKE>RK1z0v~w0%5L@{zed#*T@CnTu<&(pZyut7wF_$JoOM4% z_EHAVy5TDozyBRifgh1P|KB-yxU>QiiJwmzRi0D+oYm5#-Iz6j$}x_0!!9*nDx8A} z(CfLD`MIG0w9^Z&i=!;|W4*1?H7P?nvY@ACpoSm7z1*X^iC``o>ZdBOkAfJ!PWv?D zODM4;HG*5d**G}XkUr{LvfNlZ861u5!=0bOwRjr87HPDk`@X0sKl9s;lOnq1$N{~Z zkuZS2!(bYmqQ8Z(zx!LTIJzeOTL5dAv(4i_0R#YUBftX0pm0OLahsW_h`_zWnFmzE z;98FE3lN6rgb~cK;`_I{x~s8M!4-6k791?l zxV~62FC~*cC9}cx|9Q8kP&ZyVL&Cc|juS#XAwm}ckF=0O=x7A~K{?Q3Hs*ptDTFx$ z+CMAwzXeH&I@=@9%egNUJ)aZ9S0O_M^u8+V3KW~KH3Y66WG4rl!(m~AW5@(8_y|1I zJxl9Agm^1J6v063x)S`i6GT32Nkm0t4Mu!E&oDA7fjEp}HP9HZ>T4Gp$RhPY#(^QO z^kKlK2*OXqj!;CAMsqzk=>bUati^jANvS`yQZO9I1fOa!D_np}ur>)}t!&%2Zo{x| z8@-nqL(}shs+gN%G(%-H#u3^?#?rN6fdo3x_%^&`3pQwmkyy!S%)n`^x{4tP8lcIV>^iSA!La*Avh&GtJiE8^8i#ARSOTB( zioUo54Ojp(!2}Op`9b^=8mqiY?Kn5TveZ2Rxx8?|z*yuzH2{^AKnYu{Gao>z2+>8GpsfR3&Z+9iVXQJ? zlumb2KVxjCqzDBq2o4S4PL^CumrScvKugGkO!Evxnqg5&KFoYi*qD+@T*uCY zL`U>YBASP|(>{B-N0W3ZBt((fbQ3wrfdVy9>qx&vTTK^%geGLXv4lc|#Fz=)%?!j) zj&Xp99L@!p%WWG`61_|1%u8VWqFZyi7CoT}Y|$5GgG}Ji?L33Tyu%#TLy6ddOmK*I z|M1brG*3b7w;ema%M8aP9h(=#Pqc|8woA%%G{@AaM79vg*vzsrC5zOXk+$H6FojL3 zCL2TeJ#WJNY@Q{BVEwdB9HR4osc01(Z^dYeb2Fh(otPC)!7R>`$s}Lq^KgTwB!^xtUv_)$A~V;aZW$veqOd46$sy+)T&-8P+&`NIIR!;m|DtV&mTa8r3MDPH~BHR_*dDy+2)|$zIgvAc@L#csv z*sXPwGnLq1mCy;j*aNW!E7VX8;83`nusa<t#7k%$S*g6*k>pB4E7=i}1PySB zmEhJIy;1L+x{Bb@a>d!5jm(~oAek ztp;pZHPn?vgVjY^1{`<^lQGgFiq9*sTDt)!IPK6|r>_T9Ac)YBsXeP2R;r zph||eSC z1z(;;*G&Do>l!ufLQH}-W6uyZ*55&a0SPGTp&Hqo77Z8G+!xsSHh}KczwiI|KnUGBBJ#*FDi|% zfb|&`9TBZ6;Q&=Ys=wOlUl$N%Dz+I;rWNiR7)Y2{2Ci5KhEtGPRFR=Yd$8aTMVUPP zBfLdkpo?Qs>|09&(7*IoM3RJZn28kL))mg)k4Oer0M`H+t0o7^B1skNC98jB|m7~P3pP!45L&H!4iVnv(X^dnSV zl?63LE8TU|-bF20j<7oA!Y;(+Ts~e7X3pgmyylIac@$LY)SECM1rd-CK5kh*US=)$ zT^b07Jd9>Srsis%OhU}b@)g?iUBQR*4Rlt@N4_YUhF?jnX~AM={QuRpPiCoGo8#84 zXHixF1=s@v&1au3CaUF?Fo1zBZs0e4U!-t5Qa64YJzq!1)1d8T4YX?$KXE`m`(vngGcy1P}O92Q8)hz zVJPj0pE-)3Wo}y5J<|A_`1Ov529P~bkq@z3i^BnhdX#_cz~_o00Dzx}_TYZ`!c~K! zqIv%Ng6&;y=63GqM&uh7wZC4d!2T;!J;!|jT}Ws2o38P|YEpI7S1F-%5(`|FcN2X_ z@+5bGtOxjjkK!Yb{UpEo3@Cf0e)?aoau^usSx4=Pm;2VW$6idM*n3`u;&-(v{zfr+FrhyM%*j|t?P?{*YVaciF3p6{`7->a}Oceg{A z#Fp{See~16Zb?RWfY>LnL%)Is`?>I^a3RBn4j)2{C~;wdBS+FroY-T+kqJFAf()rJ z+MhozPP$N_QbC568KQjqhG=F{tM1&$@FWVXXuw1Vq4v>tqJq83CYe$g39!U%o^B z4$-BH17X6gm?CCa(PDv+i!mmSEP3+6bc`K08PCfy(M`IGA2$E$-oS33Q$4CKH zY-3!7l~!DN1(sN3U2&FKxTt{*TWx^`R~B{6Ab}T~<<*y8fC*NZVJ?Og1VL;RRU2-$y<=N%zyUhkaK;&@ z+;Yr42OV@hWY?&p{A^cXLI2`W3LXOh_9x&zmmVYoeczSP>8IY6a9@D$5y+mV``BmR zr~;KLsexY}l>>uWBKR1sBYk*Mh$F(pVNEyXB;rmzmAJ>Q%Z7Owl?A{cRctl>kd+o& zb)~^qVe#0bj{u0K)>>{A832-ZF}Z=0KmZolU{W5otd=1~(|7#3`2?qKUR3-J>IGCu={IqTH%M z^VMf+LFj?HUO)crCv!iZrsp!wpt{_T3Yzj~GD7@jB&Lh_PM~j!6xvj*PA(xL6HUWf z7$Sx~kq8vgU;2w{ivMB6Fl~+2Vw)qkJbnvqxNBikq#)+jrDVG6wi_k9TRRlQVk|Ob zG~Rz31)*Zt{6(-{1{W#9XbPvsaO2jLb4ET8TNT^H6<>TY#)58qoX3YYmx!X!kz6{Y zCZjB#dZOl>>3^s0muf-hS-ReNK+D|T>q5^8xME4s+Ji;^x=3NwPxGXJ)E!do>#rjw ztE}%S3XY6-B7+;SiIBw(=21v!(YEde*04l zV1^%_=9)gBW?^hOO#m*@m90?j2bRMDZ7`Rc-E1yno#R+?J{LOCMQ1vudsL((mAd!X z>}Md9&#PFav;Pvt%60p}R6%Gq9@*`TR6Xm5%?xrN-*ru1x+-4ta*~0owPbl7B9_&F zn6;nS4@LN+jL~`!3LH?2Y&g=Ej=Cj2HYv_+=S$L()aRtSwQovE6dt`MkPfdUF^vpC zT4SuRzccmEGeyEi00amp)zqLI_Bh}f61YGd=!s&y(cI>QGrSLp80i!nPs16qB zgPW2a4S@zjn90yQm>iGISoR&2(GZ25+T=b~$GRF04RG>P+OC#}Amf3^SUlN-3xw4x z=gE>MN0go#DZ|Fe>~JBihynMmHO22)@mu3_NBOpxzRj%fFLrZZ8m~vMGZw&Jy;S3Z zI--j=YX1gJ{u2Q<7-vTbgrgi+2n!$mm<)+QC6I#5Tm%g{!H$8>IT#F?1|69lNOmW6 zDV!Y&d*;GTzfJU)DsUWSADqT=vA4JuD*hO0>-c zb#nq;VoDAhVi_Vx!A8dPUKP=%%w-nI3(P>0+`QNqFiMF7?}OipAS0#%u=1q!tH?JC z2S?8M&kJfv(m5Ak4R-)wonL9E7OwIMYb@XkQ2}Jd`b5ZjYHVYM%I7{w=g&p~^dKk; z+U!V4*Gi&_ge{vW?hZmxPQq?L1=5{&EV?fj$U#9#(I(!=sM1&7@_Dn|!ylM;OQ#tT zS^p+gYOa7+lvO&!u}f*h7^FzkvxV=bSWFx?&V?7BK1rHk6zWokXRqre4XK>%Wm5$SLVW2!QH^@S!l~DNnSXHb#ZfD2x82hom;CSN0*N8VkfQ!QU4ux zJUO7A{S~1q1gv>U)n!;=xv!&44=Q_?B6&oDcVL(=QJs|-SmF|hC93QYKZ-n;M32P? z!flEb#305x*dMLfLD{H?+6(&#r-?h*hO^K`5C0Uzcl#S?C-NAit{5cw(z9e-{97-O zW5YBa^}?Kh)wAe$xjjCE186WOAy1dA4m@j;vs)-ca#vApkOP#jBjriOY|Q6f*{T*w z*cZ-_l%~9yT@wnP@sf9UCS&ttq5%fp9pnYxNaL1{(C3T<7_$W4Lo_Vgv^d{+mz>Vk zpC8g~j?xbzg}}jSE$ppCD;hKg>&)CfEZY#{O>c`8$x)N4k>P!N-4XG0IREpK1scb# z#u5ksHolc(t@8L1&z+O2hkUttUKg#0WHJOox5y{=x;no;*?7h~kJ^2?lrbM@3(ISe zh%PjSuo~>DC@CvyM@Am_#ddyy4!D$N8r+cuDNsyMXFF$B-3q77fBlismV)FMKcFI5 zl8NsO>sthAN|(C)?Jj^5&9Mm&ErSYh#-mhy>KS1;5FCyq4ksz^3-EzEaB*r>uM^`N zfAwixG2I4Qm!8-iIj&2tPba5b<>3V-USo%4GW%7`@ZGDbIL~a%&wPf{PLMaGL3CMF zqnCl6NVt6{XCyLh>5`o+66HP_(8j&eMCm~>kZIGegB>pWe)L|z!FUgxDW zsLeaSLhi_ap!ui2wCf79UYd` z9abY#JchrxnS``LGa#BE2H(MyAZ)RVq?zNnDH$Wc8q6XV1QYt#S&)ktj0W&}x4ZL$?B7UXW4%%@zEM22N?su!!+qOg%l zC&kxvf*H0o=R?fp%yB3$5*--qrBZRA9FpXn{RA40gRhr+QWTma$ z8U&of1F(QTwUuu68gJ5^a{A_4E~i7i7ym*oWdBv9T7I5b^3I4h#B)L+hSnThV%sS& zm@923Ne&pEog_*kSa((+P>|=1CI)7vNH(B?+6>~40%`FbVmZpEWc=i^Jcdwm=0g;v zo>3oXMCnp8B>)K!Ye;}Kr~y|cC@IQX#hl{e)n+Wr!advrntG*#5}o{k5}nEiT+)u9 z`l5#ZDVOz!r9fMLpprbS;V?$${Yjx!tUMh&QfD$pvIeq7=)DCgW0 z1dss>`0B6XX2?Y7nqphBc4+1a>i@9{#6k_{odPGEk|i;Ep8cVcw@!pNh+)hXtFnce z%<;}gG8oeNgJqp7o-su1(WsndO{A)8V#pwRUcpVe=VWp!IUXNvMF!SY6N60Z9P?_$}<09wBgO<#8;+8nD3H`YN#Iru)60$wZX1VXJwp zM+eC4E;6eXy5+K#p|SqvKuC%-WW*m7p#SOVg*xk6GC*~%Xw4=C^9&||?QEmw67B5) z&<5?K(x<2vgO3W|(em3k?xc`@>Su*24jlogGO1EgZPk8;50Kh91%Mg^9y@t0#C*YN zNY`w5X|B>Hp(Ma8tby9HE&s)WOe@0e$|C}hRNmgq^JdbuvgL`EQVlg5T>=fa zMuJ3?sP%4&v00MK65R`MT9}Lg&I%Y1p`kyto=W0b)@*Jg7FDTIMk}~$PKoa5LYmUj ztG%*o{l-t*G1%(@S7*qW#4QY+@W_tQ>Ls{Z#}V1AfvK(*M=X#*@fPpeN-XlW)x|;? zZ&snk!b&IUN2r{opyrCHn5fJF#tg5=H&l&@zU1oMChTCsw<^Z8iSm1XFMF<*^#LMo{n|x8Fa(o zv4+Q$BEy!g1VO+Qpg=bFvGIN|Ah$q2rJN=Zva#uK%t^1}I&z@Sa9WNm;IeZMW1F}B z0S+g!vX*bQ@*)+gu*p!Xp3SJ84KYJRfaMyojk5AlXk!j2v_cmEEE7TxEObOm^h8s1 zMN4!6>_Gqeum3Jr=8zUmHXii-wC>*+%^3?<#Le!+VZ-0Kv2wAKDu5ry^)7YYF;<4D z5X{0XWV1GNum`to#kPU_RYE>|fyu}~&v0axd6^Z$b10px&-@?9YBF&yE_>jmtoUMk zQ7X|c)@&odOL!@MQs&YuTaz&>DEr@~hS@c}fbww}34-6macJ%2& z#NO}?TSo-A9^D?kE;(!wGP4EWv2<2t6~;+0;Z5)-*fGdevv0)0FvtQ5WHwLt^dDEO zAUhHkJVICa0MXTDh9WXk-<3OutUAl0$;M8B;LJW}tVN!-Yb)efLR*3KGlSKV5WB?t zDg;3rk^j^IHc=!rMZfYzbUaB$NZva`9e&v6kG*d9s*pJJbtU|VEKv4^gn^MxUh6inT zz4AP1)qsXb!-C^^TU0?$NG$kjF#l|trtGUAX zwKvEmSryE;eD5@8`*AnxQy74=KRrP{__qd>wyd`^~~9f31_bhr*?ps z`TslboSExig3rTM_cmvh_3R;Wxc+5vmx$()xI{R&MW=%pEQ3e1c%n;mHb?>SHHq2H zctl_(k55kl0JCJAD)kKTLiFb)a#$uZ(++YXkR^Fk4k0}CqiiBs7c_$`z(ADKHSM&20BPQH$+c>q06` zbDO)lOM(dOMcM80(&{Ti2zEv!{q*EG{(8y1<{^nqgp-Qq^<_aOo~C(&ODC#DftGrm zDC{&Zs0U0z!khi8M>)egyu^mVe)sppXA7?v2z|s~2}u%dw|0XcayxURnj1T8dq>V~ zAyPBDT1J$z_XGNJmMG`Bv3Nr;x#)|66p7%xNc6zvV}9mqKITV&p^HHTY<}pA{^*N- z0W?F>t~=T(1ibTMM>sv0thoJ9I>CYT)Z_cPFoV@<;%K;PYer=sZRxK>aIgMlNMOzT`OR0p(v$w^6M~^XG(hwaIFMjLg9j1j=#g#A1|ScC43RiQ zS49pNFShdMufUNb={ANGIg;eYjvq^=RJoF6fgUVj#*`^CNIH)NW~MxuE{IHB6C;w# zGJ~juEE~Ke^&*0)2zO51xx=R&$aipmP}i-Y{(r-Xucg; zMsnV`b5Ev}lX~@(_z)rbv)zRY1>O~82%kY@jtL%}aqr$;L3{TZ;Ahw)e~)$h_wna1 zsSsiRfrOS>Mh^c7EYKiDu7GGFiY&s21DDR5;HCU(x=BCkdcf(z4N2-D!U-|_FsGj+ zf@r82vH$`prJ8CgDr^F}Sl|-Hy80?CvdS_mEw+G!Knl5HpsPr`@RDUOzWfry zuqUC!;*rLvY|Mw~h68T1EjjZnINyF_O@-8m%WTZqv|LWI=KnMc4a?(z6V5Z|Y+IAg z%Q|CDg*KtXpNtf{m%dTdO0n z#E7yWXM<;zN~%SsoRHC~tQM$26&!O6ODwX?!r@0CY489LB8jX^-6WM0*Z+VgNkdBk5vyNfa89L*B)o$mfiE@4XUBE&Hu}2 zOf%io_Tvu?VrPL^T~(pxp?`k)2moA$5a+RvKKtjn&z_*5cNRkfi7L8+gRDO))>E=M z^&0sLgE;R95Fw3Fed^4HC~dV_6agEz-4=jLT>pV?_TZLRbToz_RSd{+{f8Iff)laD8Y7)1&p&1p+p8Wod9DgjlIi%jz( z6?cX-o+&~E6ln%6JVHNV9Sc|b$&eIt<&g>Gz*iA!qjmE4ko~PlDKG-yjA~GhD-h5g z2DBUAK4Fao&>$Q=64zS3kctUX5M3~^APfwLf-r0_UQ+VlCu{Jg5svb5WvUaJlw&aD zv?(<;R2Y_4X(r4uY+yUwSmy#|%HV`7PXDhX6dYILjFd5Pcyug@Hx|XHCK69mHUs7} zX97Mkc5!G)3z{4Pv_&skk($z+X48702=v_%XS(7Qeu5x2XzGW3{s`NJ@`$#y^>HW? zn86<<-~<2wV34XHSsF#wDe0G{tm0*#nO?9f%s&}-fPL--m1rSQ2$TjP@PpSE_)mJ$b&pjrE8CEGu z0M)Qhe)hAF+)73bY7|#SIuZw|VE-sX9a=$4Miei{NXJE=^n@R16mpNqhCf{JQIPg) zWOP!g#XvWj$WlghI9=gOKQ>btDraFWt!0}6^{0+S>`f)>sz0z(#AM2>WhsdUF^5Mp zO(pTPU9IYEoeH2L5CXTor6M*qh z*XmDI81f94h^t%;O4qyMHLru?>nt`2*ur2TF@&ws88T6XkR%pMi?y6&l5@hypl%;3 z)TQfSXr>p=rggr=AuTP2U_VXvvZIyhWmIU{+9JZI#Oz&4f}jJUvdpM8L+)vL=G)%N zL5sWoDdc4u9c7myu?7i zE7vd36$j%jFGSU)2=x}`7E^L>m45JqkcL?#w|9BAO<-Yx~ZdB#%_VeVrce2 zj*^Cy8V8+|clslp9s!Ad#JYhK_1K=JmOucYa$W2Wl8~xEa*_$UfMhV)$xn_!T{lIkqKJg)z(ES(lG+VYr!<`*Hn7MC{jY~)EJvfm&;h2_gmS? z%tPgG`mexTiDo=eJKJtQltVHCKA-TVD^Irpx*@dVSFixwDZ3aIZ z=lYer%xySeRR8Y0A3aZMPrnUrp#wZ58%8>O_CQ;*M==Onw>{NyzjZ>4q6pTzz0*lt z1V~H$!{#yj>}MkOm1q@zIUY6JXW)dTFh$`DSF0MVad#Shmj;*M(ZtC+!3rwEq8hI< z;v4gXw2P$il6icWK>teEDfnRY&y8qP*Lhxw3G_BaFiSy$^w5m-OmC-9PqmcEJ$wh> zHo_TPV6|TFsA3QK;7ATE@B%R~12u31IZy)$LHI_25IXPzd9MiIZ381<(E4ox?2Q6B z!qccj`FvtQ9^(0WEC8@!`lzq^u&Zsb1=hYGf%GO^D6XNzF9tA<@c6;k&`&WKLD*oT z{UYQ2SpO;Ic!RW33Z-t&<+KFmW~fij4BJ4@y2hXA_@AHE^=geL;*rzFxN zcsMLRYQ_XyFp5TS5BYEpKhOj_@DBx~1J_TfIt{DxP$Yj;S#*U6Nk|6 zME`Mu22bNeffNo8@y_4}7B44Uu^(Wu%w&;bRH^cyP0a2OICx0^ppA7>iO&9Sq%5nZ zL=Q4xp{t^x4TlLD6(Ai&0(cTI8tt$e-{%^&aVGch8-=eMOYj8ukQ!$U?Oc$!HiY?9 zB9BHb0LZ}$R%BY_u3Fq?`)a@*@CGbCvG4v)63UO)s_b!6aTUffIKkor*fbqm9Zs-ZY5ZfwTwyvVG?m;eD#xoBGXD-M zpP(QOk{VLbIu^1a@dT&bQVUUTrE)PcE59Zh@bVOaVO|sk+5GE*r4qeg?opU-(CI{p|F;CP2QFKLBv_(_&MOhR^U35h; zASb~Q-eNRHq0k(=bEnF&S5}ZGLv5bo(SKs3DX*mluAr?%Q%B^pG>K3OB>zDP2a+{A z4k7j9KN~VY$!z8R zwNR3GU~fc8v{y_tM`v_UWwcNQHAQO_1QinlFaR;T@lba(55H5X81QB)bx8R~TD-tB z|0r$*X-T;&D!&Cv%_0=8a>}wY6*YhnkTWK<6f7Gi+2SuG=Y+G^^4b7UbJ#3F(K0yg zOijnqO-*Yfe$;m8bVG?LCXlHmV@pK;^lKJ1T2EA38FgB%wOSE?3bd69o`4GS;0f|z z4#E`#$hBNSK=`UPT@N!|sr5Bs5;Eav1zWIJln+xi(+k?>#{eh*)c>HL{;5g%5lWk( z6wObt^b_$Ofe<+4RjF`f{>wHKbWO?9H+vNr8&nv{v@9bOmI|yQ9WpmM7G?s*!5beHD;$314aN1tl(y?01eQ94tSOh2H|HdA!zkL53m4crxh_r zL1x`GFnjcP!c!%wQ$+m1UX=p6e5_NIl*qO#RO540%R)*`vAvowz7B<9-> zsdfW+>}uV{2XKMz2muJ)d2vy}Sgtq4v>3h%O42lS9u}CI&aq+Sh##B?9EPi4%7Y>i<^_ynq0p018MzfBhE@;J^z6 zSk(wP84P$4oOl!}0bLnYiC+*AS7N#FV^R$<9fp(~>`A&x?Z~0SfOYYWU7gXCK0Vdp-L(Z`P zgxDnQls#r*efgBn(AZO$*om8%3T`%k{Z|mIKpU_)ivxJ!RH1+k*p(Z#2r40ISJ|Dk zMkS=SI(}HG#7d5#&w_n`2N|x&`1l8K;23`344_gm0(o&NL2S_vOHD?Rjg66GIHoKs zhvPP3W(il*bPE+U=bX)*)0raQByh(jf+JIFM*lf4cjuH6@ z{g(MJY?}N2+= zz*ny2aG#lTJ#ykht2#ce9LsNK&TYNRyPAJ_KpXnNW_7k_efDPu!4fKA4(8y%Z(Yvs z=cE60&qE??LOc&koQ}ys5H^!D2VJEJC=(#TK@|O7NWr48fUwc;5#->o(LLSOecjo; z-Pe7~$XkUeLoCtzr$JJ^*Z&!MAKT{QTZea%z?@fY=Q}#Q*FIR6B*L>R>2!!=Myfru z%4MC_4J87S{no?Wf1yE(2_WIFi*793fTy71=UgY8T!}jZCR~iEDG<7cVAPHRJ*Oqb zaaRjM!9fyTRj-Uc-F@eIzUS{}(nrX>we8+@a}0O<-|gFxGaa3q7s!j8-mf>Qqob3X zIu4&*LwMn;0bcz@gYC*C4cfMzw#@8*y7#3 z^lRwTl!iS&;OTp^H~$tlH*)2OlfJo>hYP-`VbIxmiq*?4a82L>Dxmf+KqbB&&@g4} zIiv^Xp36s|5-K6>58Afbeyk(fta(}Pe}92l0?)CUYg~WO;z^z~Qv}je<^g~jvcV7x z|K@QXa_oT-O6626|NPNE{V~739&eHfX&; zVTp;jgX30FLLfniyMG^7k-Qko1i5!)(UU1xy8M&V#mt&Ek>pK(JniJufr2Hd;DU9r^;A?+6|q!RS825s z6jq?2AsrmjF^Gq$pasYjBRJ?_1V#B(z+4Qr=%R`wT2NCI}0&xA1=Nq2F>6y@-6j2x5nR(W!5TNIQ#{i!cl@iTeFv4|& zTtwlg5=;BR^b3GBT~LxY{OMGn0zP?T zTH>oEdgu|Nh^`jf>anltK;uwB=yk-hsYVNwr0ED%fL;@@D6N7x4x!_YJo*@=SZu+nJXq#tC_DkfQGi`X)gmCsgvmq~qpr#UZC|@WmiA zJkTFU$@nZs&4QG6Ni$sDRC@s-pLP<>Wf(?dnQ`s}Aaf?Y8~Z)5Kh{9e?2f5~qY+d8@}uG}IxgCt;tk#rb> z4e8>5-azxW2F8mNBOu(D3P6Zu93cV{T-?7JhnvS`tb>;ep$M0-x$~5u1f^>o>J(Kn z*-h+qk`qqKtOK#iA! zr%1&rTJefl%%T<re$xV$dO*oaTJn;V%>RMDmO%&% zV)B!q45bn;a+`rYPCB^hK;=Zp%F9`-haz)W-b!laY#k`txe&W2Zm|nm)ngz**4xV_hgEm}n}L zBY_0hV&EnMYMd)0lBy3Q6S%<7u6cH(CvA{~auf7=%9r7g%hGbgY6WT8xCk3|lYj0cMlbQ4R2Iq#(5y1|u-&9C(t@ zJwUXg2hHe2TT-Q+Omw3cE$K=t+Ri6-2vE~Bj~2IhA26N=o_gw=_iU`F1Uc?5jhobm z&^Xnt9>^_!tPt7;ryZ2Ih(i?=KW~)557(e>8Hi_s`~Ps)yGIGam6y%zsj6zrm6!uz zsZd7u(iOhn8#7qMGPSD3G0gs}5CR)J}==w1ud)`c+JrmM;gLD}Y-a8#Vv#wGj+amIEn;Gq5FY!Kla+HNgZjh=&fNI73uDAr(@T-Rz!^*F{i4nmWZu z^bsJS+I6+78k`os@rk7gs(>S!jsC@|Q~l})K-I3xEjB#L=Pq*w0A)Gib&M{fk@I%f zNU0%OOB4F-m!`Db;SP66huEZZce|t!?Qm1RHvc#>n7F4a4r3bYxM8(K)2xxoV_qiy zx4NP2sgb)J-wuQoZf=o`Zb3W%Aw>aE?&eW^PI?Wx2m?gtau}_SfT~!V1lYExwz)mE zGoxh@tk3<`-4SgjINpxcG$o!b!P^FXfkoxWR><1_7s#WAEXH`j>{du~Q@0hKrXd zjYm5^WkM1IfXtL@E<%Gr0CRUp7yp!ia|WUSdPo$4SdN6SFCq~E`*K0$SV@Ff7lufI z@+gm7re5=y3-Z_p1b_=_5EhXk7Uk0f$shnzFa>U~2vmRo_&ARY*^mg(i9)k=pa_G$ z#}R#GRT2pl8?b`}pa>*Uk#|-$BvA+m)C{CS4G7SSD!Gz$2Vw;Wez$mq!1#s2C|fk( z3>N_gI`w`wlz+l;YQsg1cA`VhsEi%wf794Q?SMNA0$sav5heg2#by^c0glMVfbHmE zE=h%!lnw>QCGGf*bdduNDUWkdk7bDfbMOIGkN|G^mT&n03BUz&kd}5Sk83tGAUTmX zQi>hn7cIAZKp_P~AP9A)eE)G_UI!)=IZz0@&?KO7CAP?tl$nbaR0Q8wg%&vnGdUbJ zc~kO`m(j3l$&^$_X@=2wW1;hgG}V)(W>nP}C_*)pr!bCmQIVd2O?UB)3D`tp*=||c zQtEg({qjkWR*t`k6n80fLpP6ezy(#%mTd`_ZYh@!AeSq!oN1YtL$jCIpV>l*;3xS3bp#2aD*w`|yXd_kGn+8%BBNm*Pgh9vI zVb`~df#_jbb{83Vm;d!xmk0n02@svqd82XZmPSyW*O`#o$&lfREy>w?An`}%_BF*P z6hqW7P68m3_SrD9M7oCKyB0V9#1p#-rH z18O;wfRiNg0y2bS>>*sF`4Bvr9kOJ9^9P$lDVq`caj?Ut1Q8!zlVs6Sm80?tzmNeW zT7BX-X_TsWQ#fdnx^I-!eTS2Mm1-k85Ts}M1gmhPII5%5Nu4~J0N42d9{{95nss?3 zm_tLW(9>otM;B50U>}+het8!;Fs5QUtioEX#Coi9KnSB?rlOUlYj$orX{c^GprHvA z-ms>@F%LnhhW}&e9jECK4N9SKSX)V{ae>Ne5z3}u@F-?uo8AveU<8| zmS&}Qw|$F7cZmjR_^N228mn{g062QEsH&>g$*Qb+opc$by!S`#*_TABSh}-{NHMYg zAXTcEKP?ihauBj2JF+BOvL<`7D4Vh-O9(}PnIlU{A+apgV5t4D4+~I}5D;KMfuK6| zpvx$7fl_kGRcKub3LJ_sVFy$R+;DXjglE z0GqW6XCtV$oX>f%Xq%&{x}y!-s@Dk%G-{VGs8H_aq-^G{4~0J%OQO!zT+y`=1Gc0K z5(Fw+xc`QGxQNTL`x&x?fU#HzjMJKaH)#~n%6=!4CO*c0wH9QrX>zfNuBQX8%DA)y zQJW>PtEgfO@fvJpV27P|0T(cp8gZXZ7`C+QlFI;-P-wSyAqRE&yJ{J{bqNb;Tf7NN zoeSHxt(uU)+q@51VA^P;9{W%kH7PGj7aW_WMrM&AalL_oxZoSU;@f>Kini#s=F3T@amZ+`(=632HDF z`81t9%CIEtwse`sXw03CMa74et9kpv(~By8A;=q{u?nK4Io!yNJPIwm5%TcEEf%MD z@xH-PCn|=NNGme&d%xv6CqQdl`|E0>3&p_!29&VE+ro`o{K^&3#r7%2{0YWS2x4a1 zNpwfSN5RKu44rJ;#%~PApWqGzaLmYz3*E4z)|toGX#@@6%b*y*Po&5~V_5{YE&sg( z!>pLi+rr3>9M0nl$QR)arNE|<8(Y;H7(mSL zK>gD~?bAe!(`zslGRrvkHRAGs#;|tTA{BsE5*wgWANNT!#Fdh0c!F;e7-34mU(SD80T{%-}qhM`F-E@4K4V?P%{glOdUe(>mrkkatgZ7@|>ZdtKhWV z$*t|04sP4PD8*`{+gr@rfQz`x8rY|PTS(Z^f@VK@ULY9mwO5G>>2aWybc(v`semdr%W9Fn=3akJ< zVhy_&z{?l`&L)ci`sv|uF3yUC=p63;f=l$5{)PBs@9q9kpxdIKa?QU8i zv(Bi(v+|qOVZOw(Eo(+u=H#02xXz|u9g!CVm24gu!cMXsJ_^Sk=V62H{`m$%5b_}p z?ZG_l)qe5>u*`)`!Xv!xF5dtn0POk`eB_)*hwRN1xwkN*>{E>1(xUG9Ug>gm6@mZ_ zk=Tel01a^91{i<^BLD&*04%@~EFci{n2s0p@eIINIawYp-T=S$`#Jc_)$o__%!tpe z`S44N+tG5d@0K7JAF>(0@yG5w!ABQ!kN~mJ?9HA4Bwx&Yj`IH}j|)&>*e_4$gl?cW z{x#c6y^NkMK?9O~^p4@qMOJU=)CL7WaBYz&iBHo9dev7`?<=`*`IK(xB*9n{zzHa~ z52zh9s_hWM#hM+%+6?ayKuLc-tM;U8;Vu$`lD>x|tGLEa_aD9yFg+AH;OrtF@_G;L zfiL*d|IvB;0f+wvg#HF|fcjiVHaxF3L$nv<&TEqmxIX{1-(OCqPwCXA2JdzBAqWRv zfCe8z2X0^m{d7KpWBPs!5dH)XB zFx}DuL6A=EfkBQO3`Mk#x@r|`SFm5jdes5qi6yjiKw$9NHmuvRZ?9HV$`q-b6|scu z-J3v&-!6d#cezBs@L|M>6)$F-*j={=kt2U-P`UD(25&UKLC|CBXV9Sq=0G^1N06sS z3W%m?n)N``OQF7|O?s*4i9zbFW}TWh?Wqyi4kuo`xDF~%ppjrs!qIac(c!@1BZ7}R zcK}qWO4c3FcLc`86PGBu#{?>ogzlpR+`T^+KljxflWHQ{j=;^m9I*cyWh<*flq;^W5TN5k6bDgpkUX#$ z5iS_tDvzSrRI4b5H-ylOuf1aND}liXYivj&i$v@bBO>F%vdc2tOfwyFm~hI9d?V<* z+uU2KDc0&jD4h$bJjzN6w+xdt+a~x;%z>)Xfvq<&h;vRj;Y?1D=ALsz8|kL=f{*I} z(5?yYlKF0mIp~zL&P5m9P&B1pD8;9Fs$r8gZ+`0Fz=q~Ya3!2x8Y!myYFcnW`$iRz zp^ysX^g&o-ZLkzeFHQ4Nih5XT0x5wD;zO<2!YV{!hc#AMwnm@>4Kz+fqYo&`>86`L z&|neSVzE6oTMTBb2us(ld?1z`dGzZqy#oKc#2q8sbyqQW1TbPrCNX<*vpM9rbjrH8 zoT$PhCOA_xGN(8P8YFc$60#h=u)csCnD5srDcvV)Y zqc-UUZ}u%1DTZG=Z>w#)))rYRtY8)mC`9m6#=C*5ZE$TPSal6owN4|cH z#g)QDc=zwW0if41d+*&W?wqMAtyhb#7A?&+b45tD$P?E!V8#imvGVt_zElU$Ll=GY z(eLzl&**qK8#_S@^$tAHH71?(3D5td1>wX+3jz$Gn7$8bm6Rqr)sBYlr)QE(@>FQ4 zn|FR8FrwMl^UxeWs>V^q)80582C+hH<)BfWI+0udL=`vU+>Q}ufFyw z3~>D4&4kI!oHYE65#+9ArQsZntOuHi4QwE(K}Z1=c94J-ka}#|+@)kUI}C2DW6sf2 z>ZTJi)~TW!Za{+@rT_>;We|f?s*zm;h?J+iASlb*kMW8&s;3?AQ^M-TgP{Xv`K!rslN|B<&fS595BRu|VOBwOWOltD8h6JsKp>mZ*Xc!wTc)%`M$Rd~Hl|Y0O#__Deih@9$76HXN01&EVUj(Ljv^Ie`obinFt6v+1;5WY! zAe-AX3^%peO>llwoZcj7IB~%UI{MFWItZovz|==G(WZjDM92~^H8+Z6$ewJ%=Y-_2 z$=R9ibROIy0H6Q|)ddOw$ymh*02(@d@l!TVZ08|K>7SA>Mn08oP?q;t%LCZhpt)dAwBlp4&vuz~`Kk4c!D5Y#s zBy`Vs?rX6A@Xf%g5>z2+E zl&VvG8`a-}6BlmapH=OcjVDy0lcC%!3kgUYz`9Vdxa{Xv1=3vB^nkCR8^J0VIZ%*^ zpssf10RgPg#qR$gfUWziO<4W)zzG&sBO~EqKOPIx#4eU0Bn6d55)0YN2Dl;Zh=L&} z$6ohxf>lVSW_=O}5+n{+`C zP=ia{Q6RU_bj3A6V!eU7jSmol8bx7tYvfHkZ)G>018LE;oV za45gZK-HW{%Fc}-U7!+fV>{*NqUmX~LQt<$@6o-D$4>&% zJzxJtw@-Z75se0M&aSMp4c|R)0Y~DpY~m%7Czdq`{(2&b1gK4+;Pkh8a1~`q#>g0L zGC*87b`NzsL1=C3iHM@&nw~BFOsw$)JRtH)U9re5A97RUVhSg30LpdTq^!2Q$Ap+j zr7ta}&TbWQq6`>QfR1e7P&ds%C*yNL!(E4tAosgp_U>WvUA#+Ju1)8lJIbLJDh$FB zbTHW*c(423_kOv7oT#6Zvg>mTg};uCvqLtj5_#LV-7P_T5ox8_ng??B0@?XL`8ong z;>i&a_8=dW{e+QK81P@*ZsGkA0U+Z7mZ7-C12I_0INXA~$VjnMyF64&g_DcG&YS>$s&}h5QzyRor!RO<>qzgVQ zgM*HN1~fo`5y%4-K?_T0zUY&|=$k&9t3LDC753`7h6pLeqO-#qkpFTsQvss+C_m>p zg{onxp?jg#^SKlh2=`;FIgli62)<&1gGUgZRbYfvc*9g^G(e!Ti$DM$xC0~1r!*+Q z5KBOfTR_QMz)yfNLM%i>JVZkz0IG^W&P%!C;tUMzu}CBY|D%{YsDU}4jh!>Ly5OvU zX&}&mDRSc~+%c;?W5Lj9vVxEU-D^cxd_`9r1mL4T=@5aAQ3Espff0BD6+!<4D|j7P z48{@2u!;(+aJe4an+hge2$YbeCXBa^8b2xQzNI0a@WVm|i4c2xCp-!^PXwj4;w$gE zJEa4FM^LuV0Rgm7f;fB~{$r~=BnT=%yrVFIE!ct!*h4e4NuBK?c_iDjhYZ>aoK2+?DQ=AA^ z6h@V-!7KA1TXZ@#D2H-T5ii>gLs+Ao_&~VUPc}-Yk$-L8| zZos?f=&~;hvnjAp-K#{hdd@RzqSzz|-Z6=sfVV324{0pQrhzkOG)|(BhLw`2d&`~W zOvNLpgi2s5BT$Zkq5=$3K04@zk^#I$*sdX~0k*6Nw+zs?BtRvQ%kxZ6fZWpd?9v1v z$oMR|`n=El)KAXHg~P;x5r{|trBcU4iW`@N+%+bJ8g4jq24aKw)QCG}L z>I^tIfPypp7&R!kym|samC)1>g9u6oNR3cllLiJ+H=b}&j>0IIFrMwR(FRew=|RxM z;nSnYfg%7>9`rVE^R6>=4i4fIs53ep$j)w1g}kybtE2zbZey8Of1lW#T3@YoQf=%G*hL%9ZjNLxsZ_z z!#=$f>>2?cbXVPbS9y)s?gG9H9Une;ge@bVsiT5Sy+f&*oz7Zr7WpfA_+|m9xL=2P-T$wvz25NAlqaU7zENv$URnFw&Zx#2(zmV zm{n%W&Os?lKtP#YJvz5Df{a88Z)ME5#L_Fx1G;?HWz9?X+{+J0+N3oFzZ8MM`~WV1 z+A+n?h3vdHz*a0k(>29{ZtdAEu*jpJf;;%hb#?!;kW3ui5UX+>!7M4;iFvZ#`&YTu zJu9O{4Rr%;ATR2`4u;~vxeZu{dXI=5T!@v_BXC$T029KE*dAEMXWWVUy042}H&pq} zjs*%W6gNtx5)|DR?m_^Qox$EK!{q?4hFVqK^TA}$zwS&FB7EK4vj_~J$BVE>uf4}x zDAu5*%Ro$k_LK}~ZC0gC1>ud_`uu2g9bz5PJCmrxx^L5wrMSypu0ufL;E&7vgScPu5D|bMY^u1s7eKf&cT>jM+ zhmDH!m{k5<*k}lfDU>rF`nr!|x2C+@p8)@Z_P{KrAWqkS3fc_}z+d&v-!4XgT%dx}Aulgb zgJkG~MQ}|XTm>q40x;%cE(T9D$pJd9V>`ZMJig;}pan5V+&fl^WiX9A9^^ajffbdB zPMuuE8Y!e~Lb1C>2X2T+V1=~>4qi&p*aN|RNl90%geRzkcYQ@P*vgh{7CIP&W>LOD zFarHE6aWHL{k@0?Fuk4h2PF2^e6;`J8m59{{oO9*;T~36_2YXUUl z+EK#X>49Jb-3@ldG92URK#^|n0uiW|L2v^A2s7^pQCJ?vslWgZi_ChQ-YqasT^3p@ z_yA4#&3>AhV~SmKIc=?*+LQf0yBEY&?r+i}}wDC>b`cmg+; zXRICpDv-P?P{57j0;~?}d4~V!f41icm;ik)fO`&Le=h4fb_Ss60R3Xd7#$vi{?vv3 z2^>APp1ZCAE?C1=+`k^|gNxgJp56~ zDmZcCR;s(4JmB@$kPUdCqSqry_*TO`;u4LL1K?#Mu4+n8@_U(6$XDUGP z6Ib!#R!<{fad&=k^;+&3?}6$L$-B#dTmf~* zYP8gyPS1CJ-}g>`?qv{z2;g^tANYNr0O*zjg3p0`KLrCmB}P_t?oRUXhTzxe=l90r zr%3Nv-*~pZ_*NrqJDV!(a*e|?XK`&G}L-dk|?XU}<9 znD(fJ@N3V7JQoEvcT;Ys2-7n{2rXN3XReSfcRWJhaQ5xr7VdU$_jlL0N#D}QFoFgE z?t2f7ARzzveUAV!2z9YPdx0l=>puHGXn3%bGkHVuRd)!Yr?`K|_ zbzBDxIq+L}C49rzJ(8~keKpO~Qm7^v^TUt)!Y}*`r;T}pg0CNlp%2gt0BtzO^JqWb zo~8n|z;mDndQsSOZ!P+XnE5E3;?Cr72|Y5W4l?w)5!@V9{3S;>Qn^quimKoI8hlni*1LM}8(#qGbQM z(&a6V?mu228o>xN7d>=TQcIn8UJ&W{RKS4^Hl^SZ3_3U=g*HWi7lwEtK*a-H2;rev zXo>iV8UO&GMmKJ$2v=Qo!IEKy=j9LqVl?)Em>gn2b|a5A`dA~7HwO8mkUie0<1%s( ziI_C3S=Pa3oiShc4d~BK}p(YUb_44 zX{E^H;E{$EFe9{ZGPWHZI1w&V;gIxGvgr`Ea=jfv| zT@dM{E%9^dM>P$Fz$G;(>rhnbxcXE9ss^>Pt1Tz>GR!qQ1tS+?)mm#HLR^GC1{tOOPUH=!n^jn zFL>i%5N0leW?&H@N;u~U{=B_9v# zq{C0f`)w==rMKjlxqBiDg#i>g@#M12L=kv|fvLBevg@(iq}3c$=)CiXVwH8PSwIi{ zJFh9iH7wFbw73FZIy`;jw}mNrb&pnKeYNyPb{j$0K#sD{YBESUPiR(>mM+`na|y<4 z4)z4_V$FLEIAhqK34h=X>fpFmIU|m+!U+(+F!J!%DjnRR26K=Is3OEDkX;I6?zupw zgc1QRWWfln^GB+Z!YbK8gj5`KRRTBo!PJd_3JKU53U?Nwv#0@hE(}^X;NrhxCCvyQ zSV6`55(F9{$!lNxArONo#34o?N6sV6D5xMd29WPbQQ}Oy%qRcF)kNYC6Ox%ybdxu6 zJ%)Ys15DSbwZ$(AMsNqZAK_pjqJ#meEi!ativ;B`r@4v>h*Dldf&e>*Sc-ufbD&2c zs3{-Z!8{M~;0Sr*6O|>>RRmH>BW>0LE~K!My0g_MUZ_c46^%vytKnRX(109TB?yEm z!eNN0%2l$GM&BwzVQ3UKcb%;>RGK0#F;j|aOek&|#Gn|9^cNuY?RnF~TJxk9%wtM# zNRWd~Rtjc9T!n>={hQ0e=yI%r;n7tQpu@x>fW>Dvq>p|C3C1`gy4e-*fDcI-IX~C~ zpWr5vFoUN(TQ!FSe5jHs)Y&I|x5-VGqY6n&+6o#l2Z;YoWuAormy%j3(TTbeNy{jL z51Z5_@pYz&x%_B9PLaL_A<`c^oYsu2cO!5ar=?na=`fKbhq|HEr769sOgn;EJC@NT0iUF`i)DcFb z0fsG&4T@z0=|{nI#YIAHheI?{_O^z#>mI74C~?L~UY ziy>jApeK~#DbswRBNr;`qt^X zBZdc^%U$jIhHe(cgH+2AEPXiG@lI_N7ac`JpLNk9%%NPYnFrd`23cInYeJ9gs$Z^W zJ+0LXV4H=Eegh2JW>Sx#uOjUn)OcFdn&lJS=*B0Ewptb?ZJS9ou&DO9sXHt+BDnSA zI>+jdL*0S9{wQfA@wqZaBG(`HZ824P@CG5!7_BshZWk^=0D(?-x}7ZE2eSKy2E5@7 z7*^y@UN$u)$>Ee@kOPy8DCHzYD+=H^vy#?V88luxq(Tr0 zwHv?s-LAS(g<-{|)yIQTtJDk;oS2S1=H!o2#85gqKrDk`jikCyMIdVzcetOniCJSY zY8vzN&M9<<2vn_bp;?zMToCe*i(KRppaZxl_6w9VuJK`GRO251ILJdDa*p#_>|xA>zjcyo7l2~^{K;Ue&}5fXaWhyz~Yb0CiJBa(x~{}q;x|2~wv-*NCm z*&)v0-sC@e3N({6R85%?wc-EV`Bi>iIs5eIC3{AeE=X5s>KG`i5f3QIRRb`ZRbZM^ z{6~NoU{kOgrR9-=WM3j>(5l?i1X$JY3B}-rRStXz+zniF*%;k1U-LCzH%Q;~{ay9F zLE1sYo3v&E7+N-wf(n$3SwzfI4#G<$%*)Fm+EfHV5fULJKB6RA zS%bVmTO?r$Yk^qm{gRZQ(Rt)!9o|X zVH*-$S=b#N&Y?Sy0<2LV9=e`|fFB0vS`lCXAc`L{4x*AsgbPH%A-c<%!Oa;K1v6eF zHWH$8jDV;)7mn@B>FpvXLBa6IRb8MUk;N9vsLB^wg~U)yQ;>|w{2l_n&dk6fDOy@s zQNbG4;=mzaTXX@h$RR-vq(KruK_cWqCL}{Hw$^pk6 z<3?tr9AsoM>KY+@q)CS4Nh0Hsd4onpBWt+EWWC~5WFt)iA_Eo$2AmbC8Jt@6pE$x5 zDE;Ca%-UY53K{?Qh2(GnQRqPFz{2n4o1rlxK2pW)$)r6Ef+p1B2i8~!7TgK7RYNMI zScWB8I^&-4WFI=7U8W>oqGU7LggmI6OI}9H z#iZ{cWlbjL_hFt*;kU5h*5n znp|o|#2o+JVn9}sE0ADi28}zAr-hM9u+4)|ynN4xQkmEIKF#Lg;zGUd>EU7BHtM zSg3_sf~Xx|SN2a8=$MKIYKjgjilQh1qyh@MXqk?Hj1od%`9suk11e%rl2)pvUg~tN z0u=v1!5rk}F(#=ojzW^=!5~u6T1jS(foYFfSKp-|9wI=+nbefRsi-XLc@T(eGHX>h>w&1EL)-$M;we`8>f9*| zTvP$j6sn+#E1`xc0ocO|q-z7XsIk5Qqsl0}>Xqz8M61>-0&FT2&;h81Y9;7erRu;S z1neNt0UEf08%zNpbZWg`>X{0KH=IHaR*`+NqZsz(U0$rkW~^Ug>{P748fIw0)e2<_ z>vVmBT1sT~an1p}E-ghWAmuc~!m{eULV+NV00I0c2IzpU^(&?ZY&QUaDkOv00s+`ej7jK(kj{-pM1|(;g>(LsgUCjX&EG@hq znFFH7*;?uxP%R16?h|Bf5%g>B76H~K=^R*riG=Ogl5OlJ=}k(6VwD+8ItaDSq>etX zl1}IBS^@Q<0Ugjmz@91=K<|=rZ+E7xO}w2}%4c)^so*MHJ`^q<5+&qgT_ z`;y{+R_kvGMGjmp=4wK>UK1S6MHQ&Q=MFFd7q9^nKt6DR(UvaKx+}b{u8hh-c%Gs^ ztZMPjZq?Q<73}T^5W)=VuBASLi8O)mlC9YmF9sZMMm*^h?O=n*sj1*)^eXA5T7eqe zuo^%?AM7w1^e_T+?+ov#{DOd1`s48tTv`dI5(g&}183kC=ZoUuD9$gf@?LA|Dite7 z^Abf?O)5k%$_40e&hjtk8db4?s{yBR0k7I3EU>zsZbTvg7OXA=V*w#>gdh!t#883Z zp)dwuaP5-7D(KpeVy)KZu3Kj9AgBV^ifuBGEg%%{kIFAZPy#ec(Ru$iNIkZS1*7l? ztb+A+>ZUpZ2{?i_WQP~2wKR^^9jfbkS8sowgtbhW$@f*Y1 z9E<=R%cvcHOvo&yPE4mEyE8mztvds9?XJQoyt6!OZNH8JsRpd@K62U0vq0msAwO?sI#t8TW%p9*d0f_BidG3p*?^}VYO)ZR~*(iZDyP;DWc0&#^hraXO_qb!X`_tG9TMKqYv02EX-oQ$Z+W_XuF`AbhQfB*Pp4^dd01 zc(b=tuyAT*vX~&ny~R#_`!N*UK_Hj1BXk2AK*59Q@D3ZS6}SN%SVA8-GTAP|flE+U z(OW}cYtGVvbJ3WF`s_A?u4scU0c3)Omp1h&?b82xjbBv6(~h`A1U2tznox84vq~;g z5H(Rq6$2r4ZtHd)zygImbpmJtRA=)C*f`LBC;&`BkN5bGi}Sh)xmOSQ>Pq((I11)~ zL{S)l5rDaN&vhkKf?HF8c0WP&q5%kuz`zbdAFOgmGr|ZUEFi!&vuii_T7@%Qa%zZ_ zl$LnxoHGTLNrzXgj)~ zB5+pQRRa^*yIwlvB)F&p*ZVrsFI{}>G$^R~z=Gb^IbrLn>$Vc?Y&O%lHr;rw*ZKoY z0dR8xa?kt<+)!38u%P5Zuw#Ka=f@vqOj-YD#HP42v*&KV>Oiz-_wU}j8t{M`=(`oT z1Gl@uv$GchjQe)evQr@RX}Iu#6tnCQbUYI@6u^5R%eyvc12ky#MssxV_B-(o^w^L6 zkwx9q;iwpAYl8!18LM6ZKl;L(XgRd;I3sOyvu>kOAq8K2Yg@$_a{LHIMFGtBh)s;E z+P212D66x&5;>FzRZulkB9TkE0oUfJWQl`qws^SN{;eew|X1>)nm6?i#r0? zyC9r04~PK4ih$Gu03eKjJ|8{SXSdcrg~ypRWENRY5TM0t?l!-EGYKeTlD z@&lKcA6C%hvI6IdIk|Y|!om{^zm7vSUf}02T@ZwGYTS_{P>v3%Q>Bimbae#PIZyaS1ZY-dY5XChE-Tn*&9<>`F~U z{S2xm8Xx_cFGL~nb1XHyB%{o-88Oq0GtWS4A~e!UJ1t4Paxk&Hy)xqHmfUjV0=VE3 zh#~>v)VzcM=G;V%fO4RVE~n|PyAA;?xZ86S3})NN!-x>@VGbh=MeneO4mGF;#1?%N z(n!~HXo4R3V(JbZ_VWLP!;Wf0aHItrbnwBMDy*;p3^U~EmOncU&xC@4XzvKU$g`-R z9>S`sh^r9T71$A2q>PGHVwBOz%-nKkm8|4?w%1C2eYUDd{H9qgDTW`b2$P4nBr7AtE;YoIrP-C zI~`o*DAtImsDayxgCH`UYY)q~;*LFzZ&vpbTPy-PT)Rji*XS#lcUs!oY#FYp5&e!@ndYZ0k*6C8-o%oOhTzz6{}Xag+M6;19#}s_heOsCrC?sL0n#pT4b53Wu+2sU=4W!IIcLpbFhcMk-2GlbRJ!Iy*U}0(G#v2acyin^cSy zuho#vK@x)lVW>hGlc)^prw3ff0vb>j8%4^iWqD{_Do0Y2mf(a6sZ8Z7L7+2sG7=%6 z6y-s(B{FScz?sZkUb848h@AdZYrkY>H9v>Ri&9h|I89pDs)fxa2|^IZQNvWr(G9D1 zBNh5oB87n}bm@d29ST20AySd56tkIKDTeUMA-y7GgeCus z2#6FVho1ry0XrSRWXci6(`M~gBJZ+A5|ECi@f1X^8f>X;zG?W>-#V`WPuL=y_li3&Se)d(DDR?ulQb-G0eVkJdM zg&t-Cw>=0o)jMBGS#nX1(EfcZr#P$8V*9H%8b ztcO(y^`}$}LSUhM;uJd(xQ=+zi#uc7a;~e!L5xTQxNtIzsM#YSMUWDHtVbaanRYf= z!G&fxIRoz{wES&!l#h^JCfPCn=>noSb1HSm&I21H z$Lb`EMGGJX+P-#qX!vtCx!KJ?i<8@Ka6>BMw#3&;n~DvdHH0HfJT5kg0BR`5ysetm zRFFFr>!WeIM~RRGFE}spACkRoO`qZgjb*oQ(mr1$$*16vGsOP5#?RGbdomY<2 zDq#@%E{)iq4q6h*nv^wEAxKm?D%rtMC$Q{E%OBWg6LmVy6&DDw7gbon7e;gPr6Qvz zh$*-qgj2@`bqzb@_krBXK17n%Y_SqW&)XaUd8RNFtRR`GiU1mHV+*=Iap^^T9`>Lg zLEF#cb=z;9Jz}WU?Rn4j`~*SlBLHq6z8OwH4|<$wRF`tw{bc`%g_8CI33GwwZdo7S zeRenbqTXZKS$RR6AkjWN$R7n?UmrdpYVDejF*ps*B(NaL>Q&mwvPMb?PE96KWwUysvpx#^Mg-;ruagvSQ5K7r z(C<75k8ISBiZG8+D5VEnaQ+IU{shADghU7U?}z4q|D?tL{BL=hMA9bBMk);el3@xK zff1RP(QHewcc%9Y9tKZ z0bMSQ`6A2>5ln{$q`w3Xl`abes6ZzADWz@@L-?*JjKWnsAqsDW1=Y)_uEl3OjtB{3 z%RZ;3N{pfqpa=b-6s7M8iDCx@fNmg+?j{Nh-s> zXtOW`LqtK5JTW{@E(-nO{whugQBg=LXyZ~*Jv3(<3-97gEZTYv@@lat#={7PZ4~b# z0=Uo$_mBS=a0~k&nJ!}k+~E>Fp$hONO}GFfozed!eIy%G(he{12qHiwr%^v}YUyTj z?8K!I*#^drOA(vy=6aIp?!(KXPaxzkJj#p`m+b~~@Yp!Q2&J$o9?!(GEK(e*5e0HD zgs{q{(otru2hbpB#9$kpaLM)pl&U}|?PDUh&Ye4cl@KX3i}`&j_l3IYZJp@6!KFh{FgPU@zAYGvmWB0ka3vVHw0A9SSo$ zKmT2U#4 zjo4<5{UF8gX46PuGjp`X97&OfVl6+1;uig(HMyl3jnfLB-~)u9Ih)fi>k>HhMNK|{ z8LKml&T=ur^DldVJ-Ra;SoA>$5=FOg4xqs%X#^+55xGj^L{U^l7h?+7X}Xk6v-;B$ zAI9$%OAJ=Q2h4K(q%2b4Yep3mKcw>aI!^G^Po~b&1UzBPz!Vh6L!&sVVjPeSH*^lT z;6vLqMD5Z{62J)3B#%fEMV(JQa=`yZ_mofj)KC8uPy^LPBR~w6p(OIiwZaGs*|ZDV^h4hiI-@g>U;$T)HCH?HJoGeCmz7!nG!K_yFq;)n z7nMB=lo+AXklb4yXX1n$tsll{ta+H|A7dj3AGe@nA1D zy7WU?rIllwl@OqnFgvy|sj&ZA{ZFl)^EpRUe^jC*s})tx0~Tu_W95fk{nJ(0Y|}LA zH6*HE)oWihwmkweU)$>-_oHYV?Pm!hIMw6dc(YPYjjQBG-X9nU+lD6B}M#*l=41xBl6M745A6AE#wMIwaT1qAh zjKFq36Ey!5H3cOW4+8&S7w>2vrBw;{Ym%1Mva-JDbw4($| z;A009fen~-ZTCE&7DcImF0U41<<@sCwmS3oTI66iPhb@^~-GPWV*?j?kYv(kBRbq*km?ZHuJ_falzgU%1xqlIOi(fecrm#v2(TdwLg^B+APerm2xeA;R)CV%xtBAUlZRLxh8Pz37ZkakFS|qNJnvXtB@f@f+;E*G+~`98GWl(liyjV;dg#RnW9yq z0kXqKT9*(EdZ3RQsgv5D384rW_@5ElbQ6}L)7PQd*L^n^7q~WmR+fnc$B8KyqZdUE z1QsDmnp7o%BIqEju?&z`S~d|hXj59HD<%gVVsMf6t>^k6B47oCAOVD+rg<2!yFd*H zAg6a4vCBaK>Q|J38aqsxF$w@$o7#(&+OjV@pl7+Vwb)REMTgnB3WE4UyFsS`pb927 zldvd9klFJvc+nHOJ zdut;$wezTSh4X6|_j>)o>Zu;|<=R0Y*Td4+2EefuBFN2*d!qxf{fjnyHsz6l$5eNm!w48nCH4w3$=E zmm8};0kxldB~~C8Jm^*o)uj32LMJJ||5#*9@wWwBbV}M%?px8cnQ(RB17bl4e8a#8 zd!1dOup8XU-PedmmkXpjs3-iHX^OFeAeP5m4o1AhYZ=YST+P#*&DY$`+Z@i{oT-a| z5H6hmF%ZCqkDH;(x5}^Flezi1VfJlRdX97tEXUH#P&sDlvq*RdPlm(MOiwm!@@DA75QTs01ur62dR^Zg?J8`d7cuX$tP8y@G0c%B)XVkaIuzFg9a)@Q_k3u>U8p@0kM z;12E}3u?d!KE7jGezZbuI|GLyczv{I@02bC*ZzSNQ9pc5%hkRamm@+q;93b}ewXFfoLl={a$C%c4Q|pn2Co znH9iae{}6-V1f!Rh>%`K9JX0qh8Y+HWtuUFp=e4}5le@tZB$-}pUl=?i6)kV5?d|N zCmaF+J|xF=GUha6j4>`(L~}I8I0zbO6xEFveDKl7QI_NZf+)F&Qe%@l+Gyi;1_d#o zK`V$S9%|uvrG|-Kl7$OeT&Nh_aC1Z;nT4PARb_^cS(px-1t!@4rki%&>DWwbiuT`B zQl_~do`U{`!5wrcp~-2eX;t288L9CaZ<6LV>28#Igo_(0wl$nf2oM4V0&+p=B&jrF z@KcU4QbC80MX4c(kbJlUfE7pSfvX-Ml*%iOc_Ap!l@eviD0y96A_9qDE=y85W6sy9 zOA!9$U^;X5MI}vp4(gCp6EdjgwcL(NE@j?<+udajPB1OG?iLgQ8d-3mM7@J(LhME4 zIhsHh9VIJUqyh&_Fu(>6d~m_DrSjXRoWeB6D5DTUg%42J*U+gkI)?$r9&fy{PnA63 zqZL0|Ap#t53^^;U0Hopu9fJ&_N5>y`3^L9-JLiy`7!14rsJx^(-bVa7>Tkk! zBaFAgdJ|yJZw+r+=1U_;JaG>_7%?xJ3)#4H&Np*B0u@$FZZaBbKm(1+EW6{fDyk#{ zIv{{7qJ!h6H!hcjbC?G7c*VAMbnGJKqja=yi29eBp~-3XKyV7wCsm?ZJ$3KK-}m64 z4kn*_y2rnZz$G=z;U@@fw=EA=#fCTc167Qu_ub*=Z7>12EV4rS4g6jE?SxBA2wrmB z;R6*5MPPIO`tOf{ftN)t4# zU?c%mh}5Ml1;R>+FgFBvMEg30ySY@0PTDe?VuUx43OP?QGQ809ZU~yFoQqp8+*(3{ z_a_|Q2?J2@!72!Gp&VTAdWk9zMmE^J1b9ykd?23{$44++FwAf3bJ&XB5V7}3jDiF~ zKn*UDLWAH>f)RYe{{UzOD5yajbSxkbR3@tg0^k#$ONQt~_Xa|+k$;MN2xTfkhtlM0 zUl^&I>|&QGz%A`1bI3*o@e{<*bf#>0l2CpQLbk{###%xwC1mPC%6HX}lLnCx^GtcC z9&jNGMi_;02;vR4El~-uNR(>0H@DS1fP?@4x}x~(Mu2>zZHr)XZ7$*{F>AyR8hMPZ3izoY|dW(%c4#FkME z&7lT&uq6x)atmE95f;A;<}hD6OnxS7rZlaoO>JrqE-n3dAl|JwM{K~~wk)_bOL039y=Y8p zI?>c@$B7PPb#&gF1} zPU&3Q_5Cfid9JVyE&y-;X=7N!3qimg23_cUV_M(*ZZvNl;afPASb=oF6&?Ht$mZ~S z-wZDuLdHtc+8#s{0L~tCH~Z2Av=y#CE(iMT9BVQmK$;WFq->1{-(9a)ly+HmUl=P8 zT{F9}R6?vNx$N?pBgR20ZGc za*^i|OjrjO-U7V&A@A2R#NGsnfDX=%_Oz@0?EZfAIDNZ0TA=~OgFrYS*N*qJE7c#A zDZ*^$u#g;(dY9XdF29aGMK~*drcZzHX@SG;3JZ1b0?F1BNSelu`noT!JhnzB3Ui%j zv;bokz3CgHryxZCfEh?e$bNxt=Ko$h542ap2e_>XaJTuuOaDL>nw~5zeqhcYSV8gY ztiCsZKY!&Ulp%e- zfJ(2YX2WOv_G#Ji;zLV-R8al#Dw@OKgep|7bpiB75R}1DT;Ky}a6`a0Sot+Pb^$D> zhf!SSc@k)Wi!~MeVFZ^zc?A)6u*VOwrv$V|dp1CSZKeslr*umjz0e+UiKnOPl4M2oz#}`&Z2sHo; z3^7?4#t-lR*EX>50MSKY!;}CA#%AMoe*lvY$5(@ocRN}~Vb2$KumwC)u_ro!R5%oR zhO}}9q8K)Jfo2mYe<+9!@gE#T5J#0)3Xz4d$6qNmdnD+ENXL7V*n7PfgO@0EYFJt~ zh=W*wbvzh-01{6XlX*iJg=yDzj(`j0U{xw3a6{4!M==Pg&_{On2IY5(XIB-!Lk0K7 z5I~m(y7Ye8c6i!0Oe%;L$a03GHFd}rWGNAO6ovty=n2`9aspw8rQ}x+0Yro7jj7{@ z-*|!9!b&4`2NI_cug8d#<%lFmf?R+W1oi>mMv0YJi7{w==Z0=nkPH2YgIL#f>nMlY zI1nTMFk9$I5V?qUZ3hi!=LT@c2Wl`gmXHeSG=6|k2?}|3yyg#g0C)?rh<Tus>OA%cL7SK5a1<5o750IDULsx5IMkCKnaxQ!VnRF zfa|A-peT~T=#I6gg7s*R!#8~RIDiX)&lhS-srM`n!Zek6HqHXw$>l#=0AiKg&oHI;u= z`I3&;68(q;ZWvV1XOsNkhc)1r&l5ZjMUX@ZntWG*q3LB&0X7VQ0Y@cczu1*t2Lez3 zNqevml`A-vREddFXLVXBnOMM-JxG8B;Yvx_dbXvIk#m+I)(2?E2v;QnXfQK!sZO;h zI#W;tl~4&qV19aeo!e4h|V;F8q_W)-28X7>A#^;{@r*Y=QAfb761O!w~AYj_vrAvPqj$d5JTKk1Oy7qL7tZ zi3I`4h`)&tmv;$IuxyBimpU+_C3 zod`gpCwg`|YMq@n5ExKDSlF7CC7vXx1YA&HNvD!i`2a6C1-6-q$oCsJ=!p~mrga*M zVe#g5M_B`jm{E1YfC6f!XG&~(;usZk2g7L)y%}_{$uW`M$mH3$u zg;GDCSrCL~qCIM;BZ>ej>UQ0Lc62ZugFpwILo4glK>l~4)_IpbIs%xAmqI!ac8E>v z*P8zIh*0@$$7r5X388m7byW8T{+OizX`k>Wb_+2AHDG;)MRSZM02zsg?bl5=@6 zOK8x61Ocb9=Z>!l0#s0^wt1CvaG`q2m0fuOM`;AiAeI8rWpaR*Bk--^N}}TWR3UbR z<$wUJA~R^<4zr>_HOfv?0IuN*q<4v_2=J}(6qZIhs&blUWSD|aTBpSS7j^H6mAdJP z)f#=YI)L|sh*s7ow*;&cOR=U@7^8`rRZyfLd88NcnzZ+^ARwCqJA7A{r~W7k$=Y8W zdJq*;1;e>K?J|VmI<7TKvp1Wfju2wxqz!5i9g#X|(b+(ZAg(lvsg;1QH@jp9`jLuw zq+2MbUPy*f`K%GzjC96{7}}d&nqeDeF>cye1@MCvOSWapEov$n(W99OdZf1yvdo$X zR1kxfI405x0w=p9Tncn7YY^YHnZDC<1knTYO1OnndXH49Q&;(_x+$ynNm+dVTM&M0wy`U_vm00v zYamAkk_u{*j>xRNI|q4Sw|AQh!kd+RDv+pIL}L0;y=u74TexndxQh!7BH#tTrAGkJ zghX4p_c{XgimwQHKS_D40$~Cw>vc}~lvE%OR7s8bD~r&|e_wCbk_0jSDLyZNiX zW&1T_dl^Qht>fztv-PBnDhU z>qnFeu9$n5gloAOITu8%%`h zu`_|Oka55K`kf1m#KfDjqng74!KR){ho3!iL=_eUfZTXjK_IQnv^k=cw&x!OAxvXdv2S= z2`mc6%ZT-R5KQ|fG*JW~OvQw&TfG%&uNbtdz(?{5t|bh~&AXRo41{F`wt+mV?FhGd zV0`vywNx;zD66+-CT&gZU1+SwwQS3Rs28OtD8iY$qnZXuEDEpeXNqhPsd5EbPteKE8v$jS5b=^YAZfm&dce#|1+Xx;OE)I0JiNr43y6Hf zeMZc-mAtns&-1KvRKl0!5|#o?z(6N`Uf0hZ+r&u!DQcjB0hsH5-Mh&NjnE4{0)jwJ z92~S;H3!u!#tWUa7Y(k8dL0p0rqmx}<@jLd3V>U1sl`kh6uq z>O##=8^*`3Wb1UjtvEWRKKcIFFvbUkB7MF#@^3>iV~+IsEUu`S!Ny$W6sX>sQUKm7y~ zJ=?uK+iuNwcHzJ9qMG{r%@$hOCB3x_i>*Ge+MW&F(Tyh?1=H?g%&U1277_%eEt0a# z%L~%iv8~&_J==3IOrJp5L-Glx@BmzZwB!xnK@Hq7w}%TM(|27ESv_qbh{T5srzpJ; z-!0t(PT>8)$Bm`7nI|Eiq2Gx-c4q|0p`io4JqP1W-gDr49K=E2^9i3&1&)FiR1n|r zJ<0;os}AwUX>6@=?R5*A*$a{41uo+=4jH*@Wo(KuGjWZkjoJdy(HSz~z75;5JqIhW z;Tn!=YQfthF56IS5Zas&qpgSy-m$R%{NfyqS2V8WTh1o;%wDoYOUvNp1F_FQ=LrEV zFI+IhkAVU4t=mgZ1sh%kA5Q0+b&^uV1xwE42*BEan}H{+npnu)F5Z4Y_gCO=@5w&g6a} zWe(BSDsHW%{aT&3$Pj+(+pg&LjOwN&tOOC+Y#z_!k^=}Z(dmxv>psz3fb8!c>QR&c zMsSjBmgnk@@94g{egWkN5dn1nKucp==Cj&~8Y=-aM5t7jjVUOUch(+OXWQ7#5H53~%$& zo$K|Cwh3|He=+S;WAga^09_yi9xntRf9xF84c+hwP#{cqj&x~Z1U4A-2vF-iqihCB z%jqbR(udkqLRNQt^J5R)fw9)?B|~R#5HY^$o82`=P3&=x;U3Qw9gp;L{t37c5&+=z zt3mH*!R%;Z1Rp>Ja!>46?+`vI7vr7~p73@20QoVWpVIRLSVQ)g&(cvb+!G;f&p>Q@m@jnM34F(4*+D*4Nu=$MiBKzV0Fa4 z`KeRiSf0WdsPacC(he-Mp`C#5L2cRnIEXkk(e`L zx+6yl=wyhX#w7#`drUYop$E`8HSXwm7=))!pjEA2#hO*?R<2#Wegzv=>{zm8&0LTxKn&WDVBF$(F@vCGF#C=HWTXA%Gum@;G1bPSn`oU=KQ z9$9*oiw`3hr1t!&Q^!CmIgcjIoLBW~)~#K?h8;g(>vps72_U@nw{QeFc{EoZB z#Zi_^@Y3<}2Sz?Ln3I}pkDe29T#aDFhnr>TfM)l>1tHM4aM$uipI-fX_U+w+JsSEw zSDy0cx7P6?0bt<30T>4mrEXYaZaFR*KyZZX%qq{js;H}kw45T?th219vhO|(H{`HG z4?lD$EfA}E%fS)NiU1ZNR`jhujS34eMw8ruqQJ)l&ViY%NGXrL@EvGA+Yzzj1{MHgjswxg2l@-s*q1qy)#Vp&m$ zOIrla72?(ewWMwuYwoc)b=+}B1SSQmwxrHes6kj8(t)nK80^VJN_XY8S6_onXUZ<$ z682YzF!%sdA!6B2(`A7hDO71mQi(ZKQ+*@bH}EoRPk#<&6*g~;CAVC2tt=p}MX6Kw z+=hBkF;jWX^y`vo?=49U0U$HtT5Pp_!_KmP95+47q;xl7g%{>6-EgfGQa6SZLO|Ym zSzNLI3s<_hr+tfMFpHO^SA?OzCdr;_OGY|doEH9( zYN^*|``2`t&eF1%qt2S=t{2_z$geYih-PMW`av!1~q7wAQV7t=pqu^D8vjS5JC*}L!tfdmmJ$AM97Zq-9umSIRB#HnWOlj@7SV`W@gUr=M4b;#42X9aL3L1w!a-aLf3?$J z786hfcOcM<2LxjR31|;4*sy^JBHIpm*h3}Jfio$S8HSX2L^{^72klCfknjjK1XOTH zKS{$B>8A&IGz))POb$yDU_CK@v5{f)8UWm2LowED+)X7chZDdccJ&c=Bll^Jh$<22guOsx~!++Ci}i zB!^sJ3qRe$ExMTpc|3rY;iRZztcOvi;$jLNh3ZG8sv{j@!Kx!A#4UXP`cqHjLPLSp(L@5GP!o|QfPYLiCjnByg>^#J zjJv=^8wHy^45 zyVjB=d*$l~xCq$(+2aF*T|r?DJ5>ZM*0*wi>tj#41)V^lG*Rndt~R?|Uja0;irb^q zqT~jbO2o9+btnq+pjueuHL06BE3NN*sxTxW630ubW zdNi?$#lm~#=~x5<^#c5GD?}pT10n8Hx%`Fku>R|z_!RDRD?V;SOi<$M22!=#Ao13c|@IM zlvD~jQ-v;Mtww;OLrfsw5~KFVK(@hnW0C+pA33~81~ilfJ>@BP7&^H?v|<&D0Xif2 z0tykUbh2}aI8Q7})HHLZL6n2%QmHnbwzQZ1fq^Q>FDE99V}Zn}-a<+lGUn?vCPrMVZrYhPbG*g0t)Q5NDdP`B>IJqNoTSvNRkYsJ{qb_mi_t>A2fV7ss& zIIR!ffQ3&z(YLVrx*-BTAKW)YpfT5>a2j^Pqc2$hU0>Lkf&P#R@%!lhPD38tE_upB zS?;xl4hZUgcbT7-<`1Dz7L4#P^ZDx16)$}1+4i<)3!N+AA)k&rKi|o_-S$ctH@IOj z2hDFj7owQGi9i1kd|Eal7iS;fRlj`W{oKZ1H_K>hV8O>g*@=S_nQZS zDAK)Uy+5Rn)5i)C6{UXWx4&>>ZyVQF^TZaX-RcU~eD=S;|K8`q;p)zbRjRHFQNAug zKKDbwwLu=jIl#P#05^g&i72^;O9R{Ezx~UFGzh+*LaB(Wkdd>B)5DU|OTZEovn_eQ z0(=btJhctn0)Du_{S!Z{8$O3Hw)*1=!J`uYXj?NA^udIY3e;PevV)Cj%L%pHvRkM? z{+q#TD?f*jKBE&0BGeFk`@t(T9U)X09ZU~=a=dD@x|6zvTi^#5q2LBgWC$emL(_V~hQNTLn++4`eKhLmbG9RF7s9 zuxIQqq*xxU4!Y?y#F7E$~Vu@bfOqrR?y$tq#Vt>8kG#L4wQvs-Ml z)loiK6iKdNK`fD@rTL?rM9PT_C}-p;PxD8A5Jd`kBdz$rFaafEw8*5?N;4~urK}Rg z(-Y8Onti;Adt8_57`%w6$*p8duEeZ?LYN>q%7!pPtdo#Wd`gHQ$+qN6<^sqoF-fC9 zONYRxm{f=epn`XsMqX({itNk($K0>1Jf3z;zr1|F8puX8-~u|}0w}nIf}jG4RFs2c zh`@x*)AT3PbdSBviJhB^4Wk1pFvXR8ONFRM)Wl8xa!d`8Oo<@Pwc$a3xXRolP8eg& z^ia(QsSY{>!l@9;;)G8AT1)hBnY8qZPc&jqzmgH+Ge2u_{sNn?@E2EEV_U8d!13oB$t{p6JZg|xX8(H2FW z4JC`;bPo{akOYN@>U7cn9A(OR49lj}knprh8f^#_)zKm)7aP6NyxfqRBub8CLnk%T zC`~rX%nGoiNhJla+PsqvmC`O{82OCQ4iQpE$xziOj|uS7G({W9B+~i#%MTgT2jNmR zrPFfR%LA=NExnI6B|smo(?2B_mV8sZjJDMr%x=U|KvmRUfvGs{kT87>AT3cnUDQf7 z77^srubk7{C`#4%k@d9HP(`cDXr}C>QrW1`uV_S3Wz}-|5fn|BOwGYfJqu>yxK_ng z0~Je0g&1B13P@E|TFupAH9#sIR5`2;P?ZQ-wTiAJ)@NN5o*=V?z|(U{RV1QRws2Nx z<<>0O)+8;|gz?q?6^%>PAVlWu)^y!QkNnkfJ(1xI3wPa#o={eGwO7`VR_jDiVLj4A z<%(;)PAI+Cf$hh!s!UjQmo`PxSq)c$by)T|7#`ia?^Kxf1lFa=*N4?u@GKE@jS3b` z7#VelRb`F0D8!9L+1sFwX*HB&O}1>^I+(o^icQ&?g^ehYShq;jUxCqu5LpiLNRPGI zp)JXVJqvjS5o1JJcH2&(b=uX)4WZSFpFPs@+}W{km7IOrt<4EZiA8^n)t)HTL1b61 zHQTbVn)|%kUg;pMwTg^A+qi`ff>Mu*jiz#y+q~V1_NmvorPpUV4Y$?Xv#kxmJ&S79 zAfC9@!DU?kh_DR9&5NZ?*rsjV%5BZXbq~80Go*lA%e7f&JCTKzna}7!&$ZkjteR5| z#aA)i)@6u|OBBgfl+);2*L~PK(${wdS*XET+x6X2;;bRb-E&E<()C@vwMAaJ45@9M zFR9(*z1KNxF4bL_h=pF))kt2swC7bEpJ3kW-Pj)B-t{2aAwpR2Mc*v3Rhr3-@lD_N zb&b!Mo0+K(__bfaq}=^9-uva>)#P0E{gUDB-vLe!#Vw!3A>aho5R-M^q)l4|hF~}R z-wQh52)5wasNb21mVQux(>iv@MUEvu1V7d)q zgO%a+8y1U*5n$TfUmW(~W@XteBq$jE;UA63F8j2j2=egC5FG4X`dZ_V;?TaGKS(h z=Hd=o;~LFlJ-*`Pm1E2WxN50fAhU7^$mrtYQOEwnJ#pF$< z6no?3PhOObV`NY!<=qIdQby&kjN?>hWe<_$R)%E`A>&x4<@vZHE3V~Sj#pgPUV#*IZ3=3$^82^>hUpuvL(6DnNDu%W|;5F<*QNU@^Dix@LP^v6-7$B!UGiX2I@ zq{)*gQ>t9aG9gDp91QtuNwcQSn>cgo+{v@2Mt>6qjw>|Nr_rNGlPX=xw5dmbg$f!7 z>a?oWt5~yY-TDyfK@LT^iXBU~tl6^}y&kkc6s_C0aO28dsutn6BVp(2-OIPHUx{@S z?ke!Nu;Igq-TE`6@Weowi6cv9IiV2M$(RcUZfs#$-prswPvmgogay%{HzPFt?}UML zpHa)6EwIq(){bdMR^569d}|uDgGl#i%Vu1Q98R+ zx#I~EEJ4meA!^xFlUe*Tk1nlsXV8>F8IWQO;hAZtLp?|`j+X){I72(_#6#wtST#Ar zKr=We<$o!f=cNI&L_p}I2PsnIKa3W{gFt}}N~u#g7IZ?I0`=1zjeSxnr$7e80OY54 zX8+TrK$*UG!lD1PgR7{po>?M;Bn)I~cZ_0oC!|jra?C{U3(qc0MIpQn<=nPBzlf?{s0w@)^P(qpFc6gutU~5W4fys@w5}b3=HVPbvwb5E%{A@ zCv=}<;_O2(rfvtI52i9tefoHmqpLNo`Z%G^3<+Bx4xsIbyzAe$(}ZQ44f2p?x%1eQ zVv$lup8RyVU%vY|A}pa!I}*e*1Fm21!?fwwx5UOnJof2jKe(Q2efq&=zxzM>bdK=-bJHdOZX(J)fMDKvZyu4ZLy7*Il>n)hp7vG?MFhdIPlDD5~*QkpVz%8X{J0x6+JL?`Ne!?lY%0nLtHBxyW1s^(-YVQYdn8)TR_+ zPqZ?jQJYE@UdCVogQO}?^pr(p0a2@p*(sf}3Ra%vAQXK1YFQsdhRR)OtydvLF+j>p zxK_0Q*=VUon^a3514efM-zz$HDRv@-u$3J?(TF{F2wX!MgKtO@ofB&dzH7y2u(c9)0rU%0vE^!B93*t(m8B(CeVPi0hsXF(&Zjr7)iffA^ zkYNls_=gm7Ryi0P<5l2|FIvP)TTmQh3}g65dLc)|7{CAqvj9a9;0iZ|sYD>cY^5uSGiX5|3|6m$1p)(EnAR4bwXlkhQWWWiAq>U+ zhblb$gMWk=asnaZKT1r57x!4gD-Nj`KBRT;%7d;tKXivKDGg zW+y)x&1z=zJz5}MIUD*TaQ?DDV4RA7;91XnW-^Zdp<@_8In8Un@;?&Mf!O~ZQD z$d*VC8bJ^+2V2*u-m{Iz;EOoKAql^x^srma=1sRC*2xaHLi`cxe<)fJ?)V3^A#LM2 z{KMKwH~HPXHAF&{u6*8T?*7S4)4-`m(N(DJ@5 z%GzFZma{#8vrY;?gnyemxM2VQ!B5R@Uohby3;*{8BZ%$lO}AmY73i?M#q}2$rU}?gpJACvHnScXZ6k{+ZU7$c#wDxc0SAGQ%fuaX(?#6uZClJLj z3)~iC9VkSk1zcw)f;yHn0k~v8@PIy;fB;t#95@gR_z#T`dK&sN!0_5-HJeAku) z|KNqH=WuHFgIt6TJy2Sp0D@2Ue6KqUpas-WU%n?^L=byvQD-q|ZkYfC|4@ZA z2y{0f5O}b5NpNjnn27II46G&)<^M*84}=aDS6!gMgCRJAM(Bn}C=jGz5QQcXdgT#8 zAPfQl35~#j#qbY)2#8mhZn$s-<=_W|h=^cV5Qq3@jo^2XcsuOyVqri8rWFQf_GJE5 zgd)ada5!|H2wVlxV=m|rK(Pi;I1r7%GXlYi68I1H01Qiqa0=&zhX{sAkc!7Z3(vTV zBohWLa1Zyu0xYlwR0avNFl_&qiOBd5HKqk;paGd+WX%>_!1xjUMvBw;57aOOs`!Ui zD1kxu1Ny)U2e1j7fCq)Bbm91Jv%n(g_&}|Y2#LUs?}%wAfM#o0kH`3i_&9X?s0yS& zTPxU%!KI6UK?DT(4-BXV2>-c?3t59#fM;ir4?x+8XeW*Wkp$k2kdq1-i0zkWAC?c9K#`_ri%9uE zM6i_qFn1w|X(UO61K}=5n2c75l~+J9TKREBrY>pmb;H*P)KHcQiH%seYkQVo6=@K) z7?;UY0Bt~*O}SPJ>=$HG5mAUo^gE?ydkbeNx3N@LSY5<#O*@|fiX_7f_ zl$o2?69$=?2m-+Zod1cJQaPNVS)8MJoQ|e$lE943I9^_95F7!6HaUgV>6nD)VPo(F z6p0YH$(?dDmz!3XP5GObR+7djn)#@nM+5+wP-x5(>o|>Jl7b2fhFd{E(@M zswF*OqHU_AZ@QwA+M9#C)im;+~t_wR@L;#-J+O8^Uo^hIvMR8m$1}+gqvhvu%o0QYdT zmL{B8Ta^{tw$`YA8=wXrhnR^uwsfmY1t6YNcC~Q2w({z?UONz}z;i(BagTVodnJuE z3!09rv+4G?1W^oMSBea1xR^Ui{3j4;o3vWHw2=F@RVV_I0JVGg4+?v_N7ZkPt7CgB zr;ppUu&au}rV!?cyNb08|K_jfskD6yyy~ZrK(GOg0JJs)z1XWs+ep_!~tx>x=_S68G{p`MoDa0{!j#@@L@9y#VPy`MZAYqio{tASzDY5 zUktiK?0}=24T5^cq2&*ikO_B|!E7AGLm<7(HhhJ^p*$?d=tRf;$h70D$NBJYVgCTg zfh@@MM8{e%uV5^|#}HwR?8x9n$K61~Jhd8~?V02^^E$^_;Q2(YVw zD*}BGsHv>V6-KSqO3S#M%euVFyxhya{L8=`%)&g(#9YkAe9Xw4%*wpX%-qb*{LIiC z&C)#0)LhNhe9hRL&Dy-p+}zFH{LSDT&f+}I8{(Goq;6kX94 zebE@5(Hgzc9Np0#{m~#D(jq<5Bwf-bebOkM(ki{uEZx#B{n9WU(=t8NH2+=GHht4L zozptK(>&eNKK;``9n?ZS)I?p>Mt#&sozzOb)J)yfPW{wS9o14j)l^;8R(;i2oz+^s z)m+`xUj5Zz9oAw!)?{7QW_{LZoz`l-)@aA ze*M>g9oT|B*o0l!hJDzGo!E-K*o@uSj{Vq>9odpS*_2(`mVMcno!N4Y094S~RPY2; zkOxnY2XjE$AaL5JoeLm<1(S^dI)DaN5ZhLO2DD8FbTA0GJqVUy33|}mxgZc2AP4^t z+;S}k81N6qjoinb+|0e)&OHZIFbMxJ0)n6o&;SjBkln|J3u;gf-T(02sgMeNFa@hH z0*$Q$v5f|FfB|#>1&;9Ej=%%g4F_Jp2ktLN3;qJiU12F}V zZQ=j0DGZU{1mWS54GmNv2p3)u03gYf&EiEs03-gk0QXR*$K`E z87>e2@CgHv443WVnr#tt-r<_f+V*+vMi9H8UQ0ngo5vC^UioNLqAqaiY4Ithx0wDt5 z4c@5$2;m*x{~+UyEeIs=>!mXgaA4b8uIP*I29z!91Hl7okmO4q+fGi~s{Yu)zU-22 z-#L!v`d!(|eh_i~51-EA({9*QP7uM4=LtdRyq?%2Km}Gn5Z$g203hTHUf2j=-uHg* z4=xbUKnFIS5Kc=Fg#HGMJpyi^4chS8j=dkHm384d6koRo8_Z~s&0-*+i01fYr@H_zN$UXw94FY+<=)J86Akfxz z{}KBR4Zp7Jn}Xndu;u^2_yV!pIDgjeK<5Y{DH4(QYEU}Wu88|8V*j@$U)&=OS?Cs{a7v9nR|P3<6nB>|34(tUVn*4ieZO z?*tL&rl#WpF$IIq&ImvU!hio(&S2GIZDN z!9=1rVAB~r11#vl|C(BSY9 z;m#cZ0IE_ADk-PwQw&a{LY3-N=hd4~E@E8>pdkXTVa1LmTh{DZvIXU+W&3Zf+qQCa z4C-m64>TTd4Dv~sG?^QcXkUsTAQ-LQgdP8-GU5i!l!So|Po`Yi@@334=~ywSMjMa3 z2>BXpqAFRkDUvg<9!mlufId+EmFw2c4gZxzU|H|x-P`wXnS@~VF(}BI3T@Zr(Uk^K+a@#GQ#F%sXt;qiuQx;aWe+H?c=`StJT zuTTePD~vNp8-ozri=kuy(XBuJ()&jZ`2KOnilYt!WDW*1)Nn)AR*?-tXATgk82`i)Iu626P)H-qZv@!{QRqq$Mi}XdhafWuI!VLQ z@gO)XH4hC0M#y83MgL(c?A=#elYOA)`;der)FkvO0R(AcP&x<+pj7E7ASzXwAP6D| zNJ;1|^e&-D2Sbsr(z_583q|Pyf(j@d$&SynX6?21p6i-9n8SGscXDu-&;R=~w{%GV zVFK(~_Qq)g--RKsnr_RnTRmc3K*^ob6dK^jUd6e%EXF-67uwXFF?|uo-YK>76Y|zy z_)LoP9%Ow3iCZwzr`_~@*H<}V&l+Bwq~uHBEJRAllqadbzq}~`q7)`URg#ZX?=X!`KzLg;4X?}41*!WotzU5tE`wGSNG~lbN;Vu#j zL!3=lyIp1<@!c+9X~NuHK+x;UNI`o?MC8wY2DPKDp#(f&;nNA8`XQ7?;*1Weu*M}e z^a)_k8SKKPp?QP?V#N~S+B6?}{p1_;qM3wY2h-|%nFI!iF)l>|Q|H@D0byGlKoC<# z0O1khty~R@bcF`cx}0$8VH|l+gMZo&oD(7T)tQn7JiOaN__O{qO4Ii(>}se29zid7 zTd6QyPg{%2nhfK{+p{a+0Se|rkJ3XaT7V{?G#QS%-)ibis%jp|_iZY0{L_n<=ao?#*Dx;Ca?lR1_h z82Y$$3^=X|VtzSDC#>@-^>1fn^c`f@2dSd9FM@T59Y`MsEbVkTf1~)%Pj?#2gzf-QW{F^J082ttLyG3E_+xKXjX3ot0oL>?m6z$&_>H z{k(9dZ!vwiqwBT00MiKa4oH&ZYIGT5mK$9ca`UjtMm?IJxSO!%)OM$z%7@jO2g86pAOunRzqEQL@ zO1z&$am}z9*GAnfCUfQ$6HWJ(cTsAVT{7j$-w~^e$^MC<4Zc}8Nq#I)+eMSt%XZGh z00fg*7KEe7T{rW1IoH}&LS7_X$4Z#saa#!%>9@`Sy?liWEU`>im6`dDp2-Ya%GFHD z%~dk8v^`v06X>U@<&6d<_m%STqU8=v~?Bb5HO#Y3k&wG>i4UYzEt9=`#UkVFv zWBMr6S8r!%*22Dt3xzCtRTNm9@c?{8F%<*vaD40t>5hULr{1Vb_*~XHJ#Cxx@J&^r zJXGP6e_=*EAI#19`>`MZJZ&nIlJ4OqYhJ;7)#l7(QJI{t{`Z&x*%TDMW9nSPFw66{ zU(Kz3XR*~PMTrPJN(&YKp}SuGMHeT<^E>}}@xGLF`k^b*r0Fr$ZH(Ag3mcO`r#0M- zvFMEtdwgkC(1yzW0{mi}iRkz5@jmX%J|z5COOc=TLcJ`>BIP$A_YfFgQVQ?fS*iM>l4P!6JDVE92=5OrXEJ3D%)w3Ovg#3slqp_S$%eh^jvqP{}`KMf*+j*^-KyStyXE97uBj zknqQy19S~`!9Lq{G9A7?Equ0;TRI&U0Y#TBH@sSAm5|_4XT`HC?TG%4JI57N$ZL=( zQ4U;Cfw@?B38-pRBT6Geh0os8_y8yi`G!3w%VmS6jmy!H8l@9atyCNC4i^j+oE1x5 zJa-|UooHGv;a}z~p((EwM@gOTl8@KS?&QK=)KKc^i4tRE=_;4&)l@H`gPmw%gJKjK zd$6inS_WEICdH)4c{Y|>IyNxGrmj*8KUBE>X3SD8%EQ6x5DLVSmj_4{2 zvq4@q+2{j2R#B1?bFcdi4yLRqsqFtc-tpzJ13Hi!52hOuz+a9ag{SzU(`2!+j?w0! zSwexjtiE6yf=J{Vq?8LxjuCj+IP_wKJ0NBd2jj$TWk*DF7LK+|D#7^u!T7<%1#Zqi z#d4c&!=0eoW4#(2BHH$MtRse7m{p}l>II(1(PzbVnOY^q)C`TU@FT2Sx$0+<{b4#%@{|k z9NpK`8bWAVO*W{tKl9G_>ARq(fG%#bOXkWN!|d?oxA$ar#0Ddf$sz7?(i7^qmW-(r z`I8FXrARhptR@T^EiiTRhB_d*x5ODKmT4rG2_Y-2@HHT}P&2)+OT;n{E5`2ghUvC( zgB_#ahN6F}wjj~zk!LF$2XlVKUj-AM8EFy*3&-|HE4PQnwXU(X~k&$t;y=$Ta2Ox1AH#%pGxir|T~5j7Sj z6HQeURR%3~izcLp$xRSf~Z!SS3FUFZ9we#0eWo1#R`JGh7sL|I+aeu^f`96la(vU+6Sg7L$1U zjde+ucLucI^JPwb*A$Vd?56P<$gAR$i~**Pd5dpM>5%C%PA`FCKC?TDX%vP=uUF9TdX2_C z)Pq$}B?qMoN2MGM=PIwA*X_pqQOwS(;?+1RVv{kB*{Gw4)#C!e3Ai_mpQ0OjGcQSP z8*%8n_=wl*9}ZQe_Iy59Nz;Am!`M8achNW>skgPFMq|!1N~iBjPOQl-sxtTM@?;S=Rdl+lF+t|a#wwT4TdV5ZzIrx2I_5MIzR(?? zG$biUJyv9H9sRL|9(-`5d6jWQG^qR;*B!pjOpaCk1|#NE)_7^d(i0Uxzq-M*`Tzc=fR&TlGi3^CjA)lzoL7M*$EQ02AQvZ8m(FWo{@)w?j?p0%{> zc#R^2eVVweuy3ec@*Ppu!J|4>4wF>m%OkYDcjTS4V#+{`iM-_>TH;Y{#Gfy(!NwR7_ahG~02CgbGz~NIur2;JEHWe5gnm1MPKY(2pEmf6F9(2&WIuDhR8LOP-6 zj{c1HQb{HjYW>C!NP~HL(V0MADaX@Djk#iWtLSJk5C0(SesjTket{S8A1{T%DLc#f za4`JZy~jpychgX&2T&V#Z=m8)9r$oPK1#o13~31KI(hg81x|fq08H&mM~N%R;*o`o zB}sq-jQ$cKoTljN>x(?jK#cFWq8o}3%!mxq$Yx61)M0sP35i8tL_zqq2RCMooa1iJ z;wO=S2gLPo{(B{Qvnj7$#D8=3aV!xn{MA|gf)NWn97Sm#A~of8uNC0GwCM~E )| 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
  • ~0t5Xt{C7yMb4RcBA-r%NP568q<{TUHzYG@PmDjsRJrR6gN1)US5J&Ljcyx#7JW&1;4w^R#d%xA)H+b|(OoE4 z$E`_CghfP>aq`b6lK&VSe^|iOLYIHKnm=mH(~%S4^-^cM4DbW%gd;t)qK%t4_G;SM zZx`iyF`T~UFi|??zy0K3wv{){?CdphY-L`uP?%7UejQwtO~(!4AN?$joYM2Ni;;Gb zQ577H7*19ZR(Vk9D#TZztb2*5lmsXrKcq;qe0p3^RMnLdBf_>~wp4TE)4PnpLI4hO^_=+mgIzgfcdh7Bu93@wMa$?%^Xpuy#~R!FoR} z-t_c&)56yiHFa*dr|Od>7|l5qWru{FtKoXVa<-vF6X4G)O;fe`2P-{-WFu7#imGJO8%CS;Y1O z=Sf`A$B=}uvf7tDQQNdC8@okp0(#K`Bn7NqAtC2msKSSsx?(nKIEg;lT4YF>u(bTr zdrj3(SV64~lCz@KGQ1dZnO2Vt@1fl(Xiwk`lm){z9;|B88Aj0SfI}GV3vgTb`26pH zJ2c)}^y-7nOcwTG&`cYeVCLejaW{9k(P(<|^@vyJ9^6NPNZ`y1bpbmkMqaJtSndNX z-&v8Ub{w~Q_BNLBsZreLtO3ZfO*xmwph5ZSIy0A7D&H@By!Xt+yv&1}l2Rnm?&`Lj z9Nd~`99QCecsGnUY}!K*x0ANai`C*hv<7$ z39X=x0H_V@hG6p@HERIFD@K}zl*Y4JHR3H^vQ3rxIdV?JBaL}j`DEsK<#k3pl*@hm+tyX0KrJd4d` zcQNKo=d^bY8u()sb*7z{lQbY&ZH{icTugs#AAgSxXYLkhTb(aAtMg zWwGp#;n~{Q&DjXA-!S0J8v-}_OQpIQpFypolu-6h?T4X1=#yYu-~o&IJ8=b~v+?q!%XDavYKyrqqVpYL7?4$iP-6ZTA;+JiBjOo%b%7 zR?zDwC*UjVrN#*mpzT4_NqGBJ2VE@%fe8@MRc^P}8+v`=_>!_sqE;H)VRlX>m=F@}!g@@yo{i)_NQs~U_x6a1HF+g>Vi9zE#K z8h*M`U>3qhAu5^rb(A;9>AumL>wGg!u;50*4}qCC%T5ebQQ(fs zVaQpqfi6@P&OL8PaDTv^;$B?1@_QnKRm(6z>cn#W&(`}!fM9z_?vM$_vF#w4Wi-n?YYR0{->WxO5P^MP^_oCe``4x zZ!rJ3F!43_>jwlFA3^C`zrs99UZhVKBXGcJ)%Hm&c!e*vYxg%gVC_t)puw9v1;^tg zS}2k{6y^8qM8&0oA}RYVL3Z$VWQ~Ef>C1-in$S|#HQVbcl}WN@GTdFYT!o!%1f$89 z9HV^Yi>0z~G-ajYlK2&?%8U^Zn$ZRZP){-oz)%eG>wAZPUh4f^3ADaJ6hBaKJ%ET` zm^7jQ%E0*L;HrK_Psj~^Wu3ktZPaJbRmxNq_L;cIY>3RL3a5R%s9>2=e>vv{qiu7G*l^l9u<&;^6+Lxg0Ya9- zq&qC6Zak=XI1p+J?IWTe^Hs`m>e^kZRin_MBj((N8YNt-0)WJ5nAE7O;nthJTwK_k z4OFs?8BiCNFe2+MD{_xlq}pjHg9p780BkUW3NhzlhyaLEY1Zv1szCqInUhQIWfwSwVo%3{nlf+l}X5x zI8FBAjyS(GW4LlqoU;4?hRA!sPG56BQiwAo9m0nXiVrhbUDzIJ_;3erElw+DLJRuLgf~VrDO!24S(pYi;+|Ti{Pf0Db+K!Ofyi0FLip?=9}I*+cXLXrvOt#uiRui;u4;~?7*9f&_HekwH?etqzc0t{kj+3(U;RvAKf!`2+|2GKO#L+B(0s#OwWJ-06U0Z BXZZjC literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/images/u3127.png b/framework/frontend/src/assets/images/u3127.png new file mode 100644 index 0000000000000000000000000000000000000000..a77833ee83dbc6366503b573471023b9b74fb94d GIT binary patch literal 569 zcmV-90>=G`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0nSN8K~y+Tl~OTC zRbdo9-_1d2acFP~hk^uyBnJcGKDU}$6dYcl=^`i;4bdRj5Ki%OD#-V)gHYfT0ta#H z5@C=|I<~kuHat+M{;%)+_hw};cz*ET|3BwH=eyrI=ZBR@voMTcZw%-wUF|_0k(kYA z@XpOsf=VO2)Hc9?df{mgB)qGw`~Cgoj@w=SDbcO^``YuRc*{sWb; z2;*ZNziORyNzyQl^Qz@$49Iv5fsaI5^oQ2sF`ndeXhqur`$XDv0Gml+TTOwt*CZ*?9L$tA)T>=3W=r#PD=`JoEflHy#QH*_v4 z(4V#mT&H1K%uBe;{q%Jx6bWkbkf!uO$v&wj6ZC6s_+2D$Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0WL{IK~yMHjgqfx z!ci2(_r4ew6buG~VZq=ZU^IM%g^6iFunNY-f%b((gZmE_Wmp8`g3+|Ju&|)8DlAM; zzTbV$dsoZ+u>;3@-hJm>A6GAgBuU!vGd%-5U+_*DXTcB3#5wn-^D&SuQF>7naud1%e7>M7tUSbf%q-u|xlBP-r<0NfSLH&ez3!8MH$)PjoU-Gg41 zySarb3h1fAmc?|aOM0&`AKD=Vr_y*Dl(qEk8~tLanyi&;vH}@t_ye_3dHjNQ-{`^l z!DInFg=2IXZsCA)Mwh}qNV8Ar@|+gDMX%r`x^7Rr!Q+1c4-VR@7PCRtto;YN!}Be# zG7hm|VhR03eKFrb;A!Hyr>^zS>1vXu{0DehRPy)>bAwOb;!vYi00000NkvXXu0mjf DQqi+N literal 0 HcmV?d00001 diff --git a/framework/frontend/src/assets/index/indicator.png b/framework/frontend/src/assets/index/indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..2f53da6267b85f53fbc411ba5d0177a1f8763fa0 GIT binary patch literal 341643 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�OfZa13|dE(F^C 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

    + * 支持匿名访问 GetMapping + * + * @author liaojinlong + * @see RequestMapping + */ +@AnonymousAccess +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@RequestMapping(method = RequestMethod.GET) +public @interface AnonymousGetMapping { + + /** + * Alias for {@link RequestMapping#name}. + */ + @AliasFor(annotation = RequestMapping.class) + String name() default ""; + + /** + * Alias for {@link RequestMapping#value}. + */ + @AliasFor(annotation = RequestMapping.class) + String[] value() default {}; + + /** + * Alias for {@link RequestMapping#path}. + */ + @AliasFor(annotation = RequestMapping.class) + String[] path() default {}; + + /** + * Alias for {@link RequestMapping#params}. + */ + @AliasFor(annotation = RequestMapping.class) + String[] params() default {}; + + /** + * Alias for {@link RequestMapping#headers}. + */ + @AliasFor(annotation = RequestMapping.class) + String[] headers() default {}; + + /** + * Alias for {@link RequestMapping#consumes}. + * + * @since 4.3.5 + */ + @AliasFor(annotation = RequestMapping.class) + String[] consumes() default {}; + + /** + * Alias for {@link RequestMapping#produces}. + */ + @AliasFor(annotation = RequestMapping.class) + String[] produces() default {}; + +} diff --git a/framework/src/main/java/com/yfd/platform/aspect/LogAspect.java b/framework/src/main/java/com/yfd/platform/aspect/LogAspect.java new file mode 100644 index 0000000..0c52a21 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/aspect/LogAspect.java @@ -0,0 +1,93 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.aspect; + +import com.yfd.platform.system.domain.SysLog; +import com.yfd.platform.system.mapper.SysUserMapper; +import com.yfd.platform.system.service.ISysLogService; +import com.yfd.platform.system.service.IUserService; +import com.yfd.platform.utils.RequestHolder; +import com.yfd.platform.utils.SecurityUtils; +import com.yfd.platform.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * @author + * @date 2018-11-24 + */ +@Component +@Aspect +@Slf4j +public class LogAspect { + + @Resource + private final ISysLogService sysLogService; + + @Resource + private IUserService userService; + + ThreadLocal currentTime = new ThreadLocal<>(); + + public LogAspect(ISysLogService sysLogService) { + this.sysLogService = sysLogService; + } + + /** + * 配置切入点 + */ + @Pointcut("@annotation(com.yfd.platform.annotation.Log)") + public void logPointcut() { + // 该方法无方法体,主要为了让同类中其他方法使用此切入点 + } + + /** + * 配置环绕通知,使用在方法logPointcut()上注册的切入点 + * + * @param joinPoint join point for advice + */ + @Around("logPointcut()") + public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { + Object result; + currentTime.set(System.currentTimeMillis()); + result = joinPoint.proceed(); + SysLog log = new SysLog("INFO"); + currentTime.remove(); + HttpServletRequest request = RequestHolder.getHttpServletRequest(); + Map nameInfo = userService.getNameInfo(); + String nickname = nameInfo.get("nickname"); + String username = nameInfo.get("username"); + sysLogService.save(nickname, username, StringUtils.getBrowser(request), + StringUtils.getIp(request), joinPoint, log); + return result; + } + + public String getUsername() { + try { + return SecurityUtils.getCurrentUsername(); + } catch (Exception e) { + return ""; + } + } +} diff --git a/framework/src/main/java/com/yfd/platform/component/ServerSendEventServer.java b/framework/src/main/java/com/yfd/platform/component/ServerSendEventServer.java new file mode 100644 index 0000000..ca1b1fe --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/component/ServerSendEventServer.java @@ -0,0 +1,147 @@ +package com.yfd.platform.component; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +/** + * @author Huhailong + * SSE Server send Event 服务器推送服务 + */ +@Slf4j +public class ServerSendEventServer { + + /** + * 当前连接数 + */ + private static AtomicInteger count = new AtomicInteger(0); + + private static Map sseEmitterMap = + new ConcurrentHashMap<>(); + + public static SseEmitter connect(String userId) { + //设置超时时间,0表示不过期,默认是30秒,超过时间未完成会抛出异常 + SseEmitter sseEmitter = new SseEmitter(0L); + //SseEmitter sseEmitter = new SseEmitter(); + //注册回调 + sseEmitter.onCompletion(completionCallBack(userId)); + sseEmitter.onError(errorCallBack(userId)); + sseEmitter.onTimeout(timeOutCallBack(userId)); + sseEmitterMap.put(userId, sseEmitter); + //数量+1 + count.getAndIncrement(); + log.info("create new sse connect ,current user:{}", userId); + return sseEmitter; + } + + /** + * 给指定用户发消息 + */ + public static void sendMessage(String userId, String message) { + if (sseEmitterMap.containsKey(userId)) { + try { + sseEmitterMap.get(userId).send(message); + } catch (IOException e) { + log.error("user id:{}, send message error:{}", userId, + e.getMessage()); + e.printStackTrace(); + } + } + } + + /** + * 给所有用户发消息 + */ + public static void sendMessage(String message) { + if (sseEmitterMap != null && !sseEmitterMap.isEmpty()) { + sseEmitterMap.forEach((k, v) -> { + // 发送消息 + sendMessage(k, message); + + }); + } + } + + /** + * 想多人发送消息,组播 + */ + public static void groupSendMessage(String groupId, String message) { + if (sseEmitterMap != null && !sseEmitterMap.isEmpty()) { + sseEmitterMap.forEach((k, v) -> { + try { + if (k.startsWith(groupId)) { + v.send(message, MediaType.APPLICATION_JSON); + } + } catch (IOException e) { + log.error("user id:{}, send message error:{}", groupId, + message); + removeUser(k); + } + }); + } + } + + public static void batchSendMessage(String message) { + sseEmitterMap.forEach((k, v) -> { + try { + v.send(message, MediaType.APPLICATION_JSON); + } catch (IOException e) { + log.error("user id:{}, send message error:{}", k, + e.getMessage()); + removeUser(k); + } + }); + } + + /** + * 群发消息 + */ + public static void batchSendMessage(String message, Set userIds) { + userIds.forEach(userId -> sendMessage(userId, message)); + } + + public static void removeUser(String userId) { + sseEmitterMap.remove(userId); + //数量-1 + count.getAndDecrement(); + log.info("remove user id:{}", userId); + } + + public static List getIds() { + return new ArrayList<>(sseEmitterMap.keySet()); + } + + public static int getUserCount() { + return count.intValue(); + } + + private static Runnable completionCallBack(String userId) { + return () -> { + log.info("结束连接,{}", userId); + removeUser(userId); + }; + } + + private static Runnable timeOutCallBack(String userId) { + return () -> { + log.info("连接超时,{}", userId); + removeUser(userId); + }; + } + + private static Consumer errorCallBack(String userId) { + return throwable -> { + log.error("连接异常,{}", userId); + removeUser(userId); + }; + } +} diff --git a/framework/src/main/java/com/yfd/platform/component/WebSocketServer.java b/framework/src/main/java/com/yfd/platform/component/WebSocketServer.java new file mode 100644 index 0000000..1d0b913 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/component/WebSocketServer.java @@ -0,0 +1,106 @@ +package com.yfd.platform.component; + +import org.springframework.stereotype.Component; + +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.concurrent.CopyOnWriteArrayList; + +@ServerEndpoint("/websocket/{token}") +@Component +public class WebSocketServer { + private static int onlineCount=0;//在线人数 + private static CopyOnWriteArrayList webSocketSet=new CopyOnWriteArrayList();//在线用户集合 + private Session session;//与某个客户端的连接会话 + private String currentUser; + + @OnOpen + public void onOpen(@PathParam("token") String token, Session session){ + this.currentUser = token; + this.session=session; + webSocketSet.add(this);//加入set中 + addOnlineCount(); + System.out.println("有新连接加入!当前在线人数为"+getOnlineCount()); + allCurrentOnline(); + } + + @OnClose + public void onClose(){ + webSocketSet.remove(this); + subOnlineCount(); + System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount()); + allCurrentOnline(); + } + + @OnMessage + public void onMessage(String message, Session session){ + System.out.println("来自客户端的消息:"+message); + for (WebSocketServer item:webSocketSet){ + try { + item.sendMessage(message); + } catch (IOException e) { + e.printStackTrace(); + continue; + } + } + } + + @OnError + public void onError(Session session, Throwable throwable){ + System.out.println("发生错误!"); + throwable.printStackTrace(); + } + + public void sendMessage(String message) throws IOException { + this.session.getBasicRemote().sendText(message); + } + + /** + * 获取当前所有在线用户名 + */ + public static void allCurrentOnline(){ + for (WebSocketServer item : webSocketSet) { + System.out.println(item.currentUser); + } + } + + /** + * 发送给指定用户 + */ + public static void sendMessageTo(String message,String token) throws IOException { + for (WebSocketServer item : webSocketSet) { + if(item.currentUser.equals(token)){ + item.session.getBasicRemote().sendText(message); + } + } + } + + /** + * 群发自定义消息 + */ + public static void sendInfo(String message) throws IOException { + System.out.println(message); + for (WebSocketServer item : webSocketSet) { + try { + item.sendMessage(message); + } catch (IOException e) { + continue; + } + } + } + + public static synchronized int getOnlineCount(){ + return onlineCount; + } + public static synchronized void addOnlineCount(){ + WebSocketServer.onlineCount++; + } + public static synchronized void subOnlineCount(){ + WebSocketServer.onlineCount--; + } + +} + + diff --git a/framework/src/main/java/com/yfd/platform/config/FileProperties.java b/framework/src/main/java/com/yfd/platform/config/FileProperties.java new file mode 100644 index 0000000..c179499 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/FileProperties.java @@ -0,0 +1,59 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "file") +public class FileProperties { + + /** 文件大小限制 */ + private Long maxSize; + + /** 头像大小限制 */ + private Long avatarMaxSize; + + private ElPath mac; + + private ElPath linux; + + private ElPath windows; + + public ElPath getPath(){ + String os = System.getProperty("os.name"); + if(os.toLowerCase().startsWith("win")) { + return windows; + } else if(os.toLowerCase().startsWith("mac")){ + return mac; + } + return linux; + } + + @Data + public static class ElPath{ + + private String path; + + private String avatar; + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/FileSpaceProperties.java b/framework/src/main/java/com/yfd/platform/config/FileSpaceProperties.java new file mode 100644 index 0000000..74aab7d --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/FileSpaceProperties.java @@ -0,0 +1,17 @@ +package com.yfd.platform.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 文件空间相关配置,替换 @Value("${file-space.system}") 用法 + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "file-space") +public class FileSpaceProperties { + + /** 基础目录,例如 D:/data/platform/ */ + private String system; +} \ No newline at end of file diff --git a/framework/src/main/java/com/yfd/platform/config/GlobalExceptionHandler.java b/framework/src/main/java/com/yfd/platform/config/GlobalExceptionHandler.java new file mode 100644 index 0000000..d9c7d7a --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/GlobalExceptionHandler.java @@ -0,0 +1,24 @@ +package com.yfd.platform.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @author TangWei + * @Date: 2023/3/27 18:07 + * @Description: + */ +@Slf4j +@ControllerAdvice +public class GlobalExceptionHandler { + + @ResponseBody + @ExceptionHandler(value = Throwable.class) + public ResponseResult handleException(Throwable e) { + log.error("message:{}", e.getMessage()); + return ResponseResult.error(e.getMessage()); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/config/JobRunner.java b/framework/src/main/java/com/yfd/platform/config/JobRunner.java new file mode 100644 index 0000000..c0d451e --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/JobRunner.java @@ -0,0 +1,56 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yfd.platform.system.domain.QuartzJob; +import com.yfd.platform.system.mapper.QuartzJobMapper; +import com.yfd.platform.utils.QuartzManage; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author + * @date 2019-01-07 + */ +@Component +@RequiredArgsConstructor +public class JobRunner implements ApplicationRunner { + + private static final Logger log = LoggerFactory.getLogger(JobRunner.class); + private final QuartzJobMapper quartzJobMapper; + private final QuartzManage quartzManage; + + /** + * 项目启动时重新激活启用的定时任务 + * + * @param applicationArguments / + */ + @Override + public void run(ApplicationArguments applicationArguments) { + log.info("--------------------注入定时任务---------------------"); + List quartzJobs = + quartzJobMapper.selectList(new LambdaQueryWrapper().eq(QuartzJob::getStatus, "1")); + quartzJobs.forEach(quartzManage::addJob); + log.info("--------------------定时任务注入完成---------------------"); + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/JwtAuthenticationTokenFilter.java b/framework/src/main/java/com/yfd/platform/config/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..bcb79c0 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/JwtAuthenticationTokenFilter.java @@ -0,0 +1,83 @@ +package com.yfd.platform.config; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.jwt.JWT; +import cn.hutool.jwt.JWTUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yfd.platform.component.ServerSendEventServer; +import com.yfd.platform.constant.Constant; +import com.yfd.platform.system.domain.LoginUser; +import com.yfd.platform.system.domain.Message; +import com.yfd.platform.system.service.IMessageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.annotation.Resource; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + + @Autowired + private WebConfig webConfig; + + @Override + protected void doFilterInternal(HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse, + FilterChain filterChain) throws ServletException, IOException { + //获取token + String uri = httpServletRequest.getRequestURI(); + String token = httpServletRequest.getHeader("token"); + if (StrUtil.isEmpty(token) || "/user/login".equals(uri)) { + filterChain.doFilter(httpServletRequest, httpServletResponse); + return; + } + //解析token + boolean isok = JWTUtil.verify(token, "12345678".getBytes()); + String userid = ""; + if (isok) { + final JWT jwt = JWTUtil.parseToken(token); + userid = jwt.getPayload("userid").toString(); + //从cachekey中获取用户信息失效时间 + String cachekey = "expire_time:" + userid; + if(StrUtil.isNotEmpty(webConfig.loginuserCache().get(cachekey))){ + long expire_time =Long.parseLong(webConfig.loginuserCache().get(cachekey)); + if (System.currentTimeMillis() > expire_time) { + httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Token超过期限!"); + return; + } + } + } + + //从cachekey中获取用户信息 + String cachekey = "login:" + userid; + String jsonstr = webConfig.loginuserCache().get(cachekey); + LoginUser loginUser = JSON.parseObject(jsonstr, LoginUser.class); + if (ObjectUtil.isEmpty(loginUser)) { + httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN, + "登录用户已失效!"); + return; + } + //存入SecurityContextHolder + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(loginUser, null, + loginUser.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + webConfig.loginuserCache().put(Constant.TOKEN + userid, token); + //更新了超期时间 + long expireTime =System.currentTimeMillis() + ( 30L * 60L * 1000L); + webConfig.loginuserCache().put("expire_time:" + userid, String.valueOf(expireTime)); + //放行过滤器 + filterChain.doFilter(httpServletRequest, httpServletResponse); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/config/MessageConfig.java b/framework/src/main/java/com/yfd/platform/config/MessageConfig.java new file mode 100644 index 0000000..e079d02 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/MessageConfig.java @@ -0,0 +1,50 @@ +package com.yfd.platform.config; + +import cn.hutool.cache.Cache; +import cn.hutool.cache.impl.CacheObj; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yfd.platform.component.ServerSendEventServer; +import com.yfd.platform.constant.Constant; +import com.yfd.platform.system.domain.Message; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.service.IMessageService; +import com.yfd.platform.system.service.IUserService; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.util.Iterator; + +/** + * @author TangWei + * @Date: 2023/3/24 15:56 + * @Description: + */ +@Component +public class MessageConfig { + + @Resource + private IMessageService messageService; + + @Resource + private IUserService userService; + + @Resource + private WebConfig webConfig; + + public void sendMessage() { + long count = + messageService.count(new LambdaQueryWrapper().eq(Message::getStatus, "1")); + String userId = userService.getUserInfo().getId(); + String token = webConfig.loginuserCache().get(Constant.TOKEN + userId); + ServerSendEventServer.sendMessage(token, count + ""); + } + + public void addMessage(Message message) { + messageService.save(message); + long count = + messageService.count(new LambdaQueryWrapper().eq(Message::getStatus, "1")); + ServerSendEventServer.sendMessage(count + ""); + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/MybitsPlusConfig.java b/framework/src/main/java/com/yfd/platform/config/MybitsPlusConfig.java new file mode 100644 index 0000000..de009d7 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/MybitsPlusConfig.java @@ -0,0 +1,24 @@ +package com.yfd.platform.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/****************************** + * 用途说明: + * 作者姓名: pcj + * 创建时间: 2022/10/24 10:50 + ******************************/ +@Configuration +public class MybitsPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return mybatisPlusInterceptor; + } + +} diff --git a/framework/src/main/java/com/yfd/platform/config/ProdApiPrefixFilter.java b/framework/src/main/java/com/yfd/platform/config/ProdApiPrefixFilter.java new file mode 100644 index 0000000..4c1680a --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/ProdApiPrefixFilter.java @@ -0,0 +1,44 @@ +package com.yfd.platform.config; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 将以 /prod-api/ 开头的请求转发到去掉前缀的真实后端接口路径。 + * 例如:/prod-api/user/code -> /user/code + * 这样可以兼容前端生产环境仍使用 /prod-api 作为网关前缀的情况。 + */ +@WebFilter(urlPatterns = "/prod-api/*", filterName = "prodApiPrefixFilter") +public class ProdApiPrefixFilter implements Filter { + + private static final String PREFIX = "/prod-api"; + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + if (!(req instanceof HttpServletRequest) || !(res instanceof HttpServletResponse)) { + chain.doFilter(req, res); + return; + } + + HttpServletRequest request = (HttpServletRequest) req; + String uri = request.getRequestURI(); + + // 仅拦截 /prod-api/* 的接口请求并进行内部 forward + if (uri.startsWith(PREFIX + "/")) { + String forwardUri = uri.substring(PREFIX.length()); + RequestDispatcher dispatcher = request.getRequestDispatcher(forwardUri); + dispatcher.forward(req, res); + return; + } + + chain.doFilter(req, res); + } +} \ No newline at end of file diff --git a/framework/src/main/java/com/yfd/platform/config/QuartzConfig.java b/framework/src/main/java/com/yfd/platform/config/QuartzConfig.java new file mode 100644 index 0000000..41a36db --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/QuartzConfig.java @@ -0,0 +1,77 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config; + +import org.quartz.Scheduler; +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.AdaptableJobFactory; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * 定时任务配置 + * + * @author / + * @date 2019-01-07 + */ +@Configuration +public class QuartzConfig { + + /** + * 解决Job中注入Spring Bean为null的问题 + */ + @Component("quartzJobFactory") + public static class QuartzJobFactory extends AdaptableJobFactory { + + private final AutowireCapableBeanFactory capableBeanFactory; + + public QuartzJobFactory(AutowireCapableBeanFactory capableBeanFactory) { + this.capableBeanFactory = capableBeanFactory; + } + + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + + //调用父类的方法 + Object jobInstance = super.createJobInstance(bundle); + capableBeanFactory.autowireBean(jobInstance); + return jobInstance; + } + } + + /** + * 注入scheduler到spring + * + * @param quartzJobFactory / + * @return Scheduler + * @throws Exception / + */ + @Bean(name = "scheduler") + public Scheduler scheduler(QuartzJobFactory quartzJobFactory) throws Exception { + SchedulerFactoryBean factoryBean = new SchedulerFactoryBean(); + factoryBean.setJobFactory(quartzJobFactory); + factoryBean.afterPropertiesSet(); + Scheduler scheduler = factoryBean.getScheduler(); + scheduler.start(); + return scheduler; + } + +} diff --git a/framework/src/main/java/com/yfd/platform/config/ResponseResult.java b/framework/src/main/java/com/yfd/platform/config/ResponseResult.java new file mode 100644 index 0000000..9638fcf --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/ResponseResult.java @@ -0,0 +1,57 @@ +package com.yfd.platform.config; + +import java.util.HashMap; + +public class ResponseResult extends HashMap { + private static final long serialVersionUID = 1L; + + public ResponseResult() { + } + + public static ResponseResult unlogin() { + return message("401", "未登录"); + } + + public static ResponseResult error() { + return error("操作失败"); + } + + public static ResponseResult success() { + return success("操作成功"); + } + + public static ResponseResult error(String msg) { + ResponseResult json = new ResponseResult(); + json.put((String)"code", "1");//错误 + json.put((String)"msg", msg); + return json; + } + + public static ResponseResult message(String code, String msg) { + ResponseResult json = new ResponseResult(); + json.put((String)"code", code); + json.put((String)"msg", msg); + return json; + } + + public static ResponseResult success(String msg) { + ResponseResult json = new ResponseResult(); + json.put((String)"code", "0");//正常 + json.put((String)"msg", msg); + return json; + } + + public static ResponseResult successData(Object obj) { + ResponseResult json = new ResponseResult(); + json.put((String)"code", "0");//正常 + json.put((String)"msg", "操作成功"); + json.put("data", obj); + return json; + } + + + public ResponseResult put(String key, Object value) { + super.put(key, value); + return this; + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/SecurityConfig.java b/framework/src/main/java/com/yfd/platform/config/SecurityConfig.java new file mode 100644 index 0000000..f1e1cfa --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -0,0 +1,91 @@ +package com.yfd.platform.config; + +import com.yfd.platform.config.bean.LoginProperties; +import com.yfd.platform.exception.AccessDeniedHandExcetion; +import com.yfd.platform.exception.AuthenticationException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +public class SecurityConfig { + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + @ConfigurationProperties(prefix = "login", ignoreUnknownFields = true) + public LoginProperties loginProperties() { + return new LoginProperties(); + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { + return authenticationConfiguration.getAuthenticationManager(); + } + + @Autowired + private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; + + @Autowired + private AuthenticationException authenticationException; + + @Autowired + private AccessDeniedHandExcetion accessDeniedHandExcetion; + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .csrf(csrf -> csrf.disable()) + .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .authorizeHttpRequests(auth -> auth + .requestMatchers("/user/login").anonymous() + .requestMatchers("/user/code").permitAll() + .requestMatchers(HttpMethod.GET, + "/*.html", + "/**/*.html", + "/**/*.css", + "/**/*.js", + "/webSocket/**").permitAll() + .requestMatchers( + "/swagger-ui.html", + "/swagger-ui/**", + "/v3/api-docs/**", + "/v3/api-docs.yaml", + "/swagger-resources/**", + "/webjars/**", + "/*/api-docs").permitAll() + .requestMatchers( + "/report/**", + "/images/**", + "/pageimage/**", + "/avatar/**", + "/systemurl/**", + "/api/imageserver/upload").permitAll() + .requestMatchers("/**/**").permitAll() + .anyRequest().authenticated() + ) + .cors(cors -> {}); + + http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + + http.exceptionHandling(ex -> ex + .authenticationEntryPoint(authenticationException) + .accessDeniedHandler(accessDeniedHandExcetion) + ); + + return http.build(); + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/framework/src/main/java/com/yfd/platform/config/SwaggerConfig.java new file mode 100644 index 0000000..b92f09b --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -0,0 +1,50 @@ +package com.yfd.platform.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springdoc.core.models.GroupedOpenApi; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.Contact; + +/** + * Springdoc OpenAPI 配置 + */ +@Configuration +public class SwaggerConfig { + + @Bean + public OpenAPI projectOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("项目API 接口文档") + .version("3.0") + .description("") + .contact(new Contact().name("郑顺利").email("13910913995@163.com")) + ); + } + + @Bean + public GroupedOpenApi groupWebsiteApi() { + return GroupedOpenApi.builder() + .group("1. 深北莫网站") + .packagesToScan("com.yfd.platform.modules.sbmwebsitedb.controller") + .build(); + } + + @Bean + public GroupedOpenApi groupQuartzApi() { + return GroupedOpenApi.builder() + .group("2. 定时任务") + .packagesToScan("com.yfd.platform.modules.quartz.controller") + .build(); + } + + @Bean + public GroupedOpenApi groupSystemApi() { + return GroupedOpenApi.builder() + .group("3. 系统管理") + .packagesToScan("com.yfd.platform.system.controller") + .build(); + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/WebConfig.java b/framework/src/main/java/com/yfd/platform/config/WebConfig.java new file mode 100644 index 0000000..c242a34 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/WebConfig.java @@ -0,0 +1,58 @@ +package com.yfd.platform.config; + +import cn.hutool.cache.Cache; +import cn.hutool.cache.CacheUtil; +import lombok.SneakyThrows; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Resource + private FileSpaceProperties fileSpaceProperties; + + + + @Bean + public Cache loginuserCache() { + return CacheUtil.newLRUCache(200);//用户登录缓存数 缺省200 + } + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = + new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOriginPattern("*"); + config.addAllowedHeader("*"); + config.addAllowedMethod("*"); + config.setMaxAge(3600L); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } + + @SneakyThrows + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + // 菜单图标访问路径 + String iconUrl = "file:" + System.getProperty("user.dir") + "\\src" + + "\\main\\resources\\static\\icon\\"; + registry.addResourceHandler("/menu/**").addResourceLocations(iconUrl).setCachePeriod(0); + + registry.addResourceHandler("swagger-ui.html").addResourceLocations( + "classpath:/META-INF/resources/"); + + String systemUrl = "file:" + fileSpaceProperties.getSystem().replace("\\", "/")+"user\\"; + registry.addResourceHandler("/avatar/**").addResourceLocations(systemUrl).setCachePeriod(0); + + + } + +} diff --git a/framework/src/main/java/com/yfd/platform/config/WebSocketConfig.java b/framework/src/main/java/com/yfd/platform/config/WebSocketConfig.java new file mode 100644 index 0000000..349ead0 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/WebSocketConfig.java @@ -0,0 +1,16 @@ +package com.yfd.platform.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfig { + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + + return new ServerEndpointExporter(); + } +} + diff --git a/framework/src/main/java/com/yfd/platform/config/bean/LoginCode.java b/framework/src/main/java/com/yfd/platform/config/bean/LoginCode.java new file mode 100644 index 0000000..2a7586b --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/bean/LoginCode.java @@ -0,0 +1,61 @@ +/* + * Copyright 2019-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config.bean; + +import lombok.Data; + +/** + * 登录验证码配置信息 + * + * @author: liaojinlong + * @date: 2020/6/10 18:53 + */ +@Data +public class LoginCode { + + /** + * 验证码配置 + */ + private LoginCodeEnum codeType; + /** + * 验证码有效期 分钟 + */ + private Long expiration = 2L; + /** + * 验证码内容长度 + */ + private int length = 2; + /** + * 验证码宽度 + */ + private int width = 111; + /** + * 验证码高度 + */ + private int height = 36; + /** + * 验证码字体 + */ + private String fontName; + /** + * 字体大小 + */ + private int fontSize = 25; + + public LoginCodeEnum getCodeType() { + return codeType; + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/bean/LoginCodeEnum.java b/framework/src/main/java/com/yfd/platform/config/bean/LoginCodeEnum.java new file mode 100644 index 0000000..d9ade21 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/bean/LoginCodeEnum.java @@ -0,0 +1,43 @@ +/* + * Copyright 2019-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config.bean; + +/** + * 验证码配置枚举 + * + * @author: liaojinlong + * @date: 2020/6/10 17:40 + */ + +public enum LoginCodeEnum { + /** + * 算数 + */ + arithmetic, + /** + * 中文 + */ + chinese, + /** + * 中文闪图 + */ + chinese_gif, + /** + * 闪图 + */ + gif, + spec +} diff --git a/framework/src/main/java/com/yfd/platform/config/bean/LoginProperties.java b/framework/src/main/java/com/yfd/platform/config/bean/LoginProperties.java new file mode 100644 index 0000000..b16644d --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/bean/LoginProperties.java @@ -0,0 +1,110 @@ +/* + * Copyright 2019-2020 the original author or authors. + * + * Licensed under the Apache License, Version loginCode.length.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-loginCode.length.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config.bean; + +import cn.hutool.core.util.StrUtil; +import com.wf.captcha.*; +import com.wf.captcha.base.Captcha; +import com.yfd.platform.exception.BadConfigurationException; +import lombok.Data; +import java.awt.*; +import java.util.Objects; + +/** + * 配置文件读取 + * + * @author liaojinlong + * @date loginCode.length0loginCode.length0/6/10 17:loginCode.length6 + */ +@Data +public class LoginProperties { + + /** + * 账号单用户 登录 + */ + private boolean singleLogin = false; + + private LoginCode loginCode; + /** + * 用户登录信息缓存 + */ + private boolean cacheEnable; + + public boolean isSingleLogin() { + return singleLogin; + } + + public boolean isCacheEnable() { + return cacheEnable; + } + + /** + * 获取验证码生产类 + * + * @return / + */ + public Captcha getCaptcha() { + if (Objects.isNull(loginCode)) { + loginCode = new LoginCode(); + if (Objects.isNull(loginCode.getCodeType())) { + loginCode.setCodeType(LoginCodeEnum.arithmetic); + } + } + return switchCaptcha(loginCode); + } + + /** + * 依据配置信息生产验证码 + * + * @param loginCode 验证码配置信息 + * @return / + */ + private Captcha switchCaptcha(LoginCode loginCode) { + Captcha captcha; + synchronized (this) { + switch (loginCode.getCodeType()) { + case arithmetic: + // 算术类型 https://gitee.com/whvse/EasyCaptcha + captcha = new ArithmeticCaptcha(loginCode.getWidth(), loginCode.getHeight()); + // 几位数运算,默认是两位 + captcha.setLen(loginCode.getLength()); + break; + case chinese: + captcha = new ChineseCaptcha(loginCode.getWidth(), loginCode.getHeight()); + captcha.setLen(loginCode.getLength()); + break; + case chinese_gif: + captcha = new ChineseGifCaptcha(loginCode.getWidth(), loginCode.getHeight()); + captcha.setLen(loginCode.getLength()); + break; + case gif: + captcha = new GifCaptcha(loginCode.getWidth(), loginCode.getHeight()); + captcha.setLen(loginCode.getLength()); + break; + case spec: + captcha = new SpecCaptcha(loginCode.getWidth(), loginCode.getHeight()); + captcha.setLen(loginCode.getLength()); + break; + default: + throw new BadConfigurationException("验证码配置信息错误!正确配置查看 LoginCodeEnum "); + } + } + if(StrUtil.isNotBlank(loginCode.getFontName())){ + captcha.setFont(new Font(loginCode.getFontName(), Font.PLAIN, loginCode.getFontSize())); + } + return captcha; + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/thread/AsyncTaskExecutePool.java b/framework/src/main/java/com/yfd/platform/config/thread/AsyncTaskExecutePool.java new file mode 100644 index 0000000..ff10654 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/thread/AsyncTaskExecutePool.java @@ -0,0 +1,70 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config.thread; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 异步任务线程池装配类 + * @author https://juejin.im/entry/5abb8f6951882555677e9da2 + * @date 2019年10月31日15:06:18 + */ +@Slf4j +@Configuration +public class AsyncTaskExecutePool implements AsyncConfigurer { + + /** 注入配置类 */ + private final AsyncTaskProperties config; + + public AsyncTaskExecutePool(AsyncTaskProperties config) { + this.config = config; + } + + @Override + public Executor getAsyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + //核心线程池大小 + executor.setCorePoolSize(config.getCorePoolSize()); + //最大线程数 + executor.setMaxPoolSize(config.getMaxPoolSize()); + //队列容量 + executor.setQueueCapacity(config.getQueueCapacity()); + //活跃时间 + executor.setKeepAliveSeconds(config.getKeepAliveSeconds()); + //线程名字前缀 + executor.setThreadNamePrefix("el-async-"); + // setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务 + // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + } + + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return (throwable, method, objects) -> { + log.error("===="+throwable.getMessage()+"====", throwable); + log.error("exception method:"+method.getName()); + }; + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/thread/AsyncTaskProperties.java b/framework/src/main/java/com/yfd/platform/config/thread/AsyncTaskProperties.java new file mode 100644 index 0000000..a5bc7d2 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/thread/AsyncTaskProperties.java @@ -0,0 +1,39 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config.thread; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 线程池配置属性类 + * @author https://juejin.im/entry/5abb8f6951882555677e9da2 + * @date 2019年10月31日14:58:18 + */ +@Data +@Component +@ConfigurationProperties(prefix = "task.pool") +public class AsyncTaskProperties { + + private int corePoolSize; + + private int maxPoolSize; + + private int keepAliveSeconds; + + private int queueCapacity; +} diff --git a/framework/src/main/java/com/yfd/platform/config/thread/TheadFactoryName.java b/framework/src/main/java/com/yfd/platform/config/thread/TheadFactoryName.java new file mode 100644 index 0000000..118faba --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/thread/TheadFactoryName.java @@ -0,0 +1,62 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config.thread; + +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 自定义线程名称 + * @author + * @date 2019年10月31日17:49:55 + */ +@Component +public class TheadFactoryName implements ThreadFactory { + + private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1); + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final String namePrefix; + + public TheadFactoryName() { + this("el-pool"); + } + + private TheadFactoryName(String name){ + // 使用当前线程的线程组,避免依赖已弃用的 SecurityManager + group = Thread.currentThread().getThreadGroup(); + //此时namePrefix就是 name + 第几个用这个工厂创建线程池的 + this.namePrefix = name + + POOL_NUMBER.getAndIncrement(); + } + + @Override + public Thread newThread(Runnable r) { + //此时线程的名字 就是 namePrefix + -thread- + 这个线程池中第几个执行的线程 + Thread t = new Thread(group, r, + namePrefix + "-thread-"+threadNumber.getAndIncrement(), + 0); + if (t.isDaemon()) { + t.setDaemon(false); + } + if (t.getPriority() != Thread.NORM_PRIORITY) { + t.setPriority(Thread.NORM_PRIORITY); + } + return t; + } +} diff --git a/framework/src/main/java/com/yfd/platform/config/thread/ThreadPoolExecutorUtil.java b/framework/src/main/java/com/yfd/platform/config/thread/ThreadPoolExecutorUtil.java new file mode 100644 index 0000000..cb84cc4 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/config/thread/ThreadPoolExecutorUtil.java @@ -0,0 +1,44 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.config.thread; + + + +import com.yfd.platform.utils.SpringContextHolder; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 用于获取自定义线程池 + * @author + * @date 2019年10月31日18:16:47 + */ +public class ThreadPoolExecutorUtil { + + public static ThreadPoolExecutor getPoll(){ + AsyncTaskProperties properties = SpringContextHolder.getBean(AsyncTaskProperties.class); + return new ThreadPoolExecutor( + properties.getCorePoolSize(), + properties.getMaxPoolSize(), + properties.getKeepAliveSeconds(), + TimeUnit.SECONDS, + new ArrayBlockingQueue<>(properties.getQueueCapacity()), + new TheadFactoryName() + ); + } +} diff --git a/framework/src/main/java/com/yfd/platform/constant/Constant.java b/framework/src/main/java/com/yfd/platform/constant/Constant.java new file mode 100644 index 0000000..c460999 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/constant/Constant.java @@ -0,0 +1,42 @@ +package com.yfd.platform.constant; + +/** + * @author TangWei + * @Date: 2023/3/3 17:40 + * @Description: 常量类 + */ +public class Constant { + + public static final String LOGIN = "login:"; + public static final String TOKEN = "token:"; + public static final String USER_ID = "userid"; + public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + public static final String CODE_KEY = "code-key-"; + public static final long CODE_EXPIRATION_TIME = 1000 * 60; + /** + * 用于IP定位转换 + */ + public static final String REGION = "内网IP|内网IP"; + /** + * win 系统 + */ + public static final String WIN = "win"; + + /** + * mac 系统 + */ + public static final String MAC = "mac"; + + /** + * 常用接口 + */ + public static class Url { + + // IP归属地查询 + // public static final String IP_URL = "http://whois.pconline.com + // .cn/ipJson.jsp?ip=%s&json=true"; + public static final String IP_URL = "http://whois.pconline.com" + + ".cn/ipJson.jsp?ip=%s&json=true"; + } +} diff --git a/framework/src/main/java/com/yfd/platform/datasource/DataSource.java b/framework/src/main/java/com/yfd/platform/datasource/DataSource.java new file mode 100644 index 0000000..7c6d795 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/datasource/DataSource.java @@ -0,0 +1,17 @@ +package com.yfd.platform.datasource; + +import java.lang.annotation.*; + +/****************************** + * 用途说明: + * 作者姓名: wxy + * 创建时间: 2022/9/23 17:48 + ******************************/ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataSource { + + String name() default ""; + +} diff --git a/framework/src/main/java/com/yfd/platform/datasource/DataSourceAspect.java b/framework/src/main/java/com/yfd/platform/datasource/DataSourceAspect.java new file mode 100644 index 0000000..f20c0f8 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/datasource/DataSourceAspect.java @@ -0,0 +1,55 @@ +package com.yfd.platform.datasource; + +import cn.hutool.core.util.StrUtil; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +/****************************** + * 用途说明: + * 作者姓名: wxy + * 创建时间: 2022/9/23 17:50 + ******************************/ +@Aspect +@Component +public class DataSourceAspect { + + @Pointcut("@annotation(com.yfd.platform.datasource.DataSource)") + public void dataSourcePointCut() { + + } + + private String DataBaseName; + + @Around("dataSourcePointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable { + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + if (StrUtil.isNotBlank(DataBaseName)){ + DynamicDataSource.setDataSource(DataBaseName); + }else { + DynamicDataSource.setDataSource("master"); + } + + try { + return point.proceed(); + } finally { + DynamicDataSource.clearDataSource(); + } + } + + public String getDataBase(Integer type){ + if (type == 1){ + DataBaseName="master"; + }else { + DataBaseName="slave"; + } + return DataBaseName; + } + +} diff --git a/framework/src/main/java/com/yfd/platform/datasource/DynamicDataSource.java b/framework/src/main/java/com/yfd/platform/datasource/DynamicDataSource.java new file mode 100644 index 0000000..8b52521 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/datasource/DynamicDataSource.java @@ -0,0 +1,40 @@ +package com.yfd.platform.datasource; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import javax.sql.DataSource; +import java.util.Map; + +/****************************** + * 用途说明: + * 作者姓名: wxy + * 创建时间: 2022/9/23 17:47 + ******************************/ +public class DynamicDataSource extends AbstractRoutingDataSource { + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) { + super.setDefaultTargetDataSource(defaultTargetDataSource); + super.setTargetDataSources(targetDataSources); + super.afterPropertiesSet(); + } + + @Override + protected Object determineCurrentLookupKey() { + return getDataSource(); + } + + public static void setDataSource(String dataSource) { + contextHolder.set(dataSource); + } + + public static String getDataSource() { + return contextHolder.get(); + } + + public static void clearDataSource() { + contextHolder.remove(); + } + + +} diff --git a/framework/src/main/java/com/yfd/platform/datasource/DynamicDataSourceConfig.java b/framework/src/main/java/com/yfd/platform/datasource/DynamicDataSourceConfig.java new file mode 100644 index 0000000..fc4a972 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/datasource/DynamicDataSourceConfig.java @@ -0,0 +1,38 @@ +package com.yfd.platform.datasource; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +/****************************** + * 用途说明: + * 作者姓名: wxy + * 创建时间: 2022/9/23 17:45 + ******************************/ +@Configuration +@Component +public class DynamicDataSourceConfig { + + @Bean + @ConfigurationProperties("spring.datasource.druid.master") + public DataSource wglMasterDataSource(){ + return DruidDataSourceBuilder.create().build(); + } + + @Bean + @Primary + public DynamicDataSource dataSource(DataSource wglMasterDataSource, DataSource wglSlaveDataSource) { + Map targetDataSources = new HashMap<>(); + targetDataSources.put("master",wglMasterDataSource); + return new DynamicDataSource(wglMasterDataSource, targetDataSources); + } + + +} diff --git a/framework/src/main/java/com/yfd/platform/exception/AccessDeniedHandExcetion.java b/framework/src/main/java/com/yfd/platform/exception/AccessDeniedHandExcetion.java new file mode 100644 index 0000000..0bb0ed3 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/exception/AccessDeniedHandExcetion.java @@ -0,0 +1,27 @@ +package com.yfd.platform.exception; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.stereotype.Component; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +@Component +public class AccessDeniedHandExcetion implements AccessDeniedHandler { + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { + JSONObject jobj=new JSONObject(); + jobj.putOnce("status","403"); + jobj.putOnce("msg","用户权限不足,不能访问"); + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSONUtil.toJsonStr(jobj)); + } +} diff --git a/framework/src/main/java/com/yfd/platform/exception/AuthenticationException.java b/framework/src/main/java/com/yfd/platform/exception/AuthenticationException.java new file mode 100644 index 0000000..15e8e97 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/exception/AuthenticationException.java @@ -0,0 +1,32 @@ +package com.yfd.platform.exception; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.yfd.platform.config.ResponseResult; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +@Component +public class AuthenticationException implements AuthenticationEntryPoint { + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, org.springframework.security.core.AuthenticationException authException) throws IOException, ServletException { + JSONObject jobj=new JSONObject(); + if(authException.getMessage().equals("用户账号不存在!")){ + jobj.putOnce("code","401"); + jobj.putOnce("msg","用户账号不存在/密码错误,登录失败!"); + }else{ + jobj.putOnce("code","401"); + jobj.putOnce("msg","用户Token失效,请重新登录!"); + } + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().println(JSONUtil.toJsonStr(jobj)); + } +} diff --git a/framework/src/main/java/com/yfd/platform/exception/BadConfigurationException.java b/framework/src/main/java/com/yfd/platform/exception/BadConfigurationException.java new file mode 100644 index 0000000..92ffac0 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/exception/BadConfigurationException.java @@ -0,0 +1,98 @@ +/* + * Copyright 2019-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.exception; + +/** + * 统一关于错误配置信息 异常 + * + * @author: liaojinlong + * @date: 2020/6/10 18:06 + */ +public class BadConfigurationException extends RuntimeException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public BadConfigurationException() { + super(); + } + + /** + * Constructs a new runtime exception with the specified detail message. + * The cause is not initialized, and may subsequently be initialized by a + * call to {@link #initCause}. + * + * @param message the detail message. The detail message is saved for + * later retrieval by the {@link #getMessage()} method. + */ + public BadConfigurationException(String message) { + super(message); + } + + /** + * Constructs a new runtime exception with the specified detail message and + * cause.

    Note that the detail message associated with + * {@code cause} is not automatically incorporated in + * this runtime exception's detail message. + * + * @param message the detail message (which is saved for later retrieval + * by the {@link #getMessage()} method). + * @param cause the cause (which is saved for later retrieval by the + * {@link #getCause()} method). (A {@code null} value is + * permitted, and indicates that the cause is nonexistent or + * unknown.) + * @since 1.4 + */ + public BadConfigurationException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Constructs a new runtime exception with the specified cause and a + * detail message of {@code (cause==null ? null : cause.toString())} + * (which typically contains the class and detail message of + * {@code cause}). This constructor is useful for runtime exceptions + * that are little more than wrappers for other throwables. + * + * @param cause the cause (which is saved for later retrieval by the + * {@link #getCause()} method). (A {@code null} value is + * permitted, and indicates that the cause is nonexistent or + * unknown.) + * @since 1.4 + */ + public BadConfigurationException(Throwable cause) { + super(cause); + } + + /** + * Constructs a new runtime exception with the specified detail + * message, cause, suppression enabled or disabled, and writable + * stack trace enabled or disabled. + * + * @param message the detail message. + * @param cause the cause. (A {@code null} value is permitted, + * and indicates that the cause is nonexistent or unknown.) + * @param enableSuppression whether or not suppression is enabled + * or disabled + * @param writableStackTrace whether or not the stack trace should + * be writable + * @since 1.7 + */ + protected BadConfigurationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/framework/src/main/java/com/yfd/platform/exception/BadRequestException.java b/framework/src/main/java/com/yfd/platform/exception/BadRequestException.java new file mode 100644 index 0000000..f2202ec --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/exception/BadRequestException.java @@ -0,0 +1,41 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.exception; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; + +/** + * @author + * @date 2018-11-23 + * 统一异常处理 + */ +@Getter +public class BadRequestException extends RuntimeException{ + + private Integer status = BAD_REQUEST.value(); + + public BadRequestException(String msg){ + super(msg); + } + + public BadRequestException(HttpStatus status, String msg){ + super(msg); + this.status = status.value(); + } +} diff --git a/framework/src/main/java/com/yfd/platform/exception/ChildrenExistException.java b/framework/src/main/java/com/yfd/platform/exception/ChildrenExistException.java new file mode 100644 index 0000000..18eca34 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/exception/ChildrenExistException.java @@ -0,0 +1,20 @@ +package com.yfd.platform.exception; + +import org.springframework.util.StringUtils; + +/** + * @Author pcj + * @Date 2021/1/26 9:07 + * @Version 1.0 + */ +public class ChildrenExistException extends RuntimeException{ + + public ChildrenExistException(Class clazz, String field, String val) { + super(ChildrenExistException.generateMessage(clazz.getSimpleName(), field, val)); + } + + private static String generateMessage(String entity, String field, String val) { + return StringUtils.capitalize(entity) + + " with " + field + " "+ val + " Children Exist"; + } +} diff --git a/framework/src/main/java/com/yfd/platform/exception/EntityExistException.java b/framework/src/main/java/com/yfd/platform/exception/EntityExistException.java new file mode 100644 index 0000000..028aeed --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/exception/EntityExistException.java @@ -0,0 +1,34 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.exception; + +import org.springframework.util.StringUtils; + +/** + * @author + * @date 2018-11-23 + */ +public class EntityExistException extends RuntimeException { + + public EntityExistException(Class clazz, String field, String val) { + super(EntityExistException.generateMessage(clazz.getSimpleName(), field, val)); + } + + private static String generateMessage(String entity, String field, String val) { + return StringUtils.capitalize(entity) + + " with " + field + " "+ val + " existed"; + } +} \ No newline at end of file diff --git a/framework/src/main/java/com/yfd/platform/exception/EntityNotFoundException.java b/framework/src/main/java/com/yfd/platform/exception/EntityNotFoundException.java new file mode 100644 index 0000000..8f5e1c5 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/exception/EntityNotFoundException.java @@ -0,0 +1,34 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.exception; + +import org.springframework.util.StringUtils; + +/** + * @author + * @date 2018-11-23 + */ +public class EntityNotFoundException extends RuntimeException { + + public EntityNotFoundException(Class clazz, String field, String val) { + super(EntityNotFoundException.generateMessage(clazz.getSimpleName(), field, val)); + } + + private static String generateMessage(String entity, String field, String val) { + return StringUtils.capitalize(entity) + + " with " + field + " "+ val + " does not exist"; + } +} \ No newline at end of file diff --git a/framework/src/main/java/com/yfd/platform/system/controller/DataSourceController.java b/framework/src/main/java/com/yfd/platform/system/controller/DataSourceController.java new file mode 100644 index 0000000..b34b37c --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/DataSourceController.java @@ -0,0 +1,42 @@ +package com.yfd.platform.system.controller; + +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.datasource.DataSource; +import com.yfd.platform.datasource.DataSourceAspect; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; + +/** + * @author zhengsl + * @since 2022-09-20 + */ +@RestController +@RequestMapping("/system") +@Tag(name = "切换数据库") +public class DataSourceController { + + @Resource + DataSourceAspect dataSourceAspect; + + /** + * 切换数据库 + * + * @DataSource(name="master") 可以通过注解方式切换数据库 + */ + @GetMapping("/changeDataSource") + @Operation(summary = "切换数据库") + public ResponseResult changeDataSource(Integer type) { + if (type == null) { + return ResponseResult.error("参数为空"); + } + String dataBase = dataSourceAspect.getDataBase(type); + String mess = "已切换为" + dataBase + "数据库"; + return ResponseResult.success(mess); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/LoginController.java b/framework/src/main/java/com/yfd/platform/system/controller/LoginController.java new file mode 100644 index 0000000..ac08378 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/LoginController.java @@ -0,0 +1,238 @@ +package com.yfd.platform.system.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import cn.hutool.jwt.JWTUtil; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.wf.captcha.base.Captcha; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.config.WebConfig; +import com.yfd.platform.config.bean.LoginCodeEnum; +import com.yfd.platform.config.bean.LoginProperties; +import com.yfd.platform.constant.Constant; +import com.yfd.platform.system.domain.LoginUser; +import com.yfd.platform.system.domain.SysLog; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.service.ISysLogService; +import com.yfd.platform.system.service.IUserService; +import com.yfd.platform.utils.RequestHolder; +import com.yfd.platform.utils.RsaUtils; +import com.yfd.platform.utils.StringUtils; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.sql.Timestamp; +import java.util.HashMap; +import java.util.Map; + +/** + * @author TangWei + */ +@RestController +@RequestMapping("/user") +@Tag(name = "用户登录") +public class LoginController { + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private WebConfig webConfig; + + @Resource + private IUserService userService; + + @Value("${rsa.private_key}") + private String privateKey; + + @Resource + private ISysLogService sysLogService; + + @Resource + private LoginProperties loginProperties; + + @PostMapping("/login") + @Operation(summary = "登录用户") + @ResponseBody + public ResponseResult login(SysUser user) throws Exception { + // 密码解密 + String password = RsaUtils.decryptByPrivateKey(privateKey, + user.getPassword()); + + // 是否需要验证码不需要改成false + boolean hascode = true; + if (hascode) { + // 查询验证码 + String code = webConfig.loginuserCache().get(user.getUuid()); + // 清除验证码 + webConfig.loginuserCache().remove(user.getUuid()); + if (StrUtil.isBlank(code)) { + return ResponseResult.error("验证码不存在或已过期"); + } + if (StrUtil.isBlank(user.getCode()) || !user.getCode().equalsIgnoreCase(code)) { + return ResponseResult.error("验证码错误"); + } + } + //如果认证通过了,使用userId生成token token存入ResponseResult返回 + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(user.getUsername(), + password); + Authentication authenticate = + authenticationManager.authenticate(authenticationToken); + if (ObjectUtil.isNull(authenticate)) { + return ResponseResult.unlogin(); + } + LoginUser loginUser = (LoginUser) authenticate.getPrincipal(); + Integer status = loginUser.getUser().getStatus(); + if ("0".equals(status.toString())) { + return ResponseResult.error("账号已停用"); + } + HttpServletRequest request = RequestHolder.getHttpServletRequest(); + SysLog sysLog = new SysLog(); + sysLog.setUsercode(user.getUsername()); + sysLog.setUsername(loginUser.getUser().getNickname()); + sysLog.setRequestip(StringUtils.getIp(request)); + sysLog.setBrowser(StringUtils.getBrowser(request)); + sysLog.setOpttype("登录(login)"); + sysLog.setModule("用户登录"); + String className = this.getClass().getName(); + String method = + Thread.currentThread().getStackTrace()[1].getMethodName(); + sysLog.setMethod(className + "." + method + "()"); + //sysLog.setParams(user.toString()); + sysLog.setDescription(loginUser.getUser().getNickname() + "登录系统!"); + sysLog.setLogtime(new Timestamp(System.currentTimeMillis())); + sysLogService.save(sysLog); + String userId = loginUser.getUser().getId(); + Map map = new HashMap(10) { + private static final long serialVersionUID = 1L; + + { + put("userid", userId); + put("username", loginUser.getUsername()); + long expireTime = + System.currentTimeMillis() + (long) (30L * 24L * 60L * 60L * 1000L); + put("expire_time", expireTime);//个月过期 + } + }; + + String token = JWTUtil.createToken(map, "12345678".getBytes()); + map.put("token", token); + //把完整的用户信息存入到HuTool缓存中,userId作为key + String jsonStr = JSONUtil.toJsonStr(loginUser); + webConfig.loginuserCache().put("login:" + userId, jsonStr); + webConfig.loginuserCache().put("expire_time:" + userId, map.get("expire_time").toString()); + return ResponseResult.successData(map); + } + + @Operation(summary = "获取验证码") + @GetMapping(value = "/code") + public ResponseResult getCode() { + // 获取运算的结果 + Captcha captcha = loginProperties.getCaptcha(); + String uuid = Constant.CODE_KEY + IdUtil.simpleUUID(); + //当验证码类型为 arithmetic时且长度 >= 2 时,captcha.text()的结果有几率为浮点型 + String captchaValue = captcha.text(); + if (captcha.getCharType() - 1 == LoginCodeEnum.arithmetic.ordinal() && captchaValue.contains(".")) { + captchaValue = captchaValue.split("\\.")[0]; + } + // 保存 + //redisUtils.set(uuid, captchaValue, loginProperties.getLoginCode() + // .getExpiration(), TimeUnit.MINUTES); + // 将验证码放入缓存,设置失效时间为60秒 + webConfig.loginuserCache().put(uuid, captchaValue, + Constant.CODE_EXPIRATION_TIME); + // 验证码信息 + Map imgResult = new HashMap(2) {{ + put("img", captcha.toBase64()); + put("uuid", uuid); + }}; + return ResponseResult.successData(imgResult); + } + + @PostMapping("/logout") + @Operation(summary = "退出登录") + @ResponseBody + public ResponseResult logout() { + //获取SecurityContextHolder中的用户id + UsernamePasswordAuthenticationToken authentication = + (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); + LoginUser loginuser = (LoginUser) authentication.getPrincipal(); + String userId = loginuser.getUser().getId(); + //删除redis中的登陆用户信息 + webConfig.loginuserCache().remove("login:" + userId); + //记录退出日志 + HttpServletRequest request = RequestHolder.getHttpServletRequest(); + SysLog sysLog = new SysLog(); + sysLog.setUsercode(loginuser.getUsername()); + sysLog.setUsername(loginuser.getUser().getNickname()); + sysLog.setRequestip(StringUtils.getIp(request)); + sysLog.setBrowser(StringUtils.getBrowser(request)); + sysLog.setOpttype("其他(other)"); + sysLog.setModule("注销退出"); + sysLog.setDescription("注销退出系统!"); + sysLog.setLogtime(new Timestamp(System.currentTimeMillis())); + sysLogService.save(sysLog); + return ResponseResult.success(); + } + + @Log(module = "用户登录", value = "更改用户密码") + @GetMapping("/updatePassword") + @Operation(summary = "更改用户密码") + @ResponseBody + public ResponseResult updatePassword(@RequestBody SysUser user) throws Exception { + // 密码解密 + String password = RsaUtils.decryptByPrivateKey(privateKey, + user.getPassword()); + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + String cryptPassword = passwordEncoder.encode(password); + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("password", cryptPassword); + updateWrapper.eq("id", user.getId()); + userService.update(updateWrapper); + return ResponseResult.success(); + } + + @GetMapping("/me") + @Operation(summary = "查询当前用户信息") + @ResponseBody + public ResponseResult getUserInfo() { + ResponseResult responseResult = userService.getLoginUserInfo(); + return ResponseResult.successData(responseResult); + } + + @Log(module = "用户登录", value = "修改个人信息") + @PostMapping("/updatePersonalInfo") + @Operation(summary = "修改个人信息") + @ResponseBody + public ResponseResult updateUser(@org.springframework.web.bind.annotation.RequestBody SysUser user) { + if (StrUtil.isEmpty(user.getId())) { + return ResponseResult.error("没有用户ID"); + } + //填写 当前用户名称 + user.setLastmodifier(userService.getUsername()); + //填写 当前日期 + user.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + boolean ok = userService.updateById(user); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/MessageController.java b/framework/src/main/java/com/yfd/platform/system/controller/MessageController.java new file mode 100644 index 0000000..58f61ba --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/MessageController.java @@ -0,0 +1,150 @@ +package com.yfd.platform.system.controller; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.MessageConfig; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.config.WebConfig; +import com.yfd.platform.system.domain.Message; +import com.yfd.platform.system.service.IMessageService; +import com.yfd.platform.system.service.IUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import java.sql.Timestamp; +import java.util.*; + +/** + *

    + * 消息通知 前端控制器 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +@RestController +@RequestMapping("/system/message") +@Tag(name = "消息通知") +public class MessageController { + + @Resource + private IMessageService messageService; + + @Resource + private MessageConfig messageConfig; + + @Operation(summary = "查询消息") + @GetMapping("/getMessageList") + public ResponseResult getMessageList(Page page, + String status, String title, + String type, String startDate, + String endDate) { + if (StrUtil.isBlank(status)) { + return ResponseResult.error("参数为空"); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if ("0".equals(status)) { + queryWrapper.eq(Message::getStatus, "1"); + } else { + List statusList = new ArrayList<>(); + statusList.add("2"); + statusList.add("9"); + queryWrapper.in(Message::getStatus, statusList); + + if (StrUtil.isNotBlank(title)) { + queryWrapper.like(Message::getTitle, title); + } + + if (StrUtil.isNotBlank(type)) { + queryWrapper.eq(Message::getType, type); + } + + DateTime parseStartDate = DateUtil.parse(startDate); + DateTime parseEndDate = DateUtil.parse(endDate); + DateTime dateTime = DateUtil.offsetDay(parseEndDate, 1); + + if (parseStartDate != null && parseEndDate != null) { + queryWrapper.ge(Message::getCreatetime, parseStartDate).lt(Message::getCreatetime, dateTime); + } + } + queryWrapper.orderByDesc(Message::getCreatetime); + Page pageList = messageService.page(page, queryWrapper); + return ResponseResult.successData(pageList); + } + + @Operation(summary = "根据ID查询消息") + @GetMapping("/getMessageById") + public ResponseResult getMessageById(String id) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + Message message = messageService.getById(id); + Map map = new HashMap<>(); + map.put("title", message.getTitle()); + map.put("content", message.getContent()); + map.put("createtime", message.getCreatetime()); + return ResponseResult.successData(map); + } + + @Log(module = "消息通知",value = "根据ID删除消息") + @Operation(summary = "根据ID删除消息") + @PostMapping("/deleteMessageById") + public ResponseResult deleteMessageById(@RequestParam String id) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + String[] split = id.split(","); + List idList = Arrays.asList(split); + boolean ok = messageService.removeByIds(idList); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error("删除失败"); + } + + } + + @Log(module = "消息通知", value = "将消息标记为已阅状态") + @Operation(summary = "标记已阅") + @PostMapping("/setMessageStatus") + public ResponseResult setMessageStatus(@RequestParam String id) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + String[] split = id.split(","); + long time = System.currentTimeMillis(); + for (String mid : split) { + Message message = messageService.getById(mid); + if ("9".equals(message.getStatus())) { + continue; + } + message.setStatus("2"); + message.setReadtime(new Timestamp(time)); + messageService.updateById(message); + } + messageConfig.sendMessage(); + return ResponseResult.success(); + } + + @Operation(summary = "全部已阅") + @PostMapping("/setAllMessageStatus") + public ResponseResult setAllMessageStatus() { + long time = System.currentTimeMillis(); + List list = + messageService.list(new LambdaQueryWrapper().eq(Message::getStatus, "1")); + for (Message message : list) { + message.setStatus("2"); + message.setReadtime(new Timestamp(time)); + messageService.updateById(message); + } + messageConfig.sendMessage(); + return ResponseResult.success(); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/QuartzJobController.java b/framework/src/main/java/com/yfd/platform/system/controller/QuartzJobController.java new file mode 100644 index 0000000..9da6c89 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/QuartzJobController.java @@ -0,0 +1,183 @@ +package com.yfd.platform.system.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.QuartzJob; +import com.yfd.platform.system.service.IQuartzJobService; +import com.yfd.platform.system.service.impl.UserServiceImpl; +import com.yfd.platform.utils.QuartzManage; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.quartz.CronExpression; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import java.sql.Timestamp; +import java.time.LocalDateTime; + +/** + *

    + * 定时任务 前端控制器 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +@RestController +@RequestMapping("/system/quartzjob") +@Tag(name = "定时任务") +@Transactional +public class QuartzJobController { + + @Resource + private IQuartzJobService quartzJobService; + + @Resource + private UserServiceImpl currentUser; + + @Resource + private QuartzManage quartzManage; + + @Operation(summary = "查询定时任务") + @GetMapping("/getQuartzJobList") + public ResponseResult getQuartzJobList(Page page, + String jobName) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(jobName)) { + queryWrapper.like(QuartzJob::getJobName, jobName); + } + queryWrapper.orderByAsc(QuartzJob::getOrderno); + Page pageList = quartzJobService.page(page, queryWrapper); + return ResponseResult.successData(pageList); + } + + @Log(module = "定时任务管理", value = "新增定时任务") + @Operation(summary = "新增定时任务") + @PostMapping("/addQuartzJob") + public ResponseResult addQuartzJob(@RequestBody QuartzJob quartzJob) { + if (quartzJob == null) { + return ResponseResult.error("参数为空"); + } + // 添加最近修改人 + quartzJob.setLastmodifier(currentUser.getUsername()); + // 添加最近修改时间 + quartzJob.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + if (StrUtil.isBlank(quartzJob.getJobCron()) || !CronExpression.isValidExpression(quartzJob.getJobCron())) { + return ResponseResult.error("cron表达式格式错误"); + } + quartzJob.setStatus("0"); + boolean ok = quartzJobService.addQuartzJob(quartzJob); + quartzManage.addJob(quartzJob); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error("新增失败"); + } + } + + @Log(module = "定时任务管理", value = "设置定时任务是否有效") + @Operation(summary = "设置定时任务是否有效") + @PostMapping("/setQuartzStatus") + public ResponseResult setQuartzStatus(@RequestParam String id, + @RequestParam String status) { + if (StrUtil.isBlank(id) || StrUtil.isBlank(status)) { + return ResponseResult.error("参数为空"); + } + LambdaUpdateWrapper updateWrapper = + new LambdaUpdateWrapper<>(); + //根据id 更新状态,最近修改人,最近修改时间 + updateWrapper.eq(QuartzJob::getId, id).set(QuartzJob::getStatus, + status).set( + QuartzJob::getLastmodifier, currentUser.getUsername()).set(QuartzJob::getLastmodifydate, + LocalDateTime.now()); + boolean ok = quartzJobService.update(updateWrapper); + QuartzJob quartzJob = quartzJobService.getById(id); + if ("0".equals(quartzJob.getStatus())) { + quartzManage.pauseJob(quartzJob); + } else { + quartzManage.resumeJob(quartzJob); + } + + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + @Operation(summary = "根据ID查询定时任务") + @GetMapping("/getQuartzJobById") + public ResponseResult getQuartzJobById(String id) { + QuartzJob quartzJob = quartzJobService.getById(id); + return ResponseResult.successData(quartzJob); + } + + @Log(module = "定时任务管理", value = "修改定时任务") + @Operation(summary = "修改定时任务") + @PostMapping("/updateQuartzJob") + @Transactional(rollbackFor = Exception.class) + public ResponseResult updateQuartzJob(@RequestBody QuartzJob quartzJob) { + // 添加最近修改人 + quartzJob.setLastmodifier(currentUser.getUsername()); + // 添加最近修改时间 + quartzJob.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + if (StrUtil.isBlank(quartzJob.getJobCron()) || !CronExpression.isValidExpression(quartzJob.getJobCron())) { + return ResponseResult.error("cron表达式格式错误"); + } + boolean ok = quartzJobService.updateById(quartzJob); + quartzManage.updateJobCron(quartzJob); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error("修改失败"); + } + } + + @Log(module = "定时任务管理", value = "删除定时任务") + @Operation(summary = "删除定时任务") + @PostMapping("/deleteQuartzJob") + public ResponseResult deleteQuartzJob(@RequestParam String id) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + boolean ok = quartzJobService.deleteQuartzJob(id); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error("删除失败"); + } + } + + @Log(module = "定时任务管理", value = "执行定时任务") + @Operation(summary = "执行定时任务") + @PostMapping("/execution") + public ResponseResult execution(@RequestParam String id) { + quartzJobService.execution(quartzJobService.getById(id)); + return ResponseResult.success(); + } + + /********************************** + * 用途说明: 拖动修改定时顺序 + * 参数说明 fromID 当前ID toID 到达ID + * 返回值说明: com.yfd.platform.config.ResponseResult 成功或者失败 + ***********************************/ + @Log(module = "定时任务管理", value = "拖动定时任务") + @PostMapping("/changeDictOrder") + @Operation(summary = "拖动修改定时任务顺序") + public ResponseResult changeQuartzOrder(@RequestParam String fromID, + @RequestParam String toID) { + + boolean ok = quartzJobService.changeDictOrder(fromID, toID); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/SSEController.java b/framework/src/main/java/com/yfd/platform/system/controller/SSEController.java new file mode 100644 index 0000000..41adfbb --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/SSEController.java @@ -0,0 +1,59 @@ +package com.yfd.platform.system.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yfd.platform.component.ServerSendEventServer; +import com.yfd.platform.config.WebConfig; +import com.yfd.platform.constant.Constant; +import com.yfd.platform.system.domain.Message; +import com.yfd.platform.system.service.IMessageService; +import com.yfd.platform.system.service.IUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import jakarta.annotation.Resource; + +/** + * @author Huhailong + */ +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/sse") +@Tag(name = "SSE推送服务") +public class SSEController { + + @Resource + private IMessageService messageService; + + @GetMapping("/connect/{token}") + @Operation(summary = "建立连接") + public SseEmitter connect(@PathVariable String token) { + SseEmitter connect = ServerSendEventServer.connect(token); + long count = + messageService.count(new LambdaQueryWrapper().eq(Message::getStatus, "1")); + ServerSendEventServer.sendMessage(token, count + ""); + return connect; + } + + @GetMapping("/sendmsg") + @Operation(summary = "发送消息") + public void sendMessage(String token, String message) throws InterruptedException { + + ServerSendEventServer.sendMessage(token, message); + } + + @GetMapping("/sendgroupmsg") + @Operation(summary = "多人发送消息") + public void sendgroupmsg(String groupid, String message) throws InterruptedException { + ServerSendEventServer.groupSendMessage(groupid, message); + } + + @GetMapping("/disconnect/{token}") + @Operation(summary = "关闭连接") + public void disconnect(@PathVariable String token) throws InterruptedException { + ServerSendEventServer.removeUser(token); + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/SysConfigController.java b/framework/src/main/java/com/yfd/platform/system/controller/SysConfigController.java new file mode 100644 index 0000000..3cfa7cc --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/SysConfigController.java @@ -0,0 +1,68 @@ +package com.yfd.platform.system.controller; + + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysConfig; +import com.yfd.platform.system.service.ISysConfigService; +import com.yfd.platform.system.service.IUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import javax.sound.sampled.UnsupportedAudioFileException; +import java.io.IOException; +import java.sql.Timestamp; + + +/** + *

    + * 系统全局配置 前端控制器 + *

    + * + * @author zhengsl + * @since 2022-01-19 + */ +@RestController + @RequestMapping("/system/config") +@Tag(name = "系统全局配置") +public class SysConfigController { + @Resource + private ISysConfigService configService; + + @Resource + private IUserService userService; + + @PostMapping("/getOneById") + @Operation(summary = "根据id查询全局配置详情记录") + @ResponseBody + public SysConfig getOneById(String id){ + return configService.getById(id); + } + + @PostMapping("/addConfig") + @Operation(summary = "根据id查询全局配置详情记录") + @ResponseBody + public ResponseResult addConfig(@RequestBody SysConfig config ) throws IOException, UnsupportedAudioFileException { + if (StrUtil.isEmpty(config.getId())){ + config.setId(IdUtil.fastSimpleUUID()); } + config.setLastmodifier(userService.getUsername()); + config.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + boolean ok=configService.save(config); + return ResponseResult.success(); + } + + @PostMapping("/updateById") + @Operation(summary = "根据id修改全局配置记录") + @ResponseBody + public ResponseResult updateById(@RequestBody SysConfig config) throws IOException, UnsupportedAudioFileException { + config.setLastmodifier(userService.getUsername()); + config.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + boolean ok=configService.updateById(config); + return ResponseResult.success(); + } + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/SysDictionaryController.java b/framework/src/main/java/com/yfd/platform/system/controller/SysDictionaryController.java new file mode 100644 index 0000000..70a5fdf --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/SysDictionaryController.java @@ -0,0 +1,142 @@ +package com.yfd.platform.system.controller; + +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysDictionary; +import com.yfd.platform.system.mapper.SysDictionaryItemsMapper; +import com.yfd.platform.system.service.ISysDictionaryService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.Objects; + +/** + *

    + * 数据字典表 前端控制器 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +@RestController +@RequestMapping("/system/dictionary") +@Tag(name = "数据字典") +public class SysDictionaryController { + + @Resource + private ISysDictionaryService sysDictionaryService; + + /********************************** + * 用途说明: 获取数据字典列表 + * 参数说明 dictType 字典类型 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 + ***********************************/ + @GetMapping("/dictList") + @Operation(summary = "获取数据字典列表") + public ResponseResult getDictList(String dictType) { + if (StrUtil.isBlank(dictType)) { + return ResponseResult.error("参数为空"); + } + List sysDictionaries = + sysDictionaryService.getDictList(dictType); + return ResponseResult.successData(sysDictionaries); + } + + /********************************** + * 用途说明: 根据ID删除字典 + * 参数说明 id 字典ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回删除结果成功或者失败 + ***********************************/ + @Log(module = "数据字典", value = "根据ID删除字典") + @PostMapping("/deleteById") + @Operation(summary = "根据ID删除字典") + public ResponseResult deleteDictById(@RequestParam String id) { + boolean ok = sysDictionaryService.deleteDictById(id); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /********************************** + * 用途说明: 新增字典 + * 参数说明 sysDictionary 字典对象 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回增加成功或者失败 + ***********************************/ + @Log(module = "数据字典", value = "新增数据字典") + @PostMapping("/addDict") + @Operation(summary = "新增字典") + public ResponseResult addDict(@RequestBody SysDictionary sysDictionary) { + if (sysDictionary == null) { + return ResponseResult.error("参数为空"); + } + boolean ok = sysDictionaryService.addDict(sysDictionary); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /********************************** + * 用途说明: 修改字典 + * 参数说明 sysDictionary 字典对象 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回修改成功或者失败 + ***********************************/ + @Log(module = "数据字典", value = "修改数据字典") + @PostMapping("/updateDict") + @Operation(summary = "修改字典") + public ResponseResult updateDict(@RequestBody SysDictionary sysDictionary) { + if (sysDictionary == null) { + return ResponseResult.error("参数为空"); + } + boolean ok = sysDictionaryService.updateById(sysDictionary); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /********************************** + * 用途说明: 根据ID查询字典 + * 参数说明 sysDictionary 字典对象 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回查询结果 + ***********************************/ + @PostMapping("/getDictById") + @Operation(summary = "根据ID查询字典") + public ResponseResult getDictById(String id) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + SysDictionary sysDictionary = sysDictionaryService.getById(id); + return ResponseResult.successData(sysDictionary); + } + + /********************************** + * 用途说明: 拖动修改字典顺序 + * 参数说明 fromID 当前ID toID 到达ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回拖动成功或者失败 + ***********************************/ + @Log(module = "数据字典", value = "拖动修改字典顺序") + @PostMapping("/changeDictOrder") + @Operation(summary = "拖动修改字典顺序") + public ResponseResult changeDictOrder(@RequestParam String fromID, + @RequestParam String toID) { + + boolean ok = sysDictionaryService.changeDictOrder(fromID, toID); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/SysDictionaryItemsController.java b/framework/src/main/java/com/yfd/platform/system/controller/SysDictionaryItemsController.java new file mode 100644 index 0000000..bf85d30 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/SysDictionaryItemsController.java @@ -0,0 +1,201 @@ +package com.yfd.platform.system.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysDictionaryItems; +import com.yfd.platform.system.mapper.SysDictionaryItemsMapper; +import com.yfd.platform.system.service.ISysDictionaryItemsService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import java.util.Arrays; +import java.util.List; + +/** + *

    + * 数据字典明细 前端控制器 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +@RestController +@RequestMapping("/system/dictionaryItems") +@Tag(name = "数据字典项") +public class SysDictionaryItemsController { + + @Resource + private ISysDictionaryItemsService sysDictionaryItemsService; + + /********************************** + * 用途说明: 分页查询字典项信息 + * 参数说明 dictID 字典ID ItemName 字典项名称 pageNum 当前页 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 + ***********************************/ + @GetMapping("/page") + @Operation(summary = "分页查询字典项信息") + public ResponseResult getDictItemPage(String dictId, String dictName, + Page page) { + + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + queryWrapper.eq(SysDictionaryItems::getDictId, dictId).orderByAsc(SysDictionaryItems::getOrderNo); + + // 查询前将序号初始化 + List list = + sysDictionaryItemsService.list(queryWrapper); + for (int i = 0; i < list.size(); i++) { + SysDictionaryItems sysDictionaryItems = list.get(i); + sysDictionaryItems.setOrderNo(i + 1); + sysDictionaryItemsService.updateById(sysDictionaryItems); + } + Page sysDictionaryItemsPage = + sysDictionaryItemsService.getDictItemPage(dictId, dictName, + page); + + return ResponseResult.successData(sysDictionaryItemsPage); + } + + /********************************** + * 用途说明: 增加字典项 + * 参数说明 sysDictionaryItems 字典项信息 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回增加成功或者失败 + ***********************************/ + @Log(module = "数据字典项", value = "增加字典项") + @PostMapping("/addDictionaryItem") + @Operation(summary = "增加字典项") + public ResponseResult addDictionaryItem(@RequestBody SysDictionaryItems sysDictionaryItems) { + if (sysDictionaryItems == null) { + return ResponseResult.error("参数为空"); + } + boolean ok = + sysDictionaryItemsService.addDictionaryItem(sysDictionaryItems); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /********************************** + * 用途说明: 修改字典项 + * 参数说明 sysDictionaryItems 字典项信息 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回修改成功或者失败 + ***********************************/ + @Log(module = "数据字典项", value = "修改字典项") + @PostMapping("/updateDictionaryItem") + @Operation(summary = "修改字典项") + public ResponseResult updateDictionaryItem(@RequestBody SysDictionaryItems sysDictionaryItems) { + if (sysDictionaryItems == null) { + return ResponseResult.error("参数为空"); + } + boolean ok = + sysDictionaryItemsService.updateById(sysDictionaryItems); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /********************************** + * 用途说明: 根据ID查询字典项 + * 参数说明 id 字典项ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回字典项信息 + ***********************************/ + @GetMapping("/getDictItemById") + @Operation(summary = "根据ID查询字典项") + public ResponseResult getDictItemById(String id) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + SysDictionaryItems sysDictionaryItems = + sysDictionaryItemsService.getById(id); + return ResponseResult.successData(sysDictionaryItems); + } + + /********************************** + * 用途说明: 根据ID删除字典项 + * 参数说明 id 字典项ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回删除成功或者失败 + ***********************************/ + @Log(module = "数据字典项", value = "根据ID删除字典项") + @PostMapping("/deleteDictItemById") + @Operation(summary = "根据ID删除字典项") + public ResponseResult deleteDictItemById(@RequestParam String id) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + boolean ok = sysDictionaryItemsService.removeById(id); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /********************************** + * 用途说明: 批量删除字典项 + * 参数说明 ids 字典项id数组 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回批量删除成功或失败 + ***********************************/ + @Log(module = "数据字典项", value = "批量删除字典项") + @PostMapping("/deleteDictItemByIds") + @Operation(summary = "批量删除字典项") + public ResponseResult deleteDictItemByIds(@RequestParam String id) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + String[] splitIds = id.split(","); + // 数组转集合 + List ids = Arrays.asList(splitIds); + boolean ok = sysDictionaryItemsService.removeByIds(ids); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /********************************** + * 用途说明: 拖动修改字典项顺序 + * 参数说明 fromID 当前ID toID 到达ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回拖动成功或者失败 + ***********************************/ + @Log(module = "数据字典项", value = "拖动修改字典项顺序") + @PostMapping("/changeItemOrder") + @Operation(summary = "拖动修改字典项顺序") + public ResponseResult changeItemOrder(@RequestParam String fromID, + @RequestParam String toID) { + boolean ok = sysDictionaryItemsService.changeItemOrder(fromID, toID); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /********************************** + * 用途说明: 导出数据字典项数据 + * 参数说明 sysDictionaryItemsList 所需导出的字典项集合 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回导出成功或失败 + ***********************************/ + @Log(module = "数据字典项", value = "导出字典数据到Excel") + @GetMapping("/exportExcel") + @Operation(summary = "导出数据字典项数据") + public void exportExcel(String dictID, String itemName, + Page page, + HttpServletResponse response) { + Page sysDictionaryItemsPage = + sysDictionaryItemsService.getDictItemPage(dictID, itemName, + page); + sysDictionaryItemsService.exportExcel(sysDictionaryItemsPage.getRecords(), response); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/SysLogController.java b/framework/src/main/java/com/yfd/platform/system/controller/SysLogController.java new file mode 100644 index 0000000..9f2081a --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/SysLogController.java @@ -0,0 +1,74 @@ +package com.yfd.platform.system.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysLog; +import com.yfd.platform.system.service.ISysLogService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

    + * 系统操作日志 前端控制器 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +@RestController +@RequestMapping("/system/log") +@Tag(name = "系统日志") +public class SysLogController { + + @Resource + private ISysLogService sysLogService; + + /********************************** + * 用途说明: 分页查询日志信息 + * 参数说明 page分页对象、username(用户名)、(optType) + * 操作类型、startDate(开始日期)、endDate(结束日期) + * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 + ***********************************/ + @PostMapping("/getLogList") + @Operation(summary = "分页查询日志信息") + public ResponseResult getLogList(String username, String optType, + String startDate, + String endDate, Page page) { + + Page sysLogPage = sysLogService.getLogList(username, optType, + startDate, endDate, page); + Map map = new HashMap<>(); + map.put("list", sysLogPage.getRecords()); + map.put("total", sysLogPage.getTotal()); + map.put("size", sysLogPage.getSize()); + map.put("current", sysLogPage.getCurrent()); + return ResponseResult.successData(map); + } + + /********************************** + * 用途说明: 导出日志数据 + * 参数说明 sysLogs 所需导出的字典项集合 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回导出成功或者失败 + ***********************************/ + @Log(module = "系统日志", value = "导出系统日志到Excel") + @GetMapping("/exportExcel") + @Operation(summary = "导出日志数据") + public void exportExcel(String username, String optType, + String startDate, + String endDate, Page page, + HttpServletResponse response) throws IOException { + + Page sysLogPage = sysLogService.getLogList(username, optType, + startDate, endDate, page); + sysLogService.exportExcel(sysLogPage.getRecords(), response); + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/SysMenuController.java b/framework/src/main/java/com/yfd/platform/system/controller/SysMenuController.java new file mode 100644 index 0000000..70a16a0 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/SysMenuController.java @@ -0,0 +1,308 @@ +package com.yfd.platform.system.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysMenu; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.service.ISysMenuService; +import com.yfd.platform.system.service.IUserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.apache.catalina.User; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.annotation.Resource; +import java.io.File; +import java.io.FileNotFoundException; +import java.sql.Timestamp; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + *

    + * 菜单及按钮 前端控制器 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +@RestController +@RequestMapping("/system/menu") +@Tag(name = "菜单及按钮") +public class SysMenuController { + + @Resource + private ISysMenuService sysMenuService; + + @Resource + private IUserService userService; + + // 菜单图片路径通过服务层配置获取,无需在控制器注入 + + /*********************************** + * 用途说明:获取菜单结构树(含按钮) + * 参数说明 + * systemcode 系统 + * name 名称 + * isdisplay 是否显示 + * 返回值说明: 菜单结构树集合 + ***********************************/ + @PostMapping("/getMenuButtonTree") + @Operation(summary = "获取菜单结构树(含按钮)") + @ResponseBody + public List> getMenuButtonTree(String systemcode, + String name, + String isdisplay) { + return sysMenuService.getMenuButtonTree(systemcode, name, isdisplay); + } + + /*********************************** + * 用途说明:获取菜单结构树(不含按钮) + * 参数说明 + * systemcode 系统 + * name 名称 + * isdisplay 是否显示 + * 返回值说明: 菜单结构树集合 + ***********************************/ + @PostMapping("/getMenuTree") + @Operation(summary = "获取菜单结构树(不含按钮)") + @ResponseBody + public List> getMenuTree(String systemcode, + String name, + String isdisplay) { + return sysMenuService.getMenuTree(systemcode, name, isdisplay); + } + + /*********************************** + * 用途说明:权限分配 + * 参数说明 + * systemcode 系统 + * name 名称 + * isdisplay 是否显示 + * 返回值说明: 菜单结构树集合 + ***********************************/ + @PostMapping("/permissionAssignment") + @Operation(summary = "获取分配权限(不含按钮)") + @ResponseBody + public List> permissionAssignment(String roleId) { + + return sysMenuService.permissionAssignment(roleId); + } + + /********************************** + * 用途说明: 获取当前用户菜单结构树 + * 参数说明 + * 返回值说明: java.util.List + ***********************************/ + @GetMapping("/treeRoutes") + @Operation(summary = "获取当前用户菜单结构树") + @ResponseBody + public List> getMenuTreeByUser() { + SysUser userInfo = userService.getUserInfo(); + String id = ""; + if (0 != userInfo.getUsertype()) { + id = userInfo.getId(); + } + return sysMenuService.getMenuTree(id); + } + + /*********************************** + * 用途说明:根据id查询菜单或按钮详情 + * 参数说明 + * id 菜单或按钮表id + * 返回值说明: 菜单或按钮表对象 + ***********************************/ + @PostMapping("/getOneById") + @Operation(summary = "根据id查询菜单或按钮详情") + @ResponseBody + public ResponseResult getOneById(String id) { + SysMenu sysMenu = sysMenuService.getById(id); + return ResponseResult.successData(sysMenu); + } + + /*********************************** + * 用途说明:新增菜单及按钮 + * 参数说明 + * sysMenu 菜单或按钮表对象 + * 返回值说明: 是否添加成功提示 + ***********************************/ + @Log(module = "菜单及按钮", value = "新增菜单及按钮!") + @PostMapping("/addMenu") + @Operation(summary = "新增菜单及按钮") + @ResponseBody + public ResponseResult addMenu(@RequestBody SysMenu sysMenu) { + boolean isOk = sysMenuService.addMenu(sysMenu); + if (isOk) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:修改菜单及按钮 + * 参数说明 + * sysMenu 菜单或按钮表对象 + * 返回值说明: 是否修改成功提示 + ***********************************/ + @Log(module = "菜单及按钮", value = "修改菜单及按钮") + @PostMapping("/updateById") + @Operation(summary = "修改菜单及按钮") + @ResponseBody + public ResponseResult updateById(@RequestBody SysMenu sysMenu) { + sysMenu.setLastmodifier(userService.getUsername()); + sysMenu.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + boolean isOk = sysMenuService.updateById(sysMenu); + if (isOk) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:根据id删除单个图标 + * 参数说明 + * id 删除图标id + * icon 图标名称 + * 返回值说明: 是否删除成功 + ***********************************/ + @Log(module = "菜单及按钮", value = "根据id删除单个图标!") + @PostMapping("/deleteIcon") + @Operation(summary = "根据id删除单个图标") + @ResponseBody + public ResponseResult deleteIcon(@RequestParam String id) { + boolean ok = sysMenuService.deleteIcon(id); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:更新菜单及按钮是否有效 + * 参数说明 + * id 菜单及按钮表id + * isdisplay 是否有效字段 + * 返回值说明: 是否更新成功 + ***********************************/ + @Log(module = "菜单及按钮", value = "更新菜单及按钮是否有效!") + @PostMapping("/setIsDisplay") + @Operation(summary = "更新菜单及按钮是否有效") + @ResponseBody + public ResponseResult setIsDisplay(String id, String isdisplay) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + //根据id 修改是否显示 ,最近修改人,最近修改时间 + updateWrapper.eq("id", id).set("isdisplay", isdisplay).set( + "lastmodifier", userService.getUsername()).set( + "lastmodifydate", + new Timestamp(System.currentTimeMillis())); + boolean ok = sysMenuService.update(updateWrapper); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:菜单及按钮序号排序 + * 参数说明 + * parentid 上级id + * orderMap map<菜单及按钮表id,排列序号> + * 返回值说明: 是否更新成功 + ***********************************/ + @Log(module = "菜单及按钮", value = "菜单及按钮序号排序!") + @PostMapping("/moveOrderno") + @Operation(summary = "菜单及按钮序号排序") + @ResponseBody + public ResponseResult moveOrderno(@RequestParam String parentid, + @RequestParam String id, + @RequestParam int orderno) { + boolean ok = sysMenuService.moveOrderno(parentid, id, orderno); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:根据id删除菜单或按钮 + * 参数说明 + * id 删除列的id + * 返回值说明: 是否删除成功 + ***********************************/ + @Log(module = "菜单及按钮", value = "根据id删除菜单或按钮!") + @PostMapping("/deleteById") + @Operation(summary = "根据id删除菜单或按钮") + @ResponseBody + public ResponseResult deleteById(@RequestParam String id) { + boolean ok = sysMenuService.deleteById(id); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /********************************** + * 用途说明: 菜单或者按钮拖动 + * 参数说明 id + * 参数说明 id1 + * 返回值说明: com.yfd.platform.config.ResponseResult + ***********************************/ + @Log(module = "菜单及按钮", value = "拖动修改菜单或按钮同级顺序!") + @PostMapping("/changeMenuOrder") + @Operation(summary = "菜单或按钮切换") + @ResponseBody + public ResponseResult changeMenuOrder(@RequestParam String fromId, + @RequestParam String toId) { + if (StrUtil.isBlank(fromId) || StrUtil.isBlank(toId)) { + return ResponseResult.error("参数为空!"); + } + if (fromId.equals(toId)) { + return ResponseResult.error("切换失败!"); + } + boolean ok = sysMenuService.changeOderNoById(fromId, toId); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:上传单个图标 + * 参数说明 + * icon 图标 + * 返回值说明: 是否上传成功 + ***********************************/ + @PostMapping("/uploadIcon") + @Operation(summary = "上传单个图标") + @ResponseBody + public ResponseResult uploadIcon(MultipartFile icon, String menuId) throws FileNotFoundException { + if (StrUtil.isNotBlank(menuId)) { + SysMenu sysMenu = sysMenuService.getById(menuId); + //图片路径 + String iconname = + System.getProperty("user.dir") + "\\src\\main" + + "\\resources\\static\\icon" + File.separator + sysMenu.getIcon(); + //删除图标 + new File(iconname).delete(); + } + String filename = sysMenuService.uploadIcon(icon); + SysMenu sysMenu = new SysMenu(); + sysMenu.setId(menuId); + sysMenu.setIcon(filename); + sysMenuService.updateById(sysMenu); + return ResponseResult.successData(filename); + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/SysOrganizationController.java b/framework/src/main/java/com/yfd/platform/system/controller/SysOrganizationController.java new file mode 100644 index 0000000..9f51b71 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/SysOrganizationController.java @@ -0,0 +1,210 @@ +package com.yfd.platform.system.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysOrganization; +import com.yfd.platform.system.domain.SysRole; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.mapper.SysRoleMapper; +import com.yfd.platform.system.service.ISysOrganizationService; +import com.yfd.platform.system.service.IUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import java.sql.Timestamp; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + *

    + * 系统组织框架 前端控制器 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +@RestController +@RequestMapping("/system/organization") +@Tag(name = "系统组织框架") +public class SysOrganizationController { + + @Resource + private ISysOrganizationService organizationService; + + @Resource + private IUserService userService; + + /*********************************** + * 用途说明:获取组织范围树结构 + * 参数说明 + *parentid 上级id + * params 名称(根据名称查询二级) + * 返回值说明: 组织树集合 + ***********************************/ + @PostMapping("/getOrgScopeTree") + @Operation(summary = "获取组织范围树结构") + @ResponseBody + public List> getOrgScopeTree(String roleId) { + return organizationService.getOrgScopeTree(roleId); + } + + /*********************************** + * 用途说明:获取组织范围 + * 参数说明 + * 返回值说明: 组织范围集合 + ***********************************/ + @PostMapping("/getOrgTree") + @Operation(summary = "获取组织结构树") + @ResponseBody + public List> getOrgTree(String parentid, + String params) { + return organizationService.getOrgTree(parentid, params); + } + + /*********************************** + * 用途说明:根据企业ID查询组织详情 + * 参数说明 + * id 企业id + * 返回值说明: 系统组织框架对象 + ***********************************/ + @PostMapping("/getOrganizationById") + @Operation(summary = "根据企业ID查询组织信息") + @ResponseBody + public ResponseResult getOrganizationById(String id, String orgName) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("查询失败!"); + } + List sysOrganizations = + organizationService.getOrganizationById(id, orgName); + return ResponseResult.successData(sysOrganizations); + } + + /*********************************** + * 用途说明:根据ID查询组织详情 + * 参数说明 + * id 系统组织id + * 返回值说明: 系统组织框架对象 + ***********************************/ + @PostMapping("/getOneById") + @Operation(summary = "根据ID查询组织详情") + @ResponseBody + public ResponseResult getOneById(String id) { + SysOrganization sysOrganization = organizationService.getById(id); + return ResponseResult.successData(sysOrganization); + } + + /*********************************** + * 用途说明:新增系统组织框架 + * 参数说明 + * sysOrganization 系统组织框架对象 + * 返回值说明: 是否新增成功 + ***********************************/ + @Log(module = "系统组织框架", value = "新增企业或者部门!") + @PostMapping("/addOrg") + @Operation(summary = "新增系统组织框架") + @ResponseBody + public ResponseResult addOrg(@RequestBody SysOrganization sysOrganization) { + //判断是否是否填写 有效 否则默认为 1 + if (StrUtil.isEmpty(sysOrganization.getIsvaild())) { + sysOrganization.setIsvaild("1"); + } + //填写 当前用户名称 + sysOrganization.setLastmodifier(userService.getUsername()); + //填写 当前日期 + sysOrganization.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + //新增 系统组织R + boolean isOk = organizationService.addOrg(sysOrganization); + if (isOk) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:修改系统组织框架 + * 参数说明 + * sysOrganization 系统组织框架对象 + * 返回值说明: 是否修改成功 + ***********************************/ + @Log(module = "系统组织框架", value = "修改企业或者部门信息!") + @PostMapping("/updateById") + @Operation(summary = "修改系统组织框架") + @ResponseBody + public ResponseResult updateById(@RequestBody SysOrganization sysOrganization) { + //填写 当前用户名称 + sysOrganization.setLastmodifier(userService.getUsername()); + //填写 当前日期 + sysOrganization.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + //根据id 修改系统组织 + boolean isOk = organizationService.updateById(sysOrganization); + if (isOk) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:修改系统组织框架 + * 参数说明 + * sysOrganization 系统组织框架对象 + * 返回值说明: 是否修改成功 + ***********************************/ + @Log(module = "系统组织框架", value = "设置企业/部门是否有效!") + @PostMapping("/setIsValid") + @Operation(summary = "设置组织是否有效") + @ResponseBody + public ResponseResult setIsValid(@RequestParam String id, + @RequestParam String isvaild) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + //根据id 修改是否有效,最近修改人,最近修改时间 + updateWrapper.eq("id", id).set("isvaild", isvaild).set("lastmodifier" + , userService.getUsername()).set("lastmodifydate", + new Timestamp(System.currentTimeMillis())); + boolean isOk = organizationService.update(updateWrapper); + if (isOk) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:根据id删除系统组织框架 + * 参数说明 + * id 系统组织框架id + * 返回值说明: 是否删除成功 + ***********************************/ + @Log(module = "系统组织框架", value = "根据ID删除企业或者部门!") + @PostMapping("/deleteById") + @Operation(summary = "根据id删除系统组织框架") + @ResponseBody + public ResponseResult deleteById(@RequestParam String id) { + String[] orgIds = id.split(","); + for (String orgId : orgIds) { + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + List list = + organizationService.list(queryWrapper.eq(SysOrganization::getParentid, orgId)); + List ids = + list.stream().map(SysOrganization::getId).collect(Collectors.toList()); + boolean isOk = organizationService.removeById(orgId); + if (!isOk) { + continue; + } + for (String oid : ids) { + organizationService.removeById(oid); + } + } + return ResponseResult.success(); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/SysRoleController.java b/framework/src/main/java/com/yfd/platform/system/controller/SysRoleController.java new file mode 100644 index 0000000..ea2fa0f --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/SysRoleController.java @@ -0,0 +1,324 @@ +package com.yfd.platform.system.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysRole; +import com.yfd.platform.system.service.ISysRoleService; +import com.yfd.platform.system.service.IUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + *

    + * 系统角色 前端控制器 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +@RestController +@RequestMapping("/system/role") +@Tag(name = "系统角色") +public class SysRoleController { + + @Resource + private ISysRoleService roleService; + + @Resource + private IUserService userService; + + /*********************************** + * 用途说明:查询所有角色 + * 参数说明 + * roleName 角色名称 + * 返回值说明: 查询都有角色 + ***********************************/ + @PostMapping("/list") + @Operation(summary = "查询所有角色") + @ResponseBody + public List list(String rolename) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StrUtil.isNotEmpty(rolename)) { + //根据角色名称模糊查询 + queryWrapper.like("rolename", rolename); + } + //根据角色级别,角色编号 正序排序 + queryWrapper.ne("level", "1").orderByAsc("level", "lastmodifydate"); + return roleService.list(queryWrapper); + } + + /*********************************** + * 用途说明:根据Id获取当个角色 + * 参数说明 + * id 角色表id + * 返回值说明: 根据id查询到角色详情 + ***********************************/ + @PostMapping("/getOneById") + @Operation(summary = "根据Id获取当个角色") + @ResponseBody + public ResponseResult getOneById(String id) { + SysRole sysRole = roleService.getById(id); + return ResponseResult.successData(sysRole); + } + + /*********************************** + * 用途说明:新增角色 + * 参数说明 + * sysRole 新增角色信息 + * 返回值说明: 是否新增成功 + ***********************************/ + @Log(module = "系统角色", value = "新增角色") + @PostMapping("/addRole") + @Operation(summary = "新增角色") + @ResponseBody + public ResponseResult addRole(@RequestBody SysRole sysRole) { + boolean isOk = roleService.addRole(sysRole); + if (isOk) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:分配操作权限 + * 参数说明 + * id 角色id + * optscope 分配的权限 + * 返回值说明: 是否新增成功 + ***********************************/ + @Log(module = "系统角色", value = "分配操作权限") + @PostMapping("/setOptScope") + @Operation(summary = "分配操作权限") + @ResponseBody + public ResponseResult setOptScope(@RequestParam String id, + @RequestParam String optscope) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + //根据id 更新权限,最近修改人,最近修改时间 + updateWrapper.eq("id", id).set("optscope", optscope).set( + "lastmodifier", userService.getUsername()).set( + "lastmodifydate", LocalDateTime.now()); + boolean ok = roleService.update(updateWrapper); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:角色菜单权限 + * 参数说明 + * id 角色id + * menuIds 权限id字符串 + * 返回值说明: 是否分配成功 + ***********************************/ + @Log(module = "系统角色", value = "角色菜单权限") + @PostMapping("/setMenuById") + @Operation(summary = "角色菜单权限") + @ResponseBody + public ResponseResult setMenuById(String id, String menuIds) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + if (StrUtil.isBlank(menuIds)) { + return ResponseResult.success(); + } + boolean ok = roleService.setMenuById(id, menuIds); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + + } + + /*********************************** + * 用途说明:设置组织范围 + * 参数说明 + * id 角色id + * orgscope 组织范围 + * 返回值说明: 是否新增成功 + ***********************************/ + @Log(module = "系统角色", value = "设置组织范围") + @PostMapping("/setOrgscope") + @Operation(summary = "设置组织范围") + @ResponseBody + public ResponseResult setOrgscope(@RequestParam String id, + @RequestParam String orgscope) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + //根据id 更新组织范围,最近修改人,最近修改时间 + updateWrapper.eq("id", id).set("orgscope", orgscope).set( + "lastmodifier", userService.getUsername()).set( + "lastmodifydate", LocalDateTime.now()); + boolean ok = roleService.update(updateWrapper); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:设置业务范围 + * 参数说明 + * id 角色id + * busscope 业务范围 + * 返回值说明: 是否新增成功 + ***********************************/ + @Log(module = "系统角色", value = "设置业务范围") + @PostMapping("/setBusscope") + @Operation(summary = "设置业务范围") + @ResponseBody + public ResponseResult setBusscope(@RequestParam String id, + @RequestParam String busscope) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + //根据id 更新业务范围,最近修改人,最近修改时间 + updateWrapper.eq("id", id).set("busscope", busscope).set( + "lastmodifier", userService.getUsername()).set( + "lastmodifydate", LocalDateTime.now()); + boolean ok = roleService.update(updateWrapper); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:角色添加用户 + * 参数说明 + * roleid 角色id + * userids 用户id组 + * 返回值说明: 是否新增成功 + ***********************************/ + @Log(module = "系统角色", value = "角色添加用户") + @PostMapping("/setRoleUsers") + @Operation(summary = "角色添加用户") + @ResponseBody + public ResponseResult setRoleUsers(String roleid, String userids) { + boolean isOk = true; + String[] temp = userids.split(","); + for (String userid : temp) { + isOk = isOk && userService.addUserRoles(roleid, userid); + } + if (isOk) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:删除角色用户 + * 参数说明 + * roleid 角色id + * 返回值说明: 是否新增成功 + ***********************************/ + @PostMapping("/deleteRoleUser") + @Operation(summary = "删除角色用户") + @ResponseBody + public ResponseResult deleteRoleUsers(@RequestParam String roleid, + @RequestParam String userids) { + //根据角色id、用户id删除 + boolean ok = roleService.deleteRoleUsers(roleid, userids); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:设置角色是否有效 + * 参数说明 + * id 角色id + *isvaild 是否有效(1 是 0 否 ) + * 返回值说明: 是否新增成功 + ***********************************/ + @PostMapping("/setIsvaild") + @Operation(summary = "设置角色是否有效") + @ResponseBody + public ResponseResult setIsvaild(String id, String isvaild) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + //根据id 更新业务范围,最近修改人,最近修改时间 + updateWrapper.eq("id", id).set("isvaild", isvaild).set("lastmodifier" + , userService.getUsername()).set("lastmodifydate", + LocalDateTime.now()); + boolean ok = roleService.update(updateWrapper); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:更新角色信息 + * 参数说明 + *sysRole 角色对象 + * 返回值说明: 是否修改成功 + ***********************************/ + @PostMapping("/updateById") + @Operation(summary = "更新角色信息") + @ResponseBody + public ResponseResult updateById(@RequestBody SysRole sysRole) { + //更新最近修改人 + sysRole.setLastmodifier(userService.getUsername()); + //更新最近修改时间 + sysRole.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + //根据id更新角色信息 + boolean ok = roleService.updateById(sysRole); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:根据id删除角色 + * 参数说明 + *id 角色id + * 返回值说明: 是否删除成功 + ***********************************/ + @PostMapping("/deleteById") + @Operation(summary = "根据id删除角色") + @ResponseBody + public ResponseResult deleteById(@RequestParam String id) { + roleService.deleteById(id); + return ResponseResult.success(); + } + + /*********************************** + * 用途说明:查询已分配的用户 + * 参数说明 + *orgid 所属组织 + *username 用户名称 + *status 状态 + *level 角色级别 + * rolename 角色名称 + * isvaild 角色是否有效 + * 返回值说明: 系统用户角色数据集合 + ***********************************/ + @PostMapping("/listRoleUsers") + @Operation(summary = "查询已分配的用户") + @ResponseBody + public List listRoleUsers(String orgid, String username, + String status, String level, + String rolename, String isvaild) { + return roleService.listRoleUsers(orgid, username, status, level, + rolename, isvaild); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/controller/UserController.java b/framework/src/main/java/com/yfd/platform/system/controller/UserController.java new file mode 100644 index 0000000..c90e345 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/controller/UserController.java @@ -0,0 +1,188 @@ +package com.yfd.platform.system.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.datasource.DataSource; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.service.IUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.annotation.Resource; +import java.sql.Timestamp; +import java.util.Map; + +/** + *

    + * 用户信息 前端控制器 + *

    + * + * @author zhengsl + * @since 2022-09-20 + */ +@RestController +@RequestMapping("/system/user") +@Tag(name = "系统用户") +public class UserController { + + @Resource + private IUserService userService; + + @Log(module = "系统用户", value = "新增系统用户") + @PostMapping("/addUser") + @Operation(summary = "新增系统用户") + @ResponseBody + public ResponseResult addUser(@RequestBody SysUser user, String roleids) { + Map reslut = userService.addUser(user, roleids); + return ResponseResult.successData(reslut); + } + + @Log(module = "系统用户", value = "修改用户信息") + @PostMapping("/updateUser") + @Operation(summary = "修改用户信息") + @ResponseBody + public ResponseResult updateUser(@RequestBody SysUser user, + String roleids) { + if (StrUtil.isEmpty(user.getId())) { + return ResponseResult.error("没有用户ID"); + } + //填写 当前用户名称 + user.setLastmodifier(userService.getUsername()); + //填写 当前日期 + user.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + Map reslut = userService.updateById(user, roleids); + return ResponseResult.successData(reslut); + } + + @GetMapping("/queryUsers") + @Operation(summary = "查询用户信息") + @ResponseBody + public ResponseResult queryUsers(String orgid, + String username, Page page) { + + Page> mapPage = userService.queryUsers(orgid, + username, page); + return ResponseResult.successData(mapPage); + } + + /*********************************** + * 用途说明:用户分配角色 + * 参数说明 + *idMap 用户id与角色id + * 返回值说明: 判断是否添加成功 + ************************************/ + @Log(module = "系统用户", value = "用户分配角色") + @PostMapping("/setUserRoles") + @Operation(summary = "用户分配角色") + @ResponseBody + public ResponseResult setUserRoles(String roleid, String userids) { + boolean ok = userService.setUserRoles(roleid, userids); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:根据id删除用户 + * 参数说明 + *id 用户id + * 返回值说明: 判断是否删除成功 + ************************************/ + @Log(module = "系统用户", value = "根据ID删除用户") + @PostMapping("/deleteById") + @Operation(summary = "根据ID删除用户") + @ResponseBody + public ResponseResult deleteById(String id) { + userService.deleteById(id); + return ResponseResult.success(); + } + + /*********************************** + * 用途说明:根据ID批量删除用户 + * 参数说明 + *ids 用户id集合 + * 返回值说明: 判断是否删除成功 + ************************************/ + @Log(module = "系统用户", value = "根据ID批量删除用户") + @PostMapping("/deleteUserByIds") + @Operation(summary = "根据ID批量删除用户") + @ResponseBody + public ResponseResult deleteUserByIds(String id) { + if (StrUtil.isBlank(id)) { + return ResponseResult.error("参数为空"); + } + boolean ok = userService.deleteUserByIds(id); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:重置用户密码(管理员) + * 参数说明 + *id 重置密码的 用户id + * 返回值说明: 判断是否重置成功 + ************************************/ + @Log(module = "系统用户", value = "重置用户密码") + @PostMapping("/resetPassword") + @Operation(summary = "重置用户密码") + @ResponseBody + @DataSource + public ResponseResult resetPassword(String id) throws Exception { + if (StrUtil.isBlank(id)) { + ResponseResult.error("参数为空"); + } + boolean ok = userService.resetPassword(id); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:设置账号状态(管理员) + * 参数说明 + *id 用户id + * status 设置状态 + * 返回值说明: 判断是否设置成功 + ************************************/ + @Log(module = "系统用户", value = "设置账号状态") + @PostMapping("/setStatus") + @Operation(summary = "设置账号状态") + @ResponseBody + public ResponseResult setStatus(@RequestParam String id, + @RequestParam String status) { + boolean ok = userService.setStatus(id, status); + if (ok) { + return ResponseResult.success(); + } else { + return ResponseResult.error(); + } + } + + /*********************************** + * 用途说明:修改头像(管理员) + * 参数说明 + * multipartFile 文件对象 + * status 设置状态 + * 返回值说明: 文件名 + ************************************/ + @Operation(summary = "修改头像") + @PostMapping(value = "/updateAvatar") + public ResponseResult updateAvatar(String id, MultipartFile multipartFile) { + if (multipartFile == null) { + ResponseResult.error("参数为空"); + } + boolean ok = userService.uploadAvatar(id, multipartFile); + return ResponseResult.success(); + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/Dictionary.java b/framework/src/main/java/com/yfd/platform/system/domain/Dictionary.java new file mode 100644 index 0000000..df234e3 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/Dictionary.java @@ -0,0 +1,78 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

    + * 数据字典表 + *

    + * + * @author zhengsl + * @since 2021-10-27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("rca_dictionary") +public class Dictionary implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 类型 + */ + private String type; + + /** + * 类型名称 + */ + private String typename; + + /** + * 代码 + */ + private String code; + + /** + * 名称 + */ + private String name; + + /** + * 顺序号 + */ + private String orderno; + + /** + * 上级代码 + */ + private String parentcode; + + /** + * 备用1 + */ + private String custom1; + + /** + * 备用2 + */ + private String custom2; + + /** + * 备用3 + */ + private String custom3; + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/LoginUser.java b/framework/src/main/java/com/yfd/platform/system/domain/LoginUser.java new file mode 100644 index 0000000..44cfb35 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/LoginUser.java @@ -0,0 +1,76 @@ +package com.yfd.platform.system.domain; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LoginUser implements UserDetails { + + private SysUser user; + + private List permissions; + + public LoginUser(SysUser user, List permissions) { + this.user = user; + this.permissions = permissions; + } + + @JSONField(serialize = false) + private List authorities; + + @Override + public Collection getAuthorities() { + // 将权限信息放入集合 + authorities = permissions.stream() + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + return authorities; + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getUsername(); + } + + //获取用户昵称 + public String geNickname() { + return user.getNickname(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/Message.java b/framework/src/main/java/com/yfd/platform/system/domain/Message.java new file mode 100644 index 0000000..54578e5 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/Message.java @@ -0,0 +1,117 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

    + * 消息通知 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_message") +public class Message implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(type = IdType.ASSIGN_UUID) + @Schema(description = "ID") + private String id; + + /** + * 创建时间:排序 + */ + @Schema(description = "创建时间:排序") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Timestamp createtime; + + /** + * 消息类型:1-定时任务 2-工作流触发 3-人工触发 + */ + @Schema(description = "消息类型:1-定时任务 2-工作流触发 3-人工触发") + private String type; + + /** + * 消息标题 + */ + @Schema(description = "消息标题") + private String title; + + /** + * 消息内容 + */ + @Schema(description = "消息内容") + private String content; + + /** + * 发送者名称,定时器,人员 + */ + @Schema(description = "发送者名称,定时器,人员") + private String senderName; + + /** + * 接收者代码 人员账号列表 + */ + @Schema(description = "接收者代码 人员账号列表 ") + private String receiverCodes; + + /** + * 接收者名称:为空 即为所有人,人员名称列表 + */ + @Schema(description = "接收者名称:为空 即为所有人,人员名称列表") + private String receiverNames; + + /** + * 状态:1、初始创建 2-消息已阅 9-消息过期 + */ + @Schema(description = "状态:1、初始创建 2-消息已阅 9-消息过期") + private String status; + + /** + * 有效期:小时 + */ + @Schema(description = "有效期:小时") + private Integer validperiod; + + /** + * 已阅时间 + */ + @Schema(description = "已阅时间") + private Timestamp readtime; + + /** + * 备用1 + */ + @Schema(description = "备用1") + private String custom1; + + /** + * 备用2 + */ + @Schema(description = "备用2") + private String custom2; + + /** + * 备用3 + */ + @Schema(description = "备用3") + private String custom3; + +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/QuartzJob.java b/framework/src/main/java/com/yfd/platform/system/domain/QuartzJob.java new file mode 100644 index 0000000..e3504ce --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/QuartzJob.java @@ -0,0 +1,118 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

    + * 定时任务 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_quartz_job") +public class QuartzJob implements Serializable { + + public static final String JOB_KEY = "JOB_KEY"; + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @Schema(description = "ID") + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 排序号 + */ + @Schema(description = "排序号") + private Integer orderno; + + /** + * 任务名称 + */ + @Schema(description = "任务名称") + private String jobName; + + /** + * 执行类名称 + */ + @Schema(description = "执行类名称") + private String jobClass; + + /** + * 执行方法名称 + */ + @Schema(description = "执行方法名称") + private String jobMethod; + + /** + * 时间周期表达式 + */ + @Schema(description = "时间周期表达式") + private String jobCron; + + /** + * 方法参数 + */ + @Schema(description = "方法参数") + private String jobParams; + + /** + * 任务描述 + */ + @Schema(description = "任务描述") + private String description; + + /** + * 状态:0-暂停、1-启用 + */ + @Schema(description = "状态:0-暂停、1-启用") + private String status; + + /** + * 最近修改者 + */ + @Schema(description = "最近修改者") + private String lastmodifier; + + /** + * 最近修改日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Schema(description = "最近修改日期") + private Timestamp lastmodifydate; + + /** + * 备用1 + */ + @Schema(description = "备用1") + private String custom1; + + /** + * 备用2 + */ + @Schema(description = "备用2") + private String custom2; + + /** + * 备用3 + */ + @Schema(description = "备用3") + private String custom3; + +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/SysConfig.java b/framework/src/main/java/com/yfd/platform/system/domain/SysConfig.java new file mode 100644 index 0000000..3bef030 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/SysConfig.java @@ -0,0 +1,78 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.sql.Timestamp; + +/** + *

    + * 系统全局配置 + *

    + * + * @author zhengsl + * @since 2022-01-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_config") +public class SysConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 欢迎词 + */ + private String welcome; + + /** + * 系统功能介绍 + */ + private String funcation; + + /** + * 系统版本信息 + */ + private String versioninfo; + + /** + * 备注 + */ + private String remark; + + /** + * 最近修改者 + */ + private String lastmodifier; + + /** + * 最近修改日期 + */ + @TableField(fill = FieldFill.UPDATE) + private Timestamp lastmodifydate; + + /** + * 备用1 + */ + private String custom1; + + /** + * 备用2 + */ + private String custom2; + + /** + * 备用3 + */ + private String custom3; + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/SysDictionary.java b/framework/src/main/java/com/yfd/platform/system/domain/SysDictionary.java new file mode 100644 index 0000000..ca1fb9c --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/SysDictionary.java @@ -0,0 +1,71 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

    + * 数据字典表 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class SysDictionary implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 字典类型 00-系统内置 01-用户配置 + */ + @TableField("dicttype") + private String dictType; + + /** + * 顺序号 + */ + @TableField("orderno") + private Integer orderNo; + + /** + * 字典编码 + */ + @TableField("dictcode") + private String dictCode; + + /** + * 字典名称 + */ + @TableField("dictname") + private String dictName; + + /** + * 备用1 + */ + private String custom1; + + /** + * 备用2 + */ + private String custom2; + + /** + * 备用3 + */ + private String custom3; + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/SysDictionaryItems.java b/framework/src/main/java/com/yfd/platform/system/domain/SysDictionaryItems.java new file mode 100644 index 0000000..431bfda --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/SysDictionaryItems.java @@ -0,0 +1,77 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

    + * 数据字典明细 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class SysDictionaryItems implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 对应字典ID + */ + @TableField("dictid") + private String dictId; + + /** + * 顺序号 + */ + @TableField("orderno") + private Integer orderNo; + + /** + * 项编码 + */ + @TableField("itemcode") + private String itemCode; + + /** + * 项名称 + */ + @TableField("dictname") + private String dictName; + + /** + * 父项编码 + */ + @TableField("parentcode") + private String parentCode; + + /** + * 备用1 + */ + private String custom1; + + /** + * 备用2 + */ + private String custom2; + + /** + * 备用3 + */ + private String custom3; + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/SysLog.java b/framework/src/main/java/com/yfd/platform/system/domain/SysLog.java new file mode 100644 index 0000000..dfe091d --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/SysLog.java @@ -0,0 +1,92 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.time.LocalDateTime; + +/** + *

    + * 系统操作日志 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class SysLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户账号 + */ + @TableField("usercode") + private String usercode; + + /** + * 用户名称 + */ + private String username; + + /** + * 操作类型 00-登录 01-新增 02-修改 03-删除 06-查询 09其他 + */ + @TableField("opttype") + private String opttype; + + /** + * 模块名称 + */ + private String module; + + /** + * 日志描述 + */ + private String description; + + /** + * 操作方法 + */ + private String method; + + /** + * 方法参数 + */ + private String params; + + /** + * 创建时间 + */ + @TableField("logtime") + private Timestamp logtime; + + /** + * 请求IP + */ + @TableField("requestip") + private String requestip; + + /** + * 浏览器类型 + */ + private String browser; + + public SysLog(String opttype) { + this.opttype = opttype; + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/SysMenu.java b/framework/src/main/java/com/yfd/platform/system/domain/SysMenu.java new file mode 100644 index 0000000..18802d7 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/SysMenu.java @@ -0,0 +1,114 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; + +/** + *

    + * 菜单及按钮 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_menu") +public class SysMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 1-web 2-pad 3-mobile + */ + private String systemcode; + + /** + * 1-菜单 2-按钮 + */ + private String type; + + /** + * 在系统内自动生成 + */ + private String code; + + /** + * 名称 + */ + private String name; + + /** + * 图标地址 + */ + private String icon; + + /** + * 是否外链 + */ + private String islink; + + /** + * 内部模块路径或者外链地址 + */ + private String opturl; + + /** + * 权限控制标识 + */ + private String permission; + + /** + * 顶级为0 + */ + private String parentid; + + /** + * 排序号 + */ + private Integer orderno; + + /** + * 0-不显示 1-显示 + */ + private String isdisplay; + + /** + * 最近修改者 + */ + private String lastmodifier; + + /** + * 最近修改日期 + */ + @TableField(fill = FieldFill.UPDATE) + private Timestamp lastmodifydate; + + /** + * 备用1 + */ + private String custom1; + + /** + * 备用2 + */ + private String custom2; + + /** + * 备用3 + */ + private String custom3; + +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/SysOrganization.java b/framework/src/main/java/com/yfd/platform/system/domain/SysOrganization.java new file mode 100644 index 0000000..cc7f711 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/SysOrganization.java @@ -0,0 +1,93 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.sql.Timestamp; + +/** + *

    + * 系统组织框架 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_organization") +public class SysOrganization implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 1-公司 -2-部门 + */ + private String orgtype; + + /** + * 两位一级 + */ + private String orgcode; + + /** + * 组织名称 + */ + private String orgname; + + /** + * 上级id + */ + private String parentid; + + /** + * 组织负责人 + */ + private String manager; + + /** + * 1-是 0-否 + */ + private String isvaild; + + /** + * 描述 + */ + private String description; + + /** + * 最近修改者 + */ + private String lastmodifier; + + /** + * 最近修改日期 + */ + @TableField(fill = FieldFill.UPDATE) + private Timestamp lastmodifydate; + + /** + * 备用1 + */ + private String custom1; + + /** + * 备用2 + */ + private String custom2; + + /** + * 备用3 + */ + private String custom3; + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/SysRole.java b/framework/src/main/java/com/yfd/platform/system/domain/SysRole.java new file mode 100644 index 0000000..1b21e76 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/SysRole.java @@ -0,0 +1,98 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.sql.Timestamp; + +/** + *

    + * 系统角色 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_role") +public class SysRole implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 系统生成,三位编号 + */ + private String rolecode; + + /** + * 角色名称 + */ + private String rolename; + + /** + * 1-超级管理员 2-单位管理员 3-普通用户 + */ + private String level; + + /** + * 描述 + */ + private String description; + + /** + * org1,org2 + */ + private String orgscope; + + /** + * 多个操作代码(菜单、按钮) + */ + private String optscope; + + /** + * json格式自定义业务范围 + */ + private String busscope; + + /** + * 1-是 0-否 + */ + private String isvaild; + + /** + * 最近修改者 + */ + private String lastmodifier; + + /** + * 最近修改日期 + */ + @TableField(fill = FieldFill.UPDATE) + private Timestamp lastmodifydate; + + /** + * 备用1 + */ + private String custom1; + + /** + * 备用2 + */ + private String custom2; + + /** + * 备用3 + */ + private String custom3; + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/domain/SysUser.java b/framework/src/main/java/com/yfd/platform/system/domain/SysUser.java new file mode 100644 index 0000000..0e01f4a --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/domain/SysUser.java @@ -0,0 +1,116 @@ +package com.yfd.platform.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.sql.Timestamp; + +/** + *

    + * 系统用户 + *

    + * + * @author zhengsl + * @since 2021-10-27 + */ + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_user") +public class SysUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id 主键 + */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 用户类型 0-管理员 1-普通用户 + */ + private Integer usertype; + + /** + * 用户名(账号) + */ + private String username; + /** + * 用户昵称 + */ + private String nickname; + + /** + * 登录密码(加密存储) + */ + private String password; + + /** + * 性别(0-男 1-女 ) + */ + private String sex; + + /** + * 邮箱 + */ + private String email; + /** + * 手机号 + */ + private String phone; + + /** + * 头像(预留) + */ + private String avatar; + + /** + * 账号状态(1-正常 0-停用) + */ + private Integer status; + + /** + * 部门ID + */ + private String orgid; + + /** + * 密码重置时间 + */ + private String pwdresettime; + + /** + * 最近修改者 + */ + private String lastmodifier; + + /** + * 最近修改日期 + */ + @TableField(fill = FieldFill.UPDATE) + private Timestamp lastmodifydate; + + @TableField(exist = false) + private String uuid; + + @TableField(exist = false) + private String code; + + /** + * 备用1 + */ + private String custom1; + + /** + * 备用2 + */ + private String custom2; + + /** + * 备用3 + */ + private String custom3; +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/MessageMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/MessageMapper.java new file mode 100644 index 0000000..d08fa95 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/MessageMapper.java @@ -0,0 +1,16 @@ +package com.yfd.platform.system.mapper; + +import com.yfd.platform.system.domain.Message; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

    + * 消息通知 Mapper 接口 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +public interface MessageMapper extends BaseMapper { + +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/QuartzJobMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/QuartzJobMapper.java new file mode 100644 index 0000000..ad46f1b --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/QuartzJobMapper.java @@ -0,0 +1,16 @@ +package com.yfd.platform.system.mapper; + +import com.yfd.platform.system.domain.QuartzJob; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

    + * 定时任务 Mapper 接口 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +public interface QuartzJobMapper extends BaseMapper { + +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/SysConfigMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/SysConfigMapper.java new file mode 100644 index 0000000..5bae048 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/SysConfigMapper.java @@ -0,0 +1,17 @@ +package com.yfd.platform.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.system.domain.SysConfig; + + +/** + *

    + * 系统全局配置 Mapper 接口 + *

    + * + * @author zhengsl + * @since 2022-01-19 + */ +public interface SysConfigMapper extends BaseMapper { + +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/SysDictionaryItemsMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/SysDictionaryItemsMapper.java new file mode 100644 index 0000000..de7deaa --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/SysDictionaryItemsMapper.java @@ -0,0 +1,17 @@ +package com.yfd.platform.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.system.domain.SysDictionaryItems; + +/** + *

    + * 数据字典明细 Mapper 接口 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +public interface SysDictionaryItemsMapper extends BaseMapper { + +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/SysDictionaryMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/SysDictionaryMapper.java new file mode 100644 index 0000000..7d03ca9 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/SysDictionaryMapper.java @@ -0,0 +1,22 @@ +package com.yfd.platform.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.system.domain.SysDictionary; + +/** + *

    + * 数据字典表 Mapper 接口 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +public interface SysDictionaryMapper extends BaseMapper { + + /********************************** + * 用途说明: 根据字典类型获取字典最大序号 + * 参数说明 sysDictionary 字典对象 + * 返回值说明: 返回增加成功或者失败 + ***********************************/ + Integer selectMaxNo(String dictType); +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/SysLogMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/SysLogMapper.java new file mode 100644 index 0000000..7b18518 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/SysLogMapper.java @@ -0,0 +1,16 @@ +package com.yfd.platform.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.system.domain.SysLog; + +/** + *

    + * 系统操作日志 Mapper 接口 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +public interface SysLogMapper extends BaseMapper { + +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..f57b35e --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java @@ -0,0 +1,59 @@ +package com.yfd.platform.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.system.domain.SysMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

    + * 菜单及按钮 Mapper 接口 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +public interface SysMenuMapper extends BaseMapper { + + /*********************************** + * 用途说明:菜单及按钮序号向上移动 + * 参数说明 + * parentid 上级id + *Orderno 小于序号(原序号) + *upOrderno 大于等于序号(更改的序号加一) + * 返回值说明: 是否更新成功 + ***********************************/ + boolean upMoveOrderno(@Param("parentid") String parentid, @Param("Orderno") int Orderno, @Param("upOrderno") int upOrderno); + + /*********************************** + * 用途说明:菜单及按钮序号向下移动 + * 参数说明 + * parentid 上级id + *Orderno 大于序号(原序号) + *downOrderno 小于等于序号(更改的序号减一) + * 返回值说明: 是否更新成功 + ***********************************/ + boolean downMoveOrderno(@Param("parentid") String parentid, @Param("Orderno") int Orderno, @Param("downOrderno") int downOrderno); + + + List selectPermsByUserId(String userId); + + //List selectMenuByUserId(String userId); + List> selectMenuByUserId(String userId); + + /*********************************** + * 用途说明:根据权限id查找系统类型 + * 参数说明 id 权限id + * 返回值说明: 返回系统类型 + ***********************************/ + String getSystemCodeById(String id); + + /*********************************** + * 用途说明:根据角色Id查找权限 + * 参数说明 id 权限id + * 返回值说明: 返回权限集合 + ***********************************/ + List selectMenuByRoleId(String id); +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/SysOrganizationMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/SysOrganizationMapper.java new file mode 100644 index 0000000..e856aae --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/SysOrganizationMapper.java @@ -0,0 +1,33 @@ +package com.yfd.platform.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.system.domain.SysOrganization; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

    + * 系统组织框架 Mapper 接口 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +public interface SysOrganizationMapper extends BaseMapper { + + /*********************************** + * 用途说明:去重查询组织分类 + * 返回值说明: 所有组织分类 + ***********************************/ + List queryOrgtype(); + + /*********************************** + * 用途说明:根据组织分类查询上级id + * 参数说明 + * orgtype 组织分类 + * 返回值说明: 上级id + ***********************************/ + List queryParentid(@Param("orgtype") String orgtype); + +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..acb7a81 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java @@ -0,0 +1,89 @@ +package com.yfd.platform.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.system.domain.SysRole; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

    + * 系统角色 Mapper 接口 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +public interface SysRoleMapper extends BaseMapper { + + /*********************************** + * 用途说明:根据角色id查询是否存在用户 + * 参数说明 + * roleid 角色id + * 返回值说明: 该角色下是否存在用户 + ************************************/ + List> isRoleUsersByroleid(String roleid); + + /*********************************** + * 用途说明:根据角色id查询是否存在权限 + * 参数说明 + * roleid 角色id + * 返回值说明: 该角色下是否存在权限 + ************************************/ + List> isRoleMenuByRoleId(String roleId); + + /*********************************** + * 用途说明:查询已分配的用户 + * 参数说明 + *orgid 所属组织 + *username 用户名称 + *status 状态 + *level 角色级别 '1-超级管理员 2-单位管理员 3-普通用户' + * rolename 角色名称 + * isvaild 角色是否有效 + * 返回值说明: 系统用户角色数据集合 + ***********************************/ + List listRoleUsers(String orgid, String username, String status, + String level, String rolename, String isvaild); + + /*********************************** + * 用途说明:根据 角色id和用户id 删除 (admin除外) + * 参数说明 + *roleid 角色id + * urserid 用户id + * 返回值说明: 是否删除成功 + ***********************************/ + boolean deleteRoleUsers(String roleid, String urserid); + + /********************************** + * 用途说明: 根据用户id获取角色信息 + * 参数说明 id 角色id + * 返回值说明: void + ***********************************/ + List getRoleByUserId(String id); + + /********************************** + * 用途说明: 根据角色ID删除菜单与角色关联信息 + * 参数说明 id 角色id + * 返回值说明: void + ***********************************/ + boolean deleteRoleMenus(String id); + + /********************************** + * 用途说明: 根据角色ID删除用户与角色关联信息 + * 参数说明 id 角色id + * 返回值说明: void + ***********************************/ + boolean deleteRoleUser(String id); + + /********************************** + * 用途说明: 根据角色id获取用户id + * 参数说明 id 角色id + * 返回值说明: 用户id + ***********************************/ + List getUserIdById(String id); + + void addRoleMenu(@Param("id") String id, @Param("roleid") String roleid, + @Param("menuid") String menuid); +} diff --git a/framework/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java b/framework/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..ea57c78 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java @@ -0,0 +1,96 @@ +package com.yfd.platform.system.mapper; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.system.domain.SysUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

    + * 系统用户表 Mapper 接口 + *

    + * + * @author zhengsl + * @since 2021-10-27 + */ +public interface SysUserMapper extends BaseMapper { + List list(@Param("total")String total, @Param("size")String size, @Param("orgid")String orgid, @Param("username")String username, @Param("mobile")String mobile , @Param("status")String status); + + /*********************************** + * 用途说明:新增系统角色用户对照表 对用户分配角色 + * 参数说明 + * id 生成的id + * roleid 角色id + * userid 用户id + * 返回值说明: + ************************************/ + boolean addUserRoles(@Param("id")String id,@Param("roleid") String roleid,@Param("userid") String userid); + + /*********************************** + * 用途说明:根据用户id 和角色id 查询 系统角色用户对照表 + * 参数说明 + * userid 用户id + * roleid 角色id + * 返回值说明: + ************************************/ + List getRoleUsersByid(@Param("roleid") String roleid,@Param("userid") String userid); + + /*********************************** + * 用途说明:根据用户表id查询角色表所有角色 + * 参数说明 + * userid 用户id + * 返回值说明: + ************************************/ + List getLevel(@Param("userid") String userid); + + /*********************************** + * 用途说明:根据用户表id查询角色表所有角色id + * 参数说明 + * userid 用户id + * 返回值说明: + ************************************/ + List getRoleid(@Param("userid") String userid); + + /*********************************** + * 用途说明:根据用户表id查询角色表级别 + * 参数说明 + * userid 用户id + * 返回值说明: + ************************************/ + String getMaxLevel(@Param("userid") String userid); + + /*********************************** + * 用途说明:根据用户id删除所分配的角色 + * 参数说明 + * userid 用户id + * 返回值说明: + ************************************/ + boolean delRoleUsersByUserid(@Param("userid") String userid); + + /*********************************** + * 用途说明:根据用户id删除所分配的不包含角色 + * 参数说明 + * userid 用户id + * roleids 多个角色id + * 返回值说明: + ************************************/ + boolean delInRoleUsersByUserid(@Param("userid") String userid,@Param("roleids")String[] roleids); + + Page> queryUsers(String orgid, + String username, + Page page); + + Map getOrganizationByid(String id); + + /********************************** + * 用途说明: 根据ID删除用户与角色的关联信息 + * 参数说明 ids 用户id集合 + * 返回值说明: void + ***********************************/ + void delRoleUsersByUserIds(List ids); +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/IMessageService.java b/framework/src/main/java/com/yfd/platform/system/service/IMessageService.java new file mode 100644 index 0000000..2b4c645 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/IMessageService.java @@ -0,0 +1,16 @@ +package com.yfd.platform.system.service; + +import com.yfd.platform.system.domain.Message; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 消息通知 服务类 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +public interface IMessageService extends IService { + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/IQuartzJobService.java b/framework/src/main/java/com/yfd/platform/system/service/IQuartzJobService.java new file mode 100644 index 0000000..8b71868 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/IQuartzJobService.java @@ -0,0 +1,43 @@ +package com.yfd.platform.system.service; + +import com.yfd.platform.system.domain.QuartzJob; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 定时任务 服务类 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +public interface IQuartzJobService extends IService { + + /********************************** + * 用途说明: 新增定时任务 + * 参数说明 quartzJob 定时对象 + * 返回值说明: boolean 是否成功 + ***********************************/ + boolean addQuartzJob(QuartzJob quartzJob); + + /********************************** + * 用途说明: 删除定时任务 + * 参数说明 id id + * 返回值说明: boolean 是否成功 + ***********************************/ + boolean deleteQuartzJob(String id); + + /********************************** + * 用途说明: 拖动修改定时任务顺序 + * 参数说明 fromID 当前ID toID 到达ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回拖动成功或者失败 + ***********************************/ + boolean changeDictOrder(String fromID, String toID); + + /********************************** + * 用途说明: 执行定时任务 + * 参数说明 id id + * 返回值说明: void + ***********************************/ + void execution(QuartzJob byId); +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/ISysConfigService.java b/framework/src/main/java/com/yfd/platform/system/service/ISysConfigService.java new file mode 100644 index 0000000..ef3a399 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/ISysConfigService.java @@ -0,0 +1,22 @@ +package com.yfd.platform.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.system.domain.SysConfig; + +import javax.sound.sampled.UnsupportedAudioFileException; +import java.io.IOException; +import java.util.Map; + +/** + *

    + * 系统全局配置 服务类 + *

    + * + * @author zhengsl + * @since 2022-01-19 + */ +public interface ISysConfigService extends IService { + + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/ISysDictionaryItemsService.java b/framework/src/main/java/com/yfd/platform/system/service/ISysDictionaryItemsService.java new file mode 100644 index 0000000..32f9b8f --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/ISysDictionaryItemsService.java @@ -0,0 +1,47 @@ +package com.yfd.platform.system.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.system.domain.SysDictionaryItems; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + *

    + * 数据字典明细 服务类 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +public interface ISysDictionaryItemsService extends IService { + + /********************************** + * 用途说明: 分页查询字典项信息 + * 参数说明 dictID 字典ID ItemName 字典项名称 pageNum 当前页 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 + ***********************************/ + Page getDictItemPage(String dictId, String itemName, Page page); + + /********************************** + * 用途说明: 增加字典项 + * 参数说明 sysDictionaryItems 字典项信息 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回增加成功或者失败 + ***********************************/ + boolean addDictionaryItem(SysDictionaryItems sysDictionaryItems); + + /********************************** + * 用途说明: 拖动修改字典项顺序 + * 参数说明 fromID 当前ID toID 到达ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回拖动成功或者失败 + ***********************************/ + boolean changeItemOrder(String fromID, String toID); + + /********************************** + * 用途说明: 导出数据字典项数据 + * 参数说明 sysDictionaryItemsList 所需导出的字典项集合 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回导出成功或失败 + ***********************************/ + void exportExcel(List records, HttpServletResponse response); +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/ISysDictionaryService.java b/framework/src/main/java/com/yfd/platform/system/service/ISysDictionaryService.java new file mode 100644 index 0000000..f3a4990 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/ISysDictionaryService.java @@ -0,0 +1,45 @@ +package com.yfd.platform.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.system.domain.SysDictionary; + +import java.util.List; + +/** + *

    + * 数据字典表 服务类 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +public interface ISysDictionaryService extends IService { + + /********************************** + * 用途说明: 获取数据字典列表 + * 参数说明 dictType 字典类型 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 + ***********************************/ + List getDictList(String dictType); + + /********************************** + * 用途说明: 新增字典 + * 参数说明 sysDictionary 字典对象 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回增加成功或者失败 + ***********************************/ + boolean addDict(SysDictionary sysDictionary); + + /********************************** + * 用途说明: 根据ID删除字典 + * 参数说明 id 字典ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回删除结果成功或者失败 + ***********************************/ + boolean deleteDictById(String id); + + /********************************** + * 用途说明: 拖动修改字典顺序 + * 参数说明 fromID 当前ID toID 到达ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回拖动成功或者失败 + ***********************************/ + boolean changeDictOrder(String fromID, String toID); +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/ISysLogService.java b/framework/src/main/java/com/yfd/platform/system/service/ISysLogService.java new file mode 100644 index 0000000..85fdffa --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/ISysLogService.java @@ -0,0 +1,52 @@ +package com.yfd.platform.system.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.system.domain.SysLog; +import org.aspectj.lang.ProceedingJoinPoint; + +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + *

    + * 系统操作日志 服务类 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +public interface ISysLogService extends IService { + + /********************************** + * 用途说明: 分页查询日志信息 + * 参数说明 pageNum(页码数)、pageSize(页大小,如果是固定页大小可不传)、username(用户名)、(optType) + * 操作类型、startDate(开始日期)、endDate(结束日期) + * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 + ***********************************/ + Page getLogList(String username, String optType, + String startDate, + String endDate, Page page); + + + /********************************** + * 用途说明: 导出日志数据 + * 参数说明 sysLogs 所需导出的字典项集合 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回导出成功或者失败 + ***********************************/ + void exportExcel(List sysLogs, HttpServletResponse response) throws IOException; + + /********************************** + * 用途说明: 新增日志 + * 参数说明 nickname 用户名 + * 参数说明 username 用户账号 + * 参数说明 browser 浏览器 + * 参数说明 ip 本机Ip地址 + * 参数说明 joinPoint 连接点 + * 参数说明 log 日志信息 + * 返回值说明: void + ***********************************/ + void save(String nickname,String username, String browser, String ip, ProceedingJoinPoint joinPoint, SysLog log); +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/ISysMenuService.java b/framework/src/main/java/com/yfd/platform/system/service/ISysMenuService.java new file mode 100644 index 0000000..7093e3b --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/ISysMenuService.java @@ -0,0 +1,101 @@ +package com.yfd.platform.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import com.yfd.platform.system.domain.SysMenu; +import org.springframework.web.multipart.MultipartFile; + +import java.io.FileNotFoundException; +import java.util.List; +import java.util.Map; + +/** + *

    + * 菜单及按钮 服务类 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +public interface ISysMenuService extends IService { + + /*********************************** + * 用途说明:获取菜单结构树(含按钮) + * 参数说明 + * systemcode 系统 + * name 名称 + * isdisplay 是否显示 + * 返回值说明: 菜单结构树集合 + ***********************************/ + List> getMenuButtonTree(String systemcode, String name, String isdisplay); + + /*********************************** + * 用途说明:获取菜单结构树(不含按钮) + * 参数说明 + * systemcode 系统 + * name 名称 + * isdisplay 是否显示 + * 返回值说明: 菜单结构树集合 + ***********************************/ + List> getMenuTree(String systemcode, String name, String isdisplay); + + + /*********************************** + * 用途说明:新增菜单及按钮 + * 参数说明 + * sysMenu 菜单或按钮表对象 + * 返回值说明: 是否添加成功提示 + ***********************************/ + boolean addMenu(SysMenu sysMenu); + + /*********************************** + * 用途说明:上传单个图标 + * 参数说明 + * id 上传图标id + * icon 图标 + * 返回值说明: 是否上传成功 + ***********************************/ + boolean uploadIcon(String id, MultipartFile icon); + + /*********************************** + * 用途说明:根据id删除单个图标 + * 参数说明 + * id 删除图标id + * icon 图标名称 + * 返回值说明: 是否删除成功 + ***********************************/ + boolean deleteIcon(String id); + + /*********************************** + * 用途说明:菜单及按钮序号排序 + * 参数说明 + * parentid 上级id + * orderMap map<菜单及按钮表id,排列序号> + * 返回值说明: 是否更新成功 + ***********************************/ + boolean moveOrderno(String parentid, String id, int orderno); + + /*********************************** + * 用途说明:根据id删除菜单或按钮 + * 参数说明 + * id 删除列的id + * 返回值说明: 是否删除成功 + ***********************************/ + boolean deleteById(String id); + + boolean changeOderNoById(String fromId, String toId); + + List> getMenuTree(String id); + + /*********************************** + * 用途说明:权限分配 + * 参数说明 + * systemcode 系统 + * name 名称 + * isdisplay 是否显示 + * 返回值说明: 菜单结构树集合 + ***********************************/ + List> permissionAssignment(String roleId); + + String uploadIcon(MultipartFile icon) throws FileNotFoundException; +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/ISysOrganizationService.java b/framework/src/main/java/com/yfd/platform/system/service/ISysOrganizationService.java new file mode 100644 index 0000000..5b03119 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/ISysOrganizationService.java @@ -0,0 +1,60 @@ +package com.yfd.platform.system.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.system.domain.SysOrganization; + +import java.util.List; +import java.util.Map; + +/** + *

    + * 系统组织框架 服务类 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +public interface ISysOrganizationService extends IService { + + /*********************************** + * 用途说明:获取组织结构树 + * 参数说明 + *parentid 上级id + * params 名称(根据名称查询二级) + * 返回值说明: 组织树集合 + ***********************************/ + List> getOrgTree(String parentid, String params); + + /*********************************** + * 用途说明:新增系统组织框架 + * 参数说明 + * sysOrganization 系统组织框架对象 + * 返回值说明: 是否新增成功 + ***********************************/ + boolean addOrg(SysOrganization sysOrganization); + + /*********************************** + * 用途说明:根据企业ID查询组织详情 + * 参数说明 + * id 企业id + * 返回值说明: 系统组织框架对象 + ***********************************/ + List getOrganizationById(String id,String orgName); + + /*********************************** + * 用途说明:获取组织范围树结构 + * 参数说明 + *roleId 角色id + * 返回值说明: 组织树集合 + ***********************************/ + List> getOrgScopeTree(String roleId); + + /********************************** + * 用途说明: 修改角色组织范围 + * 参数说明 roleId 角色id + * 参数说明 orgscope 组织id集合 + * 返回值说明: boolean 是否修改成功 + ***********************************/ + boolean updateOrgScopeByRoleId(String roleId, String orgscope); +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/ISysRoleService.java b/framework/src/main/java/com/yfd/platform/system/service/ISysRoleService.java new file mode 100644 index 0000000..7dcdb5c --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/ISysRoleService.java @@ -0,0 +1,66 @@ +package com.yfd.platform.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.system.domain.SysRole; + +import java.util.List; +import java.util.Map; + +/** + *

    + * 系统角色 服务类 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +public interface ISysRoleService extends IService { + + /*********************************** + * 用途说明:新增角色 + * 参数说明 + * sysRole 新增角色信息 + * 返回值说明: 是否新增成功 + ***********************************/ + boolean addRole(SysRole sysRole); + + /*********************************** + * 用途说明:删除角色用户 + * 参数说明 + * id 系统角色用户对照表id + * 返回值说明: 是否新增成功 + ***********************************/ + + boolean deleteRoleUsers(String roleid, String urserids); + + /*********************************** + * 用途说明:根据id删除角色 + * 参数说明 + *id 角色id + * 返回值说明: 是否删除成功 + ***********************************/ + void deleteById(String id); + + /*********************************** + * 用途说明:查询已分配的用户 + * 参数说明 + *orgid 所属组织 + *username 用户名称 + *status 状态 + *level 角色级别 + * rolename 角色名称 + * isvaild 角色是否有效 + * 返回值说明: 系统用户角色数据集合 + ***********************************/ + List listRoleUsers(String orgid, String username, String status, String level, String rolename, String isvaild); + + + /*********************************** + * 用途说明:角色分配权限 + * 参数说明 + * id 角色id + * menuIds 权限id字符串 + * 返回值说明: 是否分配成功 + ***********************************/ + boolean setMenuById(String id, String menuIds); +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/IUserService.java b/framework/src/main/java/com/yfd/platform/system/service/IUserService.java new file mode 100644 index 0000000..b141e53 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/IUserService.java @@ -0,0 +1,143 @@ +package com.yfd.platform.system.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.LoginUser; +import com.yfd.platform.system.domain.SysUser; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.Map; + +/** + *

    + * 系统用户 + *

    + * + * @author zhengsl + * @since 2021-10-27 + */ +public interface IUserService extends IService { + + //获取当前用户账号及名称 + String getUsername(); + + //获取当前用户信息 + SysUser getUserInfo(); + /*********************************** + * 用途说明:获取当前用户账号与姓名 + * 返回值说明: 当前用户账号与姓名 + ************************************/ + Map getNameInfo(); + //获取当前用户信息带权限 + ResponseResult getLoginUserInfo(); + + /*********************************** + * 用途说明:新增用户 + * 参数说明 + *sysUser 新增用户对象 + * id 创建者id + * roleId 角色id + * 返回值说明: 提示字符串 + ************************************/ + Map addUser(SysUser sysUser, String roleids); + + /*********************************** + * 用途说明:查询系统用户 + * 参数说明 + *page 分页集合参数 + *orgid 所属组织 + *username 用户名称 + * mobile 手机号 + * status 状态 + * 返回值说明: 用户分页集合 + ************************************/ + List list(String total, String size, String orgid, String username, + String mobile, String status); + + /*********************************** + * 用途说明:根据ID查询用户详情 + * 参数说明 + *id 用户id + * 返回值说明: 用户表对象 + ************************************/ + Map getOneById(String id); + + /*********************************** + * 用途说明:根据ID修改用户 + * 参数说明 + *sysUser 用户对象 + *roleids 角色id + * 返回值说明: 是否更新成功 + ************************************/ + Map updateById(SysUser sysUser, String roleids); + + /*********************************** + * 用途说明:用户分配角色(多个) + * 参数说明 + *roleid 角色id + * userids 用户id数组 + * 返回值说明: 判断是否添加成功 + ************************************/ + boolean setUserRoles(String roleid, String userids); + + /*********************************** + * 用途说明:根据id删除用户 + * 参数说明 + *id 用户id + * 返回值说明: 判断是否删除成功 + ************************************/ + boolean deleteById(String id); + + /*********************************** + * 用途说明:重置用户密码(管理员) + * 参数说明 + *id 重置密码的 用户id + * 返回值说明: 判断是否重置成功 + ************************************/ + boolean resetPassword(String id) throws Exception; + + /*********************************** + * 用途说明:设置账号状态(管理员) + * 参数说明 + *id 用户id + * status 设置状态 + * 返回值说明: 判断是否设置成功 + ************************************/ + boolean setStatus(String id, String status); + + /*********************************** + * 用途说明:上传用户头像 + * 参数说明 + * id 用户id + * img 账号头像 + * 返回值说明: 判断是否上传 + ***********************************/ + boolean uploadAvatar(String id, MultipartFile img); + + /*********************************** + * 用途说明:新增系统角色用户对照表 对用户分配角色(单个) + * 参数说明 + * id 生成的id + * userid 用户id + * roleid 角色id + * 返回值说明: + ************************************/ + boolean addUserRoles(String roleid, String userid); + + //Page queryUsers(String orgid, String username, Page page); + Page> queryUsers(String orgid, String username, Page page); + + /*********************************** + * 用途说明:根据ID批量删除用户 + * 参数说明 + *ids 用户id集合 + * 返回值说明: 判断是否删除成功 + ************************************/ + boolean deleteUserByIds(String ids); + + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/MessageServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/MessageServiceImpl.java new file mode 100644 index 0000000..0d3875f --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/MessageServiceImpl.java @@ -0,0 +1,20 @@ +package com.yfd.platform.system.service.impl; + +import com.yfd.platform.system.domain.Message; +import com.yfd.platform.system.mapper.MessageMapper; +import com.yfd.platform.system.service.IMessageService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

    + * 消息通知 服务实现类 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +@Service +public class MessageServiceImpl extends ServiceImpl implements IMessageService { + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/QuartzJobServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/QuartzJobServiceImpl.java new file mode 100644 index 0000000..d2a9030 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/QuartzJobServiceImpl.java @@ -0,0 +1,114 @@ +package com.yfd.platform.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yfd.platform.system.domain.QuartzJob; +import com.yfd.platform.system.domain.SysDictionary; +import com.yfd.platform.system.mapper.QuartzJobMapper; +import com.yfd.platform.system.service.IQuartzJobService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.utils.QuartzManage; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + *

    + * 定时任务 服务实现类 + *

    + * + * @author TangWei + * @since 2023-03-19 + */ +@Service +public class QuartzJobServiceImpl extends ServiceImpl implements IQuartzJobService { + + @Resource + private QuartzJobMapper quartzJobMapper; + + @Resource + private QuartzManage quartzManage; + + /********************************** + * 用途说明: 新增定时任务 + * 参数说明 quartzJob 定时对象 + * 返回值说明: boolean 是否成功 + ***********************************/ + @Override + public boolean addQuartzJob(QuartzJob quartzJob) { + // 生成序号 + long orderNo = this.count() + 1L; + quartzJob.setOrderno((int) orderNo); + return this.save(quartzJob); + } + + /********************************** + * 用途说明: 删除定时任务 + * 参数说明 id id + * 返回值说明: boolean 是否成功 + ***********************************/ + @Override + public boolean deleteQuartzJob(String id) { + String[] split = id.split(","); + Set ids = Arrays.stream(split).collect(Collectors.toSet()); + for (String s : ids) { + QuartzJob quartzJob = this.getById(s); + quartzManage.deleteJob(quartzJob); + this.removeById(s); + } + + // 查询所有定时任务 + List list = + this.list(new LambdaQueryWrapper().orderByAsc(QuartzJob::getOrderno)); + // 更新序号 + for (int i = 0; i < list.size(); i++) { + QuartzJob quartzJob = list.get(i); + quartzJob.setOrderno(i + 1); + this.updateById(quartzJob); + } + return true; + } + + /********************************** + * 用途说明: 拖动修改定时任务顺序 + * 参数说明 fromID 当前ID toID 到达ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回拖动成功或者失败 + ***********************************/ + @Override + public boolean changeDictOrder(String fromID, String toID) { + QuartzJob fromQuartzJob = + quartzJobMapper.selectById(fromID); + QuartzJob toQuartzJob = quartzJobMapper.selectById(toID); + // 如果数据字典不存在拖动失败 + if (fromQuartzJob == null || toQuartzJob == null) { + return false; + } + Integer fromOrderNo = fromQuartzJob.getOrderno(); + Integer toOrderNo = toQuartzJob.getOrderno(); + // 如果数据字典的顺序号不存在拖动失败 + if (fromOrderNo == null || toOrderNo == null) { + return false; + } + // 将顺序号放入字典对象中 + fromQuartzJob.setOrderno(toOrderNo); + toQuartzJob.setOrderno(fromOrderNo); + // 更改顺序号 + boolean fromBool = this.updateById(fromQuartzJob); + boolean toBool = this.updateById(toQuartzJob); + return fromBool && toBool; + } + + /********************************** + * 用途说明: 执行定时任务 + * 参数说明 id id + * 返回值说明: void + ***********************************/ + @Override + public void execution(QuartzJob quartzJob) { + quartzManage.runJobNow(quartzJob); + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/SysConfigServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..da15188 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,34 @@ +package com.yfd.platform.system.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.system.domain.SysConfig; +import com.yfd.platform.system.mapper.SysConfigMapper; +import com.yfd.platform.system.service.ISysConfigService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import javax.sound.sampled.UnsupportedAudioFileException; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + *

    + * 系统全局配置 服务实现类 + *

    + * + * @author zhengsl + * @since 2022-01-19 + */ +@Service +public class SysConfigServiceImpl extends ServiceImpl implements ISysConfigService { + @Resource + private UserServiceImpl currentUser; + + + + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryItemsServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryItemsServiceImpl.java new file mode 100644 index 0000000..26a30ab --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryItemsServiceImpl.java @@ -0,0 +1,123 @@ +package com.yfd.platform.system.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.system.domain.SysDictionaryItems; +import com.yfd.platform.system.mapper.SysDictionaryItemsMapper; +import com.yfd.platform.system.service.ISysDictionaryItemsService; +import com.yfd.platform.utils.FileUtil; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + *

    + * 数据字典明细 服务实现类 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +@Service +public class SysDictionaryItemsServiceImpl extends ServiceImpl implements ISysDictionaryItemsService { + + @Resource + private SysDictionaryItemsMapper sysDictionaryItemsMapper; + + /********************************** + * 用途说明: 分页查询字典项信息 + * 参数说明 dictID 字典ID ItemName 字典项名称 pageNum 当前页 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 + ***********************************/ + @Override + public Page getDictItemPage(String dictId, + String itemName, + Page page) { + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(itemName)) { + queryWrapper.like(SysDictionaryItems::getDictName, itemName); + } + queryWrapper.eq(SysDictionaryItems::getDictId, dictId).orderByAsc(SysDictionaryItems::getOrderNo); + return sysDictionaryItemsMapper.selectPage(page, queryWrapper); + } + + /********************************** + * 用途说明: 增加字典项 + * 参数说明 sysDictionaryItems 字典项信息 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回增加成功或者失败 + ***********************************/ + @Override + public boolean addDictionaryItem(SysDictionaryItems sysDictionaryItems) { + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + queryWrapper.eq(SysDictionaryItems::getDictId,sysDictionaryItems.getDictId()); + long orderNo = this.count(queryWrapper) + 1L; + // 添加顺序号 + sysDictionaryItems.setOrderNo((int) orderNo); + return this.save(sysDictionaryItems); + } + + /********************************** + * 用途说明: 拖动修改字典项顺序 + * 参数说明 fromID 当前ID toID 到达ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回拖动成功或者失败 + ***********************************/ + @Override + public boolean changeItemOrder(String fromID, String toID) { + SysDictionaryItems fromSysDictionaryItems = + sysDictionaryItemsMapper.selectById(fromID); + SysDictionaryItems toSysDictionaryItems = + sysDictionaryItemsMapper.selectById(toID); + // 如果数据字典项不存在拖动失败 + if (fromSysDictionaryItems == null || toSysDictionaryItems == null) { + return false; + } + Integer fromOrderNo = fromSysDictionaryItems.getOrderNo(); + Integer toOrderNo = toSysDictionaryItems.getOrderNo(); + // 如果数据字典的顺序号不存在拖动失败 + if (fromOrderNo == null || toOrderNo == null) { + return false; + } + // 将顺序号放入字典对象中 + fromSysDictionaryItems.setOrderNo(toOrderNo); + toSysDictionaryItems.setOrderNo(fromOrderNo); + // 更改顺序号 + boolean fromBool = this.updateById(fromSysDictionaryItems); + boolean toBool = this.updateById(toSysDictionaryItems); + return fromBool && toBool; + + } + + /********************************** + * 用途说明: 导出数据字典项数据 + * 参数说明 sysDictionaryItemsList 所需导出的字典项集合 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回导出成功或失败 + ***********************************/ + @Override + public void exportExcel(List sysDictionaryItems, + HttpServletResponse response) { + try { + List> list = new LinkedList<>(); + for (SysDictionaryItems sysDictionaryItem : sysDictionaryItems) { + Map map = new LinkedHashMap<>(); + map.put("项编号", sysDictionaryItem.getItemCode()); + map.put("项名称", sysDictionaryItem.getDictName()); + map.put("父编码", sysDictionaryItem.getParentCode()); + map.put("备注", sysDictionaryItem.getCustom1()); + list.add(map); + } + FileUtil.downloadExcel(list, response); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryServiceImpl.java new file mode 100644 index 0000000..58508b3 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryServiceImpl.java @@ -0,0 +1,114 @@ +package com.yfd.platform.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.system.domain.SysDictionary; +import com.yfd.platform.system.domain.SysDictionaryItems; +import com.yfd.platform.system.mapper.SysDictionaryItemsMapper; +import com.yfd.platform.system.mapper.SysDictionaryMapper; +import com.yfd.platform.system.service.ISysDictionaryService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import jakarta.annotation.Resource; +import java.util.List; + +/** + *

    + * 数据字典表 服务实现类 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +@Service +public class SysDictionaryServiceImpl extends ServiceImpl implements ISysDictionaryService { + + @Resource + private SysDictionaryMapper sysDictionaryMapper; + + @Resource + private SysDictionaryItemsMapper sysDictionaryItemsMapper; + + /********************************** + * 用途说明: 获取数据字典列表 + * 参数说明 dictType 字典类型 + * 返回值说明: 返回字典列表集合 + ***********************************/ + @Override + public List getDictList(String dictType) { + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + queryWrapper.eq(SysDictionary::getDictType, dictType).orderByAsc(SysDictionary::getOrderNo); + return sysDictionaryMapper.selectList(queryWrapper); + } + + /********************************** + * 用途说明: 新增字典 + * 参数说明 sysDictionary 字典对象 + * 返回值说明: 返回增加成功或者失败 + ***********************************/ + @Override + public boolean addDict(SysDictionary sysDictionary) { + //int orderNo = this.count() + 1; + Integer maxNo = + sysDictionaryMapper.selectMaxNo(sysDictionary.getDictType()); + if (maxNo == null) { + maxNo = 0; + } + // 添加顺序号 + sysDictionary.setOrderNo(maxNo + 1); + return this.save(sysDictionary); + } + + /********************************** + * 用途说明: 根据ID删除字典 + * 参数说明 id 字典ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回删除结果成功或者失败 + ***********************************/ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteDictById(String id) { + // 根据字典编码查询字典项中是否关联 + boolean isok=true; + QueryWrapper Wrapper = new QueryWrapper<>(); + Wrapper.eq("dictid", id); + if(sysDictionaryItemsMapper.delete(Wrapper)>0) { + isok=true; + } + return isok&&this.removeById(id); + } + + /********************************** + * 用途说明: 拖动修改字典顺序 + * 参数说明 fromID 当前ID toID 到达ID + * 返回值说明: com.yfd.platform.config.ResponseResult 返回拖动成功或者失败 + ***********************************/ + @Override + public boolean changeDictOrder(String fromID, String toID) { + SysDictionary fromSysDictionary = + sysDictionaryMapper.selectById(fromID); + SysDictionary toSysDictionary = sysDictionaryMapper.selectById(toID); + // 如果数据字典不存在拖动失败 + if (fromSysDictionary == null || toSysDictionary == null) { + return false; + } + Integer fromOrderNo = fromSysDictionary.getOrderNo(); + Integer toOrderNo = toSysDictionary.getOrderNo(); + // 如果数据字典的顺序号不存在拖动失败 + if (fromOrderNo == null || toOrderNo == null) { + return false; + } + // 将顺序号放入字典对象中 + fromSysDictionary.setOrderNo(toOrderNo); + toSysDictionary.setOrderNo(fromOrderNo); + // 更改顺序号 + boolean fromBool = this.updateById(fromSysDictionary); + boolean toBool = this.updateById(toSysDictionary); + return fromBool && toBool; + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/SysLogServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/SysLogServiceImpl.java new file mode 100644 index 0000000..ee671bf --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/SysLogServiceImpl.java @@ -0,0 +1,219 @@ +package com.yfd.platform.system.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.system.domain.SysLog; +import com.yfd.platform.system.mapper.SysLogMapper; +import com.yfd.platform.system.mapper.SysUserMapper; +import com.yfd.platform.system.service.ISysLogService; +import com.yfd.platform.utils.FileUtil; +import com.yfd.platform.utils.StringUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.AnnotatedType; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + *

    + * 系统操作日志 服务实现类 + *

    + * + * @author TangWei + * @since 2023-03-08 + */ +@Service +public class SysLogServiceImpl extends ServiceImpl implements ISysLogService { + + @Resource + private SysLogMapper sysLogMapper; + + /********************************** + * 用途说明: 分页查询日志信息 + * 参数说明 pageNum(页码数)、pageSize(页大小,如果是固定页大小可不传)、username(用户名)、(optType) + * 操作类型、startDate(开始日期)、endDate(结束日期) + * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 + ***********************************/ + @Override + public Page getLogList(String username, String optType, + String startDate, + String endDate, Page page) { + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // 没有传username就不按此条件查询 + if (StrUtil.isNotBlank(username)) { + queryWrapper.like(SysLog::getUsername, username); + } + // 没有传optType就不按此条件查询 + if (StrUtil.isNotBlank(optType)) { + queryWrapper.eq(SysLog::getOpttype, optType); + } + DateTime parseStartDate = DateUtil.parse(startDate); + DateTime parseEndDate = DateUtil.parse(endDate); + DateTime dateTime = DateUtil.offsetDay(parseEndDate, 1); + if (parseStartDate != null && parseEndDate != null) { + queryWrapper.ge(SysLog::getLogtime, parseStartDate).lt(SysLog::getLogtime, dateTime); + } + + queryWrapper.orderByDesc(SysLog::getLogtime); + return sysLogMapper.selectPage(page, queryWrapper); + } + + /********************************** + * 用途说明: 导出日志数据 + * 参数说明 sysLogs 所需导出的字典项集合 + * 返回值说明: com.yfd.platform.config.ResponseResult 返回导出成功或者失败 + ***********************************/ + @Override + public void exportExcel(List sysLogs, + HttpServletResponse response) { + try { + List> list = new LinkedList<>(); + for (SysLog sysLog : sysLogs) { + Map map = new LinkedHashMap<>(); + map.put("操作账号", sysLog.getUsercode()); + map.put("用户姓名", sysLog.getUsername()); + map.put("IP地址", sysLog.getRequestip()); + map.put("浏览器", sysLog.getBrowser()); + map.put("日志类型", sysLog.getOpttype()); + map.put("模块名称", sysLog.getModule()); + map.put("日志描述", sysLog.getDescription()); + Timestamp logTime = sysLog.getLogtime(); + String dateTime = ""; + if (logTime != null) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd " + + "HH:mm:ss"); + dateTime = df.format(logTime); + } + + /*String dateTime = ""; + if (logTime != null) { + dateTime = logTime.format(DateTimeFormatter.ofPattern( + "yyyy-MM-dd HH:mm:ss")); + }*/ + + map.put("操作日期", dateTime); + list.add(map); + } + FileUtil.downloadExcel(list, response); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /********************************** + * 用途说明: 新增日志 + * 参数说明 nickname 用户名 + * 参数说明 username 用户账号 + * 参数说明 browser 浏览器 + * 参数说明 ip 本机Ip地址 + * 参数说明 joinPoint 连接点 + * 参数说明 log 日志信息 + * 返回值说明: void + ***********************************/ + @Override + public void save(String nickname, String username, String browser, + String ip, + ProceedingJoinPoint joinPoint, SysLog log) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + Log aopLog = method.getAnnotation(Log.class); + // 方法路径 + String methodName = + joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()"; + // 描述 + if (log != null) { + log.setDescription(aopLog.value()); + log.setModule(aopLog.module()); + } + assert log != null; + log.setUsercode(username); + log.setRequestip(ip); + log.setMethod(methodName); + log.setUsername(nickname); + log.setParams(getParameter(method, joinPoint.getArgs())); + log.setBrowser(browser); + String operationtype = getOperationtype(signature.getName()); + log.setOpttype(operationtype); + log.setLogtime(new Timestamp(System.currentTimeMillis())); + sysLogMapper.insert(log); + } + + /** + * 根据方法和传入的参数获取请求参数 + */ + private String getParameter(Method method, Object[] args) { + List argList = new ArrayList<>(); + Parameter[] parameters = method.getParameters(); + for (int i = 0; i < parameters.length; i++) { + //将RequestBody注解修饰的参数作为请求参数 + AnnotatedType type = parameters[i].getAnnotatedType(); + + RequestBody requestBody = + parameters[i].getAnnotation(RequestBody.class); + if (requestBody != null) { + argList.add(args[i]); + } + + //将RequestParam注解修饰的参数作为请求参数 + RequestParam requestParam = + parameters[i].getAnnotation(RequestParam.class); + if (requestParam != null) { + Map map = new HashMap<>(); + String key = parameters[i].getName(); + if (!StringUtils.isEmpty(requestParam.value())) { + key = requestParam.value(); + } + map.put(key, args[i]); + argList.add(map); + } + } + if (argList.size() == 0) { + return ""; + } + return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : + JSONUtil.toJsonStr(argList); + } + + public static String getOperationtype(String value) { + String type = ""; + if (value.contains("get") || value.contains("select")) { + type = "查询(select)"; + } else if (value.contains("add") || value.contains("insert")) { + type = "添加(insert)"; + } else if (value.contains("update") || value.contains("upd") || value.contains("change") || value.contains("set")) { + type = "修改(update)"; + } else if (value.contains("delete") || value.contains("del")) { + type = "删除(delete)"; + } else if (value.contains("dowload")) { + type = "下载(dowload)"; + } else if (value.contains("import")) { + type = "导入(import)"; + } else if (value.contains("word")) { + type = "word转pdf(wordToPdf)"; + } else { + type = "其他(other)"; + } + return type; + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..b53b789 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,674 @@ +package com.yfd.platform.system.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.system.domain.SysMenu; +import com.yfd.platform.system.domain.SysRole; +import com.yfd.platform.system.mapper.SysMenuMapper; +import com.yfd.platform.system.mapper.SysRoleMapper; +import com.yfd.platform.system.service.ISysMenuService; +import com.yfd.platform.utils.FileUtil; +import com.yfd.platform.config.FileSpaceProperties; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ResourceUtils; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.annotation.Resource; +import java.io.File; +import java.io.FileNotFoundException; +import java.sql.Timestamp; +import java.text.DecimalFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

    + * 菜单及按钮 服务实现类 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +@Service +@Transactional +public class SysMenuServiceImpl extends ServiceImpl implements ISysMenuService { + + @Resource + private SysMenuMapper sysMenuMapper; + + @Resource + private UserServiceImpl currentUser; + + @Resource + private SysRoleMapper sysRoleMapper; + + // 菜单图片路径配置 + @Resource + private FileSpaceProperties fileSpaceProperties; + + /*********************************** + * 用途说明:查询菜单及按钮树状图 + * 参数说明 + * systemcode 系统 + *isdisplay 是否显示 + * 返回值说明: 菜单结构树集合 + ***********************************/ + @Override + public List> getMenuButtonTree(String systemcode, + String name, + String isdisplay) { + List> listMap=null; + if(StrUtil.isEmpty(name)){//不带名称查询,返回树结构 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("parentid", "0").eq("systemcode", systemcode).orderByAsc("orderno"); + listMap = this.listMaps(queryWrapper); + + for (int i = 0; i < listMap.size(); i++) { + //查询下一子集 + List> childList = child(listMap.get(i).get( + "id").toString(), systemcode, name, null, null); + listMap.get(i).put("children", childList); //添加新列 子集 + } + }else{ //根据菜单名称查询,直接返回类别 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like("name", name).eq("systemcode", systemcode).orderByAsc("name"); + listMap = this.listMaps(queryWrapper); + } + + + + return listMap; + } + + /*********************************** + * 用途说明:获取菜单结构树(不含按钮) + * 参数说明 + * systemcode 系统 + * isdisplay 是否显示 + * 返回值说明: 菜单结构树集合 + ***********************************/ + @Override + public List> getMenuTree(String systemcode, + String name, + String isdisplay) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StrUtil.isNotEmpty(isdisplay)) { + queryWrapper.eq("isdisplay", isdisplay); + } else { + queryWrapper.eq("isdisplay", 1); + } + + //根据系统 ,类型不为2 显示,序号 正序排序 + queryWrapper.eq("parentid", "0").eq("systemcode", systemcode).ne( + "type", "2").orderByAsc("orderno"); + List> listMap = this.listMaps(queryWrapper); + for (int i = 0; i < listMap.size(); i++) { + List> childList = child(listMap.get(i).get( + "id").toString(), systemcode, name, isdisplay, "2");//查询下一子集 + listMap.get(i).put("children", childList); //添加新列 子集 + } + return listMap; + } + + /*********************************** + * 用途说明:查询菜单及按钮树状图 + * 参数说明 + * parentid 上级id + *systemcode 系统 + * isdisplay 是否显示 + * type 按钮 + * 返回值说明: 菜单结构树集合 + ***********************************/ + private List> child(String parentid, + String systemcode, String name, + String isdisplay, String type) { + List> listMap = new ArrayList<>(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("parentid", parentid).eq("systemcode", systemcode); + //根据上级id 系统 查询 + if (StrUtil.isNotEmpty(type)) { + queryWrapper.ne("type", type); + } + + if (StrUtil.isNotEmpty(name)) { //根据菜单名称查询 + queryWrapper.like("name", name); + } + listMap = this.listMaps(queryWrapper.orderByAsc("orderno")); + if (listMap.size() > 0) { //判断是否存在子集 + for (int i = 0; i < listMap.size(); i++) { //遍历表数据 + List> childList = + child(listMap.get(i).get("id").toString(), systemcode + , name, isdisplay, type); //循环获取下一子集 + listMap.get(i).put("children", childList); //添加新列 子集 + } + } + + return listMap; + } + + /*********************************** + * 用途说明:新增菜单及按钮 + * 参数说明 + * sysMenu 菜单或按钮表对象 + * 返回值说明: 是否添加成功提示 + ***********************************/ + @Override + public boolean addMenu(SysMenu sysMenu) { + String parentId = sysMenu.getParentid(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + //根据上级id 查询到总数 并累加 + long orderno = this.count(queryWrapper.eq("parentid", + parentId)) + 1L; + // 生成排序号 + sysMenu.setOrderno((int) orderno); + // 生成编号 + QueryWrapper queryMaxCode = new QueryWrapper<>(); + queryMaxCode.eq("parentid", + parentId); + // 查询最大的编号 + List maxList = this.listObjs(queryMaxCode.select("max(code) " + + "code").eq("systemcode", sysMenu.getSystemcode())); + SysMenu parentMenu = sysMenuMapper.selectById(parentId); + // 最大编号转换成int类型 + String maxCode = maxList.size() > 0 ? maxList.get(0).toString() : "0"; + int max = ObjectUtil.isEmpty(maxList) ? 0 : + Integer.parseInt(maxCode); + DecimalFormat df; + if ("0".equals(sysMenu.getParentid())) { + df = new DecimalFormat("00"); + } else if (parentMenu.getCode().length() == 2) { + df = new DecimalFormat("0000"); + } else { + df = new DecimalFormat("000000"); + } + //DecimalFormat df = new DecimalFormat("00"); + //int parentCode = Integer.parseInt(parentMenu.getCode()); + String parentCode = ""; + if (parentMenu != null) { + parentCode = parentMenu.getCode(); + } + // 生成的新编号 年月日+4位编号 + String code; + if (max > 0) { + code = df.format(max + 1); + } else { + max = max + 1; + if (StrUtil.isBlank(parentCode)) { + parentCode = "0" + max; + } else { + int i = Integer.parseInt(parentCode); + parentCode = i + "0" + max; + } + + int format = Integer.parseInt(parentCode); + code = df.format(format); + } + + // 判断是否显示字段 是否填写 为空 + if (StrUtil.isEmpty(sysMenu.getIsdisplay())) { + // 默认设置成 1 显示 + sysMenu.setIsdisplay("1"); + } + // 判断是否填写父级id 为空 默认设置成 0 + if (StrUtil.isEmpty(sysMenu.getParentid())) { + sysMenu.setParentid("0"); + } + // 添加编号 + sysMenu.setCode(code); + // 添加排序号 + sysMenu.setOrderno((int) orderno); + // 添加最近修改人 + sysMenu.setLastmodifier(currentUser.getUsername()); + // 添加最近修改时间 + sysMenu.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + return this.save(sysMenu); + } + + /*********************************** + * 用途说明:上传单个图标 + * 参数说明 + * id 上传图标id + * icon 图标 + * 返回值说明: 是否上传成功 + ***********************************/ + @Override + public boolean uploadIcon(String id, MultipartFile icon) { + //根据id查询 + SysMenu sysMenu = this.getById(id); + //图片路径 + String iconPath = fileSpaceProperties.getSystem() + "menu" + File.separator; + String iconname = + IdUtil.fastSimpleUUID() + "." + FileUtil.getExtensionName(icon.getOriginalFilename()); + //上传图标并获取图标名称 (图片改为png格式) + String filename = + FileUtil.upload(icon, iconPath, iconname).getName(); + //更新图标名称 + sysMenu.setIcon(filename); + //添加最近修改人 + sysMenu.setLastmodifier(currentUser.getUsername()); + //添加最近修改时间 + sysMenu.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + //更新数据 + boolean isOk = this.updateById(sysMenu); + return isOk; + } + + /*********************************** + * 用途说明:根据id删除单个图标 + * 参数说明 + * id 删除图标id + * icon 图标名称 + * 返回值说明: 是否删除成功 + ***********************************/ + @Override + public boolean deleteIcon(String id) { + //根据id查询 + SysMenu sysMenu = this.getById(id); + //图片路径 + String iconname = + System.getProperty("user.dir") + "\\src\\main" + + "\\resources\\static\\icon" + File.separator + sysMenu.getIcon(); + //更新图标名称 + sysMenu.setIcon(""); + //添加最近修改人 + sysMenu.setLastmodifier(currentUser.getUsername()); + //添加最近修改时间 + sysMenu.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + //更新数据 + boolean isOk = this.updateById(sysMenu); + //更新成功 删除图片 + if (isOk == true) { + FileUtil.del(iconname); + } + return isOk; + } + + /*********************************** + * 用途说明:菜单及按钮序号排序 + * 参数说明 + * parentid 上级id + * id + * orderno 更改后序号 + * 返回值说明: 是否更新成功 + ***********************************/ + @Override + public boolean moveOrderno(String parentid, String id, int orderno) { + boolean ok = true; + SysMenu sysMenu = this.getById(id); //根据id查询原顺序号 + if (sysMenu.getOrderno() > orderno) { + ok = sysMenuMapper.upMoveOrderno(parentid, sysMenu.getOrderno(), + orderno); //根据 父级id 小于原序号 大于等于更改序号 + } else { + ok = sysMenuMapper.downMoveOrderno(parentid, sysMenu.getOrderno() + , orderno); //根据 父级id 大于原序号 小于等于更改序号 + } + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + ok = ok && this.update(updateWrapper.eq("id", id).set("orderno", + orderno)); //根据 id修改序号 + return ok; + } + + /*********************************** + * 用途说明:根据id删除菜单或按钮 + * 参数说明 + * id 删除列的id + * 返回值说明: 是否删除成功 + ***********************************/ + @Override + public boolean deleteById(String id) { + //根据id查询 + SysMenu sysMenu = this.getById(id); + //图片路径 + String iconname = + fileSpaceProperties.getSystem() + "menu" + File.separator + sysMenu.getIcon(); + //删除图标 + new File(iconname).delete(); + //根据id删除 + boolean isOk = this.removeById(id); + //删除成功同步更新表数据 + if (isOk) { + //1 创建list集合,用于封装所有删除目录或菜单id值 + List idList = new ArrayList<>(); + this.selectPermissionChildById(id, idList); + if (idList.size() > 0) { + sysMenuMapper.deleteBatchIds(idList); + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + //根据上级id 查询 根据 orderno 正序排序 + queryWrapper.eq("parentid", sysMenu.getParentid()).orderByAsc( + "orderno"); + List list = this.list(queryWrapper); + for (int i = 0; i < list.size(); i++) { + SysMenu menu = list.get(i); + //更新序列号 + menu.setOrderno(i + 1); + } + //更新表数据 + this.updateBatchById(list); + } + return isOk; + } + + //2 根据当前菜单id,查询菜单里面子菜单id,封装到list集合 + private void selectPermissionChildById(String id, List idList) { + //查询菜单里面子菜单id + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("parentid", id); + wrapper.select("id"); + List childIdList = baseMapper.selectList(wrapper); + //把childIdList里面菜单id值获取出来,封装idList里面,做递归查询 + childIdList.stream().forEach(item -> { + //封装idList里面 + idList.add(item.getId()); + //递归查询 + this.selectPermissionChildById(item.getId(), idList); + }); + } + + /********************************** + * 用途说明: 调换菜单或按钮的位置 + * 参数说明 upperId 选中的菜单Id + * 参数说明 belowId 切换的菜单Id + * 返回值说明: boolean + ***********************************/ + @Override + @Transactional + public boolean changeOderNoById(String fromId, String toId) { + SysMenu fromSysMenu = this.getById(fromId); + SysMenu toSysMenu = this.getById(toId); + // 如果菜单或按钮不存在拖动失败 + if (fromSysMenu == null || toSysMenu == null) { + return false; + } + Integer fromOrderNo = fromSysMenu.getOrderno(); + Integer toOrderNo = toSysMenu.getOrderno(); + // 如果菜单或按钮的顺序号不存在拖动失败 + if (fromOrderNo == null || toOrderNo == null) { + return false; + } + fromSysMenu.setOrderno(toOrderNo); + toSysMenu.setOrderno(fromOrderNo); + boolean fromBool = this.updateById(fromSysMenu); + boolean toBool = this.updateById(toSysMenu); + return fromBool && toBool; + } + + /********************************** + * 用途说明: 根据用户id获取菜单树 + * 参数说明 id 用户id + * 返回值说明: 返回菜单树 + ***********************************/ + @Override + public List> getMenuTree(String id) { + // 根据id获取菜单 + //List sysMenus = sysMenuMapper.selectMenuByUserId(id); + List> list; + if (StrUtil.isBlank(id)) { + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + list = this.listMaps(queryWrapper.eq(SysMenu::getIsdisplay, "1").ne(SysMenu::getType, "2").eq(SysMenu::getSystemcode, "1").orderByAsc(SysMenu::getOrderno)); + } else { + list = sysMenuMapper.selectMenuByUserId(id); + } + // 将菜单转换成树 + List> sysMenus = buildTreeLeft(list); + return sysMenus; + } + + /*********************************** + * 用途说明:权限分配 + * 参数说明 + * systemcode 系统 + * name 名称 + * isdisplay 是否显示 + * 返回值说明: 菜单结构树集合 + ***********************************/ + @Override + public List> permissionAssignment(String roleId) { + + String code = sysMenuMapper.getSystemCodeById(roleId); + if (code == null) { + code = "1"; + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysMenu::getSystemcode, code).select(SysMenu::getId, + SysMenu::getParentid, SysMenu::getName).orderByAsc + (SysMenu::getOrderno); + List> listAll = + sysMenuMapper.selectMaps(queryWrapper); + List listRole = + sysMenuMapper.selectMenuByRoleId(roleId); + for (Map map : listAll) { + String id = (String) map.get("id"); + if (listRole.contains(id)) { + map.put("checkinfo", true); + } else { + map.put("checkinfo", false); + } + + } + List> listTree = buildTrees(listAll); + return listTree; + } + + // 另一种方法 + /*public List> permissionAssignment(String roleId) { + + String code = sysMenuMapper.getSystemCodeById(roleId); + if (code == null) { + code = "1"; + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysMenu::getSystemcode, code).select(SysMenu::getId, + SysMenu::getParentid, SysMenu::getName).orderByAsc + (SysMenu::getOrderno); + List> listAll = + sysMenuMapper.selectMaps(queryWrapper); + *//*List listRole = + sysMenuMapper.selectMenuByRoleId(roleId);*//* + SysRole sysRole = sysRoleMapper.selectById(roleId); + String optscope = sysRole.getOptscope(); + // 将当前角色所对应权限id拆分 + String[] split = optscope.split(","); + List listRole = Arrays.asList(split); + for (Map map : listAll) { + String id = (String) map.get("id"); + if (listRole.contains(id)) { + map.put("checkinfo", true); + } else { + map.put("checkinfo", false); + } + + } + List> listTree = buildTrees(listAll); + return listTree; + }*/ + + /*********************************** + * 用途说明:上传单个图标 + * 参数说明 + * icon 图标 + * 返回值说明: 是否上传成功 + ***********************************/ + @Override + public String uploadIcon(MultipartFile icon) throws FileNotFoundException { + + String path = System.getProperty("user.dir") + "\\src\\main" + + "\\resources\\"; + //图片路径 + String iconPath = path + "static\\icon" + File.separator; + String iconname = + IdUtil.fastSimpleUUID() + "." + FileUtil.getExtensionName(icon.getOriginalFilename()); + //上传图标并获取图标名称 (图片改为png格式) + String filename = + FileUtil.upload(icon, iconPath, iconname).getName(); + return filename; + } + + /** + * 菜单集合递归生成树状菜单(List) + * + * @param sysMenus 菜单对象 + * @return + */ + /* public List buildTree(List sysMenus) { + List resultMenuList = new ArrayList<>(); + for (SysMenu sysMenu : sysMenus) { + + for (SysMenu menu : sysMenus) { + if (menu.getParentid().equals(sysMenu.getId())) { + sysMenu.getChildren().add(menu); + } + } + if ("0".equals(sysMenu.getParentid())) { + resultMenuList.add(sysMenu); + } + } + return resultMenuList; + }*/ + + /** + * 菜单集合递归生成树状菜单(Map)(暂不使用该方法) + * + * @param sysMenus 菜单对象 + * @return + */ + public List> buildTree(List> sysMenus) { + List> resultMenuList = new ArrayList<>(); + for (Map sysMenu : sysMenus) { + + List> childrenList = new ArrayList<>(); + for (Map menu : sysMenus) { + if (menu.get("parentid").equals(sysMenu.get("id"))) { + childrenList.add(menu); + } + } + if ("0".equals(sysMenu.get("parentid"))) { + if (childrenList.size() > 0) { + sysMenu.put("children", childrenList); + } + resultMenuList.add(sysMenu); + } + } + return resultMenuList; + } + + /********************************** + * 用途说明: 左侧菜单树构建 + * 参数说明 sysMenus + * 返回值说明: java.util.List> + ***********************************/ + public List> buildTreeLeft(List> sysMenus) { + List> resultMenuList = new ArrayList<>(); + for (Map sysMenu : sysMenus) { + if ("0".equals(sysMenu.get("parentid"))) { + resultMenuList.add(sysMenu); + } + } + for (Map sysMenu : resultMenuList) { + List> menus = iterateMenusLeft(sysMenus, + (String) sysMenu.get("id")); + if (menus.size() > 0) { + sysMenu.put("children", menus); + } + } + return resultMenuList; + } + + /** + * 左侧多级菜单查询方法 + * + * @param menuVoList 不包含最高层次菜单的菜单集合 + * @param pid 父类id + * @return + */ + public List> iterateMenusLeft(List> menuVoList, String pid) { + List> result = new ArrayList<>(); + for (Map menu : menuVoList) { + //获取菜单的id + String menuid = (String) menu.get("id"); + //获取菜单的父id + String parentid = (String) menu.get("parentid"); + if (StrUtil.isNotBlank(parentid)) { + if (parentid.equals(pid)) { + //递归查询当前子菜单的子菜单 + List> iterateMenu = + iterateMenus(menuVoList, menuid); + if (iterateMenu.size() > 0) { + menu.put("children", iterateMenu); + } + result.add(menu); + } + } + } + return result; + } + + /********************************** + * 用途说明: 生成权菜单权限树 + * 参数说明 sysMenus + * 返回值说明: java.util.List> + ***********************************/ + public List> buildTrees(List> sysMenus) { + List> resultMenuList = new ArrayList<>(); + for (Map sysMenu : sysMenus) { + if ("0".equals(sysMenu.get("parentid"))) { + resultMenuList.add(sysMenu); + } + } + for (Map sysMenu : resultMenuList) { + List> menus = iterateMenus(sysMenus, + (String) sysMenu.get("id")); + for (Map menu : menus) { + if (!(boolean) menu.get("checkinfo")) { + sysMenu.put("checkinfo", false); + break; + } + } + sysMenu.put("children", menus); + } + return resultMenuList; + } + + /** + * 多级菜单查询方法 + * + * @param menuVoList 不包含最高层次菜单的菜单集合 + * @param pid 父类id + * @return + */ + public List> iterateMenus(List> menuVoList, String pid) { + List> result = new ArrayList<>(); + for (Map menu : menuVoList) { + //获取菜单的id + String menuid = (String) menu.get("id"); + //获取菜单的父id + String parentid = (String) menu.get("parentid"); + if (StrUtil.isNotBlank(parentid)) { + if (parentid.equals(pid)) { + //递归查询当前子菜单的子菜单 + List> iterateMenu = + iterateMenus(menuVoList, menuid); + for (Map map : iterateMenu) { + boolean checkinfo = (boolean) map.get("checkinfo"); + if (!checkinfo) { + menu.put("checkinfo", false); + } + } + menu.put("children", iterateMenu); + result.add(menu); + } + } + } + return result; + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java new file mode 100644 index 0000000..01ea014 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java @@ -0,0 +1,338 @@ +package com.yfd.platform.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysOrganization; +import com.yfd.platform.system.domain.SysRole; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.mapper.SysOrganizationMapper; +import com.yfd.platform.system.mapper.SysRoleMapper; +import com.yfd.platform.system.service.ISysOrganizationService; +import com.yfd.platform.system.service.IUserService; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.sql.Timestamp; +import java.text.DecimalFormat; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + *

    + * 系统组织框架 服务实现类 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +@Service +public class SysOrganizationServiceImpl extends ServiceImpl implements ISysOrganizationService { + + @Resource + private UserServiceImpl currentUser; + + @Resource + private IUserService userService; + + @Resource + private SysRoleMapper sysRoleMapper; + + @Resource + private SysOrganizationMapper sysOrganizationMapper; + + /*********************************** + * 用途说明:获取组织结构树 + * 参数说明 + *parentid 上级id + * params 名称(根据名称查询二级) + * 返回值说明: 组织树集合 + ***********************************/ + @Override + public List> getOrgTree(String parentid, + String params) { + List> listMap = new ArrayList<>(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + //根据父级id查询 + queryWrapper.eq("parentid", parentid); + if (StrUtil.isNotEmpty(params)) { + queryWrapper.like("orgname", params); // 根据 部门名称 + } + SysUser userInfo = userService.getUserInfo(); + if (userInfo.getUsertype() != 0) { + List roleByUserId = + sysRoleMapper.getRoleByUserId(userInfo.getId()); + List ids = new ArrayList<>(); + // 循环当前角色 + for (SysRole sysRole : roleByUserId) { + // 获取角色的组织Id + String orgscope = sysRole.getOrgscope(); + if (StrUtil.isBlank(orgscope)) { + continue; + } + // 拆分组织Id + String[] split = orgscope.split(","); + List stringList = Arrays.asList(split); + Set set = new HashSet<>(); + if (stringList.size() > 0) { + List list = + sysOrganizationMapper.selectList(new LambdaQueryWrapper().in(SysOrganization::getId, stringList)); + list.forEach(l -> set.add(l.getParentid())); + } + ids.addAll(stringList); + ids.addAll(set); + } + queryWrapper.in("id", ids); + } + listMap = this.listMaps(queryWrapper.orderByAsc("orgcode")); + for (int i = 0; i < listMap.size(); i++) { + List> childList = child(listMap.get(i).get( + "id").toString());//查询下一子集 + listMap.get(i).put("childList", childList); //添加新列 子集 + } + return listMap; + } + + /*********************************** + * 用途说明:获取组织结构树 + * 参数说明 + *parentid 上级id + * params (根据参数查询 组织名称 负责人 描述) + * 返回值说明: 组织树集合 + ***********************************/ + private List> child(String parentid) { + List> listMap = new ArrayList<>(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("parentid", parentid); //根据上级id 查询 + listMap = this.listMaps(queryWrapper.orderByAsc("orgcode")); + if (listMap.size() > 0) { //判断是否存在子集 + for (int i = 0; i < listMap.size(); i++) { //遍历表数据 + List> childList = + child(listMap.get(i).get("id").toString()); //循环获取下一子集 + listMap.get(i).put("childList", childList); //添加新列 子集 + } + } + return listMap; + } + + /*********************************** + * 用途说明:新增系统组织框架 + * 参数说明 + * sysOrganization 系统组织框架对象 + * 返回值说明: 是否新增成功 + ***********************************/ + @Override + public boolean addOrg(SysOrganization sysOrganization) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + SysOrganization parent = null; + int codeMax = 0; + //查询最大的编号 判断是否存在父级id 有值 根据父级id查询 否则 根据父级id为0 查询 + queryWrapper.select("max(orgcode)"); + if (StrUtil.isNotEmpty(sysOrganization.getParentid())) { + //根据父级id查询父级信息 + parent = this.getById(sysOrganization.getParentid()); + queryWrapper.eq("parentid", sysOrganization.getParentid()); + } else { + //默认 填写父级id为0 + sysOrganization.setParentid("0"); + queryWrapper.eq("parentid", "0"); + } + List max = this.listObjs(queryWrapper); + //判断查询是否存在 存在转换成int类型并给codeMax替换值 + if (max.size() > 0) { + codeMax = + Integer.parseInt(max.get(0).toString().substring(max.get(0).toString().length() - 2)); + } + //2位数字编号 + DecimalFormat df = new DecimalFormat("00"); + //编号 + String code = df.format(codeMax + 1); + //查询到父级不为空 重新赋值 父级编号+新的序号 + if (parent != null) { + code = parent.getOrgcode() + df.format(codeMax + 1); + } + //判断是否是否填写 有效 否则默认为 1 + if (StrUtil.isEmpty(sysOrganization.getIsvaild())) { + sysOrganization.setIsvaild("1"); + } + //填写 编号 + sysOrganization.setOrgcode(code); + //填写 当前用户名称 + sysOrganization.setLastmodifier(currentUser.getUsername()); + //填写 当前日期 + sysOrganization.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + return this.save(sysOrganization); + } + + /*********************************** + * 用途说明:根据企业ID查询组织详情 + * 参数说明 + * id 企业id + * 返回值说明: 系统组织框架对象 + ***********************************/ + @Override + public List getOrganizationById(String id, + String orgName) { + + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + SysUser userInfo = userService.getUserInfo(); + if (userInfo.getUsertype() != 0) { + List roleByUserId = + sysRoleMapper.getRoleByUserId(userInfo.getId()); + List ids = new ArrayList<>(); + // 循环当前角色 + for (SysRole sysRole : roleByUserId) { + // 获取角色的组织Id + String orgscope = sysRole.getOrgscope(); + if (StrUtil.isBlank(orgscope)) { + continue; + } + // 拆分组织Id + String[] split = orgscope.split(","); + List stringList = Arrays.asList(split); + ids.addAll(stringList); + } + if (ObjectUtil.isNotEmpty(ids)) { + queryWrapper.in(SysOrganization::getId, ids); + } + + } + if (StrUtil.isNotBlank(orgName)) { + queryWrapper.like(SysOrganization::getOrgname, orgName); + } + queryWrapper.eq(SysOrganization::getParentid, id).orderByDesc(SysOrganization::getOrgcode); + return this.list(queryWrapper); + } + + /*********************************** + * 用途说明:获取组织范围树结构 + * 参数说明 + *parentid 上级id + * params 名称(根据名称查询二级) + * 返回值说明: 组织树集合 + ***********************************/ + @Override + public List> getOrgScopeTree(String roleId) { + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + queryWrapper.eq(SysOrganization::getIsvaild, '1'); + queryWrapper.orderByAsc(SysOrganization::getOrgcode); + List> listMaps = this.listMaps(queryWrapper); + // 获取当前角色 + SysRole sysRole = sysRoleMapper.selectById(roleId); + String orgscope = sysRole.getOrgscope(); + List ids = new ArrayList<>(); + if (StrUtil.isNotBlank(orgscope)) { + String[] split = orgscope.split(","); + ids = Arrays.asList(split); + } + + for (Map map : listMaps) { + String id = (String) map.get("id"); + if (ids.contains(id)) { + map.put("checkinfo", true); + } else { + map.put("checkinfo", false); + } + map.put("bool", true); + } + // 生成组织树 + List> listMap = buildTrees(listMaps); + return listMap; + } + + /********************************** + * 用途说明: 修改角色组织范围 + * 参数说明 roleId 角色id + * 参数说明 orgscope 组织id集合 + * 返回值说明: boolean 是否修改成功 + ***********************************/ + @Override + public boolean updateOrgScopeByRoleId(String roleId, String orgscope) { + SysRole sysRole = new SysRole(); + sysRole.setId(roleId); + sysRole.setOrgscope(orgscope); + int i = sysRoleMapper.updateById(sysRole); + if (i > 0) { + return true; + } else { + return false; + } + + } + + /********************************** + * 用途说明: 生成组织范围树 + * 参数说明 sysMenus + * 返回值说明: java.util.List> + ***********************************/ + public List> buildTrees(List> sysMenus) { + List> resultMenuList = new ArrayList<>(); + // 获取父节点 + for (Map sysMenu : sysMenus) { + if ("0".equals(sysMenu.get("parentid"))) { + resultMenuList.add(sysMenu); + } + } + // 寻找子节点 + for (Map sysMenu : resultMenuList) { + sysMenu.put("checkinfo", true); + List> children = new ArrayList<>(); + List array = new ArrayList<>(); + for (Map menu : sysMenus) { + String id = (String) sysMenu.get("id"); + String parentid = (String) menu.get("parentid"); + if (id.equals(parentid)) { + // 如果存在一个子节点没有被选中,父节点则不是全选状态 + if (!(boolean) menu.get("checkinfo")) { + sysMenu.put("checkinfo", false); + } else { + // 将处于选中状态的子节点加入到数组中 + array.add((String) menu.get("orgname")); + } + children.add(menu); + } + } + // 所有子节点加入父节点 + sysMenu.put("children", children); + sysMenu.put("array", array); + } + return resultMenuList; + } + + /** + * 组织集合递归生成树状菜单(Map) + * + * @param sysOrgList 组织集合 + * @return + */ + public List> buildTree(List> sysOrgList) { + List> resultOrgList = new ArrayList<>(); + for (Map sysOrg : sysOrgList) { + List> childrenList = new ArrayList<>(); + List array = new ArrayList<>(); + for (Map org : sysOrgList) { + if (org.get("parentid").equals(sysOrg.get("id"))) { + if (!(boolean) org.get("checkinfo")) { + sysOrg.put("checkinfo", false); + } + array.add((String) org.get("orgname")); + childrenList.add(org); + } + } + if ("0".equals(sysOrg.get("parentid"))) { + if (childrenList.size() > 0) { + sysOrg.put("children", childrenList); + } + resultOrgList.add(sysOrg); + } + sysOrg.put("array", array); + } + return resultOrgList; + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..63d5c36 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,163 @@ +package com.yfd.platform.system.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysRole; +import com.yfd.platform.system.mapper.SysRoleMapper; +import com.yfd.platform.system.service.ISysRoleService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import jakarta.annotation.Resource; +import java.sql.Timestamp; +import java.text.DecimalFormat; +import java.util.List; +import java.util.Map; + +/** + *

    + * 系统角色 服务实现类 + *

    + * + * @author zhengsl + * @since 2021-12-15 + */ +@Service +@Transactional +public class SysRoleServiceImpl extends ServiceImpl implements ISysRoleService { + + @Resource + private SysRoleMapper roleMapper; + + @Resource + private UserServiceImpl currentuser; + + /*********************************** + * 用途说明:新增角色 + * 参数说明 + * sysRole 新增角色信息 + * 返回值说明: 是否新增成功 + ***********************************/ + @Override + public boolean addRole(SysRole sysRole) { + //生成用户编号 + int codeMax = 0; + DecimalFormat df = new DecimalFormat("000");//四位数字编号 + QueryWrapper queryWrapper = new QueryWrapper<>(); + List max = this.listObjs(queryWrapper.select("MAX(rolecode) " + + "rolecode"));// 查询最大的编号 + if (max.size() > 0) { + codeMax = Integer.parseInt(max.get(0).toString());//判断查询是否存在 + } + // 存在转换成int类型并给codeMax替换值 + String code = df.format(codeMax + 1); // 最大编号累加 + + sysRole.setRolecode(code); //添加角色编号 + if (StringUtils.isEmpty(sysRole.getIsvaild())) { + sysRole.setIsvaild("1"); //判断是否填写有效性 默认为 1 是 + } + sysRole.setLastmodifier(currentuser.getUsername()); //添加最近修改者 + sysRole.setLastmodifydate(new Timestamp(System.currentTimeMillis())); //添加最近修改时间 + return this.save(sysRole); + } + + /*********************************** + * 用途说明:删除角色用户(admin除外) + * 参数说明 + * id 系统角色用户对照表id + * 返回值说明: 是否新增成功 + ***********************************/ + @Override + public boolean deleteRoleUsers(String roleid, String urserids) { + boolean ok = true; + //得到单个用户id + String[] temp = urserids.split(","); + for (String userid : temp) { + //根据角色id、用户id删除 (登录账号admin除外) + ok = ok && roleMapper.deleteRoleUsers(roleid, userid); + + } + return ok; + } + + /*********************************** + * 用途说明:根据id删除角色 //待修改 + * 参数说明 + *id 角色id + * 返回值说明: 是否删除成功 + ***********************************/ + @Override + public void deleteById(String id) { + String[] ids = id.split(","); + for (String roleId : ids) { + //根据id删除 角色 + boolean isOk = this.removeById(roleId); + if (!isOk) { + continue; + } + roleMapper.deleteRoleMenus(roleId); + roleMapper.deleteRoleUser(roleId); + } + } + /* 原逻辑 + @Override + public boolean deleteById(String id) { + //根据角色id查询 所关联的用户 + List> isRoleUsersByroleid = + roleMapper.isRoleUsersByroleid(id); + //判断是否关联用户 + if (isRoleUsersByroleid.size() > 0) { + return false; + } + //根据id删除 角色 + boolean isOk = this.removeById(id); + if (isOk) { + return true; + } + return false; + }*/ + + /*********************************** + * 用途说明:查询已分配的用户 + * 参数说明 + *orgid 所属组织 + *username 用户名称 + *status 状态 + *level 角色级别 + * rolename 角色名称 + * isvaild 角色是否有效 + * 返回值说明: 系统用户角色数据集合 + ***********************************/ + @Override + public List listRoleUsers(String orgid, String username, + String status, String level, + String rolename, String isvaild) { + return roleMapper.listRoleUsers(orgid, username, status, level, + rolename, isvaild); + } + + /*********************************** + * 用途说明:角色分配权限 + * 参数说明 + * id 角色id + * menuIds 权限id字符串 + * 返回值说明: 是否分配成功 + ***********************************/ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean setMenuById(String id, String menuIds) { + // 删除角色所对应的权限 + roleMapper.deleteRoleMenus(id); + // 重新赋予权限 + String[] ids = menuIds.split(","); + for (String menuId : ids) { + String uuid = IdUtil.fastSimpleUUID(); + roleMapper.addRoleMenu(uuid, id, menuId); + } + return true; + } + +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/UserDetailsServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/UserDetailsServiceImpl.java new file mode 100644 index 0000000..dc28501 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/UserDetailsServiceImpl.java @@ -0,0 +1,52 @@ +package com.yfd.platform.system.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yfd.platform.datasource.DataSource; +import com.yfd.platform.system.domain.LoginUser; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.mapper.SysMenuMapper; +import com.yfd.platform.system.service.IUserService; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.util.List; + +/** + *

    + * 用户服务实现类 继承UserDetailsService 实现接口 + *

    + * + * @author zhengsl + * @since 2021-10-27 + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + + @Resource + private IUserService userService; + + @Resource + private SysMenuMapper sysMenuMapper; + + @Override + @DataSource(name = "master") + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + //根据用户名称查询用户信息 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("username", username); + SysUser user = userService.getOne(queryWrapper); + if (ObjectUtil.isEmpty(user)) { + throw new RuntimeException("用户账号不存在!"); + } + //Todo 根据用户查询权限信息 添加到LoginUser中 + List permissions = + sysMenuMapper.selectPermsByUserId(user.getId()); + + //封装成UserDetails对象返回 + return new LoginUser(user,permissions); + } +} diff --git a/framework/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/framework/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..566d608 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -0,0 +1,550 @@ +package com.yfd.platform.system.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.config.FileProperties; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.LoginUser; +import com.yfd.platform.system.domain.SysOrganization; +import com.yfd.platform.system.domain.SysRole; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.mapper.SysOrganizationMapper; +import com.yfd.platform.system.mapper.SysRoleMapper; +import com.yfd.platform.system.mapper.SysUserMapper; +import com.yfd.platform.system.service.IUserService; +import com.yfd.platform.utils.FileUtil; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import com.yfd.platform.config.FileSpaceProperties; +import jakarta.annotation.Resource; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.annotation.Resource; +import jakarta.validation.constraints.NotBlank; +import java.io.File; +import java.sql.Timestamp; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

    + * 用户服务实现类 + *

    + * + * @author zhengsl + * @since 2021-10-27 + */ +@Service +@RequiredArgsConstructor +public class UserServiceImpl extends ServiceImpl implements IUserService { + + @Resource + private SysUserMapper sysUserMapper; + + @Resource + private SysRoleMapper sysRoleMapper; + + @Resource + private PasswordEncoder passwordEncoder; + /** + * 文件空间配置 + */ + @Resource + private FileSpaceProperties fileSpaceProperties; + + /********************************** + * 用途说明:获取当前用户账号及名称 + * 参数说明 + * 返回值说明: 系统管理员[admin] + ***********************************/ + @Override + public String getUsername() { + UsernamePasswordAuthenticationToken authentication = + (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); + LoginUser loginuser = (LoginUser) authentication.getPrincipal(); + String acountname = + loginuser.getUser().getNickname(); + return acountname; + //return "admin"; + } + + @Override + public Map getNameInfo() { + UsernamePasswordAuthenticationToken authentication = + (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); + LoginUser loginuser = (LoginUser) authentication.getPrincipal(); + String nickname = loginuser.getUser().getNickname(); + String username = loginuser.getUser().getUsername(); + Map map = new HashMap<>(); + map.put("nickname", nickname); + map.put("username", username); + return map; + } + + @Override + public SysUser getUserInfo() { + UsernamePasswordAuthenticationToken authentication = + (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); + LoginUser loginuser = (LoginUser) authentication.getPrincipal(); + return loginuser.getUser(); + } + + @Override + public ResponseResult getLoginUserInfo() { + UsernamePasswordAuthenticationToken authentication = + (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); + LoginUser loginuser = (LoginUser) authentication.getPrincipal(); + SysUser user = loginuser.getUser(); + //根据用户ID获取组织 + Map userInfo = + sysUserMapper.getOrganizationByid(user.getId()); + List roles = + sysRoleMapper.selectList(new QueryWrapper().inSql( + "id ", "SELECT roleid FROM sys_role_users ru WHERE ru" + + ".userid = '" + user.getId() + "'")); + List collect = + roles.stream().map(SysRole::getRolename).collect(Collectors.toList()); + ResponseResult responseResult = new ResponseResult(); + responseResult.put("userInfo", userInfo); + responseResult.put("roles", collect); + responseResult.put("permissions", loginuser.getPermissions()); + return responseResult; + } + + /*********************************** + * 用途说明:新增用户 + * 参数说明 + *sysUser 新增用户对象 + * id 创建者id + * roleId 角色id + * 返回值说明: 提示字符串 + ************************************/ + @Override + public Map addUser(SysUser sysUser, String roleids) { + //返回信息 + Map result = new HashMap<>(); + sysUser.setId(IdUtil.fastSimpleUUID()); + //普通用户 + sysUser.setUsertype(1); + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + //设置缺省密码 + String cryptPassword = passwordEncoder.encode("123456"); + sysUser.setPassword(cryptPassword); + sysUser.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + sysUser.setLastmodifier(getUsername()); + //账号有效 + sysUser.setStatus(1); + //判断注册的登录账号是否存在 + if (isExistAccount(sysUser.getUsername())) { + //新增用户 + boolean ok = this.save(sysUser); + //新增用户分配权限 + if (StrUtil.isNotEmpty(roleids)) { + String[] roles = roleids.split(","); + for (String roleid : roles) { + //系统生成id + String id = IdUtil.fastSimpleUUID(); + //新增sys_role_users表数据 + ok = ok && sysUserMapper.addUserRoles(id, roleid, + sysUser.getId()); + } + } + //判断新增是否成功 消息提示 + if (ok) { + result.put("status", "sucess"); + result.put("msg", "新增用户成功!"); + + } else { + result.put("status", "error"); + result.put("msg", "新增用户失败!"); + } + } else { + result.put("status", "error"); + result.put("msg", "用户账号已存在,不能重复添加!"); + } + return result; + } + + /*********************************** + * 用途说明:查询系统用户 + * 参数说明 + *page 分页集合参数 + *orgid 所属组织 + *username 用户名称 + * mobile 手机号 + * status 状态 + * 返回值说明: 用户分页集合 + ************************************/ + @Override + public List list(String total, String size, String orgid, + String username, String mobile, String status) { + List list = sysUserMapper.list(total, size, orgid, username, + mobile, status); + for (Map map : list) { + List mapList = + sysUserMapper.getLevel(map.get("id").toString()); + String roleid = ""; + String level = ""; + String rolename = ""; + for (Map map1 : mapList) { + roleid += map1.get("id") + ","; + level += map1.get("level") + ","; + rolename += map1.get("rolename") + ","; + } + if (roleid.endsWith(",")) { + roleid = roleid.substring(0, roleid.length() - 1); + } + if (level.endsWith(",")) { + level = level.substring(0, level.length() - 1); + } + if (rolename.endsWith(",")) { + rolename = rolename.substring(0, rolename.length() - 1); + } + + map.put("roleid", roleid); + map.put("level", level); + map.put("rolename", rolename); + } + return list; //返回分页集合 + } + + /*********************************** + * 用途说明:根据ID修改用户 + * 参数说明 + *sysUser 用户对象 + *roleids 角色id + * 返回值说明: 是否更新成功 + ************************************/ + @Override + public Map updateById(SysUser sysUser, String roleids) { + //返回信息 + Map result = new HashMap<>(); + //获取当前用户 最近修改者替换 + sysUser.setLastmodifier(getUsername()); + //获取当前时间 最近修改日期替换 + sysUser.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + //根据修改 + boolean ok = this.updateById(sysUser); + if (ok) { + if (StrUtil.isNotEmpty(roleids)) { + String[] roles = roleids.split(","); + List list = sysUserMapper.getRoleid(sysUser.getId()); + for (String role : roles) { + if (!list.contains(role)) { + //系统生成id + String id = IdUtil.fastSimpleUUID(); + //新增sys_role_users表数据 + ok = ok && sysUserMapper.addUserRoles(id, role, + sysUser.getId()); + } + } + //删除不包含的角色 + sysUserMapper.delInRoleUsersByUserid(sysUser.getId(), roles); + + } else { + //根据用户id 删除该用户角色关联 + ok = ok && sysUserMapper.delRoleUsersByUserid(sysUser.getId()); + } + result.put("status", "sucess"); + result.put("msg", "用户信息修改成功!"); + } else { + result.put("status", "error"); + result.put("msg", "用户信息修改失败!"); + } + + return result; + } + + @Override + public Map getOneById(String id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + Map map = this.getMap(queryWrapper.eq("id", id)); + List mapList = sysUserMapper.getLevel(id); + String roleid = ""; + String level = ""; + String rolename = ""; + for (Map map1 : mapList) { + roleid += map1.get("id") + ","; + level += map1.get("level") + ","; + rolename += map1.get("rolename") + ","; + } + if (roleid.endsWith(",")) { + roleid = roleid.substring(0, roleid.length() - 1); + } + if (level.endsWith(",")) { + level = level.substring(0, level.length() - 1); + } + if (rolename.endsWith(",")) { + rolename = rolename.substring(0, rolename.length() - 1); + } + + map.put("roleid", roleid); + map.put("level", level); + map.put("rolename", rolename); + return map; + } + + /*********************************** + * 用途说明:用户分配角色 + * 参数说明 + *listId 用户id与角色id + * 返回值说明: 判断是否添加成功 + ************************************/ + @Override + public boolean setUserRoles(String roleid, String userids) { + boolean isOk = true; + //拆分userid 数组 + String[] temp = userids.split(","); + //遍历userid + for (String userid : temp) { + //根据角色id与用户id查询 + List list = sysUserMapper.getRoleUsersByid(roleid, userid); + //判断是否用户已分配此权限 + if (list.size() == 0) { + //系统生成id + String id = IdUtil.fastSimpleUUID(); + //新增sys_role_users表数据 + isOk = isOk && sysUserMapper.addUserRoles(id, roleid, userid); + } + } + return isOk; + } + + /*********************************** + * 用途说明:根据id删除用户 + * 参数说明 + *id 用户id + * 返回值说明: 判断是否删除成功 + ************************************/ + @Override + public boolean deleteById(String id) { + //根据id查询 + SysUser sysUser = this.getById(id); + //账号头像存储地址 + String imgName = + fileSpaceProperties.getSystem() + File.separator + "user" + File.separator + sysUser.getAvatar(); + if ("admin".equals(sysUser.getUsername())) { + return false; + } else { + boolean isOk = this.removeById(id); + //判断是否删除成功 + if (isOk) { + //根据用户id 删除该用户角色关联 + sysUserMapper.delRoleUsersByUserid(id); + //判断是否存在 账号头像 存在删除 + if (StrUtil.isNotEmpty(sysUser.getAvatar())) { + FileUtil.del(imgName); + } + return false; + } else { + return false; + } + } + } + + /*********************************** + * 用途说明:重置用户密码(管理员) + * 参数说明 + *id 重置密码的 用户id + * 返回值说明: 判断是重置成功 + ************************************/ + @Override + public boolean resetPassword(String id) throws Exception { + boolean isOk = false; + //根据当前用户id 查询角色表的级别 currentUser.getUser() 获取当前用户id + String level = sysUserMapper.getMaxLevel(id); + //判断是否获取级别 + if (StrUtil.isNotEmpty(level)) { + //判断当前用户级别 管理员及以上权限 + if (Integer.parseInt(level) <= 2) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + //根据id 修改密码,密码修改时间,最近修改者,最近修改日期 将密码修改为 123456 + String cryptPassword = passwordEncoder.encode("123456"); + updateWrapper.eq("id", id).set("password", cryptPassword).set( + "pwdresettime", + new Timestamp(System.currentTimeMillis())).set( + "lastmodifydate", + new Timestamp(System.currentTimeMillis())).set( + "lastmodifier", getUsername()); + //是否修改成功 + isOk = this.update(updateWrapper); + } + } + return isOk; + } + + /*********************************** + * 用途说明:设置账号状态(管理员) + * 参数说明 + *id 用户id + * status 设置状态 + * 返回值说明: 判断是否设置成功 + ************************************/ + @Override + public boolean setStatus(String id, String status) { + boolean isOk = false; + //根据当前用户id 查询角色表的级别 currentUser.getUser() 获取当前用户id + String level = sysUserMapper.getMaxLevel(id); + //判断当前用户级别 管理员及以上权限 + if (Integer.parseInt(level) <= 2) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + //根据id修改用户状态,最近修改人,最近修改时间 + updateWrapper.eq("id", id).set("status", status).set( + "lastmodifydate", + new Timestamp(System.currentTimeMillis())).set( + "lastmodifier", getUsername()); + //是否修改成功 + isOk = this.update(updateWrapper); + } + return isOk; + } + + /*********************************** + * 用途说明:上传用户头像 + * 参数说明 + * id 用户id + * img 账号头像 + * 返回值说明: 判断是否上传 + ***********************************/ + @Override + public boolean uploadAvatar(String id, MultipartFile img) { + //根据id查询 + SysUser sysUser = this.getById(id); + //账号头像存储地址 + String imgPath = fileSpaceProperties.getSystem() + "user"; + String avatar = sysUser.getAvatar(); + if (StrUtil.isNotBlank(avatar)) { + String imgName = imgPath + File.separator + avatar; + FileUtil.del(imgName); + } + //上传图片 并获取图片名称 (图片格式修改成png) + String imgName = FileUtil.upload(img, imgPath, + IdUtil.fastSimpleUUID() + "." + FileUtil.getExtensionName(img.getOriginalFilename())).getName(); + //修改 账户头像 + sysUser.setAvatar(imgName); + //修改 最近修改者 + sysUser.setLastmodifier(getUsername()); + //修改 最近修改日期 + sysUser.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + //更新用户表 + boolean isOk = this.updateById(sysUser); + return isOk; + } + + /*********************************** + * 用途说明:新增系统角色用户对照表 对用户分配角色(单个) + * 参数说明 + * id 生成的id + * roleid 角色id + * userid 用户id + * 返回值说明: + ************************************/ + @Override + public boolean addUserRoles(String roleid, String userid) { + boolean isOk = true; + //根据角色id与用户id查询 + List list = sysUserMapper.getRoleUsersByid(roleid, userid); + //判断是否用户已分配此权限 + if (list.size() == 0) { + //系统生成id + String id = IdUtil.fastSimpleUUID(); + //新增sys_role_users表数据 + isOk = sysUserMapper.addUserRoles(id, roleid, userid); + } + return isOk; + } + + /* @Override + public Page queryUsers(String orgid, + String username, Page page) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // 分页查询中的条件查询 + if (StrUtil.isNotBlank(username)) { + queryWrapper.like(SysUser::getUsername, username); + } + queryWrapper.eq(SysUser::getOrgid, orgid); + return sysUserMapper.selectPage(page, queryWrapper); + }*/ + + @Override + public Page> queryUsers(String orgid, + String username, + Page page) { + Page> mapPage = sysUserMapper.queryUsers(orgid, + username, page); + List> list = new ArrayList<>(); + List> records = mapPage.getRecords(); + for (Map record : records) { + String id = (String) record.get("id"); + List sysRoles = sysRoleMapper.getRoleByUserId(id); + record.put("roles", sysRoles); + list.add(record); + } + mapPage.setRecords(list); + return mapPage; + } + + /*********************************** + * 用途说明:根据ID批量删除用户 + * 参数说明 + *ids 用户id集合 + * 返回值说明: 判断是否删除成功 + ************************************/ + @Override + public boolean deleteUserByIds(String id) { + String[] splitId = id.split(","); + List ids = Arrays.asList(splitId); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysUser::getId, ids); + List sysUsers = sysUserMapper.selectList(queryWrapper); + List names = + sysUsers.stream().map(SysUser::getUsername).collect(Collectors.toList()); + if (names.contains("admin")) { + return false; + } else { + int result = sysUserMapper.deleteBatchIds(ids); + if (result <= 0) { + return false; + } + // 根据ID删除用户与角色的关联信息 + sysUserMapper.delRoleUsersByUserIds(ids); + List avatars = + sysUsers.stream().map(SysUser::getAvatar).collect(Collectors.toList()); + if (avatars.size() > 0) { + for (String avatar : avatars) { + //账号头像存储地址 + String imgName = + fileSpaceProperties.getSystem() + File.separator + "user" + File.separator + avatar; + FileUtil.del(imgName); + } + } + return true; + } + } + + /*********************************** + * 用途说明:比较登录名称是否有重复 + * 参数说明 + * account 登录名称 + * 返回值说明: 重复返回 false 否则返回 true + ************************************/ + private boolean isExistAccount(String username) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (this.list(queryWrapper.eq("username", username)).size() > 0) { + //判断 查询登录账号 结果集是否为null 重复返回 false 否则返回 tree + return false; + } else { + return true; + } + } +} diff --git a/framework/src/main/java/com/yfd/platform/task/TaskMessage.java b/framework/src/main/java/com/yfd/platform/task/TaskMessage.java new file mode 100644 index 0000000..4a43d15 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/task/TaskMessage.java @@ -0,0 +1,57 @@ +package com.yfd.platform.task; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yfd.platform.component.ServerSendEventServer; +import com.yfd.platform.config.MessageConfig; +import com.yfd.platform.config.WebConfig; +import com.yfd.platform.system.domain.Message; +import com.yfd.platform.system.service.IMessageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.sql.Timestamp; +import java.util.List; + +/** + * @author TangWei + * @Date: 2023/3/22 15:39 + * @Description: + */ +@Component +public class TaskMessage { + + @Resource + private IMessageService messageService; + + /********************************** + * 用途说明: 定时监控消息是否过期 + * 参数说明 + * 返回值说明: void + ***********************************/ + public void examineMessage() { + List list = + messageService.list(new LambdaQueryWrapper().eq(Message::getStatus, "1")); + for (Message message : list) { + Timestamp createtime = message.getCreatetime(); + Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + long create = createtime.getTime(); + long now = timestamp.getTime(); + Integer validperiod = message.getValidperiod(); + long v = validperiod * 60 * 60 * 1000; + if ((now - create) > v) { + message.setStatus("9"); + message.setReadtime(timestamp); + messageService.updateById(message); + } + + } + } + + /*public void sendMessage() { + String loginToken = webConfig.loginuserCache().get("loginToken"); + long count = + messageService.count(new LambdaQueryWrapper().eq(Message::getStatus, "1")); + ServerSendEventServer.sendMessage(loginToken, count + ""); + }*/ +} diff --git a/framework/src/main/java/com/yfd/platform/utils/CallBack.java b/framework/src/main/java/com/yfd/platform/utils/CallBack.java new file mode 100644 index 0000000..5f13d70 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/CallBack.java @@ -0,0 +1,43 @@ +/* + * Copyright 2019-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.yfd.platform.utils; + +/** + * @author: liaojinlong + * @date: 2020/6/9 17:02 + * @since: 1.0 + * @see {@link SpringContextHolder} + * 针对某些初始化方法,在SpringContextHolder 初始化前时,
    + * 可提交一个 提交回调任务。
    + * 在SpringContextHolder 初始化后,进行回调使用 + */ + +public interface CallBack { + /** + * 回调执行方法 + */ + void executor(); + + /** + * 本回调任务名称 + * @return / + */ + default String getCallBackName() { + return Thread.currentThread().getId() + ":" + this.getClass().getName(); + } +} + diff --git a/framework/src/main/java/com/yfd/platform/utils/CodeGenerator.java b/framework/src/main/java/com/yfd/platform/utils/CodeGenerator.java new file mode 100644 index 0000000..1c65429 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/CodeGenerator.java @@ -0,0 +1,75 @@ +package com.yfd.platform.utils; + +import com.baomidou.mybatisplus.generator.FastAutoGenerator; +import com.baomidou.mybatisplus.generator.config.OutputFile; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; + +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +// 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中 +public class CodeGenerator { + + public static String scanner(String tip) { + Scanner scanner = new Scanner(System.in); + StringBuilder help = new StringBuilder(); + help.append("请输入" + tip + ":"); + System.out.println(help.toString()); + if (scanner.hasNext()) { + String ipt = scanner.next(); + if (ipt != null && !ipt.trim().isEmpty()) { + return ipt; + } + } + throw new RuntimeException("请输入正确的" + tip + "!"); + } + + public static void main(String[] args) { + String projectPath = System.getProperty("user.dir"); + String module = scanner("模块名称"); + + Map pathInfo = new HashMap<>(); + pathInfo.put(OutputFile.entity, projectPath + "/src/main/java/com/yfd/platform/" + module + "/domain"); + pathInfo.put(OutputFile.mapper, projectPath + "/src/main/java/com/yfd/platform/" + module + "/mapper"); + pathInfo.put(OutputFile.controller, projectPath + "/src/main/java/com/yfd/platform/" + module + "/controller"); + pathInfo.put(OutputFile.serviceImpl, projectPath + "/src/main/java/com/yfd/platform/" + module + "/service/impl"); + pathInfo.put(OutputFile.service, projectPath + "/src/main/java/com/yfd/platform/" + module + "/service"); + pathInfo.put(OutputFile.xml, projectPath + "/src/main/resources/mapper/" + module); + + FastAutoGenerator.create( + "jdbc:mysql://43.143.220.7:3306/frameworkdb2023?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai", + "root", + "zhengg7QkXa { + builder.author("TangWei") + .disableOpenDir() + .outputDir(projectPath + "/src/main/java"); + }) + .packageConfig(builder -> { + builder.parent("com.yfd.platform") + .moduleName(module) + .pathInfo(pathInfo); + }) + .strategyConfig(builder -> { + builder.addInclude(scanner("表名,多个英文逗号分割").split(",")) + .entityBuilder() + .enableLombok() + .naming(NamingStrategy.underline_to_camel) + .columnNaming(NamingStrategy.underline_to_camel) + .controllerBuilder() + .enableRestStyle() + .mapperBuilder() + .formatMapperFileName("%sMapper") + .serviceBuilder() + .formatServiceFileName("%sService") + .formatServiceImplFileName("%sServiceImpl") + .controllerBuilder() + .formatFileName("%sController"); + }) + .templateEngine(new FreemarkerTemplateEngine()) + .execute(); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/utils/EncryptConfigUtil.java b/framework/src/main/java/com/yfd/platform/utils/EncryptConfigUtil.java new file mode 100644 index 0000000..4df5527 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/EncryptConfigUtil.java @@ -0,0 +1,28 @@ +package com.yfd.platform.utils; + +import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; +import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; +import org.jasypt.util.text.BasicTextEncryptor; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +public class EncryptConfigUtil { + + public static void main(String[] args) { + +// String salt = "rca20230101"; +// String password = "123456"; +// +// BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); +// //加密所需的salt +// textEncryptor.setPassword(salt); +// //要加密的数据(数据库的用户名或密码) +// String encrypt = textEncryptor.encrypt(password); +// System.out.println("password:"+encrypt); + + + BCryptPasswordEncoder passwordEncoder=new BCryptPasswordEncoder(); + String cryptPassword=passwordEncoder.encode("dl_2023");//设置缺省密码 + + } + +} \ No newline at end of file diff --git a/framework/src/main/java/com/yfd/platform/utils/EncryptUtils.java b/framework/src/main/java/com/yfd/platform/utils/EncryptUtils.java new file mode 100644 index 0000000..2ae2b26 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/EncryptUtils.java @@ -0,0 +1,100 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.utils; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.DESKeySpec; +import javax.crypto.spec.IvParameterSpec; +import java.nio.charset.StandardCharsets; + +/** + * 加密 + * @author + * @date 2018-11-23 + */ + +public class EncryptUtils { + + private static final String STR_PARAM = "Passw0rd"; + + private static Cipher cipher; + + private static final IvParameterSpec IV = new IvParameterSpec(STR_PARAM.getBytes(StandardCharsets.UTF_8)); + + private static DESKeySpec getDesKeySpec(String source) throws Exception { + if (source == null || source.length() == 0){ + return null; + } + cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + String strKey = "Passw0rd"; + return new DESKeySpec(strKey.getBytes(StandardCharsets.UTF_8)); + } + + /** + * 对称加密 + */ + public static String desEncrypt(String source) throws Exception { + DESKeySpec desKeySpec = getDesKeySpec(source); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, IV); + return byte2hex( + cipher.doFinal(source.getBytes(StandardCharsets.UTF_8))).toUpperCase(); + } + + /** + * 对称解密 + */ + public static String desDecrypt(String source) throws Exception { + byte[] src = hex2byte(source.getBytes(StandardCharsets.UTF_8)); + DESKeySpec desKeySpec = getDesKeySpec(source); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + cipher.init(Cipher.DECRYPT_MODE, secretKey, IV); + byte[] retByte = cipher.doFinal(src); + return new String(retByte); + } + + private static String byte2hex(byte[] inStr) { + String stmp; + StringBuilder out = new StringBuilder(inStr.length * 2); + for (byte b : inStr) { + stmp = Integer.toHexString(b & 0xFF); + if (stmp.length() == 1) { + // 如果是0至F的单位字符串,则添加0 + out.append("0").append(stmp); + } else { + out.append(stmp); + } + } + return out.toString(); + } + + private static byte[] hex2byte(byte[] b) { + int size = 2; + if ((b.length % size) != 0){ + throw new IllegalArgumentException("长度不是偶数"); + } + byte[] b2 = new byte[b.length / 2]; + for (int n = 0; n < b.length; n += size) { + String item = new String(b, n, 2); + b2[n / 2] = (byte) Integer.parseInt(item, 16); + } + return b2; + } +} diff --git a/framework/src/main/java/com/yfd/platform/utils/ExecutionJob.java b/framework/src/main/java/com/yfd/platform/utils/ExecutionJob.java new file mode 100644 index 0000000..c4a2fcf --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/ExecutionJob.java @@ -0,0 +1,103 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.utils; + +import com.yfd.platform.config.MessageConfig; +import com.yfd.platform.config.thread.ThreadPoolExecutorUtil; +import com.yfd.platform.system.domain.Message; +import com.yfd.platform.system.domain.QuartzJob; +import com.yfd.platform.system.service.IMessageService; +import com.yfd.platform.system.service.IQuartzJobService; +import org.quartz.JobExecutionContext; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.sql.Timestamp; +import java.util.concurrent.Future; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 参考人人开源,https://gitee.com/renrenio/renren-security + * + * @author / + * @date 2019-01-07 + */ +@Async +@SuppressWarnings({"unchecked", "all"}) +public class ExecutionJob extends QuartzJobBean { + + /** + * 该处仅供参考 + */ + private final static ThreadPoolExecutor EXECUTOR = + ThreadPoolExecutorUtil.getPoll(); + + @Resource + private IMessageService messageService; + + @Resource + private MessageConfig messageConfig; + + @Override + public void executeInternal(JobExecutionContext context) { + QuartzJob quartzJob = + (QuartzJob) context.getMergedJobDataMap().get(QuartzJob.JOB_KEY); + // 获取spring bean + IQuartzJobService quartzJobService = + SpringContextHolder.getBean(IQuartzJobService.class); + String uuid = quartzJob.getId(); + long startTime = System.currentTimeMillis(); + String jobName = quartzJob.getJobName(); + try { + // 执行任务 + System.out.println( + "--------------------------------------------------------------"); + System.out.println("任务开始执行,任务名称:" + jobName); + QuartzRunnable task = new QuartzRunnable(quartzJob.getJobClass(), + quartzJob.getJobMethod(), + quartzJob.getJobParams()); + Future future = EXECUTOR.submit(task); + future.get(); + long times = System.currentTimeMillis() - startTime; + Message message = new Message(); + message.setCreatetime(new Timestamp(System.currentTimeMillis())); + message.setType("1"); + message.setTitle(quartzJob.getJobName()); + message.setContent(quartzJob.getDescription()); + message.setSenderName("定时器"); + message.setReceiverCodes(quartzJob.getOrderno().toString()); + message.setReceiverNames(""); + message.setStatus("1"); + message.setValidperiod(24); + messageConfig.addMessage(message); + // 任务状态 + System.out.println("任务执行完毕,任务名称:" + jobName + ", " + + "执行时间:" + times + "毫秒"); + System.out.println( + "--------------------------------------------------------------"); + } catch (Exception e) { + System.out.println("任务执行失败,任务名称:" + jobName); + System.out.println( + "--------------------------------------------------------------"); + quartzJob.setStatus("0"); + //更新状态 + quartzJobService.updateById(quartzJob); + } + } + +} diff --git a/framework/src/main/java/com/yfd/platform/utils/FileUtil.java b/framework/src/main/java/com/yfd/platform/utils/FileUtil.java new file mode 100644 index 0000000..6940aee --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/FileUtil.java @@ -0,0 +1,398 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.utils; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.poi.excel.BigExcelWriter; +import cn.hutool.poi.excel.ExcelUtil; +import com.yfd.platform.exception.BadRequestException; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.apache.tomcat.util.http.fileupload.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLDecoder; +import java.security.MessageDigest; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * File工具类,扩展 hutool 工具包 + * + * @author + * @date 2018-12-27 + */ +public class FileUtil extends cn.hutool.core.io.FileUtil { + + private static final Logger log = LoggerFactory.getLogger(FileUtil.class); + + /** + * 系统临时目录 + *
    + * windows 包含路径分割符,但Linux 不包含, + * 在windows \\==\ 前提下, + * 为安全起见 同意拼装 路径分割符, + *
    +     *       java.io.tmpdir
    +     *       windows : C:\Users/xxx\AppData\Local\Temp\
    +     *       linux: /temp
    +     * 
    + */ + public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator; + /** + * 定义GB的计算常量 + */ + private static final int GB = 1024 * 1024 * 1024; + /** + * 定义MB的计算常量 + */ + private static final int MB = 1024 * 1024; + /** + * 定义KB的计算常量 + */ + private static final int KB = 1024; + + /** + * 格式化小数 + */ + private static final DecimalFormat DF = new DecimalFormat("0.00"); + + public static final String IMAGE = "image"; + public static final String TXT = "document"; + public static final String MUSIC = "music"; + public static final String VIDEO = "video"; + public static final String OTHER = "other"; + + + /** + * MultipartFile转File + */ + public static File toFile(MultipartFile multipartFile) { + // 获取文件名 + String fileName = multipartFile.getOriginalFilename(); + // 获取文件后缀 + String prefix = "." + getExtensionName(fileName); + File file = null; + try { + // 用uuid作为文件名,防止生成的临时文件重复 + file = File.createTempFile(IdUtil.simpleUUID(), prefix); + // MultipartFile to File + multipartFile.transferTo(file); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + return file; + } + + /** + * 获取文件扩展名,不带 . + */ + public static String getExtensionName(String filename) { + if ((filename != null) && (filename.length() > 0)) { + int dot = filename.lastIndexOf('.'); + if ((dot > -1) && (dot < (filename.length() - 1))) { + return filename.substring(dot + 1); + } + } + return filename; + } + + /** + * Java文件操作 获取不带扩展名的文件名 + */ + public static String getFileNameNoEx(String filename) { + if ((filename != null) && (filename.length() > 0)) { + int dot = filename.lastIndexOf('.'); + if ((dot > -1) && (dot < (filename.length()))) { + return filename.substring(0, dot); + } + } + return filename; + } + + /** + * 文件大小转换 + */ + public static String getSize(long size) { + String resultSize; + if (size / GB >= 1) { + //如果当前Byte的值大于等于1GB + resultSize = DF.format(size / (float) GB) + "GB "; + } else if (size / MB >= 1) { + //如果当前Byte的值大于等于1MB + resultSize = DF.format(size / (float) MB) + "MB "; + } else if (size / KB >= 1) { + //如果当前Byte的值大于等于1KB + resultSize = DF.format(size / (float) KB) + "KB "; + } else { + resultSize = size + "B "; + } + return resultSize; + } + + /** + * inputStream 转 File + */ + static File inputStreamToFile(InputStream ins, String name) throws Exception { + File file = new File(SYS_TEM_DIR + name); + if (file.exists()) { + return file; + } + OutputStream os = new FileOutputStream(file); + int bytesRead; + int len = 8192; + byte[] buffer = new byte[len]; + while ((bytesRead = ins.read(buffer, 0, len)) != -1) { + os.write(buffer, 0, bytesRead); + } + os.close(); + ins.close(); + return file; + } + + /** + * 将文件名解析成文件的上传路径 + */ + public static File upload(MultipartFile file, String filePath) { + Date date = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS"); + String name = getFileNameNoEx(file.getOriginalFilename()); + String suffix = getExtensionName(file.getOriginalFilename()); + String nowStr = "-" + format.format(date); + try { + String fileName = name + "." + suffix; + String path = filePath +File.separator + fileName; + // getCanonicalFile 可解析正确各种路径 + File dest = new File(path).getCanonicalFile(); + // 检测是否存在目录 + if (!dest.getParentFile().exists()) { + if (!dest.getParentFile().mkdirs()) { + System.out.println("was not successful."); + } + } + // 文件写入 + file.transferTo(dest); + return dest; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } + + /** + * 将文件名解析成文件的上传路径 + * file 上传的文件 + * filePath 存储路径 + * tofilename 保存文件名称 + + */ + public static File upload(MultipartFile file, String filePath,String tofilename) { + try { + String filename = filePath + File.separator + tofilename; + File dest = new File(filename).getCanonicalFile(); + // 检测是否存在目录 + if (!dest.getParentFile().exists()) { + if (!dest.getParentFile().mkdirs()) { + } + } + // 文件写入 + file.transferTo(dest); + return dest; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } + + + /** + * 导出excel + */ + public static void downloadExcel(List> list, HttpServletResponse response) throws IOException { + String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; + String filename = "record"+cn.hutool.core.date.DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss"); + File file = new File(tempPath); + BigExcelWriter writer = ExcelUtil.getBigWriter(file); + // 一次性写出内容,使用默认样式,强制输出标题 + writer.write(list, true); + SXSSFSheet sheet = (SXSSFSheet)writer.getSheet(); + //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 + sheet.trackAllColumnsForAutoSizing(); + //列宽自适应 + writer.autoSizeColumnAll(); + //response为HttpServletResponse对象 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 + response.setHeader("Content-Disposition", "attachment;filename="+filename+".xlsx"); + ServletOutputStream out = response.getOutputStream(); + // 终止后删除临时文件 + file.deleteOnExit(); + writer.flush(out, true); + //此处记得关闭输出Servlet流 + IoUtil.close(out); + } + + public static String getFileType(String type) { + String documents = "txt doc pdf ppt pps xlsx xls docx"; + String music = "mp3 wav wma mpa ram ra aac aif m4a"; + String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg"; + String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg"; + if (image.contains(type)) { + return IMAGE; + } else if (documents.contains(type)) { + return TXT; + } else if (music.contains(type)) { + return MUSIC; + } else if (video.contains(type)) { + return VIDEO; + } else { + return OTHER; + } + } + + public static void checkSize(long maxSize, long size) { + // 1M + int len = 1024 * 1024; + if (size > (maxSize * len)) { + throw new BadRequestException("文件超出规定大小"); + } + } + + /** + * 判断两个文件是否相同 + */ + public static boolean check(File file1, File file2) { + String img1Md5 = getMd5(file1); + String img2Md5 = getMd5(file2); + return img1Md5.equals(img2Md5); + } + + /** + * 判断两个文件是否相同 + */ + public static boolean check(String file1Md5, String file2Md5) { + return file1Md5.equals(file2Md5); + } + + private static byte[] getByte(File file) { + // 得到文件长度 + byte[] b = new byte[(int) file.length()]; + try { + InputStream in = new FileInputStream(file); + try { + System.out.println(in.read(b)); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } catch (FileNotFoundException e) { + log.error(e.getMessage(), e); + return null; + } + return b; + } + + private static String getMd5(byte[] bytes) { + // 16进制字符 + char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + try { + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(bytes); + byte[] md = mdTemp.digest(); + int j = md.length; + char[] str = new char[j * 2]; + int k = 0; + // 移位 输出字符串 + for (byte byte0 : md) { + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } + + /** + * 下载文件 + * + * @param request / + * @param response / + * @param file / + */ + public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, boolean deleteOnExit) { + response.setCharacterEncoding(request.getCharacterEncoding()); + response.setContentType("application/octet-stream"); + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + response.setHeader("Content-Disposition", "attachment; filename=" + file.getName()); + IOUtils.copy(fis, response.getOutputStream()); + response.flushBuffer(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } finally { + if (fis != null) { + try { + fis.close(); + if (deleteOnExit) { + file.deleteOnExit(); + } + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + } + /** + * 预览PDF文件 + * + * @param filepath / + * @param response / + */ + public static void viewPDF(String filepath, HttpServletResponse response) throws IOException { + File file=new File(filepath); + String originFileName=file.getName(); //中文编码 + response.setCharacterEncoding("UTF-8"); + String showName= StrUtil.isNotBlank(originFileName)?originFileName:file.getName(); + showName= URLDecoder.decode(showName,"UTF-8"); + response.setHeader("Content-Disposition","inline;fileName="+new String(showName.getBytes(), "ISO8859-1")+";fileName*=UTF-8''"+ new String(showName.getBytes(), "ISO8859-1")); + FileInputStream fis = new FileInputStream(file); + response.setHeader("content-type", "application/pdf"); + response.setContentType("application/pdf; charset=utf-8"); + IOUtils.copy(fis, response.getOutputStream()); + fis.close(); + } + + public static String getMd5(File file) { + return getMd5(getByte(file)); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/utils/MpGenerator.java b/framework/src/main/java/com/yfd/platform/utils/MpGenerator.java new file mode 100644 index 0000000..e3aec6e --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/MpGenerator.java @@ -0,0 +1,79 @@ +package com.yfd.platform.utils; + +import com.baomidou.mybatisplus.generator.FastAutoGenerator; +import com.baomidou.mybatisplus.generator.config.OutputFile; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; +import org.springframework.util.StringUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +public class MpGenerator { + /** + * 读取控制台内容 + */ + public static String scanner(String tip) { + Scanner scanner = new Scanner(System.in); + StringBuilder help = new StringBuilder(); + help.append("请输入" + tip + ":"); + System.out.println(help.toString()); + if (scanner.hasNext()) { + String ipt = scanner.next(); + if (StringUtils.hasText(ipt)) { + return ipt; + } + } + throw new RuntimeException("请输入正确的" + tip + "!"); + } + + public static void main(String[] args) { + String projectPath = System.getProperty("user.dir"); + String url = PropertiesUtils.getPropertyField("spring.datasource.url"); + String username = PropertiesUtils.getPropertyField("spring.datasource.username"); + String password = PropertiesUtils.getPropertyField("spring.datasource.password"); + + String moduleName = scanner("模块名"); + String modulePath = moduleName.replace(".", "/"); + + Map pathInfo = new HashMap<>(); + pathInfo.put(OutputFile.entity, projectPath + "/src/main/java/com/yfd/platform/modules/domain" + modulePath + "/entity"); + pathInfo.put(OutputFile.mapper, projectPath + "/src/main/java/com/yfd/platform/modules/domain/" + modulePath + "/dao"); + pathInfo.put(OutputFile.controller, projectPath + "/src/main/java/com/yfd/platform/modules/domain" + modulePath + "/controller"); + pathInfo.put(OutputFile.service, projectPath + "/src/main/java/com/yfd/platform/modules/domain" + modulePath + "/service"); + pathInfo.put(OutputFile.serviceImpl, projectPath + "/src/main/java/com/yfd/platform/modules/domain" + modulePath + "/service/impl"); + pathInfo.put(OutputFile.xml, projectPath + "/src/main/resources/mapper/" + modulePath); + + FastAutoGenerator.create(url, username, password) + .globalConfig(builder -> { + builder.author("fwh") + .disableOpenDir() + .outputDir(projectPath + "/src/main/java"); + }) + .packageConfig(builder -> { + builder.parent(PropertiesUtils.getPropertyField("project.package.name")) + .moduleName(moduleName) + .pathInfo(pathInfo); + }) + .strategyConfig(builder -> { + builder.addInclude(scanner("表名,多个英文逗号分割").split(",")) + .entityBuilder() + .enableLombok() + .naming(NamingStrategy.underline_to_camel) + .columnNaming(NamingStrategy.underline_to_camel) + .controllerBuilder() + .enableRestStyle() + .mapperBuilder() + .formatMapperFileName("%sDao") + .serviceBuilder() + .formatServiceFileName("%sService") + .formatServiceImplFileName("%sServiceImpl") + .controllerBuilder() + .formatFileName("%sController"); + }) + .templateEngine(new FreemarkerTemplateEngine()) + .execute(); + } +} + diff --git a/framework/src/main/java/com/yfd/platform/utils/PropertiesUtils.java b/framework/src/main/java/com/yfd/platform/utils/PropertiesUtils.java new file mode 100644 index 0000000..93c7cfd --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/PropertiesUtils.java @@ -0,0 +1,29 @@ +package com.yfd.platform.utils; + +import org.springframework.core.io.ClassPathResource; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Properties; +/****************************** + * 用途说明: + * 作者姓名: pcj + * 创建时间: 2022/9/20 14:31 + ******************************/ +public class PropertiesUtils { + public final static String RESOURCE_PATH = "application.properties"; + + public final static Properties properties = new Properties(); + + public static String getPropertyField(String parameter) { + //对应resources目录下的资源路径 + ClassPathResource resource = new ClassPathResource(RESOURCE_PATH); + try { + properties.load(new InputStreamReader(resource.getInputStream(), "gbk")); + } catch (IOException e) { + throw new RuntimeException(e); + } + return properties.getProperty(parameter); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/utils/QuartzManage.java b/framework/src/main/java/com/yfd/platform/utils/QuartzManage.java new file mode 100644 index 0000000..3ff265c --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/QuartzManage.java @@ -0,0 +1,187 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.utils; + +import com.yfd.platform.system.domain.QuartzJob; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.quartz.impl.triggers.CronTriggerImpl; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.util.Date; + +import static org.quartz.TriggerBuilder.newTrigger; + +/** + * @author + * @date 2019-01-07 + */ +@Slf4j +@Component +public class QuartzManage { + + private static final String JOB_NAME = "TASK_"; + + @Resource(name = "scheduler") + private Scheduler scheduler; + + public void addJob(QuartzJob quartzJob) { + try { + // 构建job信息 + JobDetail jobDetail = JobBuilder.newJob(ExecutionJob.class). + withIdentity(JOB_NAME + quartzJob.getId()).build(); + + //通过触发器名和cron 表达式创建 Trigger + Trigger cronTrigger = newTrigger() + .withIdentity(JOB_NAME + quartzJob.getId()) + .startNow() + .withSchedule(CronScheduleBuilder.cronSchedule(quartzJob.getJobCron())) + .build(); + + cronTrigger.getJobDataMap().put(QuartzJob.JOB_KEY, quartzJob); + + //重置启动时间 + ((CronTriggerImpl) cronTrigger).setStartTime(new Date()); + + //执行定时任务 + scheduler.scheduleJob(jobDetail, cronTrigger); + + // 暂停任务 + if ("0".equals(quartzJob.getStatus())) { + pauseJob(quartzJob); + } + } catch (Exception e) { + log.error("创建定时任务失败", e); + throw new RuntimeException("创建定时任务失败"); + } + } + + /** + * 更新job cron表达式 + * + * @param quartzJob / + */ + public void updateJobCron(QuartzJob quartzJob) { + try { + TriggerKey triggerKey = + TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); + CronTrigger trigger = + (CronTrigger) scheduler.getTrigger(triggerKey); + // 如果不存在则创建一个定时任务 + if (trigger == null) { + addJob(quartzJob); + trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + } + CronScheduleBuilder scheduleBuilder = + CronScheduleBuilder.cronSchedule(quartzJob.getJobCron()); + trigger = + trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + //重置启动时间 + ((CronTriggerImpl) trigger).setStartTime(new Date()); + trigger.getJobDataMap().put(QuartzJob.JOB_KEY, quartzJob); + + scheduler.rescheduleJob(triggerKey, trigger); + // 暂停任务 + if ("0".equals(quartzJob.getStatus())) { + pauseJob(quartzJob); + } + } catch (Exception e) { + log.error("更新定时任务失败", e); + throw new RuntimeException("更新定时任务失败"); + } + + } + + /** + * 删除一个job + * + * @param quartzJob / + */ + public void deleteJob(QuartzJob quartzJob) { + try { + JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); + scheduler.pauseJob(jobKey); + scheduler.deleteJob(jobKey); + } catch (Exception e) { + log.error("删除定时任务失败", e); + throw new RuntimeException("删除定时任务失败"); + } + } + + /** + * 恢复一个job + * + * @param quartzJob / + */ + public void resumeJob(QuartzJob quartzJob) { + try { + TriggerKey triggerKey = + TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); + CronTrigger trigger = + (CronTrigger) scheduler.getTrigger(triggerKey); + // 如果不存在则创建一个定时任务 + if (trigger == null) { + addJob(quartzJob); + } + JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); + scheduler.resumeJob(jobKey); + } catch (Exception e) { + log.error("恢复定时任务失败", e); + throw new RuntimeException("恢复定时任务失败"); + } + } + + /** + * 立即执行job + * + * @param quartzJob / + */ + public void runJobNow(QuartzJob quartzJob) { + try { + TriggerKey triggerKey = + TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); + CronTrigger trigger = + (CronTrigger) scheduler.getTrigger(triggerKey); + // 如果不存在则创建一个定时任务 + if (trigger == null) { + addJob(quartzJob); + } + JobDataMap dataMap = new JobDataMap(); + dataMap.put(QuartzJob.JOB_KEY, quartzJob); + JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); + scheduler.triggerJob(jobKey, dataMap); + } catch (Exception e) { + log.error("定时任务执行失败", e); + throw new RuntimeException("定时任务执行失败"); + } + } + + /** + * 暂停一个job + * + * @param quartzJob / + */ + public void pauseJob(QuartzJob quartzJob) { + try { + JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); + scheduler.pauseJob(jobKey); + } catch (Exception e) { + log.error("定时任务暂停失败", e); + throw new RuntimeException("定时任务暂停失败"); + } + } +} diff --git a/framework/src/main/java/com/yfd/platform/utils/QuartzRunnable.java b/framework/src/main/java/com/yfd/platform/utils/QuartzRunnable.java new file mode 100644 index 0000000..b1da541 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/QuartzRunnable.java @@ -0,0 +1,58 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.utils; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Method; +import java.util.concurrent.Callable; + +/** + * 执行定时任务 + * @author / + */ +@Slf4j +public class QuartzRunnable implements Callable { + + private final Object target; + private final Method method; + private final String params; + + QuartzRunnable(String beanName, String methodName, String params) + throws NoSuchMethodException, SecurityException { + this.target = SpringContextHolder.getBean(beanName); + this.params = params; + + if (StringUtils.isNotBlank(params)) { + this.method = target.getClass().getDeclaredMethod(methodName, String.class); + } else { + this.method = target.getClass().getDeclaredMethod(methodName); + } + } + + @Override + public Object call() throws Exception { + ReflectionUtils.makeAccessible(method); + if (StringUtils.isNotBlank(params)) { + method.invoke(target, params); + } else { + method.invoke(target); + } + return null; + } +} diff --git a/framework/src/main/java/com/yfd/platform/utils/RequestHolder.java b/framework/src/main/java/com/yfd/platform/utils/RequestHolder.java new file mode 100644 index 0000000..3dbfa55 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/RequestHolder.java @@ -0,0 +1,34 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.utils; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.Objects; + +/** + * 获取 HttpServletRequest + * @author + * @date 2018-11-24 + */ +public class RequestHolder { + + public static HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + } +} diff --git a/framework/src/main/java/com/yfd/platform/utils/RsaUtils.java b/framework/src/main/java/com/yfd/platform/utils/RsaUtils.java new file mode 100644 index 0000000..6638ac7 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/RsaUtils.java @@ -0,0 +1,181 @@ +package com.yfd.platform.utils; + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +/** + * @author https://www.cnblogs.com/nihaorz/p/10690643.html + * @description Rsa 工具类,公钥私钥生成,加解密 + * @date 2020-05-18 + **/ +public class RsaUtils { + + private static final String SRC = "123456"; + + public static void main(String[] args) throws Exception { + System.out.println("\n"); + RsaKeyPair keyPair = generateKeyPair(); + System.out.println("公钥:" + keyPair.getPublicKey()); + System.out.println("私钥:" + keyPair.getPrivateKey()); + System.out.println("\n"); + test1(keyPair); + System.out.println("\n"); + test2(keyPair); + System.out.println("\n"); + } + + /** + * 公钥加密私钥解密 + */ + private static void test1(RsaKeyPair keyPair) throws Exception { + System.out.println("***************** 公钥加密私钥解密开始 *****************"); + String text1 = encryptByPublicKey(keyPair.getPublicKey(), RsaUtils.SRC); + String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1); + System.out.println("加密前:" + RsaUtils.SRC); + System.out.println("加密后:" + text1); + System.out.println("解密后:" + text2); + if (RsaUtils.SRC.equals(text2)) { + System.out.println("解密字符串和原始字符串一致,解密成功"); + } else { + System.out.println("解密字符串和原始字符串不一致,解密失败"); + } + System.out.println("***************** 公钥加密私钥解密结束 *****************"); + } + + /** + * 私钥加密公钥解密 + * @throws Exception / + */ + private static void test2(RsaKeyPair keyPair) throws Exception { + System.out.println("***************** 私钥加密公钥解密开始 *****************"); + String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), RsaUtils.SRC); + String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1); + System.out.println("加密前:" + RsaUtils.SRC); + System.out.println("加密后:" + text1); + System.out.println("解密后:" + text2); + if (RsaUtils.SRC.equals(text2)) { + System.out.println("解密字符串和原始字符串一致,解密成功"); + } else { + System.out.println("解密字符串和原始字符串不一致,解密失败"); + } + System.out.println("***************** 私钥加密公钥解密结束 *****************"); + } + + /** + * 公钥解密 + * + * @param publicKeyText 公钥 + * @param text 待解密的信息 + * @return / + * @throws Exception / + */ + public static String decryptByPublicKey(String publicKeyText, String text) throws Exception { + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + byte[] result = cipher.doFinal(Base64.decodeBase64(text)); + return new String(result); + } + + /** + * 私钥加密 + * + * @param privateKeyText 私钥 + * @param text 待加密的信息 + * @return / + * @throws Exception / + */ + public static String encryptByPrivateKey(String privateKeyText, String text) throws Exception { + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + byte[] result = cipher.doFinal(text.getBytes()); + return Base64.encodeBase64String(result); + } + + /** + * 私钥解密 + * + * @param privateKeyText 私钥 + * @param text 待解密的文本 + * @return / + * @throws Exception / + */ + public static String decryptByPrivateKey(String privateKeyText, String text) throws Exception { + PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] result = cipher.doFinal(Base64.decodeBase64(text)); + return new String(result); + } + + /** + * 公钥加密 + * + * @param publicKeyText 公钥 + * @param text 待加密的文本 + * @return / + */ + public static String encryptByPublicKey(String publicKeyText, String text) throws Exception { + X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] result = cipher.doFinal(text.getBytes()); + return Base64.encodeBase64String(result); + } + + /** + * 构建RSA密钥对 + * + * @return / + * @throws NoSuchAlgorithmException / + */ + public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + keyPairGenerator.initialize(1024); + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); + RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); + String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded()); + String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded()); + return new RsaKeyPair(publicKeyString, privateKeyString); + } + + + /** + * RSA密钥对对象 + */ + public static class RsaKeyPair { + + private final String publicKey; + private final String privateKey; + + public RsaKeyPair(String publicKey, String privateKey) { + this.publicKey = publicKey; + this.privateKey = privateKey; + } + + public String getPublicKey() { + return publicKey; + } + + public String getPrivateKey() { + return privateKey; + } + + } +} diff --git a/framework/src/main/java/com/yfd/platform/utils/SecurityUtils.java b/framework/src/main/java/com/yfd/platform/utils/SecurityUtils.java new file mode 100644 index 0000000..9df23cd --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/SecurityUtils.java @@ -0,0 +1,84 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.utils; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.yfd.platform.exception.BadRequestException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; + +import java.util.List; + +/** + * 获取当前登录的用户 + * @author + * @date 2019-01-17 + */ +@Slf4j +public class SecurityUtils { + + /** + * 获取当前登录的用户 + * @return UserDetails + */ + public static UserDetails getCurrentUser() { + UserDetailsService userDetailsService = SpringContextHolder.getBean(UserDetailsService.class); + return userDetailsService.loadUserByUsername(getCurrentUsername()); + } + + /** + * 获取系统用户名称 + * + * @return 系统用户名称 + */ + public static String getCurrentUsername() { + final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + throw new BadRequestException(HttpStatus.UNAUTHORIZED, "当前登录状态过期"); + } + if (authentication.getPrincipal() instanceof UserDetails) { + UserDetails userDetails = (UserDetails) authentication.getPrincipal(); + return userDetails.getUsername(); + } + throw new BadRequestException(HttpStatus.UNAUTHORIZED, "找不到当前登录的信息"); + } + + /** + * 获取系统用户ID + * @return 系统用户ID + */ + public static Long getCurrentUserId() { + UserDetails userDetails = getCurrentUser(); + return new JSONObject(new JSONObject(userDetails).get("user")).get("id", Long.class); + } + + /** + * 获取当前用户的数据权限 + * @return / + */ + public static List getCurrentUserDataScope(){ + UserDetails userDetails = getCurrentUser(); + JSONArray array = JSONUtil.parseArray(new JSONObject(userDetails).get("dataScopes")); + return JSONUtil.toList(array,Long.class); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/utils/SpringContextHolder.java b/framework/src/main/java/com/yfd/platform/utils/SpringContextHolder.java new file mode 100644 index 0000000..b85c770 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/SpringContextHolder.java @@ -0,0 +1,145 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.utils; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.core.env.Environment; + +import java.util.ArrayList; +import java.util.List; +/** + * @author Jie + * @date 2019-01-07 + */ +@Slf4j +public class SpringContextHolder implements ApplicationContextAware, DisposableBean { + + private static ApplicationContext applicationContext = null; + private static final List CALL_BACKS = new ArrayList<>(); + private static boolean addCallback = true; + + /** + * 针对 某些初始化方法,在SpringContextHolder 未初始化时 提交回调方法。 + * 在SpringContextHolder 初始化后,进行回调使用 + * + * @param callBack 回调函数 + */ + public synchronized static void addCallBacks(CallBack callBack) { + if (addCallback) { + SpringContextHolder.CALL_BACKS.add(callBack); + } else { + log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName()); + callBack.executor(); + } + } + + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) { + assertContextInjected(); + return (T) applicationContext.getBean(name); + } + + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBean(Class requiredType) { + assertContextInjected(); + return applicationContext.getBean(requiredType); + } + + /** + * 获取SpringBoot 配置信息 + * + * @param property 属性key + * @param defaultValue 默认值 + * @param requiredType 返回类型 + * @return / + */ + public static T getProperties(String property, T defaultValue, Class requiredType) { + T result = defaultValue; + try { + result = getBean(Environment.class).getProperty(property, requiredType); + } catch (Exception ignored) {} + return result; + } + + /** + * 获取SpringBoot 配置信息 + * + * @param property 属性key + * @return / + */ + public static String getProperties(String property) { + return getProperties(property, null, String.class); + } + + /** + * 获取SpringBoot 配置信息 + * + * @param property 属性key + * @param requiredType 返回类型 + * @return / + */ + public static T getProperties(String property, Class requiredType) { + return getProperties(property, null, requiredType); + } + + /** + * 检查ApplicationContext不为空. + */ + private static void assertContextInjected() { + if (applicationContext == null) { + throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext" + + ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder."); + } + } + + /** + * 清除SpringContextHolder中的ApplicationContext为Null. + */ + private static void clearHolder() { + log.debug("清除SpringContextHolder中的ApplicationContext:" + + applicationContext); + applicationContext = null; + } + + @Override + public void destroy() { + SpringContextHolder.clearHolder(); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if (SpringContextHolder.applicationContext != null) { + log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext); + } + SpringContextHolder.applicationContext = applicationContext; + if (addCallback) { + for (CallBack callBack : SpringContextHolder.CALL_BACKS) { + callBack.executor(); + } + CALL_BACKS.clear(); + } + SpringContextHolder.addCallback = false; + } +} diff --git a/framework/src/main/java/com/yfd/platform/utils/StringUtils.java b/framework/src/main/java/com/yfd/platform/utils/StringUtils.java new file mode 100644 index 0000000..b2a9be7 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/utils/StringUtils.java @@ -0,0 +1,305 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.utils; + + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.yfd.platform.constant.Constant; +import lombok.SneakyThrows; +import org.lionsoul.ip2region.DataBlock; +import org.lionsoul.ip2region.DbConfig; +import org.lionsoul.ip2region.DbSearcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import eu.bitwalker.useragentutils.Browser; +import eu.bitwalker.useragentutils.UserAgent; +import jakarta.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.UnknownHostException; +import java.util.Calendar; +import java.util.Date; +import java.util.Enumeration; + +/** + * @author + * 字符串工具类, 继承org.apache.commons.lang3.StringUtils类 + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + + private static final Logger log = LoggerFactory.getLogger(StringUtils.class); + private static boolean ipLocal = false; + private static File file ; + private static DbConfig config; + private static final char SEPARATOR = '_'; + private static final String UNKNOWN = "unknown"; + + static { + SpringContextHolder.addCallBacks(() -> { + StringUtils.ipLocal = SpringContextHolder.getProperties("ip.local-parsing", false, Boolean.class); + if (ipLocal) { + /* + * 此文件为独享 ,不必关闭 + */ + String path = "ip2region/ip2region.db"; + String name = "ip2region.db"; + try { + config = new DbConfig(); + file = FileUtil.inputStreamToFile(new ClassPathResource(path).getInputStream(), name); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + }); + } + + /** + * 驼峰命名法工具 + * + * @return toCamelCase(" hello_world ") == "helloWorld" + * toCapitalizeCamelCase("hello_world") == "HelloWorld" + * toUnderScoreCase("helloWorld") = "hello_world" + */ + public static String toCamelCase(String s) { + if (s == null) { + return null; + } + + s = s.toLowerCase(); + + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == SEPARATOR) { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + + return sb.toString(); + } + + /** + * 驼峰命名法工具 + * + * @return toCamelCase(" hello_world ") == "helloWorld" + * toCapitalizeCamelCase("hello_world") == "HelloWorld" + * toUnderScoreCase("helloWorld") = "hello_world" + */ + public static String toCapitalizeCamelCase(String s) { + if (s == null) { + return null; + } + s = toCamelCase(s); + return s.substring(0, 1).toUpperCase() + s.substring(1); + } + + /** + * 驼峰命名法工具 + * + * @return toCamelCase(" hello_world ") == "helloWorld" + * toCapitalizeCamelCase("hello_world") == "HelloWorld" + * toUnderScoreCase("helloWorld") = "hello_world" + */ + static String toUnderScoreCase(String s) { + if (s == null) { + return null; + } + + StringBuilder sb = new StringBuilder(); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + boolean nextUpperCase = true; + + if (i < (s.length() - 1)) { + nextUpperCase = Character.isUpperCase(s.charAt(i + 1)); + } + + if ((i > 0) && Character.isUpperCase(c)) { + if (!upperCase || !nextUpperCase) { + sb.append(SEPARATOR); + } + upperCase = true; + } else { + upperCase = false; + } + + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 获取ip地址 + */ + public static String getIp(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + String comma = ","; + String localhost = "127.0.0.1"; + if (ip.contains(comma)) { + ip = ip.split(",")[0]; + } + if (localhost.equals(ip)) { + // 获取本机真正的ip地址 + try { + ip = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + log.error(e.getMessage(), e); + } + } + return ip; + } + + /** + * 根据ip获取详细地址 + */ + @SneakyThrows + public static String getCityInfo(String ip) { + if (ipLocal) { + return getLocalCityInfo(ip); + } else { + return getHttpCityInfo(ip); + } + } + + /** + * 根据ip获取详细地址 + */ + public static String getHttpCityInfo(String ip) { + String host = "202.108.22.5"; + //超时应该在3钞以上 + int timeOut = 3000; + boolean status = false; + try { + status = InetAddress.getByName(host).isReachable(timeOut); + } catch (IOException e) { + e.printStackTrace(); + } + String api =""; + if (status){ + api = HttpUtil.get(String.format(Constant.Url.IP_URL, ip)); + }else { + api = "{\"ip\":\"127.0.0.1\",\"pro\":\"\",\"proCode\":\"999999\",\"city\":\"\",\"cityCode\":\"0\",\"region\":\"\",\"regionCode\":\"0\",\"addr\":\" 局域网\",\"regionNames\":\"\",\"err\":\"noprovince\"}"; + } + JSONObject object = JSONUtil.parseObj(api); + return object.get("addr", String.class); + } + + + /** + * 根据ip获取详细地址 + */ + public static String getLocalCityInfo(String ip) { + try { + DataBlock dataBlock = new DbSearcher(config, file.getPath()) + .binarySearch(ip); + String region = dataBlock.getRegion(); + String address = region.replace("0|", ""); + char symbol = '|'; + if (address.charAt(address.length() - 1) == symbol) { + address = address.substring(0, address.length() - 1); + } + return address.equals(Constant.REGION) ? "内网IP" : address; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return ""; + } + + public static String getBrowser(HttpServletRequest request) { + UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); + Browser browser = userAgent.getBrowser(); + return browser.getName(); + } + + /** + * 获得当天是周几 + */ + public static String getWeekDay() { + String[] weekDays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + + int w = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (w < 0) { + w = 0; + } + return weekDays[w]; + } + + /** + * 获取当前机器的IP + * + * @return / + */ + public static String getLocalIp() { + try { + InetAddress candidateAddress = null; + // 遍历所有的网络接口 + for (Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); interfaces.hasMoreElements();) { + NetworkInterface anInterface = interfaces.nextElement(); + // 在所有的接口下再遍历IP + for (Enumeration inetAddresses = anInterface.getInetAddresses(); inetAddresses.hasMoreElements();) { + InetAddress inetAddr = inetAddresses.nextElement(); + // 排除loopback类型地址 + if (!inetAddr.isLoopbackAddress()) { + if (inetAddr.isSiteLocalAddress()) { + // 如果是site-local地址,就是它了 + return inetAddr.getHostAddress(); + } else if (candidateAddress == null) { + // site-local类型的地址未被发现,先记录候选地址 + candidateAddress = inetAddr; + } + } + } + } + if (candidateAddress != null) { + return candidateAddress.getHostAddress(); + } + // 如果没有发现 non-loopback地址.只能用最次选的方案 + InetAddress jdkSuppliedAddress = InetAddress.getLocalHost(); + if (jdkSuppliedAddress == null) { + return ""; + } + return jdkSuppliedAddress.getHostAddress(); + } catch (Exception e) { + return ""; + } + } +} diff --git a/framework/src/main/resources/all-application.yml b/framework/src/main/resources/all-application.yml new file mode 100644 index 0000000..a53b797 --- /dev/null +++ b/framework/src/main/resources/all-application.yml @@ -0,0 +1,168 @@ + + + +# 此配置文件只是用作展示所有配置项, 不可不直接使用 + + +spring: + # REDIS数据库配置 + redis: + # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1 + host: 127.0.0.1 + # [必须修改] 端口号 + port: 6379 + # [可选] 数据库 DB + database: 6 + # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接 + password: + # [可选] 超时时间 + timeout: 10000 + # [可选] 一个pool最多可分配多少个jedis实例 + poolMaxTotal: 1000 + # [可选] 一个pool最多有多少个状态为idle(空闲)的jedis实例 + poolMaxIdle: 500 + # [可选] 最大的等待时间(秒) + poolMaxWait: 5 + # [可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置 + datasource: + # 使用mysql 打开23-28行注释, 删除29-36行 + name: wvp + url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true + username: + password: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + # name: eiot +# url: jdbc:sqlite::resource:wvp.sqlite +# username: +# password: +# type: com.alibaba.druid.pool.DruidDataSource +# driver-class-name: org.sqlite.JDBC + max-active: 1 + min-idle: 1 + +# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口 +server: + port: 18080 + # [可选] HTTPS配置, 默认不开启 + ssl: + # [可选] 是否开启HTTPS访问 + enabled: false + # [可选] 证书文件路径,放置在resource/目录下即可,修改xxx为文件名 + key-store: classpath:xxx.jks + # [可选] 证书密码 + key-password: password + # [可选] 证书类型, 默认为jks,根据实际修改 + key-store-type: JKS + +# 作为28181服务器的配置 +sip: + # [必须修改] 本机的IP, 必须是网卡上的IP,用于sip下协议栈监听ip,如果监听所有设置为0.0.0.0 + monitor-ip: 0.0.0.0 + # [必须修改] 本机的IP + ip: 192.168.0.100 + # [可选] 28181服务监听的端口 + port: 5060 + # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) + # 后两位为行业编码,定义参照附录D.3 + # 3701020049标识山东济南历下区 信息行业接入 + # [可选] + domain: 4401020049 + # [可选] + id: 44010200492000000001 + # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验 + password: admin123 + # [可选] 心跳超时时间, 建议设置为心跳周期的三倍 + keepalive-timeout: 255 + # [可选] 国标级联注册失败,再次发起注册的时间间隔。 默认60秒 + register-time-interval: 60 + # [可选] 云台控制速度 + ptz-speed: 50 + # TODO [可选] 收到心跳后自动上线, 重启服务后会将所有设备置为离线,默认false,等待注册后上线。设置为true则收到心跳设置为上线。 + # keepalliveToOnline: false + +#zlm 默认服务器配置 +media: + # [可选] zlm服务器唯一id,用于触发hook时区别是哪台服务器,general.mediaServerId + id: + # [必须修改] zlm服务器的内网IP + ip: 192.168.0.100 + # [可选] 返回流地址时的ip,置空使用 media.ip + stream-ip: + # [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ip + sdp-ip: + # [可选] zlm服务器的hook所使用的IP, 默认使用sip.ip + hook-ip: + # [必须修改] zlm服务器的http.port + http-port: 80 + # [可选] zlm服务器的http.sslport, 置空使用zlm配置文件配置 + http-ssl-port: + # [可选] zlm服务器的rtmp.port, 置空使用zlm配置文件配置 + rtmp-port: + # [可选] zlm服务器的rtmp.sslport, 置空使用zlm配置文件配置 + rtmp-ssl-port: + # [可选] zlm服务器的 rtp_proxy.port, 置空使用zlm配置文件配置 + rtp-proxy-port: + # [可选] zlm服务器的 rtsp.port, 置空使用zlm配置文件配置 + rtsp-port: + # [可选] zlm服务器的 rtsp.sslport, 置空使用zlm配置文件配置 + rtsp-ssl-port: + # [可选] 是否自动配置ZLM, 如果希望手动配置ZLM, 可以设为false, 不建议新接触的用户修改 + auto-config: true + # [可选] zlm服务器的hook.admin_params=secret + secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc + # [可选] zlm服务器的general.streamNoneReaderDelayMS + stream-none-reader-delay-ms: 18000 # 无人观看多久自动关闭流, -1表示永不自动关闭,即 关闭按需拉流 + # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试 + rtp: + # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输 + enable: true + # [可选] 在此范围内选择端口用于媒体流传输, + port-range: 30000,30500 # 端口范围 + # [可选] 国标级联在此范围内选择端口发送媒体流, + send-port-range: 30000,30500 # 端口范围 + # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用 + record-assist-port: 0 + +# [可选] 日志配置, 一般不需要改 +logging: + file: + name: logs/wvp.log + max-history: 30 + max-size: 10MB + total-size-cap: 300MB + level: + com.genersoft.iot: debug + com.genersoft.iot.vmp.storager.dao: info + com.genersoft.iot.vmp.gb28181: info +# [根据业务需求配置] +user-settings: + # [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true + auto-apply-play: false + # [可选] 部分设备需要扩展SDP,需要打开此设置 + senior-sdp: false + # 保存移动位置历史轨迹:true:保留历史数据,false:仅保留最后的位置(默认) + save-position-history: false + # 点播等待超时时间,单位:毫秒 + play-timeout: 3000 + # 等待音视频编码信息再返回, true: 可以根据编码选择合适的播放器,false: 可以更快点播 + wait-track: false + # 是否开启接口鉴权 + interface-authentication: true + # 接口鉴权例外的接口, 即不进行接口鉴权的接口,尽量详细书写,尽量不用/**,至少两级目录 + interface-authentication-excludes: + - /api/v1/** + # 推流直播是否录制 + record-push-live: true + # 是否将日志存储进数据库 + logInDatebase: true + +# 在线文档: swagger-ui(生产环境建议关闭) +swagger-ui: + enabled: true + +# 版本信息, 不需修改 +version: + version: "@project.version@" + description: "@project.description@" + artifact-id: "@project.artifactId@" \ No newline at end of file diff --git a/framework/src/main/resources/application-dev.yml b/framework/src/main/resources/application-dev.yml new file mode 100644 index 0000000..b814931 --- /dev/null +++ b/framework/src/main/resources/application-dev.yml @@ -0,0 +1,84 @@ +server: + port: 8093 + +spring: + #应用名称 + application: + name: Project-plateform + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + master: + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://43.138.168.68:3306/frameworkdb2023?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true + username: root + password: ylfw20230626@ + slave: + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://43.138.168.68:3306/frameworkdb2023?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true + username: root + password: ylfw20230626@ + + mvc: + pathmatch: + matching-strategy: ant_path_matcher + servlet: + multipart: + max-file-size: 30MB + max-request-size: 100MB + +logging: + file: + name: logs/projectname.log + level: + com.genersoft.iot: debug + com.genersoft.iot.vmp.storager.dao: info + com.genersoft.iot.vmp.gb28181: info + +# 在线文档: swagger-ui(生产环境建议关闭) +swagger-ui: + enabled: true + + +# 登录相关配置 +login: + # 登录缓存 + cache-enable: true + # 是否限制单用户登录 + single-login: false + # 验证码 + login-code: + # 验证码类型配置 查看 LoginProperties 类 + code-type: arithmetic + # 登录图形验证码有效时间/分钟 + expiration: 2 + # 验证码高度 + width: 111 + # 验证码宽度 + heigth: 36 + # 内容长度 + length: 2 + # 字体名称,为空则使用默认字体 + font-name: + # 字体大小 + font-size: 25 + +# IP 本地解析 +ip: + local-parsing: true + + +file-space: #项目文档空间 + files: D:\demoproject\files\ #单独上传的文件附件 + system: D:\demoproject\system\ #单独上传的文件 + +task: + pool: + # 核心线程池大小 + core-pool-size: 10 + # 最大线程数 + max-pool-size: 30 + # 活跃时间 + keep-alive-seconds: 60 + # 队列容量 + queue-capacity: 50 diff --git a/framework/src/main/resources/application-server.yml b/framework/src/main/resources/application-server.yml new file mode 100644 index 0000000..c5a5b91 --- /dev/null +++ b/framework/src/main/resources/application-server.yml @@ -0,0 +1,43 @@ +server: + port: 8090 + +spring: + #应用名称 + application: + name: Project-plateform + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + master: + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://43.138.168.68:3306/framework2023?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true + username: root + password: zhengg7QkXa + + + + + + + + + + UTF-8 + ${LOG_PATTERN} + + + + + + ${LOG_PATH}/${LOG_FILE}.log + + UTF-8 + ${LOG_PATTERN} + + + ${LOG_PATH}/${LOG_FILE}.%d{yyyy-MM-dd}.log + 30 + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/main/resources/logback.xml b/framework/src/main/resources/logback.xml new file mode 100644 index 0000000..c949c89 --- /dev/null +++ b/framework/src/main/resources/logback.xml @@ -0,0 +1,45 @@ + + + yfAdmin + + + + + + + ${log.pattern} + ${log.charset} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/main/resources/mapper/system/DictionaryMapper.xml b/framework/src/main/resources/mapper/system/DictionaryMapper.xml new file mode 100644 index 0000000..16edd1e --- /dev/null +++ b/framework/src/main/resources/mapper/system/DictionaryMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/resources/mapper/system/MessageMapper.xml b/framework/src/main/resources/mapper/system/MessageMapper.xml new file mode 100644 index 0000000..96cbcfc --- /dev/null +++ b/framework/src/main/resources/mapper/system/MessageMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/resources/mapper/system/Model3dMapper.xml b/framework/src/main/resources/mapper/system/Model3dMapper.xml new file mode 100644 index 0000000..d935f68 --- /dev/null +++ b/framework/src/main/resources/mapper/system/Model3dMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/resources/mapper/system/QuartzJobMapper.xml b/framework/src/main/resources/mapper/system/QuartzJobMapper.xml new file mode 100644 index 0000000..b523b0a --- /dev/null +++ b/framework/src/main/resources/mapper/system/QuartzJobMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/resources/mapper/system/SysConfigMapper.xml b/framework/src/main/resources/mapper/system/SysConfigMapper.xml new file mode 100644 index 0000000..cf22aa4 --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/resources/mapper/system/SysDictionaryItemsMapper.xml b/framework/src/main/resources/mapper/system/SysDictionaryItemsMapper.xml new file mode 100644 index 0000000..1bf0942 --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysDictionaryItemsMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/resources/mapper/system/SysDictionaryMapper.xml b/framework/src/main/resources/mapper/system/SysDictionaryMapper.xml new file mode 100644 index 0000000..6963e40 --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysDictionaryMapper.xml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/framework/src/main/resources/mapper/system/SysLogMapper.xml b/framework/src/main/resources/mapper/system/SysLogMapper.xml new file mode 100644 index 0000000..1046de9 --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/resources/mapper/system/SysMenuMapper.xml b/framework/src/main/resources/mapper/system/SysMenuMapper.xml new file mode 100644 index 0000000..febfab3 --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysMenuMapper.xml @@ -0,0 +1,103 @@ + + + + + + update sys_menu set orderno=orderno+1 where parentid=#{parentid} and orderno < #{Orderno} and orderno >= #{upOrderno} + + + + + update sys_menu SET orderno=orderno-1 where parentid=#{parentid} and orderno > #{Orderno} and orderno <= #{downOrderno} + + + + + + + + + + diff --git a/framework/src/main/resources/mapper/system/SysMessageMapper.xml b/framework/src/main/resources/mapper/system/SysMessageMapper.xml new file mode 100644 index 0000000..cda7c6f --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysMessageMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/resources/mapper/system/SysOrganizationMapper.xml b/framework/src/main/resources/mapper/system/SysOrganizationMapper.xml new file mode 100644 index 0000000..053c5ae --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysOrganizationMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/framework/src/main/resources/mapper/system/SysQuartzJobMapper.xml b/framework/src/main/resources/mapper/system/SysQuartzJobMapper.xml new file mode 100644 index 0000000..268cb3d --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysQuartzJobMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/src/main/resources/mapper/system/SysRoleMapper.xml b/framework/src/main/resources/mapper/system/SysRoleMapper.xml new file mode 100644 index 0000000..4b37516 --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysRoleMapper.xml @@ -0,0 +1,116 @@ + + + + + INSERT INTO sys_role_menu + + + id, + + + roleid, + + + menuid + + + + + #{id}, + + + #{roleid}, + + + #{menuid} + + + + + + + + + + + + + + + + + + + + delete from sys_role_users where userid !=(select u.id from sys_user u where u.account="admin") and roleid=#{roleid} and userid=#{urserid} + + + + + DELETE FROM sys_role_menu WHERE roleid= #{id} + + + + + DELETE FROM sys_role_users WHERE roleid= #{id} + + diff --git a/framework/src/main/resources/mapper/system/SysUserMapper.xml b/framework/src/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 0000000..f89b6dc --- /dev/null +++ b/framework/src/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + insert into sys_role_users value (#{id},#{roleid},#{userid}) + + + + + + + + + + + + + + + + + + delete from sys_role_users where userid=#{userid} + + + + delete from sys_role_users + where + userid=#{userid} + and roleid not in + + #{roleids} + + + + DELETE FROM sys_role_users WHERE userid IN + + #{id} + + + + diff --git a/framework/src/main/resources/quartz.properties b/framework/src/main/resources/quartz.properties new file mode 100644 index 0000000..03d3988 --- /dev/null +++ b/framework/src/main/resources/quartz.properties @@ -0,0 +1,21 @@ +######################################## +# Quartz 默认配置示例(RAMJobStore) +######################################## + +org.quartz.scheduler.instanceName = PlatformScheduler +org.quartz.scheduler.instanceId = AUTO + +# 线程池配置 +org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool +org.quartz.threadPool.threadCount = 10 +org.quartz.threadPool.threadPriority = 5 + +# 使用内存存储(如需持久化请改为 JobStoreTX 并配置数据源) +org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore + +# Misfire 阈值 +org.quartz.jobStore.misfireThreshold = 60000 + +# 插件(可选):关闭时清理 +org.quartz.plugin.shutdownHook.class = org.quartz.plugins.management.ShutdownHookPlugin +org.quartz.plugin.shutdownHook.cleanShutdown = true \ No newline at end of file diff --git a/framework/src/main/resources/static/assets/401-485a4475.js b/framework/src/main/resources/static/assets/401-485a4475.js new file mode 100644 index 0000000..390a98a --- /dev/null +++ b/framework/src/main/resources/static/assets/401-485a4475.js @@ -0,0 +1 @@ +import{d as v,aa as x,ab as V,c as C,f as t,w as o,a as i,S as y,i as a,M as I,o as R,j as _,h as e,W as S,J as z,K as B,_ as G}from"./index-5c62e6c4.js";const s=l=>(z("data-v-25007613"),l=l(),B(),l),N={class:"errPage-container"},j=s(()=>e("h1",{class:"text-jumbo text-ginormous"},"Oops!",-1)),M=s(()=>e("a",{href:"https://zh.airbnb.com/",target:"_blank"},"airbnb",-1)),P=s(()=>e("h2",null,"你没有权限去该页面",-1)),U=s(()=>e("h6",null,"如有不满请联系你领导",-1)),E={class:"list-unstyled"},J=s(()=>e("li",null,"或者你可以去:",-1)),K={class:"link-type"},L=s(()=>e("li",{class:"link-type"},[e("a",{href:"https://www.taobao.com/"},"随便看看")],-1)),O=["src"],T=["src"],W={name:"Page401"},$=v({...W,setup(l){const u=x({errGif:new URL("/assets/401-a61ddb94.gif",self.location).href,ewizardClap:"https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646",dialogVisible:!1}),{errGif:p,ewizardClap:f,dialogVisible:n}=V(u),h=I();function m(){h.back()}return(q,c)=>{const b=a("el-button"),g=a("router-link"),r=a("el-col"),w=a("el-row"),k=a("el-dialog");return R(),C("div",N,[t(b,{icon:"el-icon-arrow-left",class:"pan-back-btn",onClick:m},{default:o(()=>[_(" 返回 ")]),_:1}),t(w,null,{default:o(()=>[t(r,{span:12},{default:o(()=>[j,_(" gif来源"),M,_(" 页面 "),P,U,e("ul",E,[J,e("li",K,[t(g,{to:"/dashboard"},{default:o(()=>[_(" 回首页 ")]),_:1})]),L,e("li",null,[e("a",{href:"#",onClick:c[0]||(c[0]=S(d=>n.value=!0,["prevent"]))},"点我看图")])])]),_:1}),t(r,{span:12},{default:o(()=>[e("img",{src:i(p),width:"313",height:"428",alt:"Girl has dropped her ice cream."},null,8,O)]),_:1})]),_:1}),t(k,{modelValue:i(n),"onUpdate:modelValue":c[1]||(c[1]=d=>y(n)?n.value=d:null),title:"随便看"},{default:o(()=>[e("img",{src:i(f),class:"pan-img"},null,8,T)]),_:1},8,["modelValue"])])}}});const D=G($,[["__scopeId","data-v-25007613"]]);export{D as default}; diff --git a/framework/src/main/resources/static/assets/404-ae343fa7.js b/framework/src/main/resources/static/assets/404-ae343fa7.js new file mode 100644 index 0000000..51a23cb --- /dev/null +++ b/framework/src/main/resources/static/assets/404-ae343fa7.js @@ -0,0 +1 @@ +import{d as o,c as _,h as t,t as i,ag as l,J as n,K as d,j as r,o as h,_ as p}from"./index-5c62e6c4.js";const f="/assets/404-538aa4d7.png",a="/assets/404_cloud-98e7ac66.png",e=s=>(n("data-v-ec8f1f5a"),s=s(),d(),s),u={class:"wscn-http404-container"},m=l('
    404404404404
    ',1),v=e(()=>t("div",{class:"bullshit__oops"},"OOPS!",-1)),g=e(()=>t("div",{class:"bullshit__info"},[r(" All rights reserved "),t("a",{style:{color:"#20a0ff"},href:"https://wallstreetcn.com",target:"_blank"},"wallstreetcn")],-1)),b=e(()=>t("div",{class:"bullshit__info"}," Please check that the URL you entered is correct, or click the button below to return to the homepage. ",-1)),w=e(()=>t("a",{href:"",class:"bullshit__return-home"},"Back to home",-1)),k={name:"Page404"},y=o({...k,setup(s){function c(){return"The webmaster said that you can not enter this page..."}return(S,x)=>(h(),_("div",u,[t("div",{class:"wscn-http404"},[m,t("div",{class:"bullshit"},[v,g,t("div",{class:"bullshit__headline"},i(c)),b,w])])]))}});const I=p(y,[["__scopeId","data-v-ec8f1f5a"]]);export{I as default}; diff --git a/framework/src/main/resources/static/assets/BarChart-a4765ae3.js b/framework/src/main/resources/static/assets/BarChart-a4765ae3.js new file mode 100644 index 0000000..95b45f0 --- /dev/null +++ b/framework/src/main/resources/static/assets/BarChart-a4765ae3.js @@ -0,0 +1 @@ +import{r as c,i as f,L as a}from"./resize-9f0962b6.js";import{d as m,I as y,aq as u,ar as x,k as h,a4 as p,o as g,c as b,X as S,p as v}from"./index-5c62e6c4.js";const w=["id"],L=m({__name:"BarChart",props:{id:{type:String,default:"barChart"},className:{type:String,default:""},width:{type:String,default:"200px",required:!0},height:{type:String,default:"200px",required:!0}},setup(e){const o=e,{mounted:i,chart:r,beforeDestroy:n,activated:l,deactivated:s}=c();function d(){const t=f(document.getElementById(o.id));t.setOption({title:{show:!0,text:"业绩总览",x:"center",padding:15,textStyle:{fontSize:18,fontStyle:"normal",fontWeight:"bold",color:"#337ecc"}},grid:{left:"2%",right:"2%",bottom:"10%",containLabel:!0},tooltip:{trigger:"axis",axisPointer:{type:"cross",crossStyle:{color:"#999"}}},legend:{x:"center",y:"bottom",data:["收入","毛利润","收入增长率","利润增长率"]},xAxis:[{type:"category",data:["浙江","北京","上海","广东","深圳"],axisPointer:{type:"shadow"}}],yAxis:[{type:"value",min:0,max:1e4,interval:2e3,axisLabel:{formatter:"{value} "}},{type:"value",min:0,max:100,interval:20,axisLabel:{formatter:"{value}%"}}],series:[{name:"收入",type:"bar",data:[7e3,7100,7200,7300,7400],barWidth:20,itemStyle:{color:new a(0,0,0,1,[{offset:0,color:"#83bff6"},{offset:.5,color:"#188df0"},{offset:1,color:"#188df0"}])}},{name:"毛利润",type:"bar",data:[8e3,8200,8400,8600,8800],barWidth:20,itemStyle:{color:new a(0,0,0,1,[{offset:0,color:"#25d73c"},{offset:.5,color:"#1bc23d"},{offset:1,color:"#179e61"}])}},{name:"收入增长率",type:"line",yAxisIndex:1,data:[60,65,70,75,80],itemStyle:{color:"#67C23A"}},{name:"利润增长率",type:"line",yAxisIndex:1,data:[70,75,80,85,90],itemStyle:{color:"#409EFF"}}]}),r.value=t}return y(()=>{n()}),u(()=>{l()}),x(()=>{s()}),h(()=>{i(),p(()=>{d()})}),(t,C)=>(g(),b("div",{id:e.id,class:S(e.className),style:v({height:e.height,width:e.width})},null,14,w))}});export{L as default}; diff --git a/framework/src/main/resources/static/assets/FunnelChart-8e41d306.js b/framework/src/main/resources/static/assets/FunnelChart-8e41d306.js new file mode 100644 index 0000000..b4f80e1 --- /dev/null +++ b/framework/src/main/resources/static/assets/FunnelChart-8e41d306.js @@ -0,0 +1 @@ +import{r as s,i as u}from"./resize-9f0962b6.js";import{d as c,I as m,aq as h,ar as f,k as p,a4 as y,o as g,c as S,X as b,p as v}from"./index-5c62e6c4.js";const w=["id"],q=c({__name:"FunnelChart",props:{id:{type:String,default:"funnelChart"},className:{type:String,default:""},width:{type:String,default:"200px",required:!0},height:{type:String,default:"200px",required:!0}},setup(e){const n=e,{mounted:a,chart:i,beforeDestroy:o,activated:l,deactivated:r}=s();function d(){const t=u(document.getElementById(n.id));t.setOption({title:{show:!0,text:"订单线索转化漏斗图",x:"center",padding:15,textStyle:{fontSize:18,fontStyle:"normal",fontWeight:"bold",color:"#337ecc"}},grid:{left:"2%",right:"2%",bottom:"10%",containLabel:!0},legend:{x:"center",y:"bottom",data:["Show","Click","Visit","Inquiry","Order"]},series:[{name:"Funnel",type:"funnel",left:"20%",top:60,bottom:60,width:"60%",sort:"descending",gap:2,label:{show:!0,position:"inside"},labelLine:{length:10,lineStyle:{width:1,type:"solid"}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{fontSize:20}},data:[{value:60,name:"Visit"},{value:40,name:"Inquiry"},{value:20,name:"Order"},{value:80,name:"Click"},{value:100,name:"Show"}]}]}),i.value=t}return m(()=>{o()}),h(()=>{l()}),f(()=>{r()}),p(()=>{a(),y(()=>{d()})}),(t,x)=>(g(),S("div",{id:e.id,class:b(e.className),style:v({height:e.height,width:e.width})},null,14,w))}});export{q as default}; diff --git a/framework/src/main/resources/static/assets/PieChart-f0d9d351.js b/framework/src/main/resources/static/assets/PieChart-f0d9d351.js new file mode 100644 index 0000000..8f6ea0a --- /dev/null +++ b/framework/src/main/resources/static/assets/PieChart-f0d9d351.js @@ -0,0 +1 @@ +import{r as c,i as u}from"./resize-9f0962b6.js";import{d as m,I as h,aq as f,ar as p,k as g,a4 as y,o as C,c as v,X as x,p as S}from"./index-5c62e6c4.js";const b=["id"],B=m({__name:"PieChart",props:{id:{type:String,default:"pieChart"},className:{type:String,default:""},width:{type:String,default:"200px",required:!0},height:{type:String,default:"200px",required:!0}},setup(e){const i=e,{mounted:n,chart:o,beforeDestroy:r,activated:s,deactivated:d}=c();function l(){const t=u(document.getElementById(i.id));t.setOption({title:{show:!0,text:"产品分类总览",x:"center",padding:15,textStyle:{fontSize:18,fontStyle:"normal",fontWeight:"bold",color:"#337ecc"}},grid:{left:"2%",right:"2%",bottom:"10%",containLabel:!0},legend:{top:"bottom"},series:[{name:"Nightingale Chart",type:"pie",radius:[50,130],center:["50%","50%"],roseType:"area",itemStyle:{borderRadius:1,color:function(a){return["#409EFF","#67C23A","#E6A23C","#F56C6C"][a.dataIndex]}},data:[{value:26,name:"家用电器"},{value:27,name:"户外运动"},{value:24,name:"汽车用品"},{value:23,name:"手机数码"}]}]}),o.value=t}return h(()=>{r()}),f(()=>{s()}),p(()=>{d()}),g(()=>{n(),y(()=>{l()})}),(t,a)=>(C(),v("div",{id:e.id,class:x(e.className),style:S({height:e.height,width:e.width})},null,14,b))}});export{B as default}; diff --git a/framework/src/main/resources/static/assets/RadarChart-94b1112a.js b/framework/src/main/resources/static/assets/RadarChart-94b1112a.js new file mode 100644 index 0000000..3a44423 --- /dev/null +++ b/framework/src/main/resources/static/assets/RadarChart-94b1112a.js @@ -0,0 +1 @@ +import{r as l,i as m}from"./resize-9f0962b6.js";import{d as u,I as h,aq as f,ar as g,k as p,a4 as y,o as v,c as x,X as C,p as S}from"./index-5c62e6c4.js";const b=["id"],z=u({__name:"RadarChart",props:{id:{type:String,default:"radarChart"},className:{type:String,default:""},width:{type:String,default:"200px",required:!0},height:{type:String,default:"200px",required:!0}},setup(e){const n=e,{mounted:r,chart:i,beforeDestroy:o,activated:d,deactivated:s}=l();function c(){const t=m(document.getElementById(n.id));t.setOption({title:{show:!0,text:"订单状态统计",x:"center",padding:15,textStyle:{fontSize:18,fontStyle:"normal",fontWeight:"bold",color:"#337ecc"}},grid:{left:"2%",right:"2%",bottom:"10%",containLabel:!0},legend:{x:"center",y:"bottom",data:["预定数量","下单数量","发货数量"]},radar:{radius:"60%",indicator:[{name:"家用电器"},{name:"服装箱包"},{name:"运动户外"},{name:"手机数码"},{name:"汽车用品"},{name:"家具厨具"}]},series:[{name:"Budget vs spending",type:"radar",itemStyle:{borderRadius:6,color:function(a){return["#409EFF","#67C23A","#E6A23C","#F56C6C"][a.dataIndex]}},data:[{value:[400,400,400,400,400,400],name:"预定数量"},{value:[300,300,300,300,300,300],name:"下单数量"},{value:[200,200,200,200,200,200],name:"发货数量"}]}]}),i.value=t}return h(()=>{o()}),f(()=>{d()}),g(()=>{s()}),p(()=>{r(),y(()=>{c()})}),(t,a)=>(v(),x("div",{id:e.id,class:C(e.className),style:S({height:e.height,width:e.width})},null,14,b))}});export{z as default}; diff --git a/framework/src/main/resources/static/assets/editor-ec3491e5.js b/framework/src/main/resources/static/assets/editor-ec3491e5.js new file mode 100644 index 0000000..78d9f56 --- /dev/null +++ b/framework/src/main/resources/static/assets/editor-ec3491e5.js @@ -0,0 +1,186 @@ +import{d as N1,r as Eg,am as lP,k as u$,a3 as s$,a9 as l$,an as c$,o as I1,c as L1,aa as cP,ab as fP,I as f$,f as Dg,a as br,S as d$,ae as yx,w as p$}from"./index-5c62e6c4.js";import{u as h$}from"./index-f88fe59a.js";var se=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function g$(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function us(t){var e={exports:{}};return t(e,e.exports),e.exports}var yi,$0,Fh=function(t){return t&&t.Math==Math&&t},kt=Fh(typeof globalThis=="object"&&globalThis)||Fh(typeof window=="object"&&window)||Fh(typeof self=="object"&&self)||Fh(typeof se=="object"&&se)||function(){return this}()||Function("return this")(),r5=Function.prototype,bx=r5.apply,v$=r5.bind,wx=r5.call,dP=typeof Reflect=="object"&&Reflect.apply||(v$?wx.bind(bx):function(){return wx.apply(bx,arguments)}),pP=Function.prototype,w4=pP.bind,E4=pP.call,m$=w4&&w4.bind(E4),ge=w4?function(t){return t&&m$(E4,t)}:function(t){return t&&function(){return E4.apply(t,arguments)}},sn=function(t){return typeof t=="function"},Gn=function(t){try{return!!t()}catch{return!0}},Hn=!Gn(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7}),kc=Function.prototype.call,zn=kc.bind?kc.bind(kc):function(){return kc.apply(kc,arguments)},Ex={}.propertyIsEnumerable,Dx=Object.getOwnPropertyDescriptor,y$=Dx&&!Ex.call({1:2},1)?function(t){var e=Dx(this,t);return!!e&&e.enumerable}:Ex,o5={f:y$},Xr=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},b$=ge({}.toString),w$=ge("".slice),Du=function(t){return w$(b$(t),8,-1)},qm=kt.Object,E$=ge("".split),hP=Gn(function(){return!qm("z").propertyIsEnumerable(0)})?function(t){return Du(t)=="String"?E$(t,""):qm(t)}:qm,D$=kt.TypeError,i5=function(t){if(t==null)throw D$("Can't call method on "+t);return t},jo=function(t){return hP(i5(t))},tr=function(t){return typeof t=="object"?t!==null:sn(t)},Qn={},Cx=function(t){return sn(t)?t:void 0},oc=function(t,e){return arguments.length<2?Cx(Qn[t])||Cx(kt[t]):Qn[t]&&Qn[t][e]||kt[t]&&kt[t][e]},Td=ge({}.isPrototypeOf),Km=oc("navigator","userAgent")||"",xx=kt.process,Sx=kt.Deno,Ax=xx&&xx.versions||Sx&&Sx.version,Ox=Ax&&Ax.v8;Ox&&($0=(yi=Ox.split("."))[0]>0&&yi[0]<4?1:+(yi[0]+yi[1])),!$0&&Km&&(!(yi=Km.match(/Edge\/(\d+)/))||yi[1]>=74)&&(yi=Km.match(/Chrome\/(\d+)/))&&($0=+yi[1]);var _h,Cg=$0,ho=!!Object.getOwnPropertySymbols&&!Gn(function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&Cg&&Cg<41}),a5=ho&&!Symbol.sham&&typeof Symbol.iterator=="symbol",C$=kt.Object,hl=a5?function(t){return typeof t=="symbol"}:function(t){var e=oc("Symbol");return sn(e)&&Td(e.prototype,C$(t))},x$=kt.String,D4=function(t){try{return x$(t)}catch{return"Object"}},S$=kt.TypeError,u5=function(t){if(sn(t))return t;throw S$(D4(t)+" is not a function")},xg=function(t,e){var n=t[e];return n==null?void 0:u5(n)},A$=kt.TypeError,O$=Object.defineProperty,ea=kt["__core-js_shared__"]||function(t,e){try{O$(kt,t,{value:e,configurable:!0,writable:!0})}catch{kt[t]=e}return e}("__core-js_shared__",{}),ss=us(function(t){(t.exports=function(e,n){return ea[e]||(ea[e]=n!==void 0?n:{})})("versions",[]).push({version:"3.19.3",mode:"pure",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})}),k$=kt.Object,Fp=function(t){return k$(i5(t))},B$=ge({}.hasOwnProperty),Vt=Object.hasOwn||function(t,e){return B$(Fp(t),e)},F$=0,_$=Math.random(),T$=ge(1 .toString),Sg=function(t){return"Symbol("+(t===void 0?"":t)+")_"+T$(++F$+_$,36)},Bc=ss("wks"),Cu=kt.Symbol,kx=Cu&&Cu.for,P$=a5?Cu:Cu&&Cu.withoutSetter||Sg,Bn=function(t){if(!Vt(Bc,t)||!ho&&typeof Bc[t]!="string"){var e="Symbol."+t;ho&&Vt(Cu,t)?Bc[t]=Cu[t]:Bc[t]=a5&&kx?kx(e):P$(e)}return Bc[t]},j$=kt.TypeError,N$=Bn("toPrimitive"),I$=function(t,e){if(!tr(t)||hl(t))return t;var n,r=xg(t,N$);if(r){if(e===void 0&&(e="default"),n=zn(r,t,e),!tr(n)||hl(n))return n;throw j$("Can't convert object to primitive value")}return e===void 0&&(e="number"),function(o,i){var a,u;if(i==="string"&&sn(a=o.toString)&&!tr(u=zn(a,o))||sn(a=o.valueOf)&&!tr(u=zn(a,o))||i!=="string"&&sn(a=o.toString)&&!tr(u=zn(a,o)))return u;throw A$("Can't convert object to primitive value")}(t,e)},ic=function(t){var e=I$(t,"string");return hl(e)?e:e+""},C4=kt.document,L$=tr(C4)&&tr(C4.createElement),gP=function(t){return L$?C4.createElement(t):{}},vP=!Hn&&!Gn(function(){return Object.defineProperty(gP("div"),"a",{get:function(){return 7}}).a!=7}),Bx=Object.getOwnPropertyDescriptor,R$=Hn?Bx:function(t,e){if(t=jo(t),e=ic(e),vP)try{return Bx(t,e)}catch{}if(Vt(t,e))return Xr(!zn(o5.f,t,e),t[e])},R1={f:R$},M$=/#|\.prototype\./,_p=function(t,e){var n=$$[z$(t)];return n==V$||n!=H$&&(sn(e)?Gn(e):!!e)},z$=_p.normalize=function(t){return String(t).replace(M$,".").toLowerCase()},$$=_p.data={},H$=_p.NATIVE="N",V$=_p.POLYFILL="P",U$=_p,Fx=ge(ge.bind),s5=function(t,e){return u5(t),e===void 0?t:Fx?Fx(t,e):function(){return t.apply(e,arguments)}},W$=kt.String,G$=kt.TypeError,ar=function(t){if(tr(t))return t;throw G$(W$(t)+" is not an object")},q$=kt.TypeError,_x=Object.defineProperty,K$=Hn?_x:function(t,e,n){if(ar(t),e=ic(e),ar(n),vP)try{return _x(t,e,n)}catch{}if("get"in n||"set"in n)throw q$("Accessors not supported");return"value"in n&&(t[e]=n.value),t},Na={f:K$},Tn=Hn?function(t,e,n){return Na.f(t,e,Xr(1,n))}:function(t,e,n){return t[e]=n,t},Y$=R1.f,X$=function(t){var e=function(n,r,o){if(this instanceof e){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,r)}return new t(n,r,o)}return dP(t,this,arguments)};return e.prototype=t.prototype,e},Ko=function(t,e){var n,r,o,i,a,u,s,l,c=t.target,f=t.global,p=t.stat,d=t.proto,m=f?kt:p?kt[c]:(kt[c]||{}).prototype,g=f?Qn:Qn[c]||Tn(Qn,c,{})[c],v=g.prototype;for(o in e)n=!U$(f?o:c+(p?".":"#")+o,t.forced)&&m&&Vt(m,o),a=g[o],n&&(u=t.noTargetGet?(l=Y$(m,o))&&l.value:m[o]),i=n&&u?u:e[o],n&&typeof a==typeof i||(s=t.bind&&n?s5(i,kt):t.wrap&&n?X$(i):d&&sn(i)?ge(i):i,(t.sham||i&&i.sham||a&&a.sham)&&Tn(s,"sham",!0),Tn(g,o,s),d&&(Vt(Qn,r=c+"Prototype")||Tn(Qn,r,{}),Tn(Qn[r],o,i),t.real&&v&&!v[o]&&Tn(v,o,i)))},Tx=ss("keys"),M1=function(t){return Tx[t]||(Tx[t]=Sg(t))},Z$=!Gn(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}),Px=M1("IE_PROTO"),x4=kt.Object,J$=x4.prototype,Ag=Z$?x4.getPrototypeOf:function(t){var e=Fp(t);if(Vt(e,Px))return e[Px];var n=e.constructor;return sn(n)&&e instanceof n?n.prototype:e instanceof x4?J$:null},Q$=kt.String,tH=kt.TypeError,Og=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,n={};try{(t=ge(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(n,[]),e=n instanceof Array}catch{}return function(r,o){return ar(r),function(i){if(typeof i=="object"||sn(i))return i;throw tH("Can't set "+Q$(i)+" as a prototype")}(o),e?t(r,o):r.__proto__=o,r}}():void 0),eH=Math.ceil,nH=Math.floor,l5=function(t){var e=+t;return e!=e||e===0?0:(e>0?nH:eH)(e)},rH=Math.max,oH=Math.min,S4=function(t,e){var n=l5(t);return n<0?rH(n+e,0):oH(n,e)},iH=Math.min,Tp=function(t){return(e=t.length)>0?iH(l5(e),9007199254740991):0;var e},jx=function(t){return function(e,n,r){var o,i=jo(e),a=Tp(i),u=S4(r,a);if(t&&n!=n){for(;a>u;)if((o=i[u++])!=o)return!0}else for(;a>u;u++)if((t||u in i)&&i[u]===n)return t||u||0;return!t&&-1}},aH={includes:jx(!0),indexOf:jx(!1)},Pp={},uH=aH.indexOf,Nx=ge([].push),mP=function(t,e){var n,r=jo(t),o=0,i=[];for(n in r)!Vt(Pp,n)&&Vt(r,n)&&Nx(i,n);for(;e.length>o;)Vt(r,n=e[o++])&&(~uH(i,n)||Nx(i,n));return i},kg=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],sH=kg.concat("length","prototype"),lH=Object.getOwnPropertyNames||function(t){return mP(t,sH)},c5={f:lH},H0={f:Object.getOwnPropertySymbols},cH=ge([].concat),fH=oc("Reflect","ownKeys")||function(t){var e=c5.f(ar(t)),n=H0.f;return n?cH(e,n(t)):e},f5=Object.keys||function(t){return mP(t,kg)},dH=Hn?Object.defineProperties:function(t,e){ar(t);for(var n,r=jo(e),o=f5(e),i=o.length,a=0;i>a;)Na.f(t,n=o[a++],r[n]);return t},pH=oc("document","documentElement"),yP=M1("IE_PROTO"),Ym=function(){},bP=function(t){return"

    Do5Z*>lDBN2{T6MTXPLsD;klA3KA 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 + + + + {{ generateTitle(item.meta.title) }} + + {{ generateTitle(item.meta.title) }} + + + + + + + + + diff --git a/framework/frontend/src/components/GithubCorner/index.vue b/framework/frontend/src/components/GithubCorner/index.vue new file mode 100644 index 0000000..c9a4b32 --- /dev/null +++ b/framework/frontend/src/components/GithubCorner/index.vue @@ -0,0 +1,59 @@ + + + diff --git a/framework/frontend/src/components/Hamburger/index.vue b/framework/frontend/src/components/Hamburger/index.vue new file mode 100644 index 0000000..ec2a6c3 --- /dev/null +++ b/framework/frontend/src/components/Hamburger/index.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/framework/frontend/src/components/IconSelect/index.vue b/framework/frontend/src/components/IconSelect/index.vue new file mode 100644 index 0000000..9670dcf --- /dev/null +++ b/framework/frontend/src/components/IconSelect/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/framework/frontend/src/components/LangSelect/index.vue b/framework/frontend/src/components/LangSelect/index.vue new file mode 100644 index 0000000..88cdcd7 --- /dev/null +++ b/framework/frontend/src/components/LangSelect/index.vue @@ -0,0 +1,44 @@ + + + diff --git a/framework/frontend/src/components/Pagination/index.vue b/framework/frontend/src/components/Pagination/index.vue new file mode 100644 index 0000000..7ae0c19 --- /dev/null +++ b/framework/frontend/src/components/Pagination/index.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/framework/frontend/src/components/Pagination/page.vue b/framework/frontend/src/components/Pagination/page.vue new file mode 100644 index 0000000..da64123 --- /dev/null +++ b/framework/frontend/src/components/Pagination/page.vue @@ -0,0 +1,131 @@ + + + + + + \ No newline at end of file diff --git a/framework/frontend/src/components/RightPanel/index.vue b/framework/frontend/src/components/RightPanel/index.vue new file mode 100644 index 0000000..dc09179 --- /dev/null +++ b/framework/frontend/src/components/RightPanel/index.vue @@ -0,0 +1,160 @@ + + + + + + + diff --git a/framework/frontend/src/components/Screenfull/index.vue b/framework/frontend/src/components/Screenfull/index.vue new file mode 100644 index 0000000..7e9b837 --- /dev/null +++ b/framework/frontend/src/components/Screenfull/index.vue @@ -0,0 +1,18 @@ + + + diff --git a/framework/frontend/src/components/SizeSelect/index.vue b/framework/frontend/src/components/SizeSelect/index.vue new file mode 100644 index 0000000..d9dcbc1 --- /dev/null +++ b/framework/frontend/src/components/SizeSelect/index.vue @@ -0,0 +1,38 @@ + + + diff --git a/framework/frontend/src/components/SvgIcon/index.vue b/framework/frontend/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..19d3cc9 --- /dev/null +++ b/framework/frontend/src/components/SvgIcon/index.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/framework/frontend/src/components/ThemePicker/index.vue b/framework/frontend/src/components/ThemePicker/index.vue new file mode 100644 index 0000000..c51ce19 --- /dev/null +++ b/framework/frontend/src/components/ThemePicker/index.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/framework/frontend/src/components/Upload/MultiUpload.vue b/framework/frontend/src/components/Upload/MultiUpload.vue new file mode 100644 index 0000000..5c34226 --- /dev/null +++ b/framework/frontend/src/components/Upload/MultiUpload.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/framework/frontend/src/components/Upload/SingleUpload.vue b/framework/frontend/src/components/Upload/SingleUpload.vue new file mode 100644 index 0000000..9937550 --- /dev/null +++ b/framework/frontend/src/components/Upload/SingleUpload.vue @@ -0,0 +1,97 @@ + + + + + + + diff --git a/framework/frontend/src/components/WangEditor/index.vue b/framework/frontend/src/components/WangEditor/index.vue new file mode 100644 index 0000000..aeab4d1 --- /dev/null +++ b/framework/frontend/src/components/WangEditor/index.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/framework/frontend/src/directive/index.ts b/framework/frontend/src/directive/index.ts new file mode 100644 index 0000000..a966376 --- /dev/null +++ b/framework/frontend/src/directive/index.ts @@ -0,0 +1,2 @@ +export { hasPerm, hasRole } from './permission'; +export { deBounce } from './utils'; diff --git a/framework/frontend/src/directive/permission/index.ts b/framework/frontend/src/directive/permission/index.ts new file mode 100644 index 0000000..2b215dd --- /dev/null +++ b/framework/frontend/src/directive/permission/index.ts @@ -0,0 +1,54 @@ +import { useUserStoreHook } from '@/store/modules/user'; +import { Directive, DirectiveBinding } from 'vue'; + +/** + * 按钮权限校验 + */ +export const hasPerm: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + // 「超级管理员」拥有所有的按钮权限 + const { roles, perms } = useUserStoreHook(); + if (roles.includes('超级管理员')) { + return true; + } + // 「其他角色」按钮权限校验 + const { value } = binding; + if (value) { + const requiredPerms = value; // DOM绑定需要的按钮权限标识 + const hasPerm = perms?.some(perm => { + return requiredPerms.includes(perm); + }); + + if (!hasPerm) { + el.parentNode && el.parentNode.removeChild(el); + } + } else { + throw new Error( + "need perms! Like v-has-perm=\"['sys:user:add','sys:user:edit']\"" + ); + } + } +}; + +/** + * 角色权限校验 + */ +export const hasRole: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + const { value } = binding; + + if (value) { + const requiredRoles = value; // DOM绑定需要的角色编码 + const { roles } = useUserStoreHook(); + const hasRole = roles.some(perm => { + return requiredRoles.includes(perm); + }); + + if (!hasRole) { + el.parentNode && el.parentNode.removeChild(el); + } + } else { + throw new Error("need roles! Like v-has-role=\"['admin','test']\""); + } + } +}; diff --git a/framework/frontend/src/directive/utils/index.ts b/framework/frontend/src/directive/utils/index.ts new file mode 100644 index 0000000..9eeaef9 --- /dev/null +++ b/framework/frontend/src/directive/utils/index.ts @@ -0,0 +1,15 @@ +import { Directive } from 'vue'; + +/** + * 按钮防抖 + */ +export const deBounce:Directive = { + mounted(el:HTMLElement) { + el.addEventListener('click', () => { + el.classList.add('is-disabled') + setTimeout(() => { + el.classList.remove('is-disabled') + }, 2000) + }) + } +} diff --git a/framework/frontend/src/env.d.ts b/framework/frontend/src/env.d.ts new file mode 100644 index 0000000..bcddf3e --- /dev/null +++ b/framework/frontend/src/env.d.ts @@ -0,0 +1,19 @@ +/// + +declare module '*.vue' { + import { DefineComponent } from 'vue'; + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any>; + export default component; +} + +// 环境变量 TypeScript的智能提示 +interface ImportMetaEnv { + VITE_APP_TITLE: string; + VITE_APP_PORT: string; + VITE_APP_BASE_API: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/framework/frontend/src/lang/en.ts b/framework/frontend/src/lang/en.ts new file mode 100644 index 0000000..63b4df7 --- /dev/null +++ b/framework/frontend/src/lang/en.ts @@ -0,0 +1,29 @@ +export default { + // 路由国际化 + route: { + dashboard: 'Dashboard', + document: 'Document' + }, + // 登录页面国际化 + login: { + title: 'Jingyi system', + username: 'Username', + rulesUsername: 'enter one user name', + password: 'Password', + rulesPassword: 'Please input a password', + rulesPasswordPlace: 'The password cannot be less than 6 digits', + login: 'Login', + code: 'Verification Code', + copyright: '', + icp: '', + thirdPartyLogin: 'third-party login', + remember: 'Remember password' + }, + // 导航栏国际化 + navbar: { + dashboard: 'Dashboard', + logout: 'Logout', + document: 'Document', + gitee: 'Gitee' + } +}; diff --git a/framework/frontend/src/lang/index.ts b/framework/frontend/src/lang/index.ts new file mode 100644 index 0000000..5ca3f65 --- /dev/null +++ b/framework/frontend/src/lang/index.ts @@ -0,0 +1,46 @@ +// 自定义国际化配置 +import { createI18n } from 'vue-i18n'; +import { localStorage } from '@/utils/localStorage'; + +// 本地语言包 +import enLocale from './en'; +import zhCnLocale from './zh-cn'; + +const messages = { + 'zh-cn': { + ...zhCnLocale + }, + en: { + ...enLocale + } +}; + +/** + * 获取当前系统使用语言字符串 + * + * @returns zh-cn|en ... + */ +export const getLanguage = () => { + // 本地缓存获取 + let language = localStorage.get('language'); + if (language) { + return language; + } + // 浏览器使用语言 + language = navigator.language.toLowerCase(); + const locales = Object.keys(messages); + for (const locale of locales) { + if (language.indexOf(locale) > -1) { + return locale; + } + } + return 'zh-cn'; +}; + +const i18n = createI18n({ + legacy: false, + locale: getLanguage(), + messages: messages +}); + +export default i18n; diff --git a/framework/frontend/src/lang/zh-cn.ts b/framework/frontend/src/lang/zh-cn.ts new file mode 100644 index 0000000..a52feb6 --- /dev/null +++ b/framework/frontend/src/lang/zh-cn.ts @@ -0,0 +1,28 @@ +export default { + // 路由国际化 + route: { + dashboard: '首页', + document: '项目文档' + }, + // 登录页面国际化 + login: { + title: '公司开发平台框架', + username: '用户名', + rulesUsername: '请输入用户名', + password: '密码', + rulesPassword: '请输入密码', + rulesPasswordPlace: '密码不能少于6位', + login: '登 录', + code: '请输入验证码', + copyright: '', + icp: '', + thirdPartyLogin: '第三方登录', + remember: '记住密码' + }, + navbar: { + dashboard: '首页', + logout: '注销', + document: '项目文档', + gitee: '码云' + } +}; diff --git a/framework/frontend/src/layout/components/AppMain.vue b/framework/frontend/src/layout/components/AppMain.vue new file mode 100644 index 0000000..d83a57d --- /dev/null +++ b/framework/frontend/src/layout/components/AppMain.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/framework/frontend/src/layout/components/Navbar.vue b/framework/frontend/src/layout/components/Navbar.vue new file mode 100644 index 0000000..ce6ab7a --- /dev/null +++ b/framework/frontend/src/layout/components/Navbar.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/framework/frontend/src/layout/components/Settings/index.vue b/framework/frontend/src/layout/components/Settings/index.vue new file mode 100644 index 0000000..605f23a --- /dev/null +++ b/framework/frontend/src/layout/components/Settings/index.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/framework/frontend/src/layout/components/Sidebar/Link.vue b/framework/frontend/src/layout/components/Sidebar/Link.vue new file mode 100644 index 0000000..c592bbd --- /dev/null +++ b/framework/frontend/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,37 @@ + + + diff --git a/framework/frontend/src/layout/components/Sidebar/Logo.vue b/framework/frontend/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 0000000..a46a32b --- /dev/null +++ b/framework/frontend/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,33 @@ + + + diff --git a/framework/frontend/src/layout/components/Sidebar/MixNav.vue b/framework/frontend/src/layout/components/Sidebar/MixNav.vue new file mode 100644 index 0000000..55b8a7f --- /dev/null +++ b/framework/frontend/src/layout/components/Sidebar/MixNav.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/framework/frontend/src/layout/components/Sidebar/SidebarItem.vue b/framework/frontend/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..e540a1f --- /dev/null +++ b/framework/frontend/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,125 @@ + + + + diff --git a/framework/frontend/src/layout/components/Sidebar/index.vue b/framework/frontend/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..8fdf4f4 --- /dev/null +++ b/framework/frontend/src/layout/components/Sidebar/index.vue @@ -0,0 +1,43 @@ + + + diff --git a/framework/frontend/src/layout/components/TagsView/ScrollPane.vue b/framework/frontend/src/layout/components/TagsView/ScrollPane.vue new file mode 100644 index 0000000..07f79c3 --- /dev/null +++ b/framework/frontend/src/layout/components/TagsView/ScrollPane.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/framework/frontend/src/layout/components/TagsView/index.vue b/framework/frontend/src/layout/components/TagsView/index.vue new file mode 100644 index 0000000..1a5e103 --- /dev/null +++ b/framework/frontend/src/layout/components/TagsView/index.vue @@ -0,0 +1,356 @@ + + + + + diff --git a/framework/frontend/src/layout/components/index.ts b/framework/frontend/src/layout/components/index.ts new file mode 100644 index 0000000..4dca96e --- /dev/null +++ b/framework/frontend/src/layout/components/index.ts @@ -0,0 +1,4 @@ +export { default as Navbar } from './Navbar.vue'; +export { default as AppMain } from './AppMain.vue'; +export { default as Settings } from './Settings/index.vue'; +export { default as TagsView } from './TagsView/index.vue'; diff --git a/framework/frontend/src/layout/components/news.vue b/framework/frontend/src/layout/components/news.vue new file mode 100644 index 0000000..165f0c3 --- /dev/null +++ b/framework/frontend/src/layout/components/news.vue @@ -0,0 +1,257 @@ + + + + diff --git a/framework/frontend/src/layout/index.vue b/framework/frontend/src/layout/index.vue new file mode 100644 index 0000000..af0c28d --- /dev/null +++ b/framework/frontend/src/layout/index.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/framework/frontend/src/main.ts b/framework/frontend/src/main.ts new file mode 100644 index 0000000..b3a9a56 --- /dev/null +++ b/framework/frontend/src/main.ts @@ -0,0 +1,42 @@ +import { createApp, Directive } from 'vue'; +import App from './App.vue'; +import router from '@/router'; +import { setupStore } from '@/store'; + +import ElementPlus from 'element-plus'; +import * as ElementPlusIconsVue from '@element-plus/icons-vue' +import Pagination from '@/components/Pagination/index.vue'; +import '@/permission'; + +// 引入svg注册脚本 +import 'virtual:svg-icons-register'; + +// 国际化 +import i18n from '@/lang/index'; + +import '@/styles/index.scss'; +import 'element-plus/theme-chalk/index.css'; +//import 'element-plus/theme-chalk/dark/css-vars.css'; + +const app = createApp(App); +// 自定义指令 +import * as directive from '@/directive'; +Object.keys(directive).forEach(key => { + app.directive(key, (directive as { [key: string]: Directive })[key]); +}); +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) +} + +// 全局方法 +import { getDictionaries } from '@/api/dict'; +app.config.globalProperties.$getDictionaries = getDictionaries; + +// 全局挂载 +setupStore(app); +app + .component('Pagination', Pagination) + .use(router) + .use(ElementPlus) + .use(i18n) + .mount('#app'); diff --git a/framework/frontend/src/permission.ts b/framework/frontend/src/permission.ts new file mode 100644 index 0000000..467c7af --- /dev/null +++ b/framework/frontend/src/permission.ts @@ -0,0 +1,63 @@ +import router from '@/router'; +import { RouteRecordRaw } from 'vue-router'; +import { useUserStoreHook } from '@/store/modules/user'; +import { usePermissionStoreHook } from '@/store/modules/permission'; + +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; +NProgress.configure({ showSpinner: false }); // 进度条 + +const permissionStore = usePermissionStoreHook(); + +// 白名单路由 +const whiteList = ['/login']; + +router.beforeEach(async (to, from, next) => { + NProgress.start(); + const userStore = useUserStoreHook(); + if (userStore.Token) { + // 登录成功,跳转到首页 + if (to.path === '/login') { + next({ path: '/' }); + NProgress.done(); + } else { + const hasGetUserInfo = userStore.roles.length > 0; + // const hasGetUserInfo = true; + if (hasGetUserInfo) { + if (to.matched.length === 0) { + from.name ? next({ name: from.name as any }) : next('/401'); + } else { + next(); + } + } else { + try { + const { roles } = await userStore.getInfo(); + const accessRoutes: RouteRecordRaw[] = + await permissionStore.generateRoutes(roles); + + accessRoutes.forEach((route: any) => { + router.addRoute(route); + }); + next({ ...to, replace: true }); + } catch (error) { + // 移除 token 并跳转登录页 + await userStore.resetToken(); + next(`/login?redirect=${to.path}`); + NProgress.done(); + } + } + } + } else { + // 未登录可以访问白名单页面 + if (whiteList.indexOf(to.path) !== -1) { + next(); + } else { + next(`/login?redirect=${to.path}`); + NProgress.done(); + } + } +}); + +router.afterEach(() => { + NProgress.done(); +}); diff --git a/framework/frontend/src/router/index.ts b/framework/frontend/src/router/index.ts new file mode 100644 index 0000000..d45a4cf --- /dev/null +++ b/framework/frontend/src/router/index.ts @@ -0,0 +1,77 @@ +import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'; +import { usePermissionStoreHook } from '@/store/modules/permission'; + +export const Layout = () => import('@/layout/index.vue'); + +// 静态路由 +export const constantRoutes: RouteRecordRaw[] = [ + { + path: '/redirect', + component: Layout, + meta: { hidden: true }, + children: [ + { + path: '/redirect/:path(.*)', + component: () => import('@/views/redirect/index.vue') + } + ] + }, + { + path: '/login', + component: () => import('@/views/login/index.vue'), + meta: { hidden: true } + }, + { + path: '/404', + component: () => import('@/views/error-page/404.vue'), + meta: { hidden: true } + }, + + { + path: '/', + component: Layout, + redirect: '/dashboard', + children: [ + { + path: 'dashboard', + opturl: '/dashboard', + component: () => import('@/views/dashboard/index.vue'), + name: '首页', + icon: 'homepage', + meta: { title: 'dashboard', icon: 'homepage', affix: true } + }, + { + path: 'personalCenter', + component: () => import('@/views/system/user/personalCenter.vue'), + name: '个人中心', + meta: { title: 'personalCenter',hidden: true, icon: 'personalCenter' } + }, + { + path: '401', + component: () => import('@/views/error-page/401.vue'), + meta: { hidden: true } + }, + ] + } +]; + +// 创建路由 +const router = createRouter({ + history: createWebHashHistory(), + routes: constantRoutes as RouteRecordRaw[], + // 刷新时,滚动条位置还原 + scrollBehavior: () => ({ left: 0, top: 0 }) +}); + +// 重置路由 +export function resetRouter() { + const permissionStore = usePermissionStoreHook(); + permissionStore.routes.forEach(route => { + const name = route.name; + if (name && router.hasRoute(name)) { + router.hasRoute(name) && router.removeRoute(name); + } + }); +} + +export default router; diff --git a/framework/frontend/src/settings.ts b/framework/frontend/src/settings.ts new file mode 100644 index 0000000..cd9b78b --- /dev/null +++ b/framework/frontend/src/settings.ts @@ -0,0 +1,23 @@ +interface DefaultSettings { + title: string; + showSettings: boolean; + tagsView: boolean; + fixedHeader: boolean; + sidebarLogo: boolean; + errorLog: string; + layout: string; + theme: string; +} + +const defaultSettings: DefaultSettings = { + title: '公司开发平台框架', + showSettings: false, + tagsView: true, + fixedHeader: true, + sidebarLogo: true, + errorLog: 'production', + layout: 'left', + theme: 'light' +}; + +export default defaultSettings; diff --git a/framework/frontend/src/shims.d.ts b/framework/frontend/src/shims.d.ts new file mode 100644 index 0000000..288c4ac --- /dev/null +++ b/framework/frontend/src/shims.d.ts @@ -0,0 +1,2 @@ +declare module 'jsencrypt' +declare module 'sortablejs' \ No newline at end of file diff --git a/framework/frontend/src/store/index.ts b/framework/frontend/src/store/index.ts new file mode 100644 index 0000000..fc0ba49 --- /dev/null +++ b/framework/frontend/src/store/index.ts @@ -0,0 +1,11 @@ +import type { App } from 'vue'; +import { createPinia } from 'pinia'; + +const store = createPinia(); + +// 全局挂载store +export function setupStore(app: App) { + app.use(store); +} + +export { store }; diff --git a/framework/frontend/src/store/modules/app.ts b/framework/frontend/src/store/modules/app.ts new file mode 100644 index 0000000..eb4d628 --- /dev/null +++ b/framework/frontend/src/store/modules/app.ts @@ -0,0 +1,97 @@ +import { + getSidebarStatus, + setSidebarStatus, + getSize, + setSize, + setLanguage +} from '@/utils/localStorage'; +import { defineStore } from 'pinia'; +import { getLanguage } from '@/lang/index'; +import { computed, reactive, ref } from 'vue'; +import { useStorage } from '@vueuse/core'; + +// Element Plus 语言包 +import zhCn from 'element-plus/es/locale/lang/zh-cn'; +import en from 'element-plus/es/locale/lang/en'; + +export enum DeviceType { + mobile, + desktop +} + +export enum SizeType { + default, + large, + small +} + +// setup +export const useAppStore = defineStore('app', () => { + // state + const device = useStorage('device', 'desktop'); + const size = ref(getSize() || 'default'); + const language = ref(getLanguage()); + const sidebar = reactive({ + opened: getSidebarStatus() !== 'closed', + withoutAnimation: false + }); + + const locale = computed(() => { + if (language?.value == 'en') { + return en; + } else { + return zhCn; + } + }); + + // actions + function toggleSidebar(withoutAnimation: boolean) { + sidebar.opened = !sidebar.opened; + sidebar.withoutAnimation = withoutAnimation; + if (sidebar.opened) { + setSidebarStatus('opened'); + } else { + setSidebarStatus('closed'); + } + } + + function closeSideBar(withoutAnimation: boolean) { + sidebar.opened = false; + sidebar.withoutAnimation = withoutAnimation; + setSidebarStatus('closed'); + } + + function openSideBar(withoutAnimation: boolean) { + sidebar.opened = true; + sidebar.withoutAnimation = withoutAnimation; + setSidebarStatus('opened'); + } + + function toggleDevice(val: string) { + device.value = val; + } + + function changeSize(val: string) { + size.value = val; + setSize(val); + } + + function changeLanguage(val: string) { + language.value = val; + setLanguage(val); + } + + return { + device, + sidebar, + language, + locale, + size, + toggleDevice, + changeSize, + changeLanguage, + toggleSidebar, + closeSideBar, + openSideBar + }; +}); diff --git a/framework/frontend/src/store/modules/permission.ts b/framework/frontend/src/store/modules/permission.ts new file mode 100644 index 0000000..1e632ea --- /dev/null +++ b/framework/frontend/src/store/modules/permission.ts @@ -0,0 +1,82 @@ +import { RouteRecordRaw } from 'vue-router'; +import { defineStore } from 'pinia'; +import { constantRoutes } from '@/router'; +import { store } from '@/store'; +import { listRoutes } from '@/api/menu'; +import { ref } from 'vue'; + +const modules = import.meta.glob('../../views/**/**.vue'); +export const Layout = () => import('@/layout/index.vue'); + +// const hasPermission = (roles: string[], route: RouteRecordRaw) => { +// if (route.meta && route.meta.roles) { +// if (roles.includes('ROOT')) { +// return true; +// } +// return roles.some(role => { +// if (route.meta?.roles !== undefined) { +// return (route.meta.roles as string[]).includes(role); +// } +// }); +// } +// return false; +// }; + +const filterAsyncRoutes = (routes: RouteRecordRaw[], roles: string[]) => { + const res: RouteRecordRaw[] = []; + routes.forEach(route => { + const tmp = { ...route } as any; + // if (hasPermission(roles, tmp)) { + tmp.path = tmp.opturl; + if (tmp.type == '0') { + tmp.component = Layout; + } else { + const component = modules[`../../views${tmp.opturl}.vue`] as any; + if (component) { + tmp.component = component; + } else { + tmp.component = modules[`../../views/error-page/404.vue`]; + } + } + res.push(tmp) + if (tmp.children) { + tmp.children = filterAsyncRoutes(tmp.children, roles); + } + // } + }); + return res; +}; + +// setup +export const usePermissionStore = defineStore('permission', () => { + // state + const routes = ref([]); + const addRoutes = ref([]); + + // actions + function setRoutes(newRoutes: RouteRecordRaw[]) { + addRoutes.value = newRoutes; + routes.value = constantRoutes.concat(newRoutes); + } + + function generateRoutes(roles: string[]) { + return new Promise((resolve, reject) => { + listRoutes() + .then(response => { + const asyncRoutes :any = response; + const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles); + setRoutes(accessedRoutes); + resolve(accessedRoutes); + }) + .catch(error => { + reject(error); + }); + }); + } + return { routes, setRoutes, generateRoutes }; +}); + +// 非setup +export function usePermissionStoreHook() { + return usePermissionStore(store); +} diff --git a/framework/frontend/src/store/modules/settings.ts b/framework/frontend/src/store/modules/settings.ts new file mode 100644 index 0000000..0b69453 --- /dev/null +++ b/framework/frontend/src/store/modules/settings.ts @@ -0,0 +1,64 @@ +import { defineStore } from 'pinia'; +import defaultSettings from '../../settings'; +import { ref } from 'vue'; +import { useStorage } from '@vueuse/core'; + +/** + * 主题类型 + */ +export enum ThemeType { + light, + dark +} + +/** + * 布局类型 + */ +export enum LayoutType { + left, + top, + mix +} + +export const useSettingsStore = defineStore('setting', () => { + // state + const showSettings = ref(defaultSettings.showSettings); + const tagsView = useStorage('tagsView', defaultSettings.tagsView); + const fixedHeader = ref(defaultSettings.fixedHeader); + const sidebarLogo = ref(defaultSettings.sidebarLogo); + + const layout = useStorage('layout', defaultSettings.layout); + + // actions + function changeSetting(param: { key: string; value: any }) { + const { key, value } = param; + switch (key) { + case 'showSettings': + showSettings.value = value; + break; + case 'fixedHeader': + fixedHeader.value = value; + break; + case 'tagsView': + tagsView.value = value; + break; + case 'sidevarLogo': + sidebarLogo.value = value; + break; + case 'layout': + layout.value = value; + break; + default: + break; + } + } + + return { + showSettings, + tagsView, + fixedHeader, + sidebarLogo, + layout, + changeSetting + }; +}); diff --git a/framework/frontend/src/store/modules/tagsView.ts b/framework/frontend/src/store/modules/tagsView.ts new file mode 100644 index 0000000..f8a69a2 --- /dev/null +++ b/framework/frontend/src/store/modules/tagsView.ts @@ -0,0 +1,214 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import { RouteLocationNormalized } from 'vue-router'; + +export interface TagView extends Partial { + title?: string; +} + +// setup +export const useTagsViewStore = defineStore('tagsView', () => { + // state + const visitedViews = ref([]); + const cachedViews = ref([]); + + // actions + function addVisitedView(view: TagView) { + if (visitedViews.value.some(v => v.path === view.path)) return; + if (view.meta && view.meta.affix) { + visitedViews.value.unshift( + Object.assign({}, view, { + title: view.meta?.title || 'no-name' + }) + ); + } else { + visitedViews.value.push( + Object.assign({}, view, { + title: view.meta?.title || 'no-name' + }) + ); + } + } + + function addCachedView(view: TagView) { + const viewName = view.name as string; + if (cachedViews.value.includes(viewName)) return; + if (view.meta?.keepAlive) { + cachedViews.value.push(viewName); + } + } + + function delVisitedView(view: TagView) { + return new Promise(resolve => { + for (const [i, v] of visitedViews.value.entries()) { + if (v.path === view.path) { + visitedViews.value.splice(i, 1); + break; + } + } + resolve([...visitedViews.value]); + }); + } + + function delCachedView(view: TagView) { + const viewName = view.name as string; + return new Promise(resolve => { + const index = cachedViews.value.indexOf(viewName); + index > -1 && cachedViews.value.splice(index, 1); + resolve([...cachedViews.value]); + }); + } + + function delOtherVisitedViews(view: TagView) { + return new Promise(resolve => { + visitedViews.value = visitedViews.value.filter(v => { + return v.meta?.affix || v.path === view.path; + }); + resolve([...visitedViews.value]); + }); + } + + function delOtherCachedViews(view: TagView) { + const viewName = view.name as string; + return new Promise(resolve => { + const index = cachedViews.value.indexOf(viewName); + if (index > -1) { + cachedViews.value = cachedViews.value.slice(index, index + 1); + } else { + // if index = -1, there is no cached tags + cachedViews.value = []; + } + resolve([...cachedViews.value]); + }); + } + + function updateVisitedView(view: TagView) { + for (let v of visitedViews.value) { + if (v.path === view.path) { + v = Object.assign(v, view); + break; + } + } + } + + function addView(view: TagView) { + addVisitedView(view); + addCachedView(view); + } + + function delView(view: TagView) { + return new Promise(resolve => { + delVisitedView(view); + delCachedView(view); + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value] + }); + }); + } + + function delOtherViews(view: TagView) { + return new Promise(resolve => { + delOtherVisitedViews(view); + delOtherCachedViews(view); + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value] + }); + }); + } + + function delLeftViews(view: TagView) { + return new Promise(resolve => { + const currIndex = visitedViews.value.findIndex(v => v.path === view.path); + if (currIndex === -1) { + return; + } + visitedViews.value = visitedViews.value.filter((item, index) => { + // affix:true 固定tag,例如“首页” + if (index >= currIndex || (item.meta && item.meta.affix)) { + return true; + } + + const cacheIndex = cachedViews.value.indexOf(item.name as string); + if (cacheIndex > -1) { + cachedViews.value.splice(cacheIndex, 1); + } + return false; + }); + resolve({ + visitedViews: [...visitedViews.value] + }); + }); + } + function delRightViews(view: TagView) { + return new Promise(resolve => { + const currIndex = visitedViews.value.findIndex(v => v.path === view.path); + if (currIndex === -1) { + return; + } + visitedViews.value = visitedViews.value.filter((item, index) => { + // affix:true 固定tag,例如“首页” + if (index <= currIndex || (item.meta && item.meta.affix)) { + return true; + } + + const cacheIndex = cachedViews.value.indexOf(item.name as string); + if (cacheIndex > -1) { + cachedViews.value.splice(cacheIndex, 1); + } + return false; + }); + resolve({ + visitedViews: [...visitedViews.value] + }); + }); + } + + function delAllViews() { + return new Promise(resolve => { + const affixTags = visitedViews.value.filter(tag => tag.meta?.affix); + visitedViews.value = affixTags; + cachedViews.value = []; + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value] + }); + }); + } + + function delAllVisitedViews() { + return new Promise(resolve => { + const affixTags = visitedViews.value.filter(tag => tag.meta?.affix); + visitedViews.value = affixTags; + resolve([...visitedViews.value]); + }); + } + + function delAllCachedViews() { + return new Promise(resolve => { + cachedViews.value = []; + resolve([...cachedViews.value]); + }); + } + + return { + visitedViews, + cachedViews, + addVisitedView, + addCachedView, + delVisitedView, + delCachedView, + delOtherVisitedViews, + delOtherCachedViews, + updateVisitedView, + addView, + delView, + delOtherViews, + delLeftViews, + delRightViews, + delAllViews, + delAllVisitedViews, + delAllCachedViews + }; +}); diff --git a/framework/frontend/src/store/modules/user.ts b/framework/frontend/src/store/modules/user.ts new file mode 100644 index 0000000..d825937 --- /dev/null +++ b/framework/frontend/src/store/modules/user.ts @@ -0,0 +1,103 @@ +import { defineStore } from 'pinia'; + +import { getToken, setToken, removeToken } from '@/utils/auth'; +import { loginApi, logoutApi } from '@/api/auth'; +import { getUserInfo } from '@/api/user'; +import { resetRouter } from '@/router'; +import { store } from '@/store'; +import { LoginData } from '@/api/auth/types'; +import { ref } from 'vue'; +import { UserInfo } from '@/api/user/types'; + +export const useUserStore = defineStore('user', () => { + // state + const Token = ref(getToken() || ''); + const nickname = ref(''); + const avatar = ref(''); + const roles = ref>([]); // 用户角色编码集合 → 判断路由权限 + const perms = ref>([]); // 用户权限编码集合 → 判断按钮权限 + const badgeval = ref('') + + // actions + + // 登录 + function login(loginData: LoginData) { + return new Promise((resolve, reject) => { + loginApi(loginData) + .then(response => { + const { token } = response.data; + Token.value = token; + setToken(token); + resolve(); + }) + .catch(error => { + reject(error); + }); + }); + } + + // 获取信息(用户昵称、头像、角色集合、权限集合) + function getInfo() { + return new Promise((resolve, reject) => { + getUserInfo() + .then(({ data }) => { + if (!data) { + return reject('Verification failed, please Login again.'); + } + if (!data.roles || data.roles.length <= 0) { + reject('getUserInfo: roles must be a non-null array!'); + } + nickname.value = data.userInfo.nickname; + avatar.value = data.userInfo.avatar; + roles.value = data.roles; + perms.value = data.permissions; + resolve(data); + }) + .catch(error => { + reject(error); + }); + }); + } + + // 注销 + function logout() { + return new Promise((resolve, reject) => { + logoutApi() + .then(() => { + resetRouter(); + resetToken(); + resolve(); + }) + .catch(error => { + reject(error); + }); + }); + } + + // 重置 + function resetToken() { + removeToken(); + Token.value = ''; + nickname.value = ''; + avatar.value = ''; + roles.value = []; + perms.value = []; + } + return { + Token, + nickname, + avatar, + roles, + perms, + login, + getInfo, + logout, + resetToken, + badgeval + }; +}); + +// 非setup +export function useUserStoreHook() { + return useUserStore(store); +} diff --git a/framework/frontend/src/styles/element-plus.scss b/framework/frontend/src/styles/element-plus.scss new file mode 100644 index 0000000..a54cd78 --- /dev/null +++ b/framework/frontend/src/styles/element-plus.scss @@ -0,0 +1,59 @@ +:root { + // 这里可以设置你自定义的颜色变量 + // 这个是element主要按钮:active的颜色,当主题更改后此变量的值也随之更改 + --el-color-primary-dark: #0d84ff; + // --el-font-size-base: 16px !important; +} +.el-button--large, .el-input--large, .el-table--large, .el-form--large, .el-select__tags-text{ + font-size: 16px !important; + .el-form-item__label{ + font-size: 16px !important; + } + --el-font-size-base: 16px !important; +} + + +// 覆盖 element-plus 的样式 +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type='file'] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + +// dropdown +.el-dropdown-menu { + a { + display: block; + } +} + +// to fix el-date-picker css style +.el-range-separator { + box-sizing: content-box; +} + +// 选中行背景色值 +.el-table__body tr.current-row td { + background-color: #e1f3d8b5 !important; +} + +// card 的header统一高度 +.el-card__header { + height: 60px !important; +} + +// 表格表头和表体未对齐 +.el-table__header col[name='gutter'] { + display: table-cell !important; +} + + diff --git a/framework/frontend/src/styles/index.scss b/framework/frontend/src/styles/index.scss new file mode 100644 index 0000000..e0fa2bc --- /dev/null +++ b/framework/frontend/src/styles/index.scss @@ -0,0 +1,39 @@ +@import 'src/styles/variables.module'; +@import 'src/styles/element-plus'; +@import './sidebar.scss'; +@import './tailwind.scss'; + +html,body,#app{ + height: 100%; +} + +// main-container global css +.app-container { + padding: 20px; +} + +.search{ + padding: 18px 0 0 10px; + margin-bottom: 10px; + border-radius: 5px; + border: 1px solid #ddd; + box-shadow: 6px 2px 6px #CCC; +} + +svg{ + display: inline-block; +} +.el-dialog { + display: flex !important; + flex-direction: column !important; + margin: auto !important; + position: absolute !important; + top: 0 ; + left: 0 ; + right: 0; + bottom: 0; + height: max-content; +} +.el-dialog__body { + padding: 20px !important; +} \ No newline at end of file diff --git a/framework/frontend/src/styles/mixin.scss b/framework/frontend/src/styles/mixin.scss new file mode 100644 index 0000000..3ca7168 --- /dev/null +++ b/framework/frontend/src/styles/mixin.scss @@ -0,0 +1,28 @@ +@mixin clearfix { + &:after { + content: ''; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} diff --git a/framework/frontend/src/styles/sidebar.scss b/framework/frontend/src/styles/sidebar.scss new file mode 100644 index 0000000..d0c50ae --- /dev/null +++ b/framework/frontend/src/styles/sidebar.scss @@ -0,0 +1,253 @@ +svg { + vertical-align: text-bottom !important; +} +#app { + .main-container { + // min-height: 100%; + transition: margin-left 0.28s; + margin-left: $sideBarWidth; + position: relative; + } + + .sidebar-container { + transition: width 0.28s; + width: $sideBarWidth !important; + background-color: $menuBg; + height: calc(100vh - 60px); + padding-top: 15px; + position: absolute; + top: 60px; + bottom: 0; + left: 0; + z-index: 98; + overflow: hidden; + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, + 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + + .svg-icon { + margin-right: 16px; + } + + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-sub-menu__title { + &:hover { + color: $menuHover !important; + } + } + + // .is-active > .el-sub-menu__title { + // color: $subMenuActiveText !important; + // } + + & .nest-menu .el-sub-menu > .el-sub-menu__title, + & .el-sub-menu .el-menu-item { + min-width: $sideBarWidth !important; + background-color: $subMenuBg !important; + + &:hover { + color: $subMenuHover !important; + } + } + .el-menu-item.is-active { + border-right: 3px solid $subMenuHover; + background: #e8f3ff !important; + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + .svg-icon { + margin-right: 0px; + } + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + } + } + + .el-sub-menu { + overflow: hidden; + + & > .el-sub-menu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + + .el-sub-menu__icon-arrow { + display: none; + } + } + + } + + .el-menu--collapse { + .el-sub-menu { + & > .el-sub-menu__title { + & > span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-sub-menu { + min-width: $sideBarWidth !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform 0.28s; + width: $sideBarWidth !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$sideBarWidth, 0, 0); + } + } + } + + .withoutAnimation { + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + & > .el-menu { + .svg-icon { + margin-right: 16px; + } + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + } + + .nest-menu .el-sub-menu > .el-sub-menu__title, + .el-menu-item { + &:hover { + background-color: #ffffff; + // you can use $subMenuHover + color: $menuHover !important; + } + } + + // the scroll bar appears when the subMenu is too long + > .el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} +body[layout="mix"] { + + .horizontal-header{ + .el-menu-item{ + height: 50px!important; + line-height: 50px!important; + } + + .el-sub-menu__title { + background-color: #001529!important; + height: 50px!important; + } + } + .horizontal-header-right>div { + color: #FFF; + } + .svg-icon{ + margin-right: 16px; + } + +} diff --git a/framework/frontend/src/styles/tailwind.scss b/framework/frontend/src/styles/tailwind.scss new file mode 100644 index 0000000..9bb37ee --- /dev/null +++ b/framework/frontend/src/styles/tailwind.scss @@ -0,0 +1,4 @@ + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/framework/frontend/src/styles/variables.module.css b/framework/frontend/src/styles/variables.module.css new file mode 100644 index 0000000..518a1f9 --- /dev/null +++ b/framework/frontend/src/styles/variables.module.css @@ -0,0 +1,11 @@ +:export { + menuText: #409eff; + menuActiveText: #409eff; + subMenuActiveText: #409eff; + menuBg: #ffffff; + menuHover: #409eff; + subMenuBg: #ffffff; + subMenuHover: #409eff; + sideBarWidth: 210px; +} +/*# sourceMappingURL=variables.module.css.map */ \ No newline at end of file diff --git a/framework/frontend/src/styles/variables.module.css.map b/framework/frontend/src/styles/variables.module.css.map new file mode 100644 index 0000000..b95fb87 --- /dev/null +++ b/framework/frontend/src/styles/variables.module.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "AAeA,AAAA,OAAO,CAAC;EACN,QAAQ,EAfC,OAAO;EAgBhB,cAAc,EAfC,OAAO;EAgBtB,iBAAiB,EAfC,OAAO;EAgBzB,MAAM,EAdC,OAAO;EAed,SAAS,EAdC,OAAO;EAejB,SAAS,EAbC,OAAO;EAcjB,YAAY,EAbC,OAAO;EAcpB,YAAY,EAZC,KAAK;CAanB", + "sources": [ + "variables.module.scss" + ], + "names": [], + "file": "variables.module.css" +} \ No newline at end of file diff --git a/framework/frontend/src/styles/variables.module.scss b/framework/frontend/src/styles/variables.module.scss new file mode 100644 index 0000000..0376220 --- /dev/null +++ b/framework/frontend/src/styles/variables.module.scss @@ -0,0 +1,25 @@ +// sidebar +$menuText: #505050; +$menuActiveText: #409eff; +$subMenuActiveText: #409eff; + +$menuBg: #ffffff; +$menuHover: #409eff; + +$subMenuBg: #ffffff; +$subMenuHover: #409eff; + +$sideBarWidth: 210px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuText: $menuText; + menuActiveText: $menuActiveText; + subMenuActiveText: $subMenuActiveText; + menuBg: $menuBg; + menuHover: $menuHover; + subMenuBg: $subMenuBg; + subMenuHover: $subMenuHover; + sideBarWidth: $sideBarWidth; +} diff --git a/framework/frontend/src/utils/auth.ts b/framework/frontend/src/utils/auth.ts new file mode 100644 index 0000000..c6adc52 --- /dev/null +++ b/framework/frontend/src/utils/auth.ts @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie'; + +const TokenKey = 'token'; + +export function getToken() { + return Cookies.get(TokenKey); +} + +export function setToken(token: any) { + Cookies.set(TokenKey, token); +} + +export function removeToken() { + return Cookies.remove(TokenKey); +} diff --git a/framework/frontend/src/utils/filter.ts b/framework/frontend/src/utils/filter.ts new file mode 100644 index 0000000..38c28bc --- /dev/null +++ b/framework/frontend/src/utils/filter.ts @@ -0,0 +1,80 @@ +/** + * Show plural label if time is plural number + * @param {number} time + * @param {string} label + * @return {string} + */ +function pluralize(time: number, label: string) { + if (time === 1) { + return time + label; + } + return time + label + 's'; +} + +/** + * @param {number} time + */ +export function timeAgo(time: number) { + const between = Date.now() / 1000 - Number(time); + if (between < 3600) { + return pluralize(~~(between / 60), ' minute'); + } else if (between < 86400) { + return pluralize(~~(between / 3600), ' hour'); + } else { + return pluralize(~~(between / 86400), ' day'); + } +} + +/** + * Number formatting + * like 10000 => 10k + * @param {number} num + * @param {number} digits + */ +export function numberFormatter(num: number, digits: number) { + const si = [ + { value: 1e18, symbol: 'E' }, + { value: 1e15, symbol: 'P' }, + { value: 1e12, symbol: 'T' }, + { value: 1e9, symbol: 'G' }, + { value: 1e6, symbol: 'M' }, + { value: 1e3, symbol: 'k' } + ]; + for (let i = 0; i < si.length; i++) { + if (num >= si[i].value) { + return ( + (num / si[i].value) + .toFixed(digits) + .replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol + ); + } + } + return num.toString(); +} + +/** + * 10000 => "10,000" + * @param {number} num + */ +export function toThousandFilter(num: number) { + return (+num || 0) + .toString() + .replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ',')); +} + +/** + * Upper case first char + * @param {String} string + */ +export function uppercaseFirst(string: string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + +/** + * 金额转换(分->元) + * 100 => 1 + * @param {number} num + */ +export function moneyFormatter(num: number) { + return '¥' + (isNaN(num) ? 0.0 : parseFloat((num / 100).toFixed(2))); +} diff --git a/framework/frontend/src/utils/i18n.ts b/framework/frontend/src/utils/i18n.ts new file mode 100644 index 0000000..b95552a --- /dev/null +++ b/framework/frontend/src/utils/i18n.ts @@ -0,0 +1,12 @@ +// translate router.meta.title, be used in breadcrumb sidebar tagsview +import i18n from '@/lang/index'; + +export function generateTitle(title: any) { + // 判断是否存在国际化配置,如果没有原生返回 + const hasKey = i18n.global.te('route.' + title); + if (hasKey) { + const translatedTitle = i18n.global.t('route.' + title); + return translatedTitle; + } + return title; +} diff --git a/framework/frontend/src/utils/index.ts b/framework/frontend/src/utils/index.ts new file mode 100644 index 0000000..cbf844d --- /dev/null +++ b/framework/frontend/src/utils/index.ts @@ -0,0 +1,97 @@ +/** + * Check if an element has a class + * @param {HTMLElement} elm + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele: HTMLElement, cls: string) { + return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); +} + +/** + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function addClass(ele: HTMLElement, cls: string) { + if (!hasClass(ele, cls)) ele.className += ' ' + cls; +} + +/** + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function removeClass(ele: HTMLElement, cls: string) { + if (hasClass(ele, cls)) { + const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); + ele.className = ele.className.replace(reg, ' '); + } +} + +export function mix(color1: string, color2: string, weight: number) { + weight = Math.max(Math.min(Number(weight), 1), 0); + const r1 = parseInt(color1.substring(1, 3), 16); + const g1 = parseInt(color1.substring(3, 5), 16); + const b1 = parseInt(color1.substring(5, 7), 16); + const r2 = parseInt(color2.substring(1, 3), 16); + const g2 = parseInt(color2.substring(3, 5), 16); + const b2 = parseInt(color2.substring(5, 7), 16); + const r = Math.round(r1 * (1 - weight) + r2 * weight); + const g = Math.round(g1 * (1 - weight) + g2 * weight); + const b = Math.round(b1 * (1 - weight) + b2 * weight); + const rStr = ('0' + (r || 0).toString(16)).slice(-2); + const gStr = ('0' + (g || 0).toString(16)).slice(-2); + const bStr = ('0' + (b || 0).toString(16)).slice(-2); + return '#' + rStr + gStr + bStr; +} + +export function parseTime(time :any, cFormat :any) { + if (arguments.length === 0) { + return null + } + const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'undefined' || time === null || time === 'null') { + return '' + } else if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result :any, key :any) => { + let value : any = formatObj[key] + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} +export function downloadFile(obj :any, name :any, suffix :any) { + const url = window.URL.createObjectURL(new Blob([obj])) + const link = document.createElement('a') + link.style.display = 'none' + link.href = url + const fileName = parseTime(new Date(),'') + '-' + name + '.' + suffix + link.setAttribute('download', fileName) + document.body.appendChild(link) + link.click() + document.body.removeChild(link) +} \ No newline at end of file diff --git a/framework/frontend/src/utils/localStorage.ts b/framework/frontend/src/utils/localStorage.ts new file mode 100644 index 0000000..d5628e5 --- /dev/null +++ b/framework/frontend/src/utils/localStorage.ts @@ -0,0 +1,53 @@ +/** + * window.localStorage 浏览器永久缓存 + */ +export const localStorage = { + // 设置永久缓存 + set(key: string, val: any) { + window.localStorage.setItem(key, JSON.stringify(val)); + }, + // 获取永久缓存 + get(key: string) { + const json: any = window.localStorage.getItem(key); + return JSON.parse(json); + }, + // 移除永久缓存 + remove(key: string) { + window.localStorage.removeItem(key); + }, + // 移除全部永久缓存 + clear() { + window.localStorage.clear(); + } +}; + +// 侧边栏状态(显示/隐藏) +const SidebarStatusKey = 'sidebarStatus'; +export function getSidebarStatus() { + return localStorage.get(SidebarStatusKey); +} + +export function setSidebarStatus(sidebarStatus: string) { + localStorage.set(SidebarStatusKey, sidebarStatus); +} +// 布局大小 +const SizeKey = 'size'; + +export function getSize() { + return localStorage.get(SizeKey); +} + +export function setSize(size: string) { + localStorage.set(SizeKey, size); +} + +// 语言 +const LanguageKey = 'language'; + +export function getLanguage() { + return localStorage.get(LanguageKey); +} + +export function setLanguage(language: string) { + localStorage.set(LanguageKey, language); +} diff --git a/framework/frontend/src/utils/request.ts b/framework/frontend/src/utils/request.ts new file mode 100644 index 0000000..abe108e --- /dev/null +++ b/framework/frontend/src/utils/request.ts @@ -0,0 +1,87 @@ +import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; +import { ElMessage, ElMessageBox } from 'element-plus'; +import { getToken } from '@/utils/auth'; +import { useUserStoreHook } from '@/store/modules/user'; + +// 创建 axios 实例 +const service = axios.create({ + baseURL: import.meta.env.VITE_APP_BASE_API, + timeout: 50000, + headers: { 'Content-Type': 'application/json;charset=utf-8' } +}); + +// 请求拦截器 +service.interceptors.request.use( + (config: AxiosRequestConfig) => { + if (!config.headers) { + throw new Error( + `Expected 'config' and 'config.headers' not to be undefined` + ); + } + const user = useUserStoreHook(); + if (user.Token) { + config.headers.token = getToken(); + } + return config; + }, + (error: any) => { + return Promise.reject(error); + } +); + +// 响应拦截器 +service.interceptors.response.use( + (response: AxiosResponse) => { + const { status, msg } = response; + if (status === 200) { + if (response.data.code == 401) { + ElMessage({ + message: '用户名或密码错误,请重试!', + type: 'error' + }); + return; + }else if(response.data.code == 1){ + ElMessage({ + message: response.data.msg, + type: 'error' + }); + return; + } + return response.data; + } else { + // 响应数据为二进制流处理(Excel导出) + if (response.data instanceof ArrayBuffer) { + return response; + } + ElMessage({ + message: msg || '系统出错', + type: 'error' + }); + return Promise.reject(new Error(msg || 'Error')); + } + }, + (error: any) => { + if (error.response.data) { + const { status, msg } = error.response.data; + // token 过期,重新登录 + if (status === '403') { + ElMessageBox.confirm('当前页面已失效,请重新登录', '提示', { + confirmButtonText: 'OK', + type: 'warning' + }).then(() => { + localStorage.clear(); + window.location.href = '/'; + }); + } else { + ElMessage({ + message: msg || '当前页面已失效', + type: 'error' + }); + } + } + return Promise.reject(error.message); + } +); + +// 导出 axios 实例 +export default service; diff --git a/framework/frontend/src/utils/resize.ts b/framework/frontend/src/utils/resize.ts new file mode 100644 index 0000000..343bb0f --- /dev/null +++ b/framework/frontend/src/utils/resize.ts @@ -0,0 +1,73 @@ +import { ref } from 'vue'; +export default function () { + const chart = ref(); + const sidebarElm = ref(); + + const chartResizeHandler = () => { + if (chart.value) { + chart.value.resize(); + } + }; + + const sidebarResizeHandler = (e: TransitionEvent) => { + if (e.propertyName === 'width') { + chartResizeHandler(); + } + }; + + const initResizeEvent = () => { + window.addEventListener('resize', chartResizeHandler, {passive:true}); + }; + + const destroyResizeEvent = () => { + window.removeEventListener('resize', chartResizeHandler); + }; + + const initSidebarResizeEvent = () => { + sidebarElm.value = document.getElementsByClassName('sidebar-container')[0]; + if (sidebarElm.value) { + sidebarElm.value.addEventListener( + 'transitionend', + sidebarResizeHandler as EventListener, + {passive:true} + ); + } + }; + + const destroySidebarResizeEvent = () => { + if (sidebarElm.value) { + sidebarElm.value.removeEventListener( + 'transitionend', + sidebarResizeHandler as EventListener + ); + } + }; + + const mounted = () => { + initResizeEvent(); + initSidebarResizeEvent(); + }; + + const beforeDestroy = () => { + destroyResizeEvent(); + destroySidebarResizeEvent(); + }; + + const activated = () => { + initResizeEvent(); + initSidebarResizeEvent(); + }; + + const deactivated = () => { + destroyResizeEvent(); + destroySidebarResizeEvent(); + }; + + return { + chart, + mounted, + beforeDestroy, + activated, + deactivated + }; +} diff --git a/framework/frontend/src/utils/rsaEncrypt.ts b/framework/frontend/src/utils/rsaEncrypt.ts new file mode 100644 index 0000000..7bbc829 --- /dev/null +++ b/framework/frontend/src/utils/rsaEncrypt.ts @@ -0,0 +1,29 @@ +import JSEncrypt from 'jsencrypt' +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' + + '2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ==' + +const privateKey = 'MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8\n' + + 'mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9p\n' + + 'B6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue\n' + + '/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZ\n' + + 'UBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6\n' + + 'vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha\n' + + '4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3\n' + + 'tTbklZkD2A==' + +// 加密 +export function encrypt(txt:string) { + const encryptor = new JSEncrypt() + encryptor.setPublicKey(publicKey) // 设置公钥 + return encryptor.encrypt(txt) // 对需要加密的数据进行加密 +} + +// 解密 +export function decrypt(txt:string) { + const encryptor = new JSEncrypt() + encryptor.setPrivateKey(privateKey) + return encryptor.decrypt(txt) +} + diff --git a/framework/frontend/src/utils/scroll-to.ts b/framework/frontend/src/utils/scroll-to.ts new file mode 100644 index 0000000..591e3ec --- /dev/null +++ b/framework/frontend/src/utils/scroll-to.ts @@ -0,0 +1,69 @@ +const easeInOutQuad = (t: number, b: number, c: number, d: number) => { + t /= d / 2; + if (t < 1) { + return (c / 2) * t * t + b; + } + t--; + return (-c / 2) * (t * (t - 2) - 1) + b; +}; + +// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts +const requestAnimFrame = (function () { + return ( + window.requestAnimationFrame || + (window as any).webkitRequestAnimationFrame || + (window as any).mozRequestAnimationFrame || + function (callback) { + window.setTimeout(callback, 1000 / 60); + } + ); +})(); + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ +const move = (amount: number) => { + document.documentElement.scrollTop = amount; + (document.body.parentNode as HTMLElement).scrollTop = amount; + document.body.scrollTop = amount; +}; + +const position = () => { + return ( + document.documentElement.scrollTop || + (document.body.parentNode as HTMLElement).scrollTop || + document.body.scrollTop + ); +}; + +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ +export const scrollTo = (to: number, duration: number, callback?: any) => { + const start = position(); + const change = to - start; + const increment = 20; + let currentTime = 0; + duration = typeof duration === 'undefined' ? 500 : duration; + const animateScroll = function () { + // increment the time + currentTime += increment; + // find the value with the quadratic in-out easing function + const val = easeInOutQuad(currentTime, start, change, duration); + // move the document.body + move(val); + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll); + } else { + if (callback && typeof callback === 'function') { + // the animation is done so lets callback + callback(); + } + } + }; + animateScroll(); +}; diff --git a/framework/frontend/src/utils/sessionStorage.ts b/framework/frontend/src/utils/sessionStorage.ts new file mode 100644 index 0000000..fae9a21 --- /dev/null +++ b/framework/frontend/src/utils/sessionStorage.ts @@ -0,0 +1,22 @@ +/** + * window.sessionStorage 浏览器临时缓存 + */ +export const sessionStorage = { + // 设置临时缓存 + set(key: string, val: any) { + window.sessionStorage.setItem(key, JSON.stringify(val)); + }, + // 获取临时缓存 + get(key: string) { + const json: any = window.sessionStorage.getItem(key); + return JSON.parse(json); + }, + // 移除临时缓存 + remove(key: string) { + window.sessionStorage.removeItem(key); + }, + // 移除全部临时缓存 + clear() { + window.sessionStorage.clear(); + } +}; diff --git a/framework/frontend/src/utils/validate.ts b/framework/frontend/src/utils/validate.ts new file mode 100644 index 0000000..bc8ccee --- /dev/null +++ b/framework/frontend/src/utils/validate.ts @@ -0,0 +1,12 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path: string) { + const isExternal = /^(https?:|http?:|mailto:|tel:)/.test(path); + return isExternal; +} diff --git a/framework/frontend/src/views/TaskSetting/index.vue b/framework/frontend/src/views/TaskSetting/index.vue new file mode 100644 index 0000000..e295a48 --- /dev/null +++ b/framework/frontend/src/views/TaskSetting/index.vue @@ -0,0 +1,1288 @@ + + + + + + \ No newline at end of file diff --git a/framework/frontend/src/views/component/editor.vue b/framework/frontend/src/views/component/editor.vue new file mode 100644 index 0000000..b0f9a87 --- /dev/null +++ b/framework/frontend/src/views/component/editor.vue @@ -0,0 +1,22 @@ + + diff --git a/framework/frontend/src/views/component/uploader.vue b/framework/frontend/src/views/component/uploader.vue new file mode 100644 index 0000000..8a4ab8b --- /dev/null +++ b/framework/frontend/src/views/component/uploader.vue @@ -0,0 +1,33 @@ + + diff --git a/framework/frontend/src/views/dashboard/components/Chart/BarChart.vue b/framework/frontend/src/views/dashboard/components/Chart/BarChart.vue new file mode 100644 index 0000000..05be0c4 --- /dev/null +++ b/framework/frontend/src/views/dashboard/components/Chart/BarChart.vue @@ -0,0 +1,174 @@ + + + + diff --git a/framework/frontend/src/views/dashboard/components/Chart/FunnelChart.vue b/framework/frontend/src/views/dashboard/components/Chart/FunnelChart.vue new file mode 100644 index 0000000..44206d2 --- /dev/null +++ b/framework/frontend/src/views/dashboard/components/Chart/FunnelChart.vue @@ -0,0 +1,131 @@ + + + + + + diff --git a/framework/frontend/src/views/dashboard/components/Chart/PieChart.vue b/framework/frontend/src/views/dashboard/components/Chart/PieChart.vue new file mode 100644 index 0000000..2ad159f --- /dev/null +++ b/framework/frontend/src/views/dashboard/components/Chart/PieChart.vue @@ -0,0 +1,113 @@ + + + + + + diff --git a/framework/frontend/src/views/dashboard/components/Chart/RadarChart.vue b/framework/frontend/src/views/dashboard/components/Chart/RadarChart.vue new file mode 100644 index 0000000..998d62c --- /dev/null +++ b/framework/frontend/src/views/dashboard/components/Chart/RadarChart.vue @@ -0,0 +1,132 @@ + + + + + + diff --git a/framework/frontend/src/views/dashboard/components/Project/index.vue b/framework/frontend/src/views/dashboard/components/Project/index.vue new file mode 100644 index 0000000..63e471f --- /dev/null +++ b/framework/frontend/src/views/dashboard/components/Project/index.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/framework/frontend/src/views/dashboard/components/Team/index.vue b/framework/frontend/src/views/dashboard/components/Team/index.vue new file mode 100644 index 0000000..8b0cf8d --- /dev/null +++ b/framework/frontend/src/views/dashboard/components/Team/index.vue @@ -0,0 +1,240 @@ + + + + + + diff --git a/framework/frontend/src/views/dashboard/index.vue b/framework/frontend/src/views/dashboard/index.vue new file mode 100644 index 0000000..d0f23a2 --- /dev/null +++ b/framework/frontend/src/views/dashboard/index.vue @@ -0,0 +1,19 @@ + + + + + + + diff --git a/framework/frontend/src/views/error-page/401.vue b/framework/frontend/src/views/error-page/401.vue new file mode 100644 index 0000000..59b6f1a --- /dev/null +++ b/framework/frontend/src/views/error-page/401.vue @@ -0,0 +1,114 @@ + + + + + + + + diff --git a/framework/frontend/src/views/error-page/404.vue b/framework/frontend/src/views/error-page/404.vue new file mode 100644 index 0000000..8559404 --- /dev/null +++ b/framework/frontend/src/views/error-page/404.vue @@ -0,0 +1,280 @@ + + + + + + + + diff --git a/framework/frontend/src/views/login/index.vue b/framework/frontend/src/views/login/index.vue new file mode 100644 index 0000000..e49fb8b --- /dev/null +++ b/framework/frontend/src/views/login/index.vue @@ -0,0 +1,513 @@ + + + + + + + diff --git a/framework/frontend/src/views/nested/level1/index.vue b/framework/frontend/src/views/nested/level1/index.vue new file mode 100644 index 0000000..7daf19c --- /dev/null +++ b/framework/frontend/src/views/nested/level1/index.vue @@ -0,0 +1,7 @@ + diff --git a/framework/frontend/src/views/nested/level1/level2/index.vue b/framework/frontend/src/views/nested/level1/level2/index.vue new file mode 100644 index 0000000..abcc3a7 --- /dev/null +++ b/framework/frontend/src/views/nested/level1/level2/index.vue @@ -0,0 +1,7 @@ + diff --git a/framework/frontend/src/views/nested/level1/level2/level3/index1.vue b/framework/frontend/src/views/nested/level1/level2/level3/index1.vue new file mode 100644 index 0000000..888f58e --- /dev/null +++ b/framework/frontend/src/views/nested/level1/level2/level3/index1.vue @@ -0,0 +1,5 @@ + diff --git a/framework/frontend/src/views/nested/level1/level2/level3/index2.vue b/framework/frontend/src/views/nested/level1/level2/level3/index2.vue new file mode 100644 index 0000000..a99c98e --- /dev/null +++ b/framework/frontend/src/views/nested/level1/level2/level3/index2.vue @@ -0,0 +1,5 @@ + diff --git a/framework/frontend/src/views/redirect/index.vue b/framework/frontend/src/views/redirect/index.vue new file mode 100644 index 0000000..47cad96 --- /dev/null +++ b/framework/frontend/src/views/redirect/index.vue @@ -0,0 +1,15 @@ + + + diff --git a/framework/frontend/src/views/system/dept/index.vue b/framework/frontend/src/views/system/dept/index.vue new file mode 100644 index 0000000..a10061b --- /dev/null +++ b/framework/frontend/src/views/system/dept/index.vue @@ -0,0 +1,638 @@ + + + + + + + diff --git a/framework/frontend/src/views/system/dict/index.vue b/framework/frontend/src/views/system/dict/index.vue new file mode 100644 index 0000000..bf14f6a --- /dev/null +++ b/framework/frontend/src/views/system/dict/index.vue @@ -0,0 +1,708 @@ + + + + + \ No newline at end of file diff --git a/framework/frontend/src/views/system/menu/index.vue b/framework/frontend/src/views/system/menu/index.vue new file mode 100644 index 0000000..f9877ee --- /dev/null +++ b/framework/frontend/src/views/system/menu/index.vue @@ -0,0 +1,832 @@ + + + \ No newline at end of file diff --git a/framework/frontend/src/views/system/record/index.vue b/framework/frontend/src/views/system/record/index.vue new file mode 100644 index 0000000..eb25244 --- /dev/null +++ b/framework/frontend/src/views/system/record/index.vue @@ -0,0 +1,207 @@ + + + + + + + diff --git a/framework/frontend/src/views/system/role/index.vue b/framework/frontend/src/views/system/role/index.vue new file mode 100644 index 0000000..2d458c7 --- /dev/null +++ b/framework/frontend/src/views/system/role/index.vue @@ -0,0 +1,510 @@ + + + + + + + diff --git a/framework/frontend/src/views/system/user/index.vue b/framework/frontend/src/views/system/user/index.vue new file mode 100644 index 0000000..979b4bc --- /dev/null +++ b/framework/frontend/src/views/system/user/index.vue @@ -0,0 +1,559 @@ + + + + + + + + + diff --git a/framework/frontend/src/views/system/user/personalCenter.vue b/framework/frontend/src/views/system/user/personalCenter.vue new file mode 100644 index 0000000..1184351 --- /dev/null +++ b/framework/frontend/src/views/system/user/personalCenter.vue @@ -0,0 +1,289 @@ + + + + + + + diff --git a/framework/frontend/tailwind.config.js b/framework/frontend/tailwind.config.js new file mode 100644 index 0000000..5b86b53 --- /dev/null +++ b/framework/frontend/tailwind.config.js @@ -0,0 +1,15 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + darkMode: 'class', + theme: { + + backgroundColor: theme => ({ + ...theme('colors'), + "sidebar-logo":'#2b2f3a' + }) + }, + plugins: [], + + +} diff --git a/framework/frontend/tsconfig.json b/framework/frontend/tsconfig.json new file mode 100644 index 0000000..4f8945a --- /dev/null +++ b/framework/frontend/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "jsx": "preserve", + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["esnext", "dom"], + "baseUrl": ".", + "allowJs": true, + "paths": { + "@/*": ["src/*"] + }, + "skipLibCheck": true /* Skip type checking all .d.ts files. */, + "allowSyntheticDefaultImports": true /* 允许默认导入 */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "types": ["element-plus/global"], + "typeRoots": [ + "./node_modules/@types/", + "./types" + ] /* 指定多个文件夹,这些文件夹的作用类似于 './node_modules/@types'. */ + }, + "include": ["src/**/*.ts", "src/**/*.vue", "types/**/*.d.ts"], + "exclude": ["node_modules", "dist", "**/*.js"] +} diff --git a/framework/frontend/types/components.d.ts b/framework/frontend/types/components.d.ts new file mode 100644 index 0000000..94e8b82 --- /dev/null +++ b/framework/frontend/types/components.d.ts @@ -0,0 +1,9 @@ +// 全局组件类型声明 +import Pagination from '@/components/Pagination/index.vue'; + +declare module '@vue/runtime-core' { + export interface GlobalComponents { + Pagination: typeof Pagination; + } +} +export {}; diff --git a/framework/frontend/types/env.d.ts b/framework/frontend/types/env.d.ts new file mode 100644 index 0000000..bcddf3e --- /dev/null +++ b/framework/frontend/types/env.d.ts @@ -0,0 +1,19 @@ +/// + +declare module '*.vue' { + import { DefineComponent } from 'vue'; + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any>; + export default component; +} + +// 环境变量 TypeScript的智能提示 +interface ImportMetaEnv { + VITE_APP_TITLE: string; + VITE_APP_PORT: string; + VITE_APP_BASE_API: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/framework/frontend/types/global.d.ts b/framework/frontend/types/global.d.ts new file mode 100644 index 0000000..63d85cc --- /dev/null +++ b/framework/frontend/types/global.d.ts @@ -0,0 +1,23 @@ +declare global { + interface PageQuery { + pageNum: number; + pageSize: number; + } + + interface PageResult { + list: T; + total: number; + } + type DialogType = { + title?: string; + visible: boolean; + }; + + type OptionType = { + value: string; + label: string; + checked?: boolean; + children?: OptionType[]; + }; +} +export {}; diff --git a/framework/frontend/vite.config.ts b/framework/frontend/vite.config.ts new file mode 100644 index 0000000..7b198e2 --- /dev/null +++ b/framework/frontend/vite.config.ts @@ -0,0 +1,44 @@ +import { UserConfig, ConfigEnv, loadEnv } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; +import path from 'path'; + +export default ({ mode }: ConfigEnv): UserConfig => { + // 获取 .env 环境配置文件 + const env = loadEnv(mode, process.cwd()); + + return { + plugins: [ + vue(), + createSvgIconsPlugin({ + // 指定需要缓存的图标文件夹 + iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], + // 指定symbolId格式 + symbolId: 'icon-[dir]-[name]' + }) + ], + // 本地反向代理解决浏览器跨域限制 + server: { + host: '0.0.0.0', + port: Number(env.VITE_APP_PORT), + open: true, // 运行自动打开浏览器 + proxy: { + [env.VITE_APP_BASE_API]: { + // 线上API地址 + //target: 'http://192.168.1.20:8090/', + // 本地API地址 + target: 'http://localhost:8093', + changeOrigin: true, + rewrite: path => + path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '') + } + } + }, + resolve: { + // Vite路径别名配置 + alias: { + '@': path.resolve('./src') + } + } + }; +}; diff --git a/framework/pom.xml b/framework/pom.xml new file mode 100644 index 0000000..2d2a70f --- /dev/null +++ b/framework/pom.xml @@ -0,0 +1,464 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.0 + + + com.yfd + platform + 1.0 + war + platform + springboot 项目基础框架3.0 + + 17 + UTF-8 + 2023.0.1.0 + 2023.0.1 + 3.3.0 + 17 + 17 + 17 + 3.5.16 + 3.5.6 + + 30.0-jre + 3.0.3 + 1.2.20 + 1.2.20 + 3.32.3.2 + 5.8.8 + 4.1.2 + 4.1.2 + 1.2.70 + 2.5.0 + 2.3.28 + 1.11.3 + 1.16 + 1.7.2 + 1.6.2 + 1.21 + + + + + + + + org.mybatis + mybatis + ${mybatis.version} + + + org.mybatis + mybatis-spring + 3.0.3 + + + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.springframework.boot + spring-boot-starter-websocket + + + + + org.springframework.boot + spring-boot-starter-cache + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + com.google.guava + guava + ${guava.version} + + + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + + org.springframework.boot + spring-boot-starter-quartz + + + + + + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis.spring.boot.starter.version} + + + + + org.mybatis + mybatis + ${mybatis.version} + + + + + com.alibaba + druid + ${druid.version} + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + + com.alibaba + druid-spring-boot-starter + ${druid.starter.version} + + + + + com.mysql + mysql-connector-j + runtime + + + + + org.xerial + sqlite-jdbc + ${sqlite-jdbc.version} + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus.version} + + + + + org.apache.commons + commons-lang3 + + + + + org.projectlombok + lombok + true + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + cn.hutool + hutool-all + ${hutool.version} + + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.ooxml.version} + + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.version} + + + + io.micrometer + micrometer-registry-prometheus + + + + org.freemarker + freemarker + ${freemarker.version} + compile + + + org.jsoup + jsoup + ${jsoup.version} + + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + ${jasypt.version} + + + + org.lionsoul + ip2region + ${ip2region.version} + + + + + com.github.whvcse + easy-captcha + ${easy.captcha.version} + + + + + eu.bitwalker + UserAgentUtils + ${useragentutils.version} + + + + org.openjdk.nashorn + nashorn-core + 15.4 + + + + + + + src/main/resources + + **/*.* + + false + + + src/main/java + + **/*.* + + + **/*.java + + false + + + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + frontend-install + generate-resources + + exec + + + npm + ${project.basedir}/frontend + + install + + + + + frontend-build + generate-resources + + exec + + + npm + ${project.basedir}/frontend + + run + build:mvn + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.3.1 + + + copy-frontend + process-resources + + copy-resources + + + ${project.basedir}/src/main/resources/static + + + ${project.basedir}/frontend/dist + false + + + + + + + + org.asciidoctor + asciidoctor-maven-plugin + 1.5.8 + + + generate-docs + prepare-package + + process-asciidoc + + + html + book + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + -Dfile.encoding=UTF-8 + + true + + + org.projectlombok + lombok + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.4.1 + + + enforce-rules + + enforce + + + + + + [3.6.3,) + + + [17,) + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + attach-jar + + jar + + + + + + + + diff --git a/framework/src/main/java/com/yfd/platform/PlatformApplication.java b/framework/src/main/java/com/yfd/platform/PlatformApplication.java new file mode 100644 index 0000000..a98fea6 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/PlatformApplication.java @@ -0,0 +1,45 @@ +package com.yfd.platform; + +import com.yfd.platform.annotation.rest.AnonymousGetMapping; +import com.yfd.platform.datasource.DynamicDataSourceConfig; +import com.yfd.platform.utils.SpringContextHolder; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.bind.annotation.RestController; + +//@SpringBootApplication +@RestController +@EnableTransactionManagement +@ServletComponentScan("com.yfd.platform.config") +@MapperScan(basePackages = "com.yfd.platform.modules.*.mapper,com.yfd.platform.*.mapper") +@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}) +@Import({DynamicDataSourceConfig.class}) +@EnableCaching +public class PlatformApplication { + + public static void main(String[] args) { + SpringApplication.run(PlatformApplication.class, args); + } + + @Bean + public SpringContextHolder springContextHolder() { + return new SpringContextHolder(); + } + + /** + * 访问首页提示 + * + * @return / + */ + @AnonymousGetMapping("/") + public String index() { + return "Backend service started successfully"; + } +} diff --git a/framework/src/main/java/com/yfd/platform/ServletInitializer.java b/framework/src/main/java/com/yfd/platform/ServletInitializer.java new file mode 100644 index 0000000..0234b48 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/ServletInitializer.java @@ -0,0 +1,13 @@ +package com.yfd.platform; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(PlatformApplication.class); + } + +} diff --git a/framework/src/main/java/com/yfd/platform/annotation/AnonymousAccess.java b/framework/src/main/java/com/yfd/platform/annotation/AnonymousAccess.java new file mode 100644 index 0000000..2fbd4c0 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/annotation/AnonymousAccess.java @@ -0,0 +1,30 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yfd.platform.annotation; + +import java.lang.annotation.*; + +/** + * @author jacky + * 用于标记匿名访问方法 + */ +@Inherited +@Documented +@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface AnonymousAccess { + +} diff --git a/framework/src/main/java/com/yfd/platform/annotation/Log.java b/framework/src/main/java/com/yfd/platform/annotation/Log.java new file mode 100644 index 0000000..6739494 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/annotation/Log.java @@ -0,0 +1,20 @@ +package com.yfd.platform.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author TangWei + * @date 2018-11-24 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Log { + + String value() default ""; + + String module() default ""; +} + diff --git a/framework/src/main/java/com/yfd/platform/annotation/rest/AnonymousGetMapping.java b/framework/src/main/java/com/yfd/platform/annotation/rest/AnonymousGetMapping.java new file mode 100644 index 0000000..01fcc32 --- /dev/null +++ b/framework/src/main/java/com/yfd/platform/annotation/rest/AnonymousGetMapping.java @@ -0,0 +1,86 @@ +/* + * Copyright 2002-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.yfd.platform.annotation.rest; + +import com.yfd.platform.annotation.AnonymousAccess; +import org.springframework.core.annotation.AliasFor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.lang.annotation.*; + +/** + * Annotation for mapping HTTP {@code GET} requests onto specific handler + * methods. + *