From 7d57dbca276d8bb362884a6bda7c899327fb09c8 Mon Sep 17 00:00:00 2001 From: Odboy Date: Fri, 28 Mar 2025 19:10:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BC=96=E7=A0=81=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E3=80=81=E6=96=B0=E5=A2=9E=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cutejava-ui/public/favicon.ico | Bin 67646 -> 67646 bytes cutejava-ui/src/api/system/code.js | 4 +- cutejava-ui/src/api/system/user.js | 14 +- .../src/assets/icons/svg/Cronometer.svg | 1 + .../src/assets/icons/svg/Insurance.svg | 1 + cutejava-ui/src/assets/icons/svg/Sign.svg | 1 + cutejava-ui/src/assets/icons/svg/account.svg | 1 + cutejava-ui/src/assets/icons/svg/activity.svg | 1 + cutejava-ui/src/assets/icons/svg/add-file.svg | 1 + cutejava-ui/src/assets/icons/svg/add.svg | 2 + cutejava-ui/src/assets/icons/svg/aim.svg | 1 + cutejava-ui/src/assets/icons/svg/alarm.svg | 1 + cutejava-ui/src/assets/icons/svg/archives.svg | 1 + cutejava-ui/src/assets/icons/svg/article.svg | 1 + .../src/assets/icons/svg/asset-income.svg | 1 + .../src/assets/icons/svg/audit-log.svg | 1 + .../src/assets/icons/svg/authority.svg | 1 + cutejava-ui/src/assets/icons/svg/bak.svg | 1 + cutejava-ui/src/assets/icons/svg/banner.svg | 1 + cutejava-ui/src/assets/icons/svg/bargain.svg | 1 + .../src/assets/icons/svg/bigdata-screen.svg | 1 + cutejava-ui/src/assets/icons/svg/bill.svg | 1 + cutejava-ui/src/assets/icons/svg/bp.svg | 1 + .../src/assets/icons/svg/briefcase.svg | 1 + cutejava-ui/src/assets/icons/svg/build.svg | 1 + cutejava-ui/src/assets/icons/svg/business.svg | 1 + cutejava-ui/src/assets/icons/svg/button.svg | 1 + cutejava-ui/src/assets/icons/svg/calendar.svg | 1 + cutejava-ui/src/assets/icons/svg/capital.svg | 1 + cutejava-ui/src/assets/icons/svg/captcha.svg | 1 + cutejava-ui/src/assets/icons/svg/close.svg | 1 + cutejava-ui/src/assets/icons/svg/collect.svg | 1 + cutejava-ui/src/assets/icons/svg/comment.svg | 1 + cutejava-ui/src/assets/icons/svg/compass.svg | 1 + .../src/assets/icons/svg/configure.svg | 1 + cutejava-ui/src/assets/icons/svg/contract.svg | 1 + cutejava-ui/src/assets/icons/svg/copy.svg | 1 + cutejava-ui/src/assets/icons/svg/coupon.svg | 1 + cutejava-ui/src/assets/icons/svg/coupon2.svg | 1 + cutejava-ui/src/assets/icons/svg/cpu.svg | 1 + cutejava-ui/src/assets/icons/svg/crm.svg | 1 + .../src/assets/icons/svg/custom-manage.svg | 1 + cutejava-ui/src/assets/icons/svg/custom.svg | 1 + cutejava-ui/src/assets/icons/svg/dairy.svg | 1 + .../src/assets/icons/svg/data-analysis.svg | 1 + cutejava-ui/src/assets/icons/svg/data.svg | 1 + cutejava-ui/src/assets/icons/svg/debt.svg | 1 + cutejava-ui/src/assets/icons/svg/dengji.svg | 1 + cutejava-ui/src/assets/icons/svg/device.svg | 1 + cutejava-ui/src/assets/icons/svg/disc.svg | 1 + cutejava-ui/src/assets/icons/svg/document.svg | 1 + cutejava-ui/src/assets/icons/svg/dot.svg | 1 + cutejava-ui/src/assets/icons/svg/end.svg | 1 + .../src/assets/icons/svg/energy-manage.svg | 1 + cutejava-ui/src/assets/icons/svg/enlarge.svg | 1 + .../src/assets/icons/svg/excellence.svg | 1 + cutejava-ui/src/assets/icons/svg/exit.svg | 1 + cutejava-ui/src/assets/icons/svg/expenses.svg | 1 + .../src/assets/icons/svg/exporting.svg | 1 + cutejava-ui/src/assets/icons/svg/express.svg | 1 + cutejava-ui/src/assets/icons/svg/eye.svg | 1 + cutejava-ui/src/assets/icons/svg/fee.svg | 1 + cutejava-ui/src/assets/icons/svg/fenxiao.svg | 1 + cutejava-ui/src/assets/icons/svg/fiance.svg | 1 + cutejava-ui/src/assets/icons/svg/file.svg | 1 + cutejava-ui/src/assets/icons/svg/filter.svg | 1 + .../src/assets/icons/svg/finance-debt.svg | 1 + .../src/assets/icons/svg/finance-repaylog.svg | 1 + cutejava-ui/src/assets/icons/svg/finance.svg | 1 + .../src/assets/icons/svg/fingerprint.svg | 1 + cutejava-ui/src/assets/icons/svg/finish.svg | 1 + .../src/assets/icons/svg/fixed-assets.svg | 1 + cutejava-ui/src/assets/icons/svg/folder.svg | 1 + cutejava-ui/src/assets/icons/svg/gateway.svg | 1 + .../src/assets/icons/svg/generated.svg | 1 + cutejava-ui/src/assets/icons/svg/gift.svg | 1 + cutejava-ui/src/assets/icons/svg/goods.svg | 1 + cutejava-ui/src/assets/icons/svg/history.svg | 1 + .../src/assets/icons/svg/ic-yesterday.svg | 1 + cutejava-ui/src/assets/icons/svg/import.svg | 1 + cutejava-ui/src/assets/icons/svg/info.svg | 1 + .../src/assets/icons/svg/interface.svg | 1 + .../src/assets/icons/svg/invisible.svg | 1 + cutejava-ui/src/assets/icons/svg/iot.svg | 1 + .../src/assets/icons/svg/knowledge-base.svg | 1 + cutejava-ui/src/assets/icons/svg/lease.svg | 1 + .../src/assets/icons/svg/life-dairy.svg | 1 + .../src/assets/icons/svg/life-journal.svg | 1 + cutejava-ui/src/assets/icons/svg/life.svg | 1 + cutejava-ui/src/assets/icons/svg/loan.svg | 1 + cutejava-ui/src/assets/icons/svg/location.svg | 1 + .../src/assets/icons/svg/login-log.svg | 1 + .../src/assets/icons/svg/logistics.svg | 1 + .../src/assets/icons/svg/love-hobby.svg | 1 + cutejava-ui/src/assets/icons/svg/love-log.svg | 1 + .../src/assets/icons/svg/m-cockpit.svg | 1 + cutejava-ui/src/assets/icons/svg/mail.svg | 1 + cutejava-ui/src/assets/icons/svg/mapPin.svg | 1 + cutejava-ui/src/assets/icons/svg/mc.svg | 1 + .../src/assets/icons/svg/minus-sign.svg | 1 + .../src/assets/icons/svg/mircrophone.svg | 1 + .../src/assets/icons/svg/monthlyview.svg | 1 + cutejava-ui/src/assets/icons/svg/music.svg | 1 + cutejava-ui/src/assets/icons/svg/narrow.svg | 1 + cutejava-ui/src/assets/icons/svg/news.svg | 1 + .../src/assets/icons/svg/online_user.svg | 1 + cutejava-ui/src/assets/icons/svg/ops.svg | 1 + cutejava-ui/src/assets/icons/svg/opus.svg | 1 + cutejava-ui/src/assets/icons/svg/order.svg | 1 + .../src/assets/icons/svg/orderinfo.svg | 1 + .../src/assets/icons/svg/performance.svg | 1 + .../src/assets/icons/svg/phonecall.svg | 1 + cutejava-ui/src/assets/icons/svg/picture.svg | 1 + cutejava-ui/src/assets/icons/svg/plan.svg | 1 + .../src/assets/icons/svg/plateform.svg | 1 + cutejava-ui/src/assets/icons/svg/plmt.svg | 1 + cutejava-ui/src/assets/icons/svg/plus.svg | 1 + cutejava-ui/src/assets/icons/svg/pm.svg | 1 + cutejava-ui/src/assets/icons/svg/points.svg | 1 + cutejava-ui/src/assets/icons/svg/post.svg | 1 + cutejava-ui/src/assets/icons/svg/preview.svg | 1 + cutejava-ui/src/assets/icons/svg/price.svg | 1 + cutejava-ui/src/assets/icons/svg/printer.svg | 1 + cutejava-ui/src/assets/icons/svg/pt.svg | 1 + cutejava-ui/src/assets/icons/svg/qr-code.svg | 1 + .../src/assets/icons/svg/question-answer.svg | 1 + cutejava-ui/src/assets/icons/svg/read.svg | 1 + cutejava-ui/src/assets/icons/svg/rec.svg | 1 + cutejava-ui/src/assets/icons/svg/record.svg | 1 + cutejava-ui/src/assets/icons/svg/refresh.svg | 1 + cutejava-ui/src/assets/icons/svg/release.svg | 1 + cutejava-ui/src/assets/icons/svg/reply.svg | 1 + cutejava-ui/src/assets/icons/svg/report.svg | 1 + cutejava-ui/src/assets/icons/svg/revoke.svg | 1 + .../src/assets/icons/svg/risk-manage.svg | 1 + cutejava-ui/src/assets/icons/svg/rule.svg | 1 + cutejava-ui/src/assets/icons/svg/run.svg | 1 + cutejava-ui/src/assets/icons/svg/running.svg | 1 + cutejava-ui/src/assets/icons/svg/salary.svg | 1 + cutejava-ui/src/assets/icons/svg/save.svg | 1 + cutejava-ui/src/assets/icons/svg/scan.svg | 1 + .../src/assets/icons/svg/school-cert.svg | 1 + .../src/assets/icons/svg/school-citation.svg | 1 + .../src/assets/icons/svg/school-resume.svg | 1 + cutejava-ui/src/assets/icons/svg/scm.svg | 1 + cutejava-ui/src/assets/icons/svg/seckill.svg | 1 + .../src/assets/icons/svg/server_monitor.svg | 1 + .../src/assets/icons/svg/service-center.svg | 1 + cutejava-ui/src/assets/icons/svg/setting.svg | 1 + cutejava-ui/src/assets/icons/svg/seven.svg | 1 + cutejava-ui/src/assets/icons/svg/share.svg | 1 + .../src/assets/icons/svg/shop-manage.svg | 1 + cutejava-ui/src/assets/icons/svg/shop.svg | 1 + cutejava-ui/src/assets/icons/svg/sign2.svg | 1 + cutejava-ui/src/assets/icons/svg/smile.svg | 1 + .../src/assets/icons/svg/space-alloc.svg | 1 + .../src/assets/icons/svg/space-manage.svg | 1 + cutejava-ui/src/assets/icons/svg/special.svg | 1 + cutejava-ui/src/assets/icons/svg/star.svg | 1 + .../src/assets/icons/svg/storage-space.svg | 1 + cutejava-ui/src/assets/icons/svg/storage.svg | 1 + cutejava-ui/src/assets/icons/svg/store.svg | 1 + .../src/assets/icons/svg/storehouse.svg | 1 + cutejava-ui/src/assets/icons/svg/student.svg | 1 + .../src/assets/icons/svg/system-config.svg | 1 + .../src/assets/icons/svg/take-photo.svg | 1 + .../src/assets/icons/svg/task manege.svg | 1 + cutejava-ui/src/assets/icons/svg/tem.svg | 1 + cutejava-ui/src/assets/icons/svg/temp.svg | 1 + .../src/assets/icons/svg/thumbs-up.svg | 1 + .../src/assets/icons/svg/time-birthday.svg | 1 + .../src/assets/icons/svg/time-downcount.svg | 1 + cutejava-ui/src/assets/icons/svg/tixian.svg | 1 + cutejava-ui/src/assets/icons/svg/today.svg | 1 + cutejava-ui/src/assets/icons/svg/upload.svg | 1 + cutejava-ui/src/assets/icons/svg/version.svg | 1 + cutejava-ui/src/assets/icons/svg/visitor.svg | 1 + cutejava-ui/src/assets/icons/svg/warning.svg | 1 + .../src/assets/icons/svg/work-joblog.svg | 1 + .../src/assets/icons/svg/work-manage.svg | 1 + .../src/assets/icons/svg/work-order.svg | 1 + .../src/assets/icons/svg/work-plan.svg | 1 + .../src/assets/icons/svg/work-resume.svg | 1 + cutejava-ui/src/assets/icons/svg/work.svg | 1 + cutejava-ui/src/assets/icons/svg/wxapp.svg | 1 + cutejava-ui/src/assets/icons/svg/wxpay.svg | 1 + cutejava-ui/src/assets/icons/svg/yingxiao.svg | 1 + cutejava-ui/src/assets/icons/svg/yuan-141.svg | 1 + cutejava-ui/src/assets/images/avatar.png | Bin 1865 -> 30212 bytes cutejava-ui/src/assets/images/logo.png | Bin 8852 -> 58082 bytes .../src/layout/components/Sidebar/Logo.vue | 2 + .../components/{ => base}/ClipboardDemo.vue | 2 +- .../components/{ => base}/CodemirrorDemo.vue | 2 +- .../components/{ => base}/CountToDemo.vue | 0 .../components/{ => base}/DragTableDemo.vue | 0 .../views/components/{ => base}/Echarts.vue | 22 +-- .../views/components/{ => base}/Editor.vue | 2 +- .../views/components/{ => base}/MarkDown.vue | 0 .../components/{ => base}/OneKeyCopy.vue | 0 .../components/{ => base}/SplitPaneDemo.vue | 0 .../components/{ => base}/WebSocketDemo.vue | 0 .../views/components/{ => base}/YamlEdit.vue | 2 +- .../components/business/CuteDeptTree.vue | 79 ++++++++ .../components/business/CuteUserSelect.vue | 74 ++++++++ .../views/components/business/DemoShow.vue | 52 ++++++ .../src/views/system/job/module/form.vue | 4 +- .../views/system/user/center/updateEmail.vue | 4 +- cutejava-ui/src/views/system/user/index.vue | 62 ++----- .../main/java/cn/odboy/base/BaseResult.java | 2 - .../src/main/java/cn/odboy/base/MyEntity.java | 10 +- .../java/cn/odboy/constant/SystemConst.java | 11 ++ .../cn/odboy/constant/SystemRedisKey.java | 5 + .../odboy/mybatis/interfaces/EasyMapper.java | 4 +- .../cn/odboy/mybatis/util/CmdGenHelper.java | 5 +- .../cn/odboy/mybatis/util/MybatisHelper.java | 12 +- .../cn/odboy/redis/RedisConfiguration.java | 4 +- .../java/cn/odboy/server/SwaggerConfig.java | 3 +- .../java/cn/odboy/thread/AsyncExecutor.java | 2 +- .../src/main/java/cn/odboy/util/CollUtil.java | 5 +- ...ESEncryptUtil.java => DesEncryptUtil.java} | 2 +- .../src/main/java/cn/odboy/util/FileUtil.java | 11 +- .../odboy/util/{IPUtil.java => IpUtil.java} | 2 +- .../src/main/java/cn/odboy/util/ListUtil.java | 3 +- ...SAEncryptUtil.java => RsaEncryptUtil.java} | 14 +- .../main/java/cn/odboy/util/ScriptUtil.java | 8 +- .../main/java/cn/odboy/util/SecurityUtil.java | 1 - .../src/main/java/cn/odboy/util/SqlUtil.java | 3 - .../context/WebSocketClientManager.java | 1 + .../websocket/context/WebSocketServer.java | 3 - .../QuartzJobQueryCriteria.java | 2 +- .../system/request/CreateDeptRequest.java | 21 +++ .../request/CreateDictDetailRequest.java | 22 +++ .../system/request/CreateDictRequest.java | 15 ++ .../system/request/CreateJobRequest.java | 18 ++ .../system/request/CreateRoleRequest.java | 27 +++ .../{dto => request}/DeptQueryCriteria.java | 2 +- .../DictDetailQueryCriteria.java | 2 +- .../{dto => request}/DictQueryCriteria.java | 2 +- .../{dto => request}/JobQueryCriteria.java | 2 +- .../{dto => request}/MenuQueryCriteria.java | 2 +- .../{dto => request}/RoleQueryCriteria.java | 2 +- .../UserLoginRequest.java} | 4 +- .../{dto => request}/UserQueryCriteria.java | 2 +- .../system/{dto => response}/MenuMetaVo.java | 2 +- .../system/{dto => response}/MenuVo.java | 2 +- .../model/system/response/SimpleUserVo.java | 42 +++++ .../model/system/response/UserInfoVo.java | 22 +++ .../system/{dto => response}/UserPassVo.java | 2 +- .../LocalStorageQueryCriteria.java | 2 +- .../{dto => request}/QiniuQueryCriteria.java | 2 +- .../job/mapper/QuartzJobMapper.java | 2 +- .../job/mapper/QuartzLogMapper.java | 2 +- .../job/rest/QuartzJobController.java | 2 +- .../job/service/QuartzJobService.java | 2 +- .../service/impl/QuartzJobServiceImpl.java | 2 +- ...tUtilTest.java => DesEncryptUtilTest.java} | 6 +- .../core/config/LoginProperties.java | 2 - .../core/config/SecurityProperties.java | 1 - .../application/core/context/TokenFilter.java | 1 - .../core/context/TokenProvider.java | 1 - .../application/core/rest/AuthController.java | 36 ++-- .../core/rest/OnlineController.java | 4 +- .../service/impl/UserCacheServiceImpl.java | 8 +- .../impl/UserDetailsServiceImpl.java} | 4 +- .../service/impl/UserOnlineServiceImpl.java | 4 +- .../application/system/mapper/DeptMapper.java | 2 +- .../system/mapper/DictDetailMapper.java | 2 +- .../application/system/mapper/DictMapper.java | 2 +- .../application/system/mapper/JobMapper.java | 2 +- .../application/system/mapper/MenuMapper.java | 4 +- .../application/system/mapper/RoleMapper.java | 2 +- .../application/system/mapper/UserMapper.java | 2 +- ...Controller.java => CaptchaController.java} | 28 +-- .../system/rest/DeptController.java | 11 +- .../system/rest/DictController.java | 11 +- .../system/rest/DictDetailController.java | 11 +- .../system/rest/JobController.java | 13 +- .../system/rest/MenuController.java | 4 +- .../system/rest/RoleController.java | 11 +- .../system/rest/UserController.java | 58 ++++-- .../system/service/DeptService.java | 6 +- .../system/service/DictDetailService.java | 5 +- .../system/service/DictService.java | 5 +- .../system/service/JobService.java | 5 +- .../system/service/MenuService.java | 4 +- .../system/service/RoleService.java | 5 +- .../system/service/UserService.java | 2 +- .../system/service/impl/DataServiceImpl.java | 2 +- .../system/service/impl/DeptServiceImpl.java | 10 +- .../service/impl/DictDetailServiceImpl.java | 13 +- .../system/service/impl/DictServiceImpl.java | 8 +- .../system/service/impl/JobServiceImpl.java | 8 +- .../system/service/impl/MenuServiceImpl.java | 6 +- .../service/impl/MonitorServiceImpl.java | 4 +- .../system/service/impl/RoleServiceImpl.java | 12 +- .../system/service/impl/UserServiceImpl.java | 4 +- .../src/main/resources/mapper/MenuMapper.xml | 4 +- .../tools/mapper/LocalStorageMapper.java | 2 +- .../tools/mapper/QiniuContentMapper.java | 2 +- .../tools/rest/LocalStorageController.java | 3 +- .../tools/rest/QiniuController.java | 5 +- .../tools/service/CaptchaService.java} | 8 +- .../tools/service/EmailService.java | 8 + .../tools/service/LocalStorageService.java | 2 +- .../tools/service/QiniuContentService.java | 16 +- .../service/impl/CaptchaServiceImpl.java} | 13 +- .../tools/service/impl/EmailServiceImpl.java | 15 +- .../service/impl/LocalStorageServiceImpl.java | 2 +- .../service/impl/QiniuContentServiceImpl.java | 14 +- sql/cutejava20250321.sql | 170 +++++++++--------- 310 files changed, 990 insertions(+), 432 deletions(-) create mode 100644 cutejava-ui/src/assets/icons/svg/Cronometer.svg create mode 100644 cutejava-ui/src/assets/icons/svg/Insurance.svg create mode 100644 cutejava-ui/src/assets/icons/svg/Sign.svg create mode 100644 cutejava-ui/src/assets/icons/svg/account.svg create mode 100644 cutejava-ui/src/assets/icons/svg/activity.svg create mode 100644 cutejava-ui/src/assets/icons/svg/add-file.svg create mode 100644 cutejava-ui/src/assets/icons/svg/add.svg create mode 100644 cutejava-ui/src/assets/icons/svg/aim.svg create mode 100644 cutejava-ui/src/assets/icons/svg/alarm.svg create mode 100644 cutejava-ui/src/assets/icons/svg/archives.svg create mode 100644 cutejava-ui/src/assets/icons/svg/article.svg create mode 100644 cutejava-ui/src/assets/icons/svg/asset-income.svg create mode 100644 cutejava-ui/src/assets/icons/svg/audit-log.svg create mode 100644 cutejava-ui/src/assets/icons/svg/authority.svg create mode 100644 cutejava-ui/src/assets/icons/svg/bak.svg create mode 100644 cutejava-ui/src/assets/icons/svg/banner.svg create mode 100644 cutejava-ui/src/assets/icons/svg/bargain.svg create mode 100644 cutejava-ui/src/assets/icons/svg/bigdata-screen.svg create mode 100644 cutejava-ui/src/assets/icons/svg/bill.svg create mode 100644 cutejava-ui/src/assets/icons/svg/bp.svg create mode 100644 cutejava-ui/src/assets/icons/svg/briefcase.svg create mode 100644 cutejava-ui/src/assets/icons/svg/build.svg create mode 100644 cutejava-ui/src/assets/icons/svg/business.svg create mode 100644 cutejava-ui/src/assets/icons/svg/button.svg create mode 100644 cutejava-ui/src/assets/icons/svg/calendar.svg create mode 100644 cutejava-ui/src/assets/icons/svg/capital.svg create mode 100644 cutejava-ui/src/assets/icons/svg/captcha.svg create mode 100644 cutejava-ui/src/assets/icons/svg/close.svg create mode 100644 cutejava-ui/src/assets/icons/svg/collect.svg create mode 100644 cutejava-ui/src/assets/icons/svg/comment.svg create mode 100644 cutejava-ui/src/assets/icons/svg/compass.svg create mode 100644 cutejava-ui/src/assets/icons/svg/configure.svg create mode 100644 cutejava-ui/src/assets/icons/svg/contract.svg create mode 100644 cutejava-ui/src/assets/icons/svg/copy.svg create mode 100644 cutejava-ui/src/assets/icons/svg/coupon.svg create mode 100644 cutejava-ui/src/assets/icons/svg/coupon2.svg create mode 100644 cutejava-ui/src/assets/icons/svg/cpu.svg create mode 100644 cutejava-ui/src/assets/icons/svg/crm.svg create mode 100644 cutejava-ui/src/assets/icons/svg/custom-manage.svg create mode 100644 cutejava-ui/src/assets/icons/svg/custom.svg create mode 100644 cutejava-ui/src/assets/icons/svg/dairy.svg create mode 100644 cutejava-ui/src/assets/icons/svg/data-analysis.svg create mode 100644 cutejava-ui/src/assets/icons/svg/data.svg create mode 100644 cutejava-ui/src/assets/icons/svg/debt.svg create mode 100644 cutejava-ui/src/assets/icons/svg/dengji.svg create mode 100644 cutejava-ui/src/assets/icons/svg/device.svg create mode 100644 cutejava-ui/src/assets/icons/svg/disc.svg create mode 100644 cutejava-ui/src/assets/icons/svg/document.svg create mode 100644 cutejava-ui/src/assets/icons/svg/dot.svg create mode 100644 cutejava-ui/src/assets/icons/svg/end.svg create mode 100644 cutejava-ui/src/assets/icons/svg/energy-manage.svg create mode 100644 cutejava-ui/src/assets/icons/svg/enlarge.svg create mode 100644 cutejava-ui/src/assets/icons/svg/excellence.svg create mode 100644 cutejava-ui/src/assets/icons/svg/exit.svg create mode 100644 cutejava-ui/src/assets/icons/svg/expenses.svg create mode 100644 cutejava-ui/src/assets/icons/svg/exporting.svg create mode 100644 cutejava-ui/src/assets/icons/svg/express.svg create mode 100644 cutejava-ui/src/assets/icons/svg/eye.svg create mode 100644 cutejava-ui/src/assets/icons/svg/fee.svg create mode 100644 cutejava-ui/src/assets/icons/svg/fenxiao.svg create mode 100644 cutejava-ui/src/assets/icons/svg/fiance.svg create mode 100644 cutejava-ui/src/assets/icons/svg/file.svg create mode 100644 cutejava-ui/src/assets/icons/svg/filter.svg create mode 100644 cutejava-ui/src/assets/icons/svg/finance-debt.svg create mode 100644 cutejava-ui/src/assets/icons/svg/finance-repaylog.svg create mode 100644 cutejava-ui/src/assets/icons/svg/finance.svg create mode 100644 cutejava-ui/src/assets/icons/svg/fingerprint.svg create mode 100644 cutejava-ui/src/assets/icons/svg/finish.svg create mode 100644 cutejava-ui/src/assets/icons/svg/fixed-assets.svg create mode 100644 cutejava-ui/src/assets/icons/svg/folder.svg create mode 100644 cutejava-ui/src/assets/icons/svg/gateway.svg create mode 100644 cutejava-ui/src/assets/icons/svg/generated.svg create mode 100644 cutejava-ui/src/assets/icons/svg/gift.svg create mode 100644 cutejava-ui/src/assets/icons/svg/goods.svg create mode 100644 cutejava-ui/src/assets/icons/svg/history.svg create mode 100644 cutejava-ui/src/assets/icons/svg/ic-yesterday.svg create mode 100644 cutejava-ui/src/assets/icons/svg/import.svg create mode 100644 cutejava-ui/src/assets/icons/svg/info.svg create mode 100644 cutejava-ui/src/assets/icons/svg/interface.svg create mode 100644 cutejava-ui/src/assets/icons/svg/invisible.svg create mode 100644 cutejava-ui/src/assets/icons/svg/iot.svg create mode 100644 cutejava-ui/src/assets/icons/svg/knowledge-base.svg create mode 100644 cutejava-ui/src/assets/icons/svg/lease.svg create mode 100644 cutejava-ui/src/assets/icons/svg/life-dairy.svg create mode 100644 cutejava-ui/src/assets/icons/svg/life-journal.svg create mode 100644 cutejava-ui/src/assets/icons/svg/life.svg create mode 100644 cutejava-ui/src/assets/icons/svg/loan.svg create mode 100644 cutejava-ui/src/assets/icons/svg/location.svg create mode 100644 cutejava-ui/src/assets/icons/svg/login-log.svg create mode 100644 cutejava-ui/src/assets/icons/svg/logistics.svg create mode 100644 cutejava-ui/src/assets/icons/svg/love-hobby.svg create mode 100644 cutejava-ui/src/assets/icons/svg/love-log.svg create mode 100644 cutejava-ui/src/assets/icons/svg/m-cockpit.svg create mode 100644 cutejava-ui/src/assets/icons/svg/mail.svg create mode 100644 cutejava-ui/src/assets/icons/svg/mapPin.svg create mode 100644 cutejava-ui/src/assets/icons/svg/mc.svg create mode 100644 cutejava-ui/src/assets/icons/svg/minus-sign.svg create mode 100644 cutejava-ui/src/assets/icons/svg/mircrophone.svg create mode 100644 cutejava-ui/src/assets/icons/svg/monthlyview.svg create mode 100644 cutejava-ui/src/assets/icons/svg/music.svg create mode 100644 cutejava-ui/src/assets/icons/svg/narrow.svg create mode 100644 cutejava-ui/src/assets/icons/svg/news.svg create mode 100644 cutejava-ui/src/assets/icons/svg/online_user.svg create mode 100644 cutejava-ui/src/assets/icons/svg/ops.svg create mode 100644 cutejava-ui/src/assets/icons/svg/opus.svg create mode 100644 cutejava-ui/src/assets/icons/svg/order.svg create mode 100644 cutejava-ui/src/assets/icons/svg/orderinfo.svg create mode 100644 cutejava-ui/src/assets/icons/svg/performance.svg create mode 100644 cutejava-ui/src/assets/icons/svg/phonecall.svg create mode 100644 cutejava-ui/src/assets/icons/svg/picture.svg create mode 100644 cutejava-ui/src/assets/icons/svg/plan.svg create mode 100644 cutejava-ui/src/assets/icons/svg/plateform.svg create mode 100644 cutejava-ui/src/assets/icons/svg/plmt.svg create mode 100644 cutejava-ui/src/assets/icons/svg/plus.svg create mode 100644 cutejava-ui/src/assets/icons/svg/pm.svg create mode 100644 cutejava-ui/src/assets/icons/svg/points.svg create mode 100644 cutejava-ui/src/assets/icons/svg/post.svg create mode 100644 cutejava-ui/src/assets/icons/svg/preview.svg create mode 100644 cutejava-ui/src/assets/icons/svg/price.svg create mode 100644 cutejava-ui/src/assets/icons/svg/printer.svg create mode 100644 cutejava-ui/src/assets/icons/svg/pt.svg create mode 100644 cutejava-ui/src/assets/icons/svg/qr-code.svg create mode 100644 cutejava-ui/src/assets/icons/svg/question-answer.svg create mode 100644 cutejava-ui/src/assets/icons/svg/read.svg create mode 100644 cutejava-ui/src/assets/icons/svg/rec.svg create mode 100644 cutejava-ui/src/assets/icons/svg/record.svg create mode 100644 cutejava-ui/src/assets/icons/svg/refresh.svg create mode 100644 cutejava-ui/src/assets/icons/svg/release.svg create mode 100644 cutejava-ui/src/assets/icons/svg/reply.svg create mode 100644 cutejava-ui/src/assets/icons/svg/report.svg create mode 100644 cutejava-ui/src/assets/icons/svg/revoke.svg create mode 100644 cutejava-ui/src/assets/icons/svg/risk-manage.svg create mode 100644 cutejava-ui/src/assets/icons/svg/rule.svg create mode 100644 cutejava-ui/src/assets/icons/svg/run.svg create mode 100644 cutejava-ui/src/assets/icons/svg/running.svg create mode 100644 cutejava-ui/src/assets/icons/svg/salary.svg create mode 100644 cutejava-ui/src/assets/icons/svg/save.svg create mode 100644 cutejava-ui/src/assets/icons/svg/scan.svg create mode 100644 cutejava-ui/src/assets/icons/svg/school-cert.svg create mode 100644 cutejava-ui/src/assets/icons/svg/school-citation.svg create mode 100644 cutejava-ui/src/assets/icons/svg/school-resume.svg create mode 100644 cutejava-ui/src/assets/icons/svg/scm.svg create mode 100644 cutejava-ui/src/assets/icons/svg/seckill.svg create mode 100644 cutejava-ui/src/assets/icons/svg/server_monitor.svg create mode 100644 cutejava-ui/src/assets/icons/svg/service-center.svg create mode 100644 cutejava-ui/src/assets/icons/svg/setting.svg create mode 100644 cutejava-ui/src/assets/icons/svg/seven.svg create mode 100644 cutejava-ui/src/assets/icons/svg/share.svg create mode 100644 cutejava-ui/src/assets/icons/svg/shop-manage.svg create mode 100644 cutejava-ui/src/assets/icons/svg/shop.svg create mode 100644 cutejava-ui/src/assets/icons/svg/sign2.svg create mode 100644 cutejava-ui/src/assets/icons/svg/smile.svg create mode 100644 cutejava-ui/src/assets/icons/svg/space-alloc.svg create mode 100644 cutejava-ui/src/assets/icons/svg/space-manage.svg create mode 100644 cutejava-ui/src/assets/icons/svg/special.svg create mode 100644 cutejava-ui/src/assets/icons/svg/star.svg create mode 100644 cutejava-ui/src/assets/icons/svg/storage-space.svg create mode 100644 cutejava-ui/src/assets/icons/svg/storage.svg create mode 100644 cutejava-ui/src/assets/icons/svg/store.svg create mode 100644 cutejava-ui/src/assets/icons/svg/storehouse.svg create mode 100644 cutejava-ui/src/assets/icons/svg/student.svg create mode 100644 cutejava-ui/src/assets/icons/svg/system-config.svg create mode 100644 cutejava-ui/src/assets/icons/svg/take-photo.svg create mode 100644 cutejava-ui/src/assets/icons/svg/task manege.svg create mode 100644 cutejava-ui/src/assets/icons/svg/tem.svg create mode 100644 cutejava-ui/src/assets/icons/svg/temp.svg create mode 100644 cutejava-ui/src/assets/icons/svg/thumbs-up.svg create mode 100644 cutejava-ui/src/assets/icons/svg/time-birthday.svg create mode 100644 cutejava-ui/src/assets/icons/svg/time-downcount.svg create mode 100644 cutejava-ui/src/assets/icons/svg/tixian.svg create mode 100644 cutejava-ui/src/assets/icons/svg/today.svg create mode 100644 cutejava-ui/src/assets/icons/svg/upload.svg create mode 100644 cutejava-ui/src/assets/icons/svg/version.svg create mode 100644 cutejava-ui/src/assets/icons/svg/visitor.svg create mode 100644 cutejava-ui/src/assets/icons/svg/warning.svg create mode 100644 cutejava-ui/src/assets/icons/svg/work-joblog.svg create mode 100644 cutejava-ui/src/assets/icons/svg/work-manage.svg create mode 100644 cutejava-ui/src/assets/icons/svg/work-order.svg create mode 100644 cutejava-ui/src/assets/icons/svg/work-plan.svg create mode 100644 cutejava-ui/src/assets/icons/svg/work-resume.svg create mode 100644 cutejava-ui/src/assets/icons/svg/work.svg create mode 100644 cutejava-ui/src/assets/icons/svg/wxapp.svg create mode 100644 cutejava-ui/src/assets/icons/svg/wxpay.svg create mode 100644 cutejava-ui/src/assets/icons/svg/yingxiao.svg create mode 100644 cutejava-ui/src/assets/icons/svg/yuan-141.svg rename cutejava-ui/src/views/components/{ => base}/ClipboardDemo.vue (95%) rename cutejava-ui/src/views/components/{ => base}/CodemirrorDemo.vue (81%) rename cutejava-ui/src/views/components/{ => base}/CountToDemo.vue (100%) rename cutejava-ui/src/views/components/{ => base}/DragTableDemo.vue (100%) rename cutejava-ui/src/views/components/{ => base}/Echarts.vue (79%) rename cutejava-ui/src/views/components/{ => base}/Editor.vue (92%) rename cutejava-ui/src/views/components/{ => base}/MarkDown.vue (100%) rename cutejava-ui/src/views/components/{ => base}/OneKeyCopy.vue (100%) rename cutejava-ui/src/views/components/{ => base}/SplitPaneDemo.vue (100%) rename cutejava-ui/src/views/components/{ => base}/WebSocketDemo.vue (100%) rename cutejava-ui/src/views/components/{ => base}/YamlEdit.vue (99%) create mode 100644 cutejava-ui/src/views/components/business/CuteDeptTree.vue create mode 100644 cutejava-ui/src/views/components/business/CuteUserSelect.vue create mode 100644 cutejava-ui/src/views/components/business/DemoShow.vue rename cutejava/cutejava-common/src/main/java/cn/odboy/util/{DESEncryptUtil.java => DesEncryptUtil.java} (98%) rename cutejava/cutejava-common/src/main/java/cn/odboy/util/{IPUtil.java => IpUtil.java} (99%) rename cutejava/cutejava-common/src/main/java/cn/odboy/util/{RSAEncryptUtil.java => RsaEncryptUtil.java} (96%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/job/{dto => request}/QuartzJobQueryCriteria.java (94%) create mode 100644 cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDeptRequest.java create mode 100644 cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDictDetailRequest.java create mode 100644 cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDictRequest.java create mode 100644 cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateJobRequest.java create mode 100644 cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateRoleRequest.java rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => request}/DeptQueryCriteria.java (94%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => request}/DictDetailQueryCriteria.java (91%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => request}/DictQueryCriteria.java (90%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => request}/JobQueryCriteria.java (94%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => request}/MenuQueryCriteria.java (92%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => request}/RoleQueryCriteria.java (93%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto/UserAuthDto.java => request/UserLoginRequest.java} (87%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => request}/UserQueryCriteria.java (96%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => response}/MenuMetaVo.java (92%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => response}/MenuVo.java (95%) create mode 100644 cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/SimpleUserVo.java create mode 100644 cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/UserInfoVo.java rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/{dto => response}/UserPassVo.java (87%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/{dto => request}/LocalStorageQueryCriteria.java (93%) rename cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/{dto => request}/QiniuQueryCriteria.java (93%) rename cutejava/cutejava-starter/src/test/java/cn/odboy/util/{DESEncryptUtilTest.java => DesEncryptUtilTest.java} (84%) rename cutejava/cutejava-system/src/main/java/cn/odboy/application/core/{context/UserDetailsHelper.java => service/impl/UserDetailsServiceImpl.java} (94%) rename cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/{VerifyController.java => CaptchaController.java} (64%) rename cutejava/{cutejava-system/src/main/java/cn/odboy/application/system/service/VerifyService.java => cutejava-tools/src/main/java/cn/odboy/application/tools/service/CaptchaService.java} (54%) rename cutejava/{cutejava-system/src/main/java/cn/odboy/application/system/service/impl/VerifyServiceImpl.java => cutejava-tools/src/main/java/cn/odboy/application/tools/service/impl/CaptchaServiceImpl.java} (87%) diff --git a/cutejava-ui/public/favicon.ico b/cutejava-ui/public/favicon.ico index fcb69992e5f0777989b89db9a6318b3621eff240..71483780ea6ac148297ddd5ff4e9eefcd5964059 100644 GIT binary patch literal 67646 zcmcG%RdXF#`tI51ZX)J#BIbH7&zG4v6BBd#bQikJ%*;?Oqs$DFZCSP@%aUa=GfNgT zGi!@kdgk}8t#qkeRo(rkaIMO%O__T=FH`>IFaM2yXV3nH|Nmcq`S1VRfBVb-`Io=^ z<-fCd%AR!3+rz)`+W+yt|HUo$H~-7+SyCP=qkB=wJ&Q_NUCBI`#B)jfo!Ymc%>E@M z)X(X5;E2whZPU+}s}x&0rR?5irFJdwxh17^tth2?Maitx&ShnEEGoBaQ3bsVDjJzp z-R!ceMi&)Z)UT(ZRXTGfPX~8qY5(p_o%y+3Pa}GjSi7jaPARW_QQ0kviYp#dOzyBE zle+chV}o9QtWi){sqO`4=-S;xUAP*p!>2-Z=tP)~o{G?^GcmewAw}meX6WLz0zG)q zq+q@`@O`U76FZfZH>}F0adnQ&tD{efkM7Xj%XvDmEkYZ=d9DrL-O<*cF6-#=hk72C zq?F1g6?Ts)r+ZfEo%2d!#dWe*ZOckovy$3Zl-RMN`1WNbbS(2e_RikdwWQScg)b|m zeM!l@p3J_abj`C*vr6ljS4Jm$$M21-p3sMyNyRoVD3SLj@xCPXH_^U>{j@zz`**CA z)obxz)3Oq|_Jr0YeZhYX_KpU?)zLr?=j~rm#v1%j9Ba_UE7iZjKN(s{?d7+!jE+(} z7nIHKD(YJVbE#%*Nd+xq3W=)KnbR5Cu{j>>3w82%t!_WZiZm)~5f(@&CQAb^p&p?fy1Q$2TSD^tN=J*^#Xi z+w*jIOP-GGEY^V?`P#iHTl=@=>*#?Zojj7S^B2N8%u~RVCcTUIDZ4@{sF%`;<`fd%re7{WAKTt(>!w%m;wx?cAw--1 z7NpJJJkx&Y;L!FrI}2-E9`l{Ufl1}?O&R8 z>3EHh#`Z z-8@~Wkoy(NPV81;X1_}F`_xiDsllFQ4RQ^>VQFM=MWch#D36Drxvu^dwIFM2Y8F&c zzNDg}StTWoDE8B+f&=Rm8eGe&(VL(u#YOh0D0@y-rO3s|0iD{DsI7l{tL@*ufc_q7 z&(?=Jdi0qdy~$8!&8P~I-Fe`e&0c19NLk4KG;m9@#d9X#y_MK)dSd~eV4vCZwJQ}` zNNAc@Ozo7S;s1DafXQaVCYkT`2JC4Jg)|XO&8c>r{2AVJ%HfNi#Fj?3^^e$XZ^}ycYaxWkCzJ_&29TO>>-N zO=(%vE7HUQv@x@yp@|js4=rhMXhj2qOX}*HQ+xZYdIn}SHod4}uD!B&N^c)E>%yKa z?fdbAwwrD6_uJaO zfon>el-`bSx?z!~S>pui6t|>;Lpl2}O;X7uO&2KGdUn`)ssFWUL zM6ot)j?q?l{^HeIy$l~!d=dIRe_W44s&wKgJoaO_c5L{dgWDr@;aI$apOq>-xkpu% zlj_EP7#vv8*f?0ug7fk+xXyv-63dVKoMtt*!n3Puk>e6;p7+i2t{FZvy|k#Al|}d5 zynEKDW06;v-CE?kAf?ssT;e>?)eY+>0*kfv4FQ$G_m14o@5YW?Qc;xL+9Ueeq$e7!QSdBbvrzd6pq z@3Tw(HMb0=tVLVAzQCI2d*+sq5UeHEGT*VnXBO?VJf7jXdH!DF?EDfag= z|2Vzorlt1gS;d4k>B`Y`?fBuHHhdqb4eRb{*PeSidp1~i?#JuFvs68Kk&c~Eu9W&g z<@d}ezi*bkSx^=-HN*5h{F;c&k8hsG{$2og{)XpM@p+7Y6OkcCD~arX0y@Q3BKRBc z8{X-wM|Wel#mJJ%@cW*IRcha%I2}BYr&DJu z_2^Z*vMQF9QL@Ay)oJgp8135_uB|@=>gvTrWu_0RrDYkJyR6xH~36HNV zyXD88-Z?_*mP%yRALz?z8S+rUhig^23 zJw0=pM2}A|t-zy8j%OFadvOJxXL;EFdNdjEEB;Of@b@3#@31!7F&WQ$78a2F;J^0s zCjad_Oinobm%#gv@JDAj8v`1cLl5&`DZ_zE%F^Vcx#$8S9N;|m?$@LY%1 zKh^%9?r7iU8@h1jxt_j=)4POXCD-;T4_h!7o56hl1Rf`vuI2mES(&U1FidCP%~ni7 zPuNO@20XmJKAJp8F*q_oZJZQ{6|g^udxJ)f@J>Cw}V zgGy;$!KRbav8~gw3)1ih%r;1CTF{-B{W@}{8UAlmO2w=i@$K_!$94T)hJM=cN;`HY z>iXSAMWs)v0PJH^CKV7+rXxF&v7_JW{K-h=7j|iM0vQkPGbYnbwxgpBd&6RZ$4f>J z@SnGq99@8y(*qtI_>Yc<`JBhgbEXd#u>d%Jkq1UM$a%9K49!^{&!b)JxdoH`JYE8S zC;#1%$DDr|S!D9Uy#tzDvh(n!@rflh){iUcL${t^tkvlaX*&4bN3ajmfgfM%*v1z+ zviTXZ?!IBAL{DE2)#@BtkfEOAG5iJvGdv21ZO829T;Zw;14Yz|I^{Y4De6K zZcIT(q@XuaonFT7!=FsC*b=;Nay%KnH(ZmAZn}^u9FvJD*-GNEtrV8gOD6BLbELEq zpMkb=8>E+EQ@VCCd69xwxKv#_U4gf9F*<@wPfWcs}fSJFRe-za#Y5 zZ|-Zy-YDIF-l~NBd1cisDLi&i*De=o-_}rkx>vgKONu_14QUKHKY@`o14f3^EO<{N zpJzDEg6{(RyTWqv*kNFD*e{P4paXl4UmyG)e~+gB#zb zI{Xtci}k_Uzx9!h9C)Y;Kfl+5pe#jZHYpt%%0%8LgL@+U7zd8&=z=WxGo9x%k^Skd z$blB40l~NE0^~yqawEZ$9YzDZ-*kwh4{)}lvl)0Tjb*WiEa)Pi7;SzRGTGt`byG?x znO1JolHSG5==%K;-F(rjm}-1E=+fejjt2O=;hzaTzKNdF)qqxoyc<(m_M%Ro$orgbiwlKW5eH%jUW4eg#Vmj2ln3j)s8T`0J;HpTZaD(_|Nj) zGvGf1{=ZpV(+tb#ZY}=iODyx;(gL;$bUeK@<7C>@oIkeE+Pt9R+;N2lwdwNV0{yZx zUne%C>d?Am9bETOJHCIWjX&Jcp}irxeIrYOA=Qd593k&9N8V)4`C?h%V0@d69>@mA zYD^ z6r~f#3lthXsq`A`0OSfHO*bCY63=<3Z9hEJuJzZIlTxSIY5cmGd5zD_fjfB5E)k1a z0Q)5kv*{y_7Kq=W8+?mK2Yw6;vxP;ozs*+jFT>x%)Q-R5>s7x0uXxUE6T6Nj~n5g)3no>g&0L6i<| zizQbPr(K(gYZD`X8eFWf_y#2w4=d@jPpP%D%5azvqrqm*Bc_l~Y$9(!%I%kO+#(Kb zGMboM6#24;(9+rKsXA~nN;~(3Ydzn+VQYkbzEP$(DZ~0yht1fwqQH+sdiG&hZ-{@# zkb_CX#?Lf*!}iN0rj-o;o9;;EyD{4opFW|Jr&9Ifcfs0&t@q+>zp}9(va$a&S{L>F zW0&^sh|-R40=4bi>k4}ENn>NP$o)l)IlLD%%wzwu$A-Vjfz`!+jiOk`*uP2RUzYK> z=MOla(D?K>eElm8c>4dp5`V*facK?y$f|j0bl!B*vRM|+!sMEc0IUOrfcLv_ic#OroWTx*bq!iG)$*X#_9CgBwY;1R=~47-47|$ zt>6sZ3AVUXts-+e^&V#}BBM{?seK9|mwEpQ@zeuR+K3Ihe`k~~T`17S3xzs;p-2y3 z_YkYXrXU8HgxzOxhYYYws|RyrRSvo%2R_dt)|1UKgJTMIs@WRmpClJg>X)C>^zC=| zv~|x*z539q+&bh^_Z0eJNgr}2wC89Nd78)C|NV7cKK4YNZ6ojo_A-1w4E_UC$i}%v z)`I$x2ZJ-v0{ri-A#}qquZ^;wKK5?H(STp?|H}VnCoF0T`D@3uSpV1J@3#XzzF&J> zL}o2x1Nik6UMDfgWv+i2I$6YraPq?RhsiVO*KCa`^xeP+HUn|wTJnBL;CJm*f%b0r zq#f%&YTNo)?b?>2om-Q%>!&DuXW~xZ1(K6`tle8*!++sAwEq)%%{U#w<~*=HMcc4D zcWsN*FXz$~@}ff#Q6uEcd!ZF#lkj#1@!k~lLlSmD68hvtT)!g8iKh{N&V|qOcr6#~ zGl}J-8U6$4p#k#5*dDhY7UA=dCD@p+ybg+|8M(@B#9@Q=lB zO%9k{FoWGVh3!5CuT68bc)$B+_Po>Mybt-{*?rz|EuH*(A3ORoo@SZPYHOCqW~-P? z@E?&!tIrudSS-@wjs6Ax(1ZE7^XB_C@@j zw)L%UJt|Z(Ih>pp^aS>a(NucvitgR3(YBx7lP`IqYbT$prKw+|)8I|wrEh#r{o~*d z=KYi4zq$q{mo$JcZEJ8G8X*2V$otJc7)KBI@i#taufE{#=Y8XUr~ggnE<*>a_qPGKXB8K@QBaOwSoj z8~qm-O)2Knpb}CBRbDrz8sah8#L%M1nLc@5qesuG^em`Wk2yYk#N)tPeTbtzp=M6S z_>9%q1!dq?&^o7_Msjzp;E4S8$9{+v<0lyQw$7iW{vx1FM-S)f(D7u2#-%_?bLze(x+XMr=g*JBJ)(Ca;-qVDZMaaX?p7#B;Cl(T#Svu9?IC)42Wt{0j%n(amhzkOb(<2#b5SBci$yUEI{8dUA*EOm4< zDkkUp8J_xVIhP@DCsvz54)H_ofWoqd^&x*$ah0=5ZpLP7wfuqQmWTloM{qQN{5Sl~ z2Iv^ZH)&c_1hN0KdvdiAyZ+FLSBlMVQYoK(@orE%wkBx%_C&pn?xPkC-w?aO@`LGo z-s(q^kOlW%k7)14TP8NjEa)9uWI+dO zRv+@9m!!Y|_QE(Z0rR1p?Zp0h_&XZ_8DK}#2_D~>UuMsF{N(xTOQvs)-&VilKkMk7 z*MEJ#{eGiUFW>NI=UXeQoX+ApEoY7DQ&Ynn^+?oN>`B-5je*2z;*?i6gnf=3*Es?2 z;XlB?S;+7#;Lz-xclpz8HJ;_V~Ou25HfV|?W11mQBari8mV>YA|Hs%G21bT$EiK!F&d@Y zPlmL6eFi>Xke)qBRTpxqk=$WJ=d{|eA6ub;mO)$4z|g$9q2FHLG7FjDGg?3?p^zOFJ_Z0LtOGQ1zYstAp3#Q>ZN+E9m(N1h zTbv-aa#?S(7xX-7LV;;x3Z{nPWA&Wko2<6Pr!=c??+{3HKW_5 z>h>9ZZWvPo@~n|Mp$6>4IzH1(Uc3`p=pz5oZ8~8Ue@6qR7bdV9T&xJ$_yvDIe_8E^ z@x0#`^gsS$cbWcQAg0IBmf`cCg}-O(t;O{}9e>jU$bc#HmnlH0uU*o^%hfuxnfljt zPpLC_g}+}#zMUK*^(9%zU$fIQ!QAw5W}D>?$@5^B#SjO2Up}c2YHeO-j_Y;aq(VPa zTUs|yjhVmp*J{fw|K|J`bkT&58r1j1BQ8|w=R>L5wt=|*&gTjYtrg`?E^lP9MSXrFA~lw9c!Uc$KZ1j%n4lPpbv{ zqHP!&aJHe@2L9#b!5F?G`hUpcgxG*C_6qNsT%Tgu-)nL3c-f8?gYoe9=)!2gbhTmV zea>n>X7L*=|6@5o?|D0V-}ld+`_1cM_aF5;ESBNLH72kr2C(rGKKAL-u`He6ldS!l z19krDJ7qPahtaKR#AecvzZuAZbYyad(ZFiHIF|a7=mzSrprQAlvGWS2^{QZ8Vfbwy ziABcZyT`X!o_*CWVL$9~4|pboB6s#AY2*L8rajcVMduRR$G%J>_LxQugW;ai#?fk* zSMk4br(4Ijk^^N|cY4}bRMYy3UlG@IMQ-{gSdZ#)W1{SJStA#&JbbzA)ZH&{YPj+Qv5 z_q?ae&HwY3_nIBeZu<}6&u=t;_RHehah=sqKIPN9cAeUppk04`O+M|lUPTmPgHv)56|-5^F# zQ8|bWx2R@pzZ%|GRyXNnKqGmC2INyUb#m3@0-KRzog>(XW)rTl2h1<<_ovylO{>5j;LO52n<6Sd7J%7pryk03N2qi7ayDUp)4n=jeUsKYQ*sum1<}w{w2M z9y*u?|5;?yEIv>LIe=^I>+$bmwEsJ3;J_<|BoKe2FD2XYKQh2yLj{FmP zAgUG`pa%LwEw!d~v*>^sryooYc=)@TD0X9t+S+L7ZRc*Edo3Ebtl+;Y9tbWR2Uyt8VLtLU7 zd$S39par|2&3pvvaC@)^%s(`L(BcC_7{VjS0MmzG^06lSUHtS{oEFI|nh!QTzoH4# z8N`^zDfpe5L%)$*o?W6A6uPjZs{yfCl3RxRZ?QK_J^UR_@wdg1+_J~+dn^|52cNUg zuCBGT@sA#_J(tCRY?+=jy*!V8GWxX|gSZdvy1X}2=g1Z9-X5eAmx7gC)d@D1?;}4% zo+gF8_2-E3&3K%Gtry?Cq-ba$61{J95M58rVFU4>W?}-o?!`u|-qB)~qtrf!Jg(K& z?}K&gah7ty%HqN1=cVKK`)dlUJ_&sT?;HLJ_#O{KhIDv$iH>YbP-tiwypMdR7Ptl4 zscf22DK$d1Z3~VDYOzx)o2Q`->W84;CTz%dXrT)~p&NN%aex7f8@t>v_+taiE#up> z7iRnU-2Sck1HvC;Js`-+9&+`vMI&-2{$F}9@<;!YScT9op zoLc#O1G?XAfQrUx)lu7EGQjx17F*ElfJW%I9UACD7C1eCFW66>V9@veII+!3I z=<094f~?xAE-;#~ee(OTlgNlx{EC$1E=5Q6>do^WJ-E`S2UkmoZ8yba>R57{NmLWdih9~6T&80OE-T+SO4re!{7WH z5C3`Seu2EkJaz!4ApHo$S?@LK@OKf~zwsIMRgd-XWt0lq`<2%>i4L%Mui1gf0gKIp zyU7Gs_swI|56SSKfBE%=JBO1ooOgzru&{O=-Tq!zFH@V1jhKMmj|OYQJqMX$HEAi{ z;`ubw{(lXhslpblY@31S@dMBub;OVB z@nIV*CIIg@A_I&bn(%E+E;RAk4rJSqkNN?4cN&~LUbK1ulLxjOPcF}DVu~CCb=IBs zU5)(KPeTg2Ri&G!3ibGAzN#BWonJk*h#i1_wfe1J^K$mszx=g9rf2*-Z#3X?O?<}1 zbCC-!ukY+olSRLkM@9$#4C_C7{R{s5Cd&^y-UoZj6WaS{@M$UwC#W$j()r!7IiynZM40}5o{?&Y6Me`(U+^w=kpUUaYu4>mhRHv6u%GAntJ3YdlF7lhrKXl7s z&ts0R)))-!==h!YIz5f7S&P3%f8NnB`i*b+Z={1S^55|1x?J4C;g9`daXNn4Br-84 zepuHIW$Wnr2<`mwzD}HauEftBDujQsJFo@8%W6Rlf9ny;pq^(fE&LXLi<2Smi2pTV zr=2^TOl{9?J$;w067;_7QRe%yz{>j62FkD1dhKk(>rpH3Xl(V64xfNy!fgP!Y?)q*qcTBUXEWc4|h9y{Osuf_c!vx zd;VWJdidMX^+Q0zrlaQhZ8OU=PG(tuOgH@f=1!AN5vxB)KgD)zfqO3!RSYgx8)k7q z%lCSi8~#QI-rsBSx8G*;Z~c_{*}c>eglh9oj}@NWMn7=%cmQ3av%Nn^nKjCQ>w?$2X*#jivoV`)Po!J^Px zXBW&GrhKLodJBKusvB3z_23r$r`QO6)U^zfOB=D;H1bT-^CnkpkF9!Zian z@NjoEAI2-tqR9i#Ubmz9ryjW1Twvg4)q06<93}aiKhHHdjLqpBmm?pP<(tvgNjS(7o)~BC!d3y4$V|tXG(yh9>5qieQusJ7?$_uaEyK{zhwdJ|Z+<=*`aUr)lzK$j+eal{)f6oDQ#}PkrNc zYO-Qf&@txnL%I0Xe*Cf5(EZj=W|+JFLU8o(FV1UJA3CFj{Lq6dx%mArbYO3=BGXz` zKwYWf@A%*FM?Pn^V(TYQ=*lnj?;grf=-W1>#7yeqp?vMx_EEPV6bmv`bkd+MQU88= zGjl$Ecu7BfxSroBS9nMVKG}#e$V=tsOe(LCIA(#*(L#O+z2nv6Y9w#e4uAGi8)P|v zaroVAZ+~pu{ABiKjs5q9Zye@Ju4d3`N2ic$CPyu|PDn_d_?z(`@C&Y0E8uLo?wo7T zt@G8oeZEq+`1`@-as@puR$Oeo>WCxw$W6}UC(OfhhK0YrbCm}8+oLl(noZ*I^S_t> z{dT0Ep3VQa8Y1goGa2U97I?O<*{>y;BMPAA>m>Dp2i8B)rAwhoDQy8atKswb|F`&i zxO>MZSIYGM3BK}eW@GH2c95AHhmXEfcse`*{?=!dW- zYQU^>jVG zm#J5QS<1=kQak5pMrUHBiMRAf!Y^J-FMT zo7amK^|3*{_^z{86rPXJ6Z^T?r*j7rU4P%58+p_L=4s2154G=`N4jw+PQmEh zM?V+ozy@ko*9Fr5Kp)hmd(=B$(ydD`)!f*FjJ6nu^#>sD=jV|5)PL~YB)`?Lbvd6^ z8Zi8g=O)45eC09w?AHr@Zhb|Dzxn&K;BWaMizT5_s7s{JfE=~0aUOT^`-*eu#fzF$ z;FAtr!pFKFP@%Y}KGio)L2D*=*mdkmFK=ji(`?5twVzz4hml>ECm+`0zxMGzs!w#k zarJjv?8Cm-Tk|GwpyhGsvZQEO0mpK5W&<^#KLpV~@B+WR3*AlaAO3y@et=*8`!WAo z|JRWdDomf$yZfy=OKkbl?sz>tm#aJ1l6Ch@fs)A=WFh;rTBO&XCUoiyy^beJ6&>5_ zYP!a#-LI{hL#Gx}H$q<%y}ifCQSJEQF+Bheb@@Py!UN$c=JcGRHu&K8Av*TcGwhao zI<(=sPVc^|=+Fp_`MRk=7}xSVHW;~^NtWqyPyQKpo{o3?k6yGr9_M|d)Rx=wk@qn= zu*V~_)Q>;|X6Ku4<9tMDX&T*a^@LV)<@gWz>W|;7I6CMwAC)+HYT}@R?$H->p;0fG zVba_&0qvMBHv7+XfZuNRFj;#v9{nTy{c$9}4Qq7pkMOq~#~1qHTuW>5ch}DAyr&EQ zIQU_me%@Z7;~QdhXm=3$xm3l2%;P{`XW&C86KA)+Qjh1?96T9H`!wQ|*@?O{W zMC!(YPddJh*$ihx^@-x&JpA_*W;ETr+oNOf{$2EV3o^y>D`UjyTbh>j^k#`R{`H=A z{%}u6=zZP4E{J?kh~7PE)RP<4x{mz6bGB3`um_H8cnkLTb!5wRYE3Tc;=Z%gibrZ< zl!haIm5{Gyms-BY{N71)fysG)4#4CicoGwzBt~lW0V9BHYnU|({v+T%jH6_|MaJt> z=n%^fOhHe6T#%vc=dX6dDh)sjGwcUpF!hs<%1fVB;H_TWxbRuAF)bPl?6hu*|Nt@0o-rtWLTB z`}x)>?0_w4^jp2ujk{sg>-Q-KUoewcO*(X7J?2jSn+<3_JhCAXonXJWwrUc)I1?T6 zPM5Za>fH9X;1{SJ+n*{lsYTh?bHU7RId`&J7fux`HKkW$%+Q%;zb62qnYl%GFQqXr z>85sm9{^7WEBIcq(i6Ior}P$HDA9}CUCid1(T$VDFW1ql@M91&+iv5-UWabaG2`is z-o1FOrs^8`hWeTFGXmd|k46tnVE;pA?5m%T?PztMCjW-PcMz<-HH^$3o+ob1bq$aM z95xySf6J$i+n#~RZ~KSMZZjPG%h{EN9lE8DctvXLxE@}uRzxWEtkft>L67#D=_7BM z?eCU7$7@!f?6BuJfqXJPUR&qu@wNFfzr!6`vFAJ;=RV8l*S^nUk&|4<#3G$$yf#eE zG%~mudn=tDfe7^TGrf+_rB;txF=DSd$h0(UEQyc`spTx)eO2{Wf(iajPM(t6^yq;Yf)YZd{Idx-ySI3-#RUvs!+Mxy`NAQ5dCMKQ z4^nr?>YqYSVn!q(?Q%9Kxh2=fj7*y18Yfqm*`;6b=W`|xj6T--jE3*p*rE9oUM|37pXDb!8gPD~ z$rX5G7CNvQIrU{Tx_hERm-iKD|E8BZd^SkQHT}c{>D?iIlL@a|9Kb*K0eL`PFon9{ z3HB>DZCDo%Q1i#^f?u|Lz^7oA;x1+xYzxI7s?$5>LtH*vtzc@B+sNb0z*m##*eUEZ zA2YP#-n7v3@l+fBb`Je>StSKcf;{NuVD4Jggeogm^qHE(w3J!=Kc7NhO)$@`NoTfZ z>*VH-$blEkOSsMPD*f`8bztLp9o=<77mo$#-qjZh35sVv&}ZeOw=jESMpK-B!eqYH zh|O570Cl8RQ%>#h5U*MOxVCMSI-?=#OD0_{rP&jcU~4w@+L)1hjBGG@Zg#udTcowg z*eUev7`dk|{Kg(?7Jb+hqwMzx`e>B>9|Myw3wbn#ooPMHV=U5E?2qXlG#WH#7JG*vVN1K*nXYbm7r6b-=h1eH$R!FD~D5cG^_gST=uV+~`uXlxcT2VHZ;$lt|2V4~m){{biLozAtu5osS8a0rEREy= z%IO^_X8u=NDzon1O;TrAtFzlPh!M~ejovzhJ~*=Jj*f4n;Kr-a)NP$S z9HihEY1FFsX&jm3LrITJlHUjK0s1N1h#NN#%usi>qF!nkn$df8Ez`&W-Ul&Gz_%0N zZ!};s)A69~Gka)#IJ4#}8Yaa5*4E+7KpQj20n_7S*d=4^y^rr2g$C@gTlnW@hgd)R zsJk|F6EryiZCc*K@G~3U>{-{dfLw5Om*BS6A26BzwT)=<%IL?V4Lf>yD*q9`0LfwX zyN%55xptDi`yc2L+wfFD;f3@A&8Ps(Gu!C>19O}GkxA^x&Gy1K=wQ}Qbl4!h$O-!8 zK%^d?P1Ws_%tt*}qPyp7bYfqcu26UI=x&idmk-jnkDW}OZGz%7N_16KGNP-;ne&CO zxApt03VM{N0djDYLe!7Ic)j7S=BesQX{%dT^srAlVv))wE(;` zbrjvT|2t-UerG!2xz6o)L!K*42e&@a-5XKFWJZ`9V}3pO(?2-EV;{9K12&hb#Yc{r zm?1T$?c|$V_{}Z&bnVob4Z*jDzhN~FR))XH)^X!8*>m3K;>^6q za!QlPgE45shwW#*sb*)o9#tOOb3Th%us0*?U(mTE+0^l#qe5* z+qW%~16&|}PcFx302{FKGdbnJP9575O^ogx_F1g%gZJxzX5FPXY}fi|9oY3w5#bfi z&X_^AP12h+Z8;fuFCnrHTLFwVzS1wp!|~;+)zik@*Wz(KA(wdWNR;x6J6wIn7&5pI z$Gd~N;0|Vr)irTl>0|g=^}2h8Ji$Ktl<{Nte;>&V$arkpLftu8uG2dsl@MD2&7rS| zeUGDehO9=E9+II^^gTRZ(@dQyHD-;-xEksVYUzh*Xn_uhhkN)N-lnrn|66=;lznwH zU~+%ew=?{0@BKLVeb5~<|-#+MU1mDI-&f4Od9u0WBZ*suS|7ZAn^54+`xZBbEL+gXfNbT0qE$Q0) z-5YJ${ZubLl{1fpSfI)L)?1oZUDni zI<@bEDys&ZJ!HSncz4i8-5>etI{H{ziLbR{hgOwRQxZ9-7uOpVaJ)*7ueLGQw^NTV zwdooDW*KvXM#%+^!B-89LrP7pR5dg929YziI^c7wDXM9r-jrIYI&zuyR)0e6&j=Sj zW&Xk{{$`_3LIXao$H@ft+G5I1FCgzHcx<+!4<0xFY7ALEj7?#EiTyZ~1IV3z^kARs zU$Y)I>ucmSmc3>@twYSaFq?D)`_yI~SR8v8p7F;vp$oHLSu@a`_57K>_xp&P-}$?% z@eZE1SfJ;tx+C=CX5VnFmM5@2LdXg_usX3ZU7$v2m&ww-p*nv4gHqVLBIbdlQ@3mO zpVb7}Y*LHoH#aO(?^R3femMU63tc!Grhs!vddi&ER}Wi=hkn-k*OltTm#}`EQ4E?< zl0_D$8#4T<^*Y3Sr^DMqbnSSe;@);C_HC=4-=r7$P@10ID5aNa%Kc7@XS-fkYO$=x zx1kH1I(*DwpV1&Sz#~K04E4+lFP&EnvBv63W=_zzVEST+nxFyV!=DSr^z;_9R8EHL z_3Iopv`;`!an`#$fL!gR_s%WfoQr$)GOw@~zw7H|eU5$9D-0S97~LQT29XQ4 zhM|cePT*!Si<#z9T%{b!gWsT|1wsXE!UU zooi4jJp;w1qiSYPN06~&*fXOTwWAE+9ml4!*lF4);*TfubZ&nf^RKG)kePVbPQ<~# z`3k&VkKbRdqP%Y6aCUtbBUzn&fDW|UzRsa>a&Du1|CDC=+umn%GG%-L7Kl~<5&yr5 zIPBevVrA1I-7pzOin@pWg0c+aq-8 zOaijDLa*+$>2+W|dxxAdJ%)Vq!9!+ukD=>)vxYx0SLAM9@;o*FCG`Ci>BCdz6i}CR znp|Jt?J|Yj?N;E8D&=K1yIMwzm%Dlcc+K)xR^w=K^=ag+=~!2fft@|);_OD>{9gM9 zU)t}AjjAC|k)f;P6|Wu7C8k`fN7NfsqxTuHsc!hRpT47EVp9WFM~F@^pM9Jdwb|X~ zyPN*E@AJolc#ZQ}zp%-F%QcuCH%!uC02{Y^c#fQu)g-S_m&jhNVsHLMH#H<(;Ou%^ zsa@=V=B$RXuIuIPM2Y!rXrk{vz#*-swZT(z3=C32dz+Wlh;^BP_&@I#5pxZWJ( zy{iR4-)5i#Y@TC1{UA>-mFf($InN#aq{rlHZk(&q(+6eL>)>mHi;t#|F&NP;c+~u0 zlmEl?i+z08tIH<}^!iboUfpidxxM&}Cz2J-T%Zq6sagJ+I8;V0`pN35z#kgrm+)JN zTd?02Kebr5Kep@1GouaDjb{5YO9_6gp{MNbrEFb2maVtXYLpi1)3fXCx^gZ@Y1~_Y z5E1b{zl=3`Z#v&>@d@a65}VQLhx~cuRs78c;5k3fL4!OteLRGnHi&)GKQ*lu=Grv0 zSZ%WPD6*U$5WG#?9X{`*54+R)S*cs^gjf7W{151$)oPzvZPa9$JTjTkJpxTJ2cZ}J z;PpQD;lo<5>)@P!SsdFioN@jLF;Di))gwZqYvVsg4=xwXb$>aMo3h{0(j;u}b{+UB ziQeru%=Ic$Df!@R?EYlzKkEZGI!MM=s>+|ylZ(s@A~$#ZK&Zmr4(s~mR&t;l~Cvwx_!JWFv zePce6(>H%_g!qd$PpS`l!FaK&msmdhYBAt(;&Z0sosEwSH9m7X*N)JG*?ZP^WIWkV ze51Z~T%Vyk>t*lZ8cYuuopsUIVEA_teC`C-cJpna0qc3T;}`s?$1?m|*!xywLJPic z`ylnH$R(2C}X!wopTmHmMs&xgQ2T_l?WRiceV9)$4t_ zM-IHXVchl4SpA(38u)@gig_H{wg;Osf;ymIh!>qd5sj{A7RmK$upd!iK$A|=vv&4K zFgiN_H~7!v_jvd(L*G_sXEPp69{lDvnQVg&`nlftcm34y7UpBpus z7WwA4*Qia#ek?8>Q4@Yr4>Z(+uW8t~GGn8S8fEKS>q54h>~CX#f5-pe-%1^h)iqk5 zO9P*4Ax>qVZ{}VJ)&p&HYBdi|4nPMs`^d-NKI}v{1Bq+2d5BK_ugZWw#UC0r{+dAl z#lIWYL44^gn}V6|TgVJ*YGK##zu|B9A<0hY*X8}(o8kK)-M*8lxb!8RI7tonFQsaz z8^zCO-z>L^pKJD?=~ANuiyQaS6Bx$4*kj;)^<1W&GFvV?wO3757d zDS{m4caCrzMBcSwI~G^bOT?Vic5J;4bb!^S*5eDAuhE80)dnBe6Kk~Ire@}4wIXw@ zpP>n!Z^YheVxMc#wN~%kz;g|}R!{7s$$DO(p&n#_fBp?e^wuCg!XQVBV{^+a@-yVQ z(FfMgYWwFcZ@__gY(}KJFOAIv z!46DBc3#|{#+>3{Jqj#VY|flcU7#lFR z6JxS|W}9hYafdSUUDoSp{Z7r$Wdrq6b?DeSVs2H~+12>n*6&h}KJf5wgATfpA#Uyw z=Ne>xJsKF|cT=8lhsXJ!X99n3MS!>=r*r`6^fv>;b2v7-vh$5q`7-%~4L^1cqdYg@p* ziF=6D&C%~T@8m!|`B*>x=qdQWn^`C}^T_#x_*bS2{4{_qV|$Gs>fyh(#>9JU^#)&f zhTmiUlHvd1RVOupN!rbQ?e0G>Rxxx~V0C(D>p~hY<1%QpDTTeATOPfJ4*bA*(S`t`54pc@V|x>;t;U`gUx7i``eiW`MrF-^9GhkI>0WJ$YNg9I0i6rE;IAXT8dVUxtx+rV~fu zH?xl{4({+rKXtUNAbV?c^J1pz8z!BfH9;)H>aKdAu`uvIxg|;`nH8FpQbb&XdLEYX zK9)cKEGC4_XR$BV1hip!5g*rI*D#^@*k*lt+lNn)M}0~$xe6b2M|{-qM+RB0&El(F z$lO%!A@(tbeiLTc#zu3Gued&BF}^%>)C3+;5q*jYAH<&XsS})i&X@Mvo#uP;HLf2Z zE4`7L)F$LcGa%y{MM>B{H?L1>IUYhOJ;2;_>0pzLG zGkx(@xNeJIdvQV2|2Fr|*#lw!ZT^yd+UROBI}tO#2iSo`H@R0*t0fA z-u%F~588?SCo+RNRKcIBsT;zt%9!O|9s}gt`TgWpEr(_JTTPweZ@!@Q*S9q->(TX6 z>H>;gZH&!pvzc916Vyd-=)1=a^eGkV{66mM6j-P>c+2W<7SL6$#|nF34&0~7rA!!> z#BN&K*vqVbdbK`NM^Z@~xt*D)<$8I)L5=j38f{H*J*H!Z*&8=UmTSzT1~ojQM^RDS zV=8(|SMU!Sf6<73a`=OL2k}Cy-|NPYH2mE>Jc~CY2L_3EIa?4qcld+3S3lrk zZ%4=X#``RjtCQFY9r(h}?^Tn}No7{VN4-z!Q~~FsVqH~@U{=t?c~h3F&N z7owLROPTS+%$ag@K*%Waazee(jmcZHjeW>O(~+a#KTQ0x3Vj<$-C!DnAxtit4`ugH z8|B(Nv3J8?bW-c{nLdCVJ))L2EosQbK`pOpaVuxLK;tvW@E&aB(tPSrUpCTDl&Y&| zGQq2pTA&`?xL8BoNDKFA!|wq9ajs>8bC|8+LnjU3@6_inkV7tbTq-rbIF zpsrvLn~xcMRpc3)u26bD7&$ zfla{PHesW-5L0XicZ(gl_#i%j&BN;^w_q_rHxrfLHv~^uzQFj;;#Xcw_)EUQL`70oCwtG zs0!xF5Yumzp1mE_0Wp+zTSFnEL5F zXaicPMdmhJe8^&l*b?0qM?zNHURqqRn?7fg0mlFR;6B8@kFuBMYg>HEY$W4z&-Qai zyU$i?! zZ=>qzC705v^?vq#L}yQx;YZiN&*){#S6S|dy&lE(Z^M_($Qo1;Jv)6CU*kH*h-H}^ zpFrof5&H~#$$esv7c1m>lQPrB_4Y*z{Z{>IW*=zz`VGNM-#jfBp#`|_30jocmgw~7(M#)E5PPzK?j8fu9m6<(?UtoDk zY$x7t{;SO)wiz?&$=HGqYlsVVG8+Wn3Obx!nt*n>-yky-D$6I(Y5CMJ2T`Yfm-{(g zWERG0MSc3j^>k2IG)QlvkN6F~Mf;RKV*^xS>(%j_O0n_G&Z{S0RRga%nZPyW7BMrm z0{o#F>vK2!EsoT~>`jX$TVBa#;B}8tXEr{wI{%PZ6tr$Jpm9L`XZV{)_rny^n5p{7*}cf?~$F-)XU) z2Nn?D8bz;|-H%OdwgCHD*F2*%;&0W|N1C5%exco))ABT9$kQI;A|FE9^~=#bVlb7& z(B`Qhnm}GyU-*Et+v|ugzI>Xm)BB@z@l*!fd2R6+n(y;md85#(<5rtujttR)ATkyQ(;*-I(v*gnW2UO zoj?sj6@BY<{JwJR!?H%R^RNl1yDw{)RSCTjpR2J6nz>&TzpVxAf5o316?tS2|K3Tk z=NfJGlYn9UuL=CI?MspkEyRqSL7+5-)dD#EcYQJrf0Pj{b2L@X&rS83HZ%#b$sVzYLp-81o&HR>YvEP>(O%j6CQ- z_ghZFY<@Qv7ah=x?C(YQ_aOUS4T;%*%)Yf*`BvLHN_@id5)OZKyp#XnZ1upFvoxQ{ z`XgL_Jo>bdSlQLH6*|Fv&OgMBD5nYDhaPQ4i`jnG1Mcy@)q+0@Xw~7(+&=)l`!1fI zKk&DEzr808c=Z}HflqP|-uK1Sei^RxO&PXeT*uso;*w$XqU8gT4JP;DeZ${svCkqq_Uyb17T3t;a`o0j`{PC>{9phe*Cphn?sAiW-o+S3}>__;25Pe-$!@L3F z_tqaeNZw_F^MAn~ES>yEPmV!%RtM@c*<-4{~y+)-(y0TkCtig4^i|~KSu}Lr55#`PHei*Y`a_Ztpw=s`YY_$8ERy1 z=-sObXt{T->~jmYw&e%9@kyNCU)BG8?5pL3d$Ile zGq5fHL@p5dHfp?pPiH*$HU5?hG&_2H0eMK?&+4&yiA8)MR(65@tV>tR6vNEc9CWDF z{94cc*Zu#7|HDh@3g&(vKN6=8%olP!gV?vpRouJzG4ouGe%8%^9JLecwK(($GRa~U z^=-`QV76y3`HvCv3&75>cldMNeZ)6nLwm^8=Tb{jNZ%#)9`xHo-Yz1zpP80LI==5C zv%<>NiY|3I1+W}vSzV0PbCj3QDlu&Y8A=To^1y2U{P=S&{10y#{$CdO8y%RwcR35A zDVE8DL9<)g>y&ivk8`t0*UuNxhfF+~^I3g(J3dG_^U%-i&!CTj9+)4W(5H5v{uJ%qPj9@$J>D);BmD?_g8IbxQWX`q61V7AC$(+e=m+!fZ3c2PwN_>? zSq{#;w7C{6F* z)KI61tOmdG!WsHa>vf6y4Lo{~!z{3Id>(2bsIQtJZ(%jlR&!_g7ho?WWng18QNs%;CFU|DQo5ZwEz1F)JC z<9pY?2If{jXz`yx(_h5JCh?ig2e7<_i}~W~Ss$Cl$;a5c!VF@i`16;q)N#KT{7%#R z*d?a-?Vf^vg#WV}P4o@N>BO-Zg>t`%^cL#G&|O)?IFc*r_kA*?69;Pa`gw(V5z5wE zJq!j`!(w`C7+-G0Ff;s32A~Vf7w96+@$p@k0?ro@duxVHsF5Ld5+2;@YB;W(Ohp${ z&rN*R?hP^s4UAjt9c&H%0px#a-Lz~jgz3&vc-(Rh7Jsl>q_y~ak0-%@($Rrm4teru zoIN++#J+zFU*2rXwB!*zywa#!7fY4F42l-^sf$`c%0A>Ho>YO&{_<|Et{%wI&s#Ee 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 literal 67646 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 U$^5!t50tOVCyZ47oXe;G53^4nod5s; diff --git a/cutejava-ui/src/api/system/code.js b/cutejava-ui/src/api/system/code.js index 0d2e4c27..5202be2d 100644 --- a/cutejava-ui/src/api/system/code.js +++ b/cutejava-ui/src/api/system/code.js @@ -1,8 +1,8 @@ import request from '@/utils/request' -export function resetEmail(data) { +export function sendCaptcha(data) { return request({ - url: 'api/code/resetEmail?email=' + data, + url: 'api/code/sendCaptcha?email=' + data, method: 'post' }) } diff --git a/cutejava-ui/src/api/system/user.js b/cutejava-ui/src/api/system/user.js index fee2d844..81caa68a 100644 --- a/cutejava-ui/src/api/system/user.js +++ b/cutejava-ui/src/api/system/user.js @@ -65,5 +65,17 @@ export function updateEmail(form) { }) } -export default { add, edit, del, resetPwd } +export function queryUserMetaPage(query) { + return request({ + url: 'api/users/queryUserMetaPage', + method: 'post', + data: { + page: 1, + pageSize: 50, + blurry: query + } + }) +} + +export default { add, edit, del, resetPwd, queryUserMetaPage } diff --git a/cutejava-ui/src/assets/icons/svg/Cronometer.svg b/cutejava-ui/src/assets/icons/svg/Cronometer.svg new file mode 100644 index 00000000..5980483a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/Cronometer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/Insurance.svg b/cutejava-ui/src/assets/icons/svg/Insurance.svg new file mode 100644 index 00000000..fd66e860 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/Insurance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/Sign.svg b/cutejava-ui/src/assets/icons/svg/Sign.svg new file mode 100644 index 00000000..59c9e6f2 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/Sign.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/account.svg b/cutejava-ui/src/assets/icons/svg/account.svg new file mode 100644 index 00000000..0499445a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/account.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/activity.svg b/cutejava-ui/src/assets/icons/svg/activity.svg new file mode 100644 index 00000000..0608eed4 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/activity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/add-file.svg b/cutejava-ui/src/assets/icons/svg/add-file.svg new file mode 100644 index 00000000..eccbdcb8 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/add-file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/add.svg b/cutejava-ui/src/assets/icons/svg/add.svg new file mode 100644 index 00000000..2ddbd0bf --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/add.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/aim.svg b/cutejava-ui/src/assets/icons/svg/aim.svg new file mode 100644 index 00000000..59dbc1b0 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/aim.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/alarm.svg b/cutejava-ui/src/assets/icons/svg/alarm.svg new file mode 100644 index 00000000..f6453405 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/alarm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/archives.svg b/cutejava-ui/src/assets/icons/svg/archives.svg new file mode 100644 index 00000000..0c280b74 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/archives.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/article.svg b/cutejava-ui/src/assets/icons/svg/article.svg new file mode 100644 index 00000000..2df901d5 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/article.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/asset-income.svg b/cutejava-ui/src/assets/icons/svg/asset-income.svg new file mode 100644 index 00000000..ce25f908 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/asset-income.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/audit-log.svg b/cutejava-ui/src/assets/icons/svg/audit-log.svg new file mode 100644 index 00000000..7c3e5220 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/audit-log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/authority.svg b/cutejava-ui/src/assets/icons/svg/authority.svg new file mode 100644 index 00000000..09810e63 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/authority.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/bak.svg b/cutejava-ui/src/assets/icons/svg/bak.svg new file mode 100644 index 00000000..4610dcb5 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/bak.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/banner.svg b/cutejava-ui/src/assets/icons/svg/banner.svg new file mode 100644 index 00000000..dc9b7c03 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/banner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/bargain.svg b/cutejava-ui/src/assets/icons/svg/bargain.svg new file mode 100644 index 00000000..c12661ba --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/bargain.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/bigdata-screen.svg b/cutejava-ui/src/assets/icons/svg/bigdata-screen.svg new file mode 100644 index 00000000..1648c7f9 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/bigdata-screen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/bill.svg b/cutejava-ui/src/assets/icons/svg/bill.svg new file mode 100644 index 00000000..01827a04 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/bill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/bp.svg b/cutejava-ui/src/assets/icons/svg/bp.svg new file mode 100644 index 00000000..84db1d92 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/bp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/briefcase.svg b/cutejava-ui/src/assets/icons/svg/briefcase.svg new file mode 100644 index 00000000..dbc08acb --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/briefcase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/build.svg b/cutejava-ui/src/assets/icons/svg/build.svg new file mode 100644 index 00000000..05dba9e2 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/build.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/business.svg b/cutejava-ui/src/assets/icons/svg/business.svg new file mode 100644 index 00000000..14d189ec --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/business.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/button.svg b/cutejava-ui/src/assets/icons/svg/button.svg new file mode 100644 index 00000000..972e2631 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/calendar.svg b/cutejava-ui/src/assets/icons/svg/calendar.svg new file mode 100644 index 00000000..f355e6f2 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/capital.svg b/cutejava-ui/src/assets/icons/svg/capital.svg new file mode 100644 index 00000000..271e9f6d --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/capital.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/captcha.svg b/cutejava-ui/src/assets/icons/svg/captcha.svg new file mode 100644 index 00000000..d793e9a2 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/captcha.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/close.svg b/cutejava-ui/src/assets/icons/svg/close.svg new file mode 100644 index 00000000..f8a4b0ec --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/collect.svg b/cutejava-ui/src/assets/icons/svg/collect.svg new file mode 100644 index 00000000..38f267e6 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/collect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/comment.svg b/cutejava-ui/src/assets/icons/svg/comment.svg new file mode 100644 index 00000000..fad4b679 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/comment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/compass.svg b/cutejava-ui/src/assets/icons/svg/compass.svg new file mode 100644 index 00000000..9415742d --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/compass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/configure.svg b/cutejava-ui/src/assets/icons/svg/configure.svg new file mode 100644 index 00000000..0b0591d5 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/configure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/contract.svg b/cutejava-ui/src/assets/icons/svg/contract.svg new file mode 100644 index 00000000..624c6010 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/contract.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/copy.svg b/cutejava-ui/src/assets/icons/svg/copy.svg new file mode 100644 index 00000000..55c197c9 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/coupon.svg b/cutejava-ui/src/assets/icons/svg/coupon.svg new file mode 100644 index 00000000..5a025651 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/coupon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/coupon2.svg b/cutejava-ui/src/assets/icons/svg/coupon2.svg new file mode 100644 index 00000000..b3a003e7 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/coupon2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/cpu.svg b/cutejava-ui/src/assets/icons/svg/cpu.svg new file mode 100644 index 00000000..af69b338 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/cpu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/crm.svg b/cutejava-ui/src/assets/icons/svg/crm.svg new file mode 100644 index 00000000..3b407d3e --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/crm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/custom-manage.svg b/cutejava-ui/src/assets/icons/svg/custom-manage.svg new file mode 100644 index 00000000..76db5ec8 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/custom-manage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/custom.svg b/cutejava-ui/src/assets/icons/svg/custom.svg new file mode 100644 index 00000000..7b479a87 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/custom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/dairy.svg b/cutejava-ui/src/assets/icons/svg/dairy.svg new file mode 100644 index 00000000..cf3a694d --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/dairy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/data-analysis.svg b/cutejava-ui/src/assets/icons/svg/data-analysis.svg new file mode 100644 index 00000000..adf1cf4f --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/data-analysis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/data.svg b/cutejava-ui/src/assets/icons/svg/data.svg new file mode 100644 index 00000000..6a88e50e --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/data.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/debt.svg b/cutejava-ui/src/assets/icons/svg/debt.svg new file mode 100644 index 00000000..cba05a85 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/debt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/dengji.svg b/cutejava-ui/src/assets/icons/svg/dengji.svg new file mode 100644 index 00000000..e2cd8cfe --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/dengji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/device.svg b/cutejava-ui/src/assets/icons/svg/device.svg new file mode 100644 index 00000000..a192cb93 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/device.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/disc.svg b/cutejava-ui/src/assets/icons/svg/disc.svg new file mode 100644 index 00000000..d28447a0 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/disc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/document.svg b/cutejava-ui/src/assets/icons/svg/document.svg new file mode 100644 index 00000000..2e073647 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/document.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/dot.svg b/cutejava-ui/src/assets/icons/svg/dot.svg new file mode 100644 index 00000000..1e9d9b97 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/dot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/end.svg b/cutejava-ui/src/assets/icons/svg/end.svg new file mode 100644 index 00000000..21f457ce --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/end.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/energy-manage.svg b/cutejava-ui/src/assets/icons/svg/energy-manage.svg new file mode 100644 index 00000000..1301f18b --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/energy-manage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/enlarge.svg b/cutejava-ui/src/assets/icons/svg/enlarge.svg new file mode 100644 index 00000000..bce8376e --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/enlarge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/excellence.svg b/cutejava-ui/src/assets/icons/svg/excellence.svg new file mode 100644 index 00000000..e83360f1 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/excellence.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/exit.svg b/cutejava-ui/src/assets/icons/svg/exit.svg new file mode 100644 index 00000000..81460821 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/expenses.svg b/cutejava-ui/src/assets/icons/svg/expenses.svg new file mode 100644 index 00000000..fb9fa11e --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/expenses.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/exporting.svg b/cutejava-ui/src/assets/icons/svg/exporting.svg new file mode 100644 index 00000000..1eeaee7c --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/exporting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/express.svg b/cutejava-ui/src/assets/icons/svg/express.svg new file mode 100644 index 00000000..667528ef --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/express.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/eye.svg b/cutejava-ui/src/assets/icons/svg/eye.svg new file mode 100644 index 00000000..4f9086b4 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/fee.svg b/cutejava-ui/src/assets/icons/svg/fee.svg new file mode 100644 index 00000000..518879f3 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/fee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/fenxiao.svg b/cutejava-ui/src/assets/icons/svg/fenxiao.svg new file mode 100644 index 00000000..943263d3 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/fenxiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/fiance.svg b/cutejava-ui/src/assets/icons/svg/fiance.svg new file mode 100644 index 00000000..f7e5b9a9 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/fiance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/file.svg b/cutejava-ui/src/assets/icons/svg/file.svg new file mode 100644 index 00000000..cf13d2c0 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/filter.svg b/cutejava-ui/src/assets/icons/svg/filter.svg new file mode 100644 index 00000000..b01d6266 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/finance-debt.svg b/cutejava-ui/src/assets/icons/svg/finance-debt.svg new file mode 100644 index 00000000..4bb5948d --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/finance-debt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/finance-repaylog.svg b/cutejava-ui/src/assets/icons/svg/finance-repaylog.svg new file mode 100644 index 00000000..6371fd3d --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/finance-repaylog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/finance.svg b/cutejava-ui/src/assets/icons/svg/finance.svg new file mode 100644 index 00000000..89149d09 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/finance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/fingerprint.svg b/cutejava-ui/src/assets/icons/svg/fingerprint.svg new file mode 100644 index 00000000..e3911ce3 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/fingerprint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/finish.svg b/cutejava-ui/src/assets/icons/svg/finish.svg new file mode 100644 index 00000000..c1947fb4 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/finish.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/fixed-assets.svg b/cutejava-ui/src/assets/icons/svg/fixed-assets.svg new file mode 100644 index 00000000..90b0e925 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/fixed-assets.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/folder.svg b/cutejava-ui/src/assets/icons/svg/folder.svg new file mode 100644 index 00000000..2e3c9f22 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/gateway.svg b/cutejava-ui/src/assets/icons/svg/gateway.svg new file mode 100644 index 00000000..dcf48279 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/gateway.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/generated.svg b/cutejava-ui/src/assets/icons/svg/generated.svg new file mode 100644 index 00000000..c40e9237 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/generated.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/gift.svg b/cutejava-ui/src/assets/icons/svg/gift.svg new file mode 100644 index 00000000..6587643e --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/goods.svg b/cutejava-ui/src/assets/icons/svg/goods.svg new file mode 100644 index 00000000..0294e022 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/goods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/history.svg b/cutejava-ui/src/assets/icons/svg/history.svg new file mode 100644 index 00000000..19ee9e53 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/ic-yesterday.svg b/cutejava-ui/src/assets/icons/svg/ic-yesterday.svg new file mode 100644 index 00000000..fae35c23 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/ic-yesterday.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/import.svg b/cutejava-ui/src/assets/icons/svg/import.svg new file mode 100644 index 00000000..cc8cd953 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/import.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/info.svg b/cutejava-ui/src/assets/icons/svg/info.svg new file mode 100644 index 00000000..47417202 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/interface.svg b/cutejava-ui/src/assets/icons/svg/interface.svg new file mode 100644 index 00000000..bd3a08ac --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/interface.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/invisible.svg b/cutejava-ui/src/assets/icons/svg/invisible.svg new file mode 100644 index 00000000..9cf919e5 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/invisible.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/iot.svg b/cutejava-ui/src/assets/icons/svg/iot.svg new file mode 100644 index 00000000..73adadda --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/iot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/knowledge-base.svg b/cutejava-ui/src/assets/icons/svg/knowledge-base.svg new file mode 100644 index 00000000..54b2bddb --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/knowledge-base.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/lease.svg b/cutejava-ui/src/assets/icons/svg/lease.svg new file mode 100644 index 00000000..15c88a7e --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/lease.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/life-dairy.svg b/cutejava-ui/src/assets/icons/svg/life-dairy.svg new file mode 100644 index 00000000..a5f2f5a7 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/life-dairy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/life-journal.svg b/cutejava-ui/src/assets/icons/svg/life-journal.svg new file mode 100644 index 00000000..4ccbeb78 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/life-journal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/life.svg b/cutejava-ui/src/assets/icons/svg/life.svg new file mode 100644 index 00000000..8f1234d9 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/life.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/loan.svg b/cutejava-ui/src/assets/icons/svg/loan.svg new file mode 100644 index 00000000..c807fe93 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/loan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/location.svg b/cutejava-ui/src/assets/icons/svg/location.svg new file mode 100644 index 00000000..6926a9a7 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/location.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/login-log.svg b/cutejava-ui/src/assets/icons/svg/login-log.svg new file mode 100644 index 00000000..1c30fb49 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/login-log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/logistics.svg b/cutejava-ui/src/assets/icons/svg/logistics.svg new file mode 100644 index 00000000..72a37408 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/logistics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/love-hobby.svg b/cutejava-ui/src/assets/icons/svg/love-hobby.svg new file mode 100644 index 00000000..6a716f91 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/love-hobby.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/love-log.svg b/cutejava-ui/src/assets/icons/svg/love-log.svg new file mode 100644 index 00000000..f226362c --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/love-log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/m-cockpit.svg b/cutejava-ui/src/assets/icons/svg/m-cockpit.svg new file mode 100644 index 00000000..3a3ce28b --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/m-cockpit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/mail.svg b/cutejava-ui/src/assets/icons/svg/mail.svg new file mode 100644 index 00000000..e1cc4e8e --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/mapPin.svg b/cutejava-ui/src/assets/icons/svg/mapPin.svg new file mode 100644 index 00000000..bf72488f --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/mapPin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/mc.svg b/cutejava-ui/src/assets/icons/svg/mc.svg new file mode 100644 index 00000000..8a9c482a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/mc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/minus-sign.svg b/cutejava-ui/src/assets/icons/svg/minus-sign.svg new file mode 100644 index 00000000..4e7eda29 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/minus-sign.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/mircrophone.svg b/cutejava-ui/src/assets/icons/svg/mircrophone.svg new file mode 100644 index 00000000..7b01e0a1 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/mircrophone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/monthlyview.svg b/cutejava-ui/src/assets/icons/svg/monthlyview.svg new file mode 100644 index 00000000..8657dd5b --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/monthlyview.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/music.svg b/cutejava-ui/src/assets/icons/svg/music.svg new file mode 100644 index 00000000..0eb52c03 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/narrow.svg b/cutejava-ui/src/assets/icons/svg/narrow.svg new file mode 100644 index 00000000..98ca8546 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/narrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/news.svg b/cutejava-ui/src/assets/icons/svg/news.svg new file mode 100644 index 00000000..b26e1e3b --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/online_user.svg b/cutejava-ui/src/assets/icons/svg/online_user.svg new file mode 100644 index 00000000..f934aca3 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/online_user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/ops.svg b/cutejava-ui/src/assets/icons/svg/ops.svg new file mode 100644 index 00000000..87d5d7e6 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/ops.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/opus.svg b/cutejava-ui/src/assets/icons/svg/opus.svg new file mode 100644 index 00000000..d28e4dc9 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/opus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/order.svg b/cutejava-ui/src/assets/icons/svg/order.svg new file mode 100644 index 00000000..df06451d --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/orderinfo.svg b/cutejava-ui/src/assets/icons/svg/orderinfo.svg new file mode 100644 index 00000000..86e919fd --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/orderinfo.svg @@ -0,0 +1 @@ + diff --git a/cutejava-ui/src/assets/icons/svg/performance.svg b/cutejava-ui/src/assets/icons/svg/performance.svg new file mode 100644 index 00000000..4848f766 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/performance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/phonecall.svg b/cutejava-ui/src/assets/icons/svg/phonecall.svg new file mode 100644 index 00000000..e213baed --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/phonecall.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/picture.svg b/cutejava-ui/src/assets/icons/svg/picture.svg new file mode 100644 index 00000000..2c31589d --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/picture.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/plan.svg b/cutejava-ui/src/assets/icons/svg/plan.svg new file mode 100644 index 00000000..8708ca8f --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/plan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/plateform.svg b/cutejava-ui/src/assets/icons/svg/plateform.svg new file mode 100644 index 00000000..eefe95b4 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/plateform.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/plmt.svg b/cutejava-ui/src/assets/icons/svg/plmt.svg new file mode 100644 index 00000000..91d012b5 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/plmt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/plus.svg b/cutejava-ui/src/assets/icons/svg/plus.svg new file mode 100644 index 00000000..07b396fb --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/pm.svg b/cutejava-ui/src/assets/icons/svg/pm.svg new file mode 100644 index 00000000..079a1fd6 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/pm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/points.svg b/cutejava-ui/src/assets/icons/svg/points.svg new file mode 100644 index 00000000..7c450d5c --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/points.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/post.svg b/cutejava-ui/src/assets/icons/svg/post.svg new file mode 100644 index 00000000..62b4b33b --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/post.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/preview.svg b/cutejava-ui/src/assets/icons/svg/preview.svg new file mode 100644 index 00000000..1c880a80 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/preview.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/price.svg b/cutejava-ui/src/assets/icons/svg/price.svg new file mode 100644 index 00000000..952f8ac1 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/price.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/printer.svg b/cutejava-ui/src/assets/icons/svg/printer.svg new file mode 100644 index 00000000..8203afad --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/printer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/pt.svg b/cutejava-ui/src/assets/icons/svg/pt.svg new file mode 100644 index 00000000..d357865f --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/pt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/qr-code.svg b/cutejava-ui/src/assets/icons/svg/qr-code.svg new file mode 100644 index 00000000..b7daff9b --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/qr-code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/question-answer.svg b/cutejava-ui/src/assets/icons/svg/question-answer.svg new file mode 100644 index 00000000..4dace76a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/question-answer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/read.svg b/cutejava-ui/src/assets/icons/svg/read.svg new file mode 100644 index 00000000..900afb39 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/read.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/rec.svg b/cutejava-ui/src/assets/icons/svg/rec.svg new file mode 100644 index 00000000..18339da9 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/rec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/record.svg b/cutejava-ui/src/assets/icons/svg/record.svg new file mode 100644 index 00000000..1c030b9b --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/record.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/refresh.svg b/cutejava-ui/src/assets/icons/svg/refresh.svg new file mode 100644 index 00000000..31217add --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/release.svg b/cutejava-ui/src/assets/icons/svg/release.svg new file mode 100644 index 00000000..2a02af97 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/release.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/reply.svg b/cutejava-ui/src/assets/icons/svg/reply.svg new file mode 100644 index 00000000..3be88d41 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/reply.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/report.svg b/cutejava-ui/src/assets/icons/svg/report.svg new file mode 100644 index 00000000..444f5bee --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/report.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/revoke.svg b/cutejava-ui/src/assets/icons/svg/revoke.svg new file mode 100644 index 00000000..d1aafe1a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/revoke.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/risk-manage.svg b/cutejava-ui/src/assets/icons/svg/risk-manage.svg new file mode 100644 index 00000000..260769e2 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/risk-manage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/rule.svg b/cutejava-ui/src/assets/icons/svg/rule.svg new file mode 100644 index 00000000..a1bbb6a6 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/rule.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/run.svg b/cutejava-ui/src/assets/icons/svg/run.svg new file mode 100644 index 00000000..c90ff44d --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/run.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/running.svg b/cutejava-ui/src/assets/icons/svg/running.svg new file mode 100644 index 00000000..b95cb88c --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/running.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/salary.svg b/cutejava-ui/src/assets/icons/svg/salary.svg new file mode 100644 index 00000000..8f5ff994 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/salary.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/save.svg b/cutejava-ui/src/assets/icons/svg/save.svg new file mode 100644 index 00000000..8d7ae1e0 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/scan.svg b/cutejava-ui/src/assets/icons/svg/scan.svg new file mode 100644 index 00000000..2c2b722f --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/scan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/school-cert.svg b/cutejava-ui/src/assets/icons/svg/school-cert.svg new file mode 100644 index 00000000..54e3fdfb --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/school-cert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/school-citation.svg b/cutejava-ui/src/assets/icons/svg/school-citation.svg new file mode 100644 index 00000000..62c573cd --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/school-citation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/school-resume.svg b/cutejava-ui/src/assets/icons/svg/school-resume.svg new file mode 100644 index 00000000..368adba7 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/school-resume.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/scm.svg b/cutejava-ui/src/assets/icons/svg/scm.svg new file mode 100644 index 00000000..455c7fee --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/scm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/seckill.svg b/cutejava-ui/src/assets/icons/svg/seckill.svg new file mode 100644 index 00000000..dcd59e9a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/seckill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/server_monitor.svg b/cutejava-ui/src/assets/icons/svg/server_monitor.svg new file mode 100644 index 00000000..c13cc19c --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/server_monitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/service-center.svg b/cutejava-ui/src/assets/icons/svg/service-center.svg new file mode 100644 index 00000000..b29b84d4 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/service-center.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/setting.svg b/cutejava-ui/src/assets/icons/svg/setting.svg new file mode 100644 index 00000000..148b393c --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/setting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/seven.svg b/cutejava-ui/src/assets/icons/svg/seven.svg new file mode 100644 index 00000000..d2df729a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/seven.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/share.svg b/cutejava-ui/src/assets/icons/svg/share.svg new file mode 100644 index 00000000..1fea5094 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/shop-manage.svg b/cutejava-ui/src/assets/icons/svg/shop-manage.svg new file mode 100644 index 00000000..cf008dbc --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/shop-manage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/shop.svg b/cutejava-ui/src/assets/icons/svg/shop.svg new file mode 100644 index 00000000..7e644c65 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/shop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/sign2.svg b/cutejava-ui/src/assets/icons/svg/sign2.svg new file mode 100644 index 00000000..73e61068 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/sign2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/smile.svg b/cutejava-ui/src/assets/icons/svg/smile.svg new file mode 100644 index 00000000..db227597 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/smile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/space-alloc.svg b/cutejava-ui/src/assets/icons/svg/space-alloc.svg new file mode 100644 index 00000000..1cecc207 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/space-alloc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/space-manage.svg b/cutejava-ui/src/assets/icons/svg/space-manage.svg new file mode 100644 index 00000000..7ba5dc71 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/space-manage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/special.svg b/cutejava-ui/src/assets/icons/svg/special.svg new file mode 100644 index 00000000..707bbf50 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/special.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/star.svg b/cutejava-ui/src/assets/icons/svg/star.svg new file mode 100644 index 00000000..9a714dbd --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/storage-space.svg b/cutejava-ui/src/assets/icons/svg/storage-space.svg new file mode 100644 index 00000000..a80368b5 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/storage-space.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/storage.svg b/cutejava-ui/src/assets/icons/svg/storage.svg new file mode 100644 index 00000000..c68dd43e --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/storage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/store.svg b/cutejava-ui/src/assets/icons/svg/store.svg new file mode 100644 index 00000000..65d1f136 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/store.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/storehouse.svg b/cutejava-ui/src/assets/icons/svg/storehouse.svg new file mode 100644 index 00000000..b5e89e78 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/storehouse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/student.svg b/cutejava-ui/src/assets/icons/svg/student.svg new file mode 100644 index 00000000..fdd368ad --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/student.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/system-config.svg b/cutejava-ui/src/assets/icons/svg/system-config.svg new file mode 100644 index 00000000..64c8abb2 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/system-config.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/take-photo.svg b/cutejava-ui/src/assets/icons/svg/take-photo.svg new file mode 100644 index 00000000..5120f2a0 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/take-photo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/task manege.svg b/cutejava-ui/src/assets/icons/svg/task manege.svg new file mode 100644 index 00000000..91c986ab --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/task manege.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/tem.svg b/cutejava-ui/src/assets/icons/svg/tem.svg new file mode 100644 index 00000000..90a53ef9 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/tem.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/temp.svg b/cutejava-ui/src/assets/icons/svg/temp.svg new file mode 100644 index 00000000..c18d6d9a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/temp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/thumbs-up.svg b/cutejava-ui/src/assets/icons/svg/thumbs-up.svg new file mode 100644 index 00000000..60bfb208 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/time-birthday.svg b/cutejava-ui/src/assets/icons/svg/time-birthday.svg new file mode 100644 index 00000000..8ad5706a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/time-birthday.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/time-downcount.svg b/cutejava-ui/src/assets/icons/svg/time-downcount.svg new file mode 100644 index 00000000..a42de3da --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/time-downcount.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/tixian.svg b/cutejava-ui/src/assets/icons/svg/tixian.svg new file mode 100644 index 00000000..9363bd9c --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/tixian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/today.svg b/cutejava-ui/src/assets/icons/svg/today.svg new file mode 100644 index 00000000..3ab4d15c --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/today.svg @@ -0,0 +1 @@ + diff --git a/cutejava-ui/src/assets/icons/svg/upload.svg b/cutejava-ui/src/assets/icons/svg/upload.svg new file mode 100644 index 00000000..a0f13e2e --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/version.svg b/cutejava-ui/src/assets/icons/svg/version.svg new file mode 100644 index 00000000..e6004dd1 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/version.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/visitor.svg b/cutejava-ui/src/assets/icons/svg/visitor.svg new file mode 100644 index 00000000..d7af05f8 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/visitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/warning.svg b/cutejava-ui/src/assets/icons/svg/warning.svg new file mode 100644 index 00000000..e6cc4548 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/warning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/work-joblog.svg b/cutejava-ui/src/assets/icons/svg/work-joblog.svg new file mode 100644 index 00000000..10d5c5d9 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/work-joblog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/work-manage.svg b/cutejava-ui/src/assets/icons/svg/work-manage.svg new file mode 100644 index 00000000..e82ea0cb --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/work-manage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/work-order.svg b/cutejava-ui/src/assets/icons/svg/work-order.svg new file mode 100644 index 00000000..3a711be4 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/work-order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/work-plan.svg b/cutejava-ui/src/assets/icons/svg/work-plan.svg new file mode 100644 index 00000000..70dd9f92 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/work-plan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/work-resume.svg b/cutejava-ui/src/assets/icons/svg/work-resume.svg new file mode 100644 index 00000000..231948db --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/work-resume.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/work.svg b/cutejava-ui/src/assets/icons/svg/work.svg new file mode 100644 index 00000000..5bbb31b8 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/work.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/wxapp.svg b/cutejava-ui/src/assets/icons/svg/wxapp.svg new file mode 100644 index 00000000..8d3af3a4 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/wxapp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/wxpay.svg b/cutejava-ui/src/assets/icons/svg/wxpay.svg new file mode 100644 index 00000000..d3e4d16a --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/wxpay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/yingxiao.svg b/cutejava-ui/src/assets/icons/svg/yingxiao.svg new file mode 100644 index 00000000..8b7d1f1f --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/yingxiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/icons/svg/yuan-141.svg b/cutejava-ui/src/assets/icons/svg/yuan-141.svg new file mode 100644 index 00000000..86010a97 --- /dev/null +++ b/cutejava-ui/src/assets/icons/svg/yuan-141.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cutejava-ui/src/assets/images/avatar.png b/cutejava-ui/src/assets/images/avatar.png index 997732a452cdf6273ec7cd444dab69f1a4db4e48..d51b71776a6450930e82a41ddd0692601b66f396 100644 GIT binary patch literal 30212 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 SBJ}40fQ5;T@p~h;xPJj%?#LPd diff --git a/cutejava-ui/src/assets/images/logo.png b/cutejava-ui/src/assets/images/logo.png index f7577109651b89def3d9359ab324b445c714fe77..b48bbced629a8244da3670112d82fb87d2e32d5e 100644 GIT binary patch literal 58082 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 literal 8852 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 ZLF@BRes2KN|GQZNP*u`YtbtmE{|_Y7!}b6G diff --git a/cutejava-ui/src/layout/components/Sidebar/Logo.vue b/cutejava-ui/src/layout/components/Sidebar/Logo.vue index effc55d7..c5d2217c 100644 --- a/cutejava-ui/src/layout/components/Sidebar/Logo.vue +++ b/cutejava-ui/src/layout/components/Sidebar/Logo.vue @@ -59,6 +59,7 @@ export default { height: 32px; vertical-align: middle; margin-right: 6px; + border-radius: 50%; } & .sidebar-title { @@ -76,6 +77,7 @@ export default { &.collapse { .sidebar-logo { margin-right: 0px; + border-radius: 50%; } } } diff --git a/cutejava-ui/src/views/components/ClipboardDemo.vue b/cutejava-ui/src/views/components/base/ClipboardDemo.vue similarity index 95% rename from cutejava-ui/src/views/components/ClipboardDemo.vue rename to cutejava-ui/src/views/components/base/ClipboardDemo.vue index 94ca03b2..c979eb49 100644 --- a/cutejava-ui/src/views/components/ClipboardDemo.vue +++ b/cutejava-ui/src/views/components/base/ClipboardDemo.vue @@ -10,7 +10,7 @@ + diff --git a/cutejava-ui/src/views/components/business/CuteUserSelect.vue b/cutejava-ui/src/views/components/business/CuteUserSelect.vue new file mode 100644 index 00000000..2b5a6829 --- /dev/null +++ b/cutejava-ui/src/views/components/business/CuteUserSelect.vue @@ -0,0 +1,74 @@ + + + + diff --git a/cutejava-ui/src/views/components/business/DemoShow.vue b/cutejava-ui/src/views/components/business/DemoShow.vue new file mode 100644 index 00000000..7b2e13d8 --- /dev/null +++ b/cutejava-ui/src/views/components/business/DemoShow.vue @@ -0,0 +1,52 @@ + + + + diff --git a/cutejava-ui/src/views/system/job/module/form.vue b/cutejava-ui/src/views/system/job/module/form.vue index aa538fb1..eac3b928 100644 --- a/cutejava-ui/src/views/system/job/module/form.vue +++ b/cutejava-ui/src/views/system/job/module/form.vue @@ -15,7 +15,7 @@ label-width="80px" > { + sendCaptcha(this.form.email).then(res => { this.$message({ showClose: true, message: '发送成功,验证码有效期5分钟', diff --git a/cutejava-ui/src/views/system/user/index.vue b/cutejava-ui/src/views/system/user/index.vue index aa867a1a..e88aed86 100644 --- a/cutejava-ui/src/views/system/user/index.vue +++ b/cutejava-ui/src/views/system/user/index.vue @@ -2,27 +2,7 @@
- -
- -
- -
+ @@ -216,12 +196,13 @@ import Treeselect from '@riophae/vue-treeselect' import { mapGetters } from 'vuex' import '@riophae/vue-treeselect/dist/vue-treeselect.css' import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect' +import CuteDeptTree from '@/views/components/business/CuteDeptTree' let userRoles = [] let userJobs = [] const defaultForm = { id: null, username: null, nickName: null, gender: '男', email: null, enabled: 'false', roles: [], jobs: [], dept: { id: null }, phone: null } export default { name: 'User', - components: { Treeselect, crudOperation, rrOperation, udOperation, pagination, DateRangePicker }, + components: { CuteDeptTree, Treeselect, crudOperation, rrOperation, udOperation, pagination, DateRangePicker }, cruds() { return CRUD({ title: '用户', url: 'api/users', crudMethod: { ...crudUser }}) }, @@ -241,9 +222,8 @@ export default { } return { height: document.documentElement.clientHeight - 180 + 'px;', - deptName: '', depts: [], deptDatas: [], jobs: [], level: 3, roles: [], + deptName: '', depts: [], jobs: [], level: 3, roles: [], jobDatas: [], roleDatas: [], // 多选时使用 - defaultProps: { children: 'children', label: 'name', isLeaf: 'leaf' }, permission: { add: ['admin', 'user:add'], edit: ['admin', 'user:edit'], @@ -386,25 +366,14 @@ export default { console.log(this.jobDatas) return true }, - // 获取左侧部门数据 - getDeptDatas(node, resolve) { - const params = {} - if (typeof node !== 'object') { - if (node) { - params['name'] = node - } - } else if (node.level !== 0) { - params['pid'] = node.data.id + // 切换部门 + handleNodeClick(data) { + if (data.pid === 0) { + this.query.deptId = null + } else { + this.query.deptId = data.id } - setTimeout(() => { - getDepts(params).then(res => { - if (resolve) { - resolve(res.content) - } else { - this.deptDatas = res.content - } - }) - }, 100) + this.crud.toQuery() }, getDepts() { getDepts({ enabled: true }).then(res => { @@ -449,15 +418,6 @@ export default { }) } }, - // 切换部门 - handleNodeClick(data) { - if (data.pid === 0) { - this.query.deptId = null - } else { - this.query.deptId = data.id - } - this.crud.toQuery() - }, // 改变状态 changeEnabled(data, val) { this.$confirm('此操作将 "' + this.dict.label.user_status[val] + '" ' + data.username + ', 是否继续?', '提示', { diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/base/BaseResult.java b/cutejava/cutejava-common/src/main/java/cn/odboy/base/BaseResult.java index fe51e10b..18c2bcae 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/base/BaseResult.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/base/BaseResult.java @@ -5,8 +5,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.util.List; - /** * 结果封装类 */ diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/base/MyEntity.java b/cutejava/cutejava-common/src/main/java/cn/odboy/base/MyEntity.java index 6d53bb66..b546dbf5 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/base/MyEntity.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/base/MyEntity.java @@ -1,8 +1,8 @@ package cn.odboy.base; +import com.alibaba.fastjson2.annotation.JSONField; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -32,16 +32,12 @@ public class MyEntity extends MyObject { @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") - // @JSONField(format = "yyyy-MM-dd HH:mm:ss") -// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Timestamp createTime; @TableField(fill = FieldFill.INSERT_UPDATE) @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") - // @JSONField(format = "yyyy-MM-dd HH:mm:ss") -// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Timestamp updateTime; /* 分组校验 */ diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/constant/SystemConst.java b/cutejava/cutejava-common/src/main/java/cn/odboy/constant/SystemConst.java index afefc9cf..5995a527 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/constant/SystemConst.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/constant/SystemConst.java @@ -23,4 +23,15 @@ public class SystemConst { * Token前缀 */ public static final String TOKEN_PREFIX = "Bearer"; + + /** + * 小数点 + */ + public static final String SYMBOL_DOT = "."; + public static final String SYMBOL_EQUAL = "="; + public static final String SYMBOL_ADD = "+"; + public static final String SYMBOL_SUBTRACT = "-"; + public static final String SYMBOL_AT = "@"; + public static final String PROPERTY_OS_NAME = "os.name"; + public static final String OS_NAME_WINDOWS = "Windows"; } diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/constant/SystemRedisKey.java b/cutejava/cutejava-common/src/main/java/cn/odboy/constant/SystemRedisKey.java index 49ca967f..c1e9af70 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/constant/SystemRedisKey.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/constant/SystemRedisKey.java @@ -56,4 +56,9 @@ public interface SystemRedisKey { * 登录验证码 */ String CAPTCHA_LOGIN = "captcha::login:"; + + /** + * 用户信息 + */ + String USER_INFO = "user::info:"; } diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/interfaces/EasyMapper.java b/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/interfaces/EasyMapper.java index 871d1c06..fc3c0d25 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/interfaces/EasyMapper.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/interfaces/EasyMapper.java @@ -89,11 +89,11 @@ public interface EasyMapper extends BaseMapper { Map result = new ConcurrentHashMap<>(1); List list = this.selectList(wrapper); if (CollUtil.isEmpty(list)) { - return new HashMap<>(); + return new HashMap<>(3); } E tempObj = list.stream().findFirst().orElse(null); if (tempObj == null) { - return new HashMap<>(); + return new HashMap<>(3); } Field[] fields = ReflectUtil.getFields(tempObj.getClass()); for (E e : list) { diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/util/CmdGenHelper.java b/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/util/CmdGenHelper.java index 78abfbe9..fbe86507 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/util/CmdGenHelper.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/util/CmdGenHelper.java @@ -109,10 +109,7 @@ public class CmdGenHelper { // 5.2.Controller策略配置 // 开启生成@RestController控制器 fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle()); - // 如果不需要生成Controller - // fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller("")); - // 5.3.Service策略配置 - // 格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I + // 如果不需要生成Controller,fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3.Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder .serviceBuilder() .formatServiceFileName("%sService") diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/util/MybatisHelper.java b/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/util/MybatisHelper.java index 88079801..d8281411 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/util/MybatisHelper.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/mybatis/util/MybatisHelper.java @@ -110,10 +110,11 @@ public class MybatisHelper { if (fieldVal instanceof List) { List between = new ArrayList<>((List) fieldVal); if (CollectionUtil.isNotEmpty(between)) { - if (between.size() >= 2) { + int minSize = 2; + if (between.size() >= minSize) { queryWrapper.between(finalAttributeName, between.get(0), between.get(1)); } else { - throw new BadRequestException("BETWEEN类型的对象列表长度必须 >= 2"); + throw new BadRequestException("BETWEEN类型的对象列表长度必须 >= " + minSize); } } } else { @@ -215,16 +216,9 @@ public class MybatisHelper { public static void main(String[] args) { QueryWrapper query = new QueryWrapper(); - //query.or(); query.or(wrapper -> wrapper.eq("username", 1).or().eq("nickname", 2)); - //query.like("a",1); - //query.or(); - //query.like("b",2); - //query.and(wrapper->wrapper.eq("c",1)); query.eq("id", 1); query.orderByDesc("id"); -// query.apply("left join student t1 on t1.id = t1.id"); -// query.last("left join student t1 on t1.id = t1.id"); System.err.println("getSqlSelect================================="); System.err.println(query.getSqlSelect()); System.err.println("getSqlSegment================================="); diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/redis/RedisConfiguration.java b/cutejava/cutejava-common/src/main/java/cn/odboy/redis/RedisConfiguration.java index d97a2e8c..7c6179f0 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/redis/RedisConfiguration.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/redis/RedisConfiguration.java @@ -181,8 +181,8 @@ public class RedisConfiguration extends CachingConfigurerSupport { return null; } String str = new String(bytes, StandardCharsets.UTF_8); - // 支持AutoType - return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType); + // 移除对 SupportAutoType 的使用 + return JSON.parseObject(str, clazz); } } } \ No newline at end of file diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/server/SwaggerConfig.java b/cutejava/cutejava-common/src/main/java/cn/odboy/server/SwaggerConfig.java index 23ce43b9..9824e9fa 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/server/SwaggerConfig.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/server/SwaggerConfig.java @@ -2,7 +2,6 @@ package cn.odboy.server; import cn.odboy.constant.SystemConst; import cn.odboy.util.AnonTagUtil; -import cn.odboy.util.SecurityUtil; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Value; @@ -85,7 +84,7 @@ public class SwaggerConfig { private SecurityContext getContextByPath() { Set urls = AnonTagUtil.getAllAnonymousUrl(applicationContext); - urls = urls.stream().filter(url -> !url.equals("/")).collect(Collectors.toSet()); + urls = urls.stream().filter(url -> !"/".equals(url)).collect(Collectors.toSet()); String regExp = "^(?!" + apiPath + String.join("|" + apiPath, urls) + ").*$"; return SecurityContext.builder() .securityReferences(defaultAuth()) diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/thread/AsyncExecutor.java b/cutejava/cutejava-common/src/main/java/cn/odboy/thread/AsyncExecutor.java index 6e4f8994..a296da6c 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/thread/AsyncExecutor.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/thread/AsyncExecutor.java @@ -63,10 +63,10 @@ public class AsyncExecutor implements AsyncConfigurer { /** * 自定义线程池,用法,注入到类中使用 - * private ThreadPoolTaskExecutor taskExecutor; */ @Bean("taskAsync") public ThreadPoolTaskExecutor taskAsync() { + // 用法 private ThreadPoolTaskExecutor taskExecutor ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(AsyncExecutor.corePoolSize); executor.setMaxPoolSize(AsyncExecutor.maxPoolSize); diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/util/CollUtil.java b/cutejava/cutejava-common/src/main/java/cn/odboy/util/CollUtil.java index 50b13536..bc2cdfb1 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/util/CollUtil.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/util/CollUtil.java @@ -17,9 +17,6 @@ package cn.odboy.util; import cn.odboy.base.MyMetaOption; import com.alibaba.fastjson2.JSON; -import com.google.common.base.Joiner; -import com.google.common.base.Splitter; -import com.google.common.collect.Lists; import java.lang.reflect.Field; import java.math.BigDecimal; @@ -37,7 +34,7 @@ import java.util.stream.Collectors; */ public class CollUtil extends cn.hutool.core.collection.CollUtil { private static Predicate distinctPredicate(Function keyMapper) { - Map map = new HashMap<>(); + Map map = new HashMap<>(3); return (t) -> null == map.putIfAbsent(keyMapper.apply(t), true); } diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/util/DESEncryptUtil.java b/cutejava/cutejava-common/src/main/java/cn/odboy/util/DesEncryptUtil.java similarity index 98% rename from cutejava/cutejava-common/src/main/java/cn/odboy/util/DESEncryptUtil.java rename to cutejava/cutejava-common/src/main/java/cn/odboy/util/DesEncryptUtil.java index 10799b3c..74c14a9f 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/util/DESEncryptUtil.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/util/DesEncryptUtil.java @@ -10,7 +10,7 @@ import java.nio.charset.StandardCharsets; /** * DES加密 */ -public class DESEncryptUtil { +public class DesEncryptUtil { private static final String STR_PARAM = "Passw0rd"; private static final IvParameterSpec IV = new IvParameterSpec(STR_PARAM.getBytes(StandardCharsets.UTF_8)); diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/util/FileUtil.java b/cutejava/cutejava-common/src/main/java/cn/odboy/util/FileUtil.java index 896f135a..3d1a4e9b 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/util/FileUtil.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/util/FileUtil.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.poi.excel.BigExcelWriter; import cn.hutool.poi.excel.ExcelUtil; import cn.odboy.constant.FileTypeEnum; +import cn.odboy.constant.SystemConst; import cn.odboy.exception.BadRequestException; import lombok.extern.slf4j.Slf4j; import org.apache.poi.util.IOUtils; @@ -25,6 +26,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static cn.odboy.constant.SystemConst.*; + /** * File工具类,扩展 hutool 工具包 */ @@ -175,8 +178,10 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { if (value instanceof String) { String strValue = (String) value; // 检查并处理以特殊字符开头的值 - if (strValue.startsWith("=") || strValue.startsWith("+") || strValue.startsWith("-") || strValue.startsWith("@")) { - strValue = "'" + strValue; // 添加单引号前缀 + if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD) + || strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith(SYMBOL_AT)) { + // 添加单引号前缀 + strValue = "'" + strValue; } sanitizedMap.put(key, strValue); } else { @@ -346,7 +351,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { // 不允许文件名超过255(在Mac和Linux中)或260(在Windows中)个字符 int maxFileNameLength = 255; - if (System.getProperty("os.name").startsWith("Windows")) { + if (System.getProperty(SystemConst.PROPERTY_OS_NAME).startsWith(SystemConst.OS_NAME_WINDOWS)) { maxFileNameLength = 260; } if (fileName.length() > maxFileNameLength) { diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/util/IPUtil.java b/cutejava/cutejava-common/src/main/java/cn/odboy/util/IpUtil.java similarity index 99% rename from cutejava/cutejava-common/src/main/java/cn/odboy/util/IPUtil.java rename to cutejava/cutejava-common/src/main/java/cn/odboy/util/IpUtil.java index 665532af..0d687bcf 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/util/IPUtil.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/util/IpUtil.java @@ -11,7 +11,7 @@ import java.util.Enumeration; /** * IP地址 相关 */ -public class IPUtil { +public class IpUtil { /** * 注入bean */ diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/util/ListUtil.java b/cutejava/cutejava-common/src/main/java/cn/odboy/util/ListUtil.java index 6ff293f6..19a2ade8 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/util/ListUtil.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/util/ListUtil.java @@ -50,7 +50,8 @@ public class ListUtil { */ public static void main(String[] args) { List entities = new ArrayList<>(); - for (int i = 0; i < 50; i++) { + int total = 50; + for (int i = 0; i < total; i++) { MyEntity entity = new MyEntity(); if (i % 2 == 0) { entity.setCreateBy("odboy"); diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/util/RSAEncryptUtil.java b/cutejava/cutejava-common/src/main/java/cn/odboy/util/RsaEncryptUtil.java similarity index 96% rename from cutejava/cutejava-common/src/main/java/cn/odboy/util/RSAEncryptUtil.java rename to cutejava/cutejava-common/src/main/java/cn/odboy/util/RsaEncryptUtil.java index dd11b26b..82eeb138 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/util/RSAEncryptUtil.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/util/RsaEncryptUtil.java @@ -13,7 +13,7 @@ import java.security.spec.X509EncodedKeySpec; /** * Rsa 工具类,公钥私钥生成,加解密 */ -public class RSAEncryptUtil { +public class RsaEncryptUtil { private static final String SRC = "123456"; @@ -34,12 +34,12 @@ public class RSAEncryptUtil { */ private static void test1(RsaKeyPair keyPair) throws Exception { System.out.println("***************** 公钥加密私钥解密开始 *****************"); - String text1 = encryptByPublicKey(keyPair.getPublicKey(), RSAEncryptUtil.SRC); + String text1 = encryptByPublicKey(keyPair.getPublicKey(), RsaEncryptUtil.SRC); String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1); - System.out.println("加密前:" + RSAEncryptUtil.SRC); + System.out.println("加密前:" + RsaEncryptUtil.SRC); System.out.println("加密后:" + text1); System.out.println("解密后:" + text2); - if (RSAEncryptUtil.SRC.equals(text2)) { + if (RsaEncryptUtil.SRC.equals(text2)) { System.out.println("解密字符串和原始字符串一致,解密成功"); } else { System.out.println("解密字符串和原始字符串不一致,解密失败"); @@ -54,12 +54,12 @@ public class RSAEncryptUtil { */ private static void test2(RsaKeyPair keyPair) throws Exception { System.out.println("***************** 私钥加密公钥解密开始 *****************"); - String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), RSAEncryptUtil.SRC); + String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), RsaEncryptUtil.SRC); String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1); - System.out.println("加密前:" + RSAEncryptUtil.SRC); + System.out.println("加密前:" + RsaEncryptUtil.SRC); System.out.println("加密后:" + text1); System.out.println("解密后:" + text2); - if (RSAEncryptUtil.SRC.equals(text2)) { + if (RsaEncryptUtil.SRC.equals(text2)) { System.out.println("解密字符串和原始字符串一致,解密成功"); } else { System.out.println("解密字符串和原始字符串不一致,解密失败"); diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/util/ScriptUtil.java b/cutejava/cutejava-common/src/main/java/cn/odboy/util/ScriptUtil.java index 8baf55ea..947eb41a 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/util/ScriptUtil.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/util/ScriptUtil.java @@ -50,7 +50,7 @@ public class ScriptUtil { ScriptContext newContext = new SimpleScriptContext(); if (compareObj != null) { Field[] fields = ReflectUtil.getFields(compareObj.getClass()); - Map filedNameValueMap = new HashMap<>(); + Map filedNameValueMap = new HashMap<>(3); Arrays.stream(fields).parallel().forEach(f -> filedNameValueMap.put(f.getName(), ReflectUtil.getFieldValue(compareObj, f))); Set> entries = filedNameValueMap.entrySet(); long count = entries.stream().filter(f -> f.getValue() != null).count(); @@ -64,12 +64,6 @@ public class ScriptUtil { }); newContext.setBindings(engineScope, ScriptContext.ENGINE_SCOPE); } -// if (script.contains(FUNCTION_TAG)) { -// // 由ScriptEngines实现的接口, 其方法允许调用以前已执行的脚本中的过程 -// Invocable inv = (Invocable) engine; -// // 调用全局函数, 并传入参数 -// inv.invokeFunction("hello", "测试"); -// } // 执行脚本, 注意这里指定新的执行作用域上下文 return engine.eval(script, newContext); } catch (ScriptException e) { diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/util/SecurityUtil.java b/cutejava/cutejava-common/src/main/java/cn/odboy/util/SecurityUtil.java index 03cc9f4a..f6d3fc75 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/util/SecurityUtil.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/util/SecurityUtil.java @@ -10,7 +10,6 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Component; diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/util/SqlUtil.java b/cutejava/cutejava-common/src/main/java/cn/odboy/util/SqlUtil.java index d25fc285..389e1248 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/util/SqlUtil.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/util/SqlUtil.java @@ -18,9 +18,6 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.List; -/** - * @author / - */ @Slf4j public class SqlUtil { /** diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/websocket/context/WebSocketClientManager.java b/cutejava/cutejava-common/src/main/java/cn/odboy/websocket/context/WebSocketClientManager.java index 5bae834b..ee389d83 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/websocket/context/WebSocketClientManager.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/websocket/context/WebSocketClientManager.java @@ -1,4 +1,5 @@ package cn.odboy.websocket.context; + import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/cutejava/cutejava-common/src/main/java/cn/odboy/websocket/context/WebSocketServer.java b/cutejava/cutejava-common/src/main/java/cn/odboy/websocket/context/WebSocketServer.java index 577e815e..348b5429 100644 --- a/cutejava/cutejava-common/src/main/java/cn/odboy/websocket/context/WebSocketServer.java +++ b/cutejava/cutejava-common/src/main/java/cn/odboy/websocket/context/WebSocketServer.java @@ -3,16 +3,13 @@ package cn.odboy.websocket.context; import cn.odboy.websocket.dto.WebSocketMsgDto; import com.alibaba.fastjson2.JSON; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; -import java.util.Map; import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; @Slf4j diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/job/dto/QuartzJobQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/job/request/QuartzJobQueryCriteria.java similarity index 94% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/job/dto/QuartzJobQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/job/request/QuartzJobQueryCriteria.java index 61197890..d3239ca2 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/job/dto/QuartzJobQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/job/request/QuartzJobQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.job.dto; +package cn.odboy.model.job.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDeptRequest.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDeptRequest.java new file mode 100644 index 00000000..7a3d8c14 --- /dev/null +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDeptRequest.java @@ -0,0 +1,21 @@ +package cn.odboy.model.system.request; + +import cn.odboy.base.MyObject; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@EqualsAndHashCode(callSuper = false) +public class CreateDeptRequest extends MyObject { + @NotBlank(message = "部门名称必填") + private String name; + @NotNull(message = "部门排序必填") + private Integer deptSort; + private Boolean enabled; + private String isTop; + private Long pid; + private Integer subCount = 0; +} diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDictDetailRequest.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDictDetailRequest.java new file mode 100644 index 00000000..ad7a91c4 --- /dev/null +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDictDetailRequest.java @@ -0,0 +1,22 @@ +package cn.odboy.model.system.request; + +import cn.odboy.base.MyObject; +import cn.odboy.model.system.domain.Dict; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@EqualsAndHashCode(callSuper = false) +public class CreateDictDetailRequest extends MyObject { + @NotBlank(message = "参数dict必填") + private Dict dict; + @NotBlank(message = "字典标签必填") + private String label; + @NotBlank(message = "字典值必填") + private String value; + @NotNull(message = "字典排序必填") + private Integer dictSort; +} diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDictRequest.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDictRequest.java new file mode 100644 index 00000000..66a21e11 --- /dev/null +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateDictRequest.java @@ -0,0 +1,15 @@ +package cn.odboy.model.system.request; + +import cn.odboy.base.MyObject; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; + +@Data +@EqualsAndHashCode(callSuper = false) +public class CreateDictRequest extends MyObject { + @NotBlank(message = "字典名称必填") + private String name; + private String description; +} diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateJobRequest.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateJobRequest.java new file mode 100644 index 00000000..da2f7a8c --- /dev/null +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateJobRequest.java @@ -0,0 +1,18 @@ +package cn.odboy.model.system.request; + +import cn.odboy.base.MyObject; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@EqualsAndHashCode(callSuper = false) +public class CreateJobRequest extends MyObject { + @NotBlank(message = "职位名称必填") + private String name; + @NotNull(message = "职位排序必填") + private Integer jobSort; + private Boolean enabled; +} diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateRoleRequest.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateRoleRequest.java new file mode 100644 index 00000000..628c2623 --- /dev/null +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/CreateRoleRequest.java @@ -0,0 +1,27 @@ +package cn.odboy.model.system.request; + +import cn.odboy.base.MyObject; +import cn.odboy.model.system.domain.Dept; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Set; + +@Data +@EqualsAndHashCode(callSuper = false) +public class CreateRoleRequest extends MyObject { + @NotBlank(message = "角色名称必填") + private String name; + @NotNull(message = "角色级别必填") + private Integer level; + @NotBlank(message = "数据范围必填") + private String dataScope; + private String description; + /** + * 关联的部门 + */ + private Long id; + private Set depts; +} diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/DeptQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/DeptQueryCriteria.java similarity index 94% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/DeptQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/DeptQueryCriteria.java index 18f0717c..bb0deb37 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/DeptQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/DeptQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/DictDetailQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/DictDetailQueryCriteria.java similarity index 91% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/DictDetailQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/DictDetailQueryCriteria.java index 0c8b6eaa..c17b3388 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/DictDetailQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/DictDetailQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/DictQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/DictQueryCriteria.java similarity index 90% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/DictQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/DictQueryCriteria.java index e9270f73..67d731fe 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/DictQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/DictQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/JobQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/JobQueryCriteria.java similarity index 94% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/JobQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/JobQueryCriteria.java index 8c5bc48f..825aab9e 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/JobQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/JobQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/MenuQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/MenuQueryCriteria.java similarity index 92% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/MenuQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/MenuQueryCriteria.java index 27e7001a..b3d835e8 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/MenuQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/MenuQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/RoleQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/RoleQueryCriteria.java similarity index 93% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/RoleQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/RoleQueryCriteria.java index c6b50627..e76d9ca6 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/RoleQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/RoleQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/UserAuthDto.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/UserLoginRequest.java similarity index 87% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/UserAuthDto.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/UserLoginRequest.java index 375dee40..03ce05a5 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/UserAuthDto.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/UserLoginRequest.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.request; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -8,7 +8,7 @@ import javax.validation.constraints.NotBlank; @Getter @Setter -public class UserAuthDto { +public class UserLoginRequest { @NotBlank @ApiModelProperty(value = "用户名") diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/UserQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/UserQueryCriteria.java similarity index 96% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/UserQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/UserQueryCriteria.java index f747284c..1f74de45 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/UserQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/request/UserQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.request; import cn.odboy.base.MyObject; import io.swagger.annotations.ApiModelProperty; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/MenuMetaVo.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/MenuMetaVo.java similarity index 92% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/MenuMetaVo.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/MenuMetaVo.java index 6f2b2316..5a8f0bf5 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/MenuMetaVo.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/MenuMetaVo.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.response; import cn.odboy.base.MyObject; import io.swagger.annotations.ApiModelProperty; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/MenuVo.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/MenuVo.java similarity index 95% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/MenuVo.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/MenuVo.java index c2d61b87..3e61b318 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/MenuVo.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/MenuVo.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.response; import cn.odboy.base.MyObject; import io.swagger.annotations.ApiModelProperty; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/SimpleUserVo.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/SimpleUserVo.java new file mode 100644 index 00000000..c308cfa5 --- /dev/null +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/SimpleUserVo.java @@ -0,0 +1,42 @@ +package cn.odboy.model.system.response; + +import cn.odboy.base.MyObject; +import cn.odboy.model.system.domain.Dept; +import cn.odboy.model.system.domain.Job; +import cn.odboy.model.system.domain.Role; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Set; + +@Data +@EqualsAndHashCode(callSuper = false) +public class SimpleUserVo extends MyObject { + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @ApiModelProperty(value = "用户角色") + private Set roles; + @ApiModelProperty(value = "用户岗位") + private Set jobs; + private Long deptId; + @TableField(exist = false) + private Dept dept; + @ApiModelProperty(value = "用户名称") + private String username; + @ApiModelProperty(value = "用户昵称") + private String nickName; + @ApiModelProperty(value = "邮箱") + private String email; + @ApiModelProperty(value = "电话号码") + private String phone; + @ApiModelProperty(value = "用户性别") + private String gender; + @ApiModelProperty(value = "头像真实名称", hidden = true) + private String avatarName; + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "是否为admin账号", hidden = true) + private Boolean isAdmin = false; +} \ No newline at end of file diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/UserInfoVo.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/UserInfoVo.java new file mode 100644 index 00000000..87ecf094 --- /dev/null +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/UserInfoVo.java @@ -0,0 +1,22 @@ +package cn.odboy.model.system.response; + +import cn.odboy.base.MyObject; +import cn.odboy.model.system.dto.RoleCodeDto; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Data +@EqualsAndHashCode(callSuper = false) +public class UserInfoVo extends MyObject { + private SimpleUserVo user; + private List dataScopes; + private List authorities; + + public Set getRoles() { + return authorities.stream().map(RoleCodeDto::getAuthority).collect(Collectors.toSet()); + } +} diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/UserPassVo.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/UserPassVo.java similarity index 87% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/UserPassVo.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/UserPassVo.java index 418bc14a..242f721a 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/dto/UserPassVo.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/system/response/UserPassVo.java @@ -1,4 +1,4 @@ -package cn.odboy.model.system.dto; +package cn.odboy.model.system.response; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/dto/LocalStorageQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/request/LocalStorageQueryCriteria.java similarity index 93% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/dto/LocalStorageQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/request/LocalStorageQueryCriteria.java index 5002987e..c7831cd0 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/dto/LocalStorageQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/request/LocalStorageQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.tools.dto; +package cn.odboy.model.tools.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/dto/QiniuQueryCriteria.java b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/request/QiniuQueryCriteria.java similarity index 93% rename from cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/dto/QiniuQueryCriteria.java rename to cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/request/QiniuQueryCriteria.java index 7c67674d..180fea38 100644 --- a/cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/dto/QiniuQueryCriteria.java +++ b/cutejava/cutejava-domain/src/main/java/cn/odboy/model/tools/request/QiniuQueryCriteria.java @@ -1,4 +1,4 @@ -package cn.odboy.model.tools.dto; +package cn.odboy.model.tools.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/mapper/QuartzJobMapper.java b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/mapper/QuartzJobMapper.java index 94402992..04edb814 100644 --- a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/mapper/QuartzJobMapper.java +++ b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/mapper/QuartzJobMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.job.mapper; import cn.odboy.model.job.domain.QuartzJob; -import cn.odboy.model.job.dto.QuartzJobQueryCriteria; +import cn.odboy.model.job.request.QuartzJobQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/mapper/QuartzLogMapper.java b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/mapper/QuartzLogMapper.java index c8083c58..3f76cd77 100644 --- a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/mapper/QuartzLogMapper.java +++ b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/mapper/QuartzLogMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.job.mapper; import cn.odboy.model.job.domain.QuartzLog; -import cn.odboy.model.job.dto.QuartzJobQueryCriteria; +import cn.odboy.model.job.request.QuartzJobQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/rest/QuartzJobController.java b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/rest/QuartzJobController.java index 8ba2e512..9c2d7cd6 100644 --- a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/rest/QuartzJobController.java +++ b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/rest/QuartzJobController.java @@ -6,7 +6,7 @@ import cn.odboy.context.SpringBeanHolder; import cn.odboy.exception.BadRequestException; import cn.odboy.model.job.domain.QuartzJob; import cn.odboy.model.job.domain.QuartzLog; -import cn.odboy.model.job.dto.QuartzJobQueryCriteria; +import cn.odboy.model.job.request.QuartzJobQueryCriteria; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; diff --git a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/service/QuartzJobService.java b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/service/QuartzJobService.java index d04789bc..18695f30 100644 --- a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/service/QuartzJobService.java +++ b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/service/QuartzJobService.java @@ -3,7 +3,7 @@ package cn.odboy.application.job.service; import cn.odboy.base.PageResult; import cn.odboy.model.job.domain.QuartzJob; import cn.odboy.model.job.domain.QuartzLog; -import cn.odboy.model.job.dto.QuartzJobQueryCriteria; +import cn.odboy.model.job.request.QuartzJobQueryCriteria; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/service/impl/QuartzJobServiceImpl.java b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/service/impl/QuartzJobServiceImpl.java index 581cc2b0..47f29f45 100644 --- a/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/service/impl/QuartzJobServiceImpl.java +++ b/cutejava/cutejava-job/src/main/java/cn/odboy/application/job/service/impl/QuartzJobServiceImpl.java @@ -10,7 +10,7 @@ import cn.odboy.base.PageResult; import cn.odboy.exception.BadRequestException; import cn.odboy.model.job.domain.QuartzJob; import cn.odboy.model.job.domain.QuartzLog; -import cn.odboy.model.job.dto.QuartzJobQueryCriteria; +import cn.odboy.model.job.request.QuartzJobQueryCriteria; import cn.odboy.util.FileUtil; import cn.odboy.util.PageUtil; import cn.odboy.util.RedisUtil; diff --git a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/DESEncryptUtilTest.java b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/DesEncryptUtilTest.java similarity index 84% rename from cutejava/cutejava-starter/src/test/java/cn/odboy/util/DESEncryptUtilTest.java rename to cutejava/cutejava-starter/src/test/java/cn/odboy/util/DesEncryptUtilTest.java index c65b4e66..eabc2f27 100644 --- a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/DESEncryptUtilTest.java +++ b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/DesEncryptUtilTest.java @@ -3,11 +3,11 @@ package cn.odboy.util; import lombok.SneakyThrows; import org.junit.jupiter.api.Test; -import static cn.odboy.util.DESEncryptUtil.desDecrypt; -import static cn.odboy.util.DESEncryptUtil.desEncrypt; +import static cn.odboy.util.DesEncryptUtil.desDecrypt; +import static cn.odboy.util.DesEncryptUtil.desEncrypt; import static org.junit.jupiter.api.Assertions.assertEquals; -public class DESEncryptUtilTest { +public class DesEncryptUtilTest { @SneakyThrows public static void main(String[] args) { diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/config/LoginProperties.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/config/LoginProperties.java index ffb60b05..7446531a 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/config/LoginProperties.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/config/LoginProperties.java @@ -16,6 +16,4 @@ public class LoginProperties { * 账号单用户 登录 */ private boolean singleLogin = false; - - public static final String cacheKey = "user_login_cache:"; } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/config/SecurityProperties.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/config/SecurityProperties.java index 2ba56014..b7fdbc25 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/config/SecurityProperties.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/config/SecurityProperties.java @@ -1,6 +1,5 @@ package cn.odboy.application.core.config; -import cn.odboy.util.SecurityUtil; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/TokenFilter.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/TokenFilter.java index 1fd644b2..c1b2df9b 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/TokenFilter.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/TokenFilter.java @@ -5,7 +5,6 @@ import cn.odboy.application.core.config.SecurityProperties; import cn.odboy.application.core.service.impl.UserOnlineServiceImpl; import cn.odboy.constant.SystemConst; import cn.odboy.model.system.dto.UserOnlineDto; -import cn.odboy.util.SecurityUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/TokenProvider.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/TokenProvider.java index 1816fed8..e1699e54 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/TokenProvider.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/TokenProvider.java @@ -8,7 +8,6 @@ import cn.odboy.constant.SystemConst; import cn.odboy.constant.SystemRedisKey; import cn.odboy.model.system.dto.UserJwtDto; import cn.odboy.util.RedisUtil; -import cn.odboy.util.SecurityUtil; import io.jsonwebtoken.*; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/rest/AuthController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/rest/AuthController.java index 01131f19..971e7f1f 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/rest/AuthController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/rest/AuthController.java @@ -1,23 +1,24 @@ package cn.odboy.application.core.rest; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.IdUtil; import cn.odboy.annotation.AnonymousDeleteMapping; import cn.odboy.annotation.AnonymousGetMapping; import cn.odboy.annotation.AnonymousPostMapping; import cn.odboy.application.core.config.CaptchaConfig; import cn.odboy.application.core.config.LoginProperties; -import cn.odboy.application.core.config.SecurityProperties; import cn.odboy.application.core.constant.LoginCodeEnum; import cn.odboy.application.core.context.TokenProvider; -import cn.odboy.application.core.context.UserDetailsHelper; +import cn.odboy.application.core.service.impl.UserDetailsServiceImpl; import cn.odboy.application.core.service.impl.UserOnlineServiceImpl; import cn.odboy.constant.SystemConst; import cn.odboy.constant.SystemRedisKey; import cn.odboy.exception.BadRequestException; -import cn.odboy.model.system.dto.UserAuthDto; +import cn.odboy.model.system.response.UserInfoVo; import cn.odboy.model.system.dto.UserJwtDto; +import cn.odboy.model.system.request.UserLoginRequest; import cn.odboy.properties.RsaProperties; -import cn.odboy.util.RSAEncryptUtil; +import cn.odboy.util.RsaEncryptUtil; import cn.odboy.util.RedisUtil; import cn.odboy.util.SecurityUtil; import cn.odboy.util.StringUtil; @@ -31,7 +32,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -53,32 +53,31 @@ import java.util.concurrent.TimeUnit; @RequiredArgsConstructor @Api(tags = "系统:系统授权接口") public class AuthController { - private final SecurityProperties properties; private final RedisUtil redisUtil; private final UserOnlineServiceImpl onlineUserService; private final TokenProvider tokenProvider; private final CaptchaConfig captchaConfig; private final LoginProperties loginProperties; private final PasswordEncoder passwordEncoder; - private final UserDetailsHelper userDetailsService; + private final UserDetailsServiceImpl userDetailsService; @ApiOperation("登录授权") @AnonymousPostMapping(value = "/login") - public ResponseEntity login(@Validated @RequestBody UserAuthDto authUser, HttpServletRequest request) throws Exception { + public ResponseEntity login(@Validated @RequestBody UserLoginRequest loginRequest, HttpServletRequest request) throws Exception { // 密码解密 - String password = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword()); + String password = RsaEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, loginRequest.getPassword()); // 查询验证码 - String code = redisUtil.get(authUser.getUuid(), String.class); + String code = redisUtil.get(loginRequest.getUuid(), String.class); // 清除验证码 - redisUtil.del(authUser.getUuid()); + redisUtil.del(loginRequest.getUuid()); if (StringUtil.isBlank(code)) { throw new BadRequestException("验证码不存在或已过期"); } - if (StringUtil.isBlank(authUser.getCode()) || !authUser.getCode().equalsIgnoreCase(code)) { + if (StringUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) { throw new BadRequestException("验证码错误"); } // 获取用户信息 - UserJwtDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername()); + UserJwtDto jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername()); // 验证用户密码 if (!passwordEncoder.matches(password, jwtUser.getPassword())) { throw new BadRequestException("登录密码错误"); @@ -90,11 +89,11 @@ public class AuthController { // 返回 token 与 用户信息 Map authInfo = new HashMap<>(2) {{ put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); - put("user", jwtUser); + put("user", BeanUtil.copyProperties(jwtUser, UserInfoVo.class)); }}; if (loginProperties.isSingleLogin()) { // 踢掉之前已经登录的token - onlineUserService.kickOutByUsername(authUser.getUsername()); + onlineUserService.kickOutByUsername(loginRequest.getUsername()); } // 保存在线信息 onlineUserService.save(jwtUser, token, request); @@ -104,9 +103,10 @@ public class AuthController { @ApiOperation("获取用户信息") @GetMapping(value = "/info") - public ResponseEntity getUserInfo() { + public ResponseEntity getUserInfo() { UserJwtDto jwtUser = (UserJwtDto) SecurityUtil.getCurrentUser(); - return ResponseEntity.ok(jwtUser); + UserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, UserInfoVo.class); + return ResponseEntity.ok(userInfoVo); } @ApiOperation("获取验证码") @@ -117,7 +117,7 @@ public class AuthController { String uuid = SystemRedisKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); //当验证码类型为 arithmetic时且长度 >= 2 时,captcha.text()的结果有几率为浮点型 String captchaValue = captcha.text(); - if (captcha.getCharType() - 1 == LoginCodeEnum.ARITHMETIC.ordinal() && captchaValue.contains(".")) { + if (captcha.getCharType() - 1 == LoginCodeEnum.ARITHMETIC.ordinal() && captchaValue.contains(SystemConst.SYMBOL_DOT)) { captchaValue = captchaValue.split("\\.")[0]; } // 保存 diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/rest/OnlineController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/rest/OnlineController.java index dc33b80d..8a58ccbc 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/rest/OnlineController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/rest/OnlineController.java @@ -3,7 +3,7 @@ package cn.odboy.application.core.rest; import cn.odboy.application.core.service.UserOnlineService; import cn.odboy.base.PageResult; import cn.odboy.model.system.dto.UserOnlineDto; -import cn.odboy.util.DESEncryptUtil; +import cn.odboy.util.DesEncryptUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -45,7 +45,7 @@ public class OnlineController { public ResponseEntity deleteOnlineUser(@RequestBody Set keys) throws Exception { for (String token : keys) { // 解密Key - token = DESEncryptUtil.desDecrypt(token); + token = DesEncryptUtil.desDecrypt(token); userOnlineService.logoutByToken(token); } return new ResponseEntity<>(HttpStatus.OK); diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserCacheServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserCacheServiceImpl.java index 646a6ff3..fd8dcb10 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserCacheServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserCacheServiceImpl.java @@ -1,8 +1,8 @@ package cn.odboy.application.core.service.impl; import cn.hutool.core.util.RandomUtil; -import cn.odboy.application.core.config.LoginProperties; import cn.odboy.application.core.service.UserCacheService; +import cn.odboy.constant.SystemRedisKey; import cn.odboy.model.system.dto.UserJwtDto; import cn.odboy.util.RedisUtil; import cn.odboy.util.StringUtil; @@ -24,7 +24,7 @@ public class UserCacheServiceImpl implements UserCacheService { username = StringUtil.lowerCase(username); if (StringUtil.isNotEmpty(username)) { // 获取数据 - return redisUtil.get(LoginProperties.cacheKey + username, UserJwtDto.class); + return redisUtil.get(SystemRedisKey.USER_INFO + username, UserJwtDto.class); } return null; } @@ -37,7 +37,7 @@ public class UserCacheServiceImpl implements UserCacheService { if (StringUtil.isNotEmpty(userName)) { // 添加数据, 避免数据同时过期(2小时左右) long time = 7200 + RandomUtil.randomInt(900, 1800); - redisUtil.set(LoginProperties.cacheKey + userName, user, time); + redisUtil.set(SystemRedisKey.USER_INFO + userName, user, time); } } @@ -48,7 +48,7 @@ public class UserCacheServiceImpl implements UserCacheService { userName = StringUtil.lowerCase(userName); if (StringUtil.isNotEmpty(userName)) { // 清除数据 - redisUtil.del(LoginProperties.cacheKey + userName); + redisUtil.del(SystemRedisKey.USER_INFO + userName); } } } \ No newline at end of file diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/UserDetailsHelper.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserDetailsServiceImpl.java similarity index 94% rename from cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/UserDetailsHelper.java rename to cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserDetailsServiceImpl.java index 0cdcf6c1..1cf8b173 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/context/UserDetailsHelper.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserDetailsServiceImpl.java @@ -1,4 +1,4 @@ -package cn.odboy.application.core.context; +package cn.odboy.application.core.service.impl; import cn.odboy.application.core.service.UserCacheService; import cn.odboy.application.system.service.DataService; @@ -18,7 +18,7 @@ import java.util.List; @Slf4j @RequiredArgsConstructor @Service("userDetailsService") -public class UserDetailsHelper implements UserDetailsService { +public class UserDetailsServiceImpl implements UserDetailsService { private final UserService userService; private final RoleService roleService; private final DataService dataService; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserOnlineServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserOnlineServiceImpl.java index 3064994e..fc438d60 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserOnlineServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/core/service/impl/UserOnlineServiceImpl.java @@ -34,7 +34,7 @@ public class UserOnlineServiceImpl implements UserOnlineService { String ip = BrowserUtil.getIp(request); String id = tokenProvider.getId(token); String version = BrowserUtil.getVersion(request); - String address = IPUtil.getCityInfo(ip); + String address = IpUtil.getCityInfo(ip); UserOnlineDto userOnlineDto = null; try { userOnlineDto = new UserOnlineDto(); @@ -45,7 +45,7 @@ public class UserOnlineServiceImpl implements UserOnlineService { userOnlineDto.setBrowser(version); userOnlineDto.setIp(ip); userOnlineDto.setAddress(address); - userOnlineDto.setKey(DESEncryptUtil.desEncrypt(token)); + userOnlineDto.setKey(DesEncryptUtil.desEncrypt(token)); userOnlineDto.setLoginTime(new Date()); } catch (Exception e) { log.error(e.getMessage(), e); diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DeptMapper.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DeptMapper.java index 767aec6a..9b337e8b 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DeptMapper.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DeptMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.system.mapper; import cn.odboy.model.system.domain.Dept; -import cn.odboy.model.system.dto.DeptQueryCriteria; +import cn.odboy.model.system.request.DeptQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DictDetailMapper.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DictDetailMapper.java index 97745ee5..ff32baf0 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DictDetailMapper.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DictDetailMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.system.mapper; import cn.odboy.model.system.domain.DictDetail; -import cn.odboy.model.system.dto.DictDetailQueryCriteria; +import cn.odboy.model.system.request.DictDetailQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DictMapper.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DictMapper.java index 995b3d37..3784d254 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DictMapper.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/DictMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.system.mapper; import cn.odboy.model.system.domain.Dict; -import cn.odboy.model.system.dto.DictQueryCriteria; +import cn.odboy.model.system.request.DictQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/JobMapper.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/JobMapper.java index 6d969e88..1083e2d7 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/JobMapper.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/JobMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.system.mapper; import cn.odboy.model.system.domain.Job; -import cn.odboy.model.system.dto.JobQueryCriteria; +import cn.odboy.model.system.request.JobQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/MenuMapper.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/MenuMapper.java index f5c70653..abb3f154 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/MenuMapper.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/MenuMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.system.mapper; import cn.odboy.model.system.domain.Menu; -import cn.odboy.model.system.dto.MenuQueryCriteria; +import cn.odboy.model.system.request.MenuQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -25,7 +25,7 @@ public interface MenuMapper extends BaseMapper { Menu getMenuByComponentName(@Param("name") String name); - int getMenuCountByPid(@Param("pid") Long pid); + Integer getMenuCountByPid(@Param("pid") Long pid); void updateSubCntById(@Param("count") int count, @Param("menuId") Long menuId); } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/RoleMapper.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/RoleMapper.java index c721e577..bf0189f5 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/RoleMapper.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/RoleMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.system.mapper; import cn.odboy.model.system.domain.Role; -import cn.odboy.model.system.dto.RoleQueryCriteria; +import cn.odboy.model.system.request.RoleQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/UserMapper.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/UserMapper.java index c5787a7f..481cf918 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/UserMapper.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/mapper/UserMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.system.mapper; import cn.odboy.model.system.domain.User; -import cn.odboy.model.system.dto.UserQueryCriteria; +import cn.odboy.model.system.request.UserQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/VerifyController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/CaptchaController.java similarity index 64% rename from cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/VerifyController.java rename to cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/CaptchaController.java index 9a555ea8..73854d9c 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/VerifyController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/CaptchaController.java @@ -1,10 +1,9 @@ package cn.odboy.application.system.rest; -import cn.odboy.application.system.service.VerifyService; +import cn.odboy.application.tools.service.CaptchaService; import cn.odboy.application.tools.service.EmailService; import cn.odboy.constant.CodeBiEnum; import cn.odboy.constant.CodeEnum; -import cn.odboy.model.tools.dto.EmailDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -14,29 +13,30 @@ import org.springframework.web.bind.annotation.*; import java.util.Objects; - @RestController @RequiredArgsConstructor @RequestMapping("/api/code") @Api(tags = "系统:验证码管理") -public class VerifyController { - - private final VerifyService verificationCodeService; +public class CaptchaController { + private final CaptchaService captchaService; private final EmailService emailService; - @PostMapping(value = "/resetEmail") + /** + * 除了这个其他的接口都没有用上 + * + * @param email 邮件地址 + */ + @PostMapping(value = "/sendCaptcha") @ApiOperation("重置邮箱,发送验证码") public ResponseEntity resetEmail(@RequestParam String email) { - EmailDto emailDto = verificationCodeService.sendEmailCode(email, CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey()); - emailService.sendEmail(emailDto); + emailService.sendCaptcha(email, CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey()); return new ResponseEntity<>(HttpStatus.OK); } - @PostMapping(value = "/email/resetPass") + @PostMapping(value = "/resetPass") @ApiOperation("重置密码,发送验证码") public ResponseEntity resetPass(@RequestParam String email) { - EmailDto emailDto = verificationCodeService.sendEmailCode(email, CodeEnum.EMAIL_RESET_PWD_CODE.getKey()); - emailService.sendEmail(emailDto); + emailService.sendCaptcha(email, CodeEnum.EMAIL_RESET_PWD_CODE.getKey()); return new ResponseEntity<>(HttpStatus.OK); } @@ -46,10 +46,10 @@ public class VerifyController { CodeBiEnum biEnum = CodeBiEnum.find(codeBi); switch (Objects.requireNonNull(biEnum)) { case ONE: - verificationCodeService.validateEmailCode(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey(), email, code); + captchaService.checkCode(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey(), email, code); break; case TWO: - verificationCodeService.validateEmailCode(CodeEnum.EMAIL_RESET_PWD_CODE.getKey(), email, code); + captchaService.checkCode(CodeEnum.EMAIL_RESET_PWD_CODE.getKey(), email, code); break; default: break; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DeptController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DeptController.java index 184b1a97..cea02c6a 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DeptController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DeptController.java @@ -2,9 +2,9 @@ package cn.odboy.application.system.rest; import cn.odboy.application.system.service.DeptService; import cn.odboy.base.PageResult; -import cn.odboy.exception.BadRequestException; import cn.odboy.model.system.domain.Dept; -import cn.odboy.model.system.dto.DeptQueryCriteria; +import cn.odboy.model.system.request.DeptQueryCriteria; +import cn.odboy.model.system.request.CreateDeptRequest; import cn.odboy.util.PageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -24,9 +24,7 @@ import java.util.stream.Collectors; @Api(tags = "系统:部门管理") @RequestMapping("/api/dept") public class DeptController { - private final DeptService deptService; - private static final String ENTITY_NAME = "dept"; @ApiOperation("导出部门数据") @GetMapping(value = "/download") @@ -68,10 +66,7 @@ public class DeptController { @ApiOperation("新增部门") @PostMapping @PreAuthorize("@el.check('dept:add')") - public ResponseEntity createDept(@Validated @RequestBody Dept resources) { - if (resources.getId() != null) { - throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID"); - } + public ResponseEntity createDept(@Validated @RequestBody CreateDeptRequest resources) { deptService.createDept(resources); return new ResponseEntity<>(HttpStatus.CREATED); } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DictController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DictController.java index 8ca61e07..92e03160 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DictController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DictController.java @@ -2,9 +2,9 @@ package cn.odboy.application.system.rest; import cn.odboy.application.system.service.DictService; import cn.odboy.base.PageResult; -import cn.odboy.exception.BadRequestException; import cn.odboy.model.system.domain.Dict; -import cn.odboy.model.system.dto.DictQueryCriteria; +import cn.odboy.model.system.request.DictQueryCriteria; +import cn.odboy.model.system.request.CreateDictRequest; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -25,9 +25,7 @@ import java.util.Set; @Api(tags = "系统:字典管理") @RequestMapping("/api/dict") public class DictController { - private final DictService dictService; - private static final String ENTITY_NAME = "dict"; @ApiOperation("导出字典数据") @GetMapping(value = "/download") @@ -54,10 +52,7 @@ public class DictController { @ApiOperation("新增字典") @PostMapping @PreAuthorize("@el.check('dict:add')") - public ResponseEntity createDict(@Validated @RequestBody Dict resources) { - if (resources.getId() != null) { - throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID"); - } + public ResponseEntity createDict(@Validated @RequestBody CreateDictRequest resources) { dictService.saveDict(resources); return new ResponseEntity<>(HttpStatus.CREATED); } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DictDetailController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DictDetailController.java index 3045bb70..39f0c589 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DictDetailController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/DictDetailController.java @@ -2,9 +2,9 @@ package cn.odboy.application.system.rest; import cn.odboy.application.system.service.DictDetailService; import cn.odboy.base.PageResult; -import cn.odboy.exception.BadRequestException; import cn.odboy.model.system.domain.DictDetail; -import cn.odboy.model.system.dto.DictDetailQueryCriteria; +import cn.odboy.model.system.request.DictDetailQueryCriteria; +import cn.odboy.model.system.request.CreateDictDetailRequest; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -24,9 +24,7 @@ import java.util.Map; @Api(tags = "系统:字典详情管理") @RequestMapping("/api/dictDetail") public class DictDetailController { - private final DictDetailService dictDetailService; - private static final String ENTITY_NAME = "dictDetail"; @ApiOperation("查询字典详情") @GetMapping @@ -49,10 +47,7 @@ public class DictDetailController { @ApiOperation("新增字典详情") @PostMapping @PreAuthorize("@el.check('dict:add')") - public ResponseEntity createDictDetail(@Validated @RequestBody DictDetail resources) { - if (resources.getId() != null) { - throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID"); - } + public ResponseEntity createDictDetail(@Validated @RequestBody CreateDictDetailRequest resources) { dictDetailService.saveDictDetail(resources); return new ResponseEntity<>(HttpStatus.CREATED); } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/JobController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/JobController.java index 07deba0d..e3e94c8c 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/JobController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/JobController.java @@ -2,9 +2,9 @@ package cn.odboy.application.system.rest; import cn.odboy.application.system.service.JobService; import cn.odboy.base.PageResult; -import cn.odboy.exception.BadRequestException; import cn.odboy.model.system.domain.Job; -import cn.odboy.model.system.dto.JobQueryCriteria; +import cn.odboy.model.system.request.JobQueryCriteria; +import cn.odboy.model.system.request.CreateJobRequest; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -25,9 +25,7 @@ import java.util.Set; @Api(tags = "系统:岗位管理") @RequestMapping("/api/job") public class JobController { - private final JobService jobService; - private static final String ENTITY_NAME = "job"; @ApiOperation("导出岗位数据") @GetMapping(value = "/download") @@ -47,11 +45,8 @@ public class JobController { @ApiOperation("新增岗位") @PostMapping @PreAuthorize("@el.check('job:add')") - public ResponseEntity createJob(@Validated @RequestBody Job resources) { - if (resources.getId() != null) { - throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID"); - } - jobService.saveJob(resources); + public ResponseEntity createJob(@Validated @RequestBody CreateJobRequest resources) { + jobService.createJob(resources); return new ResponseEntity<>(HttpStatus.CREATED); } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/MenuController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/MenuController.java index 6fd7f709..344cf3af 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/MenuController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/MenuController.java @@ -5,8 +5,8 @@ import cn.odboy.application.system.service.MenuService; import cn.odboy.base.PageResult; import cn.odboy.exception.BadRequestException; import cn.odboy.model.system.domain.Menu; -import cn.odboy.model.system.dto.MenuQueryCriteria; -import cn.odboy.model.system.dto.MenuVo; +import cn.odboy.model.system.request.MenuQueryCriteria; +import cn.odboy.model.system.response.MenuVo; import cn.odboy.util.PageUtil; import cn.odboy.util.SecurityUtil; import io.swagger.annotations.Api; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/RoleController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/RoleController.java index c08938cb..97788089 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/RoleController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/RoleController.java @@ -5,7 +5,8 @@ import cn.odboy.application.system.service.RoleService; import cn.odboy.base.PageResult; import cn.odboy.exception.BadRequestException; import cn.odboy.model.system.domain.Role; -import cn.odboy.model.system.dto.RoleQueryCriteria; +import cn.odboy.model.system.request.RoleQueryCriteria; +import cn.odboy.model.system.request.CreateRoleRequest; import cn.odboy.util.SecurityUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; @@ -30,11 +31,8 @@ import java.util.stream.Collectors; @Api(tags = "系统:角色管理") @RequestMapping("/api/roles") public class RoleController { - private final RoleService roleService; - private static final String ENTITY_NAME = "role"; - @ApiOperation("获取单个role") @GetMapping(value = "/{id}") @PreAuthorize("@el.check('roles:list')") @@ -73,10 +71,7 @@ public class RoleController { @ApiOperation("新增角色") @PostMapping @PreAuthorize("@el.check('roles:add')") - public ResponseEntity createRole(@Validated @RequestBody Role resources) { - if (resources.getId() != null) { - throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID"); - } + public ResponseEntity createRole(@Validated @RequestBody CreateRoleRequest resources) { getLevels(resources.getLevel()); roleService.createRole(resources); return new ResponseEntity<>(HttpStatus.CREATED); diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/UserController.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/UserController.java index f3ed16d4..f8b71386 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/UserController.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/rest/UserController.java @@ -1,19 +1,25 @@ package cn.odboy.application.system.rest; import cn.hutool.core.collection.CollectionUtil; -import cn.odboy.application.system.service.*; +import cn.odboy.application.system.service.DataService; +import cn.odboy.application.system.service.DeptService; +import cn.odboy.application.system.service.RoleService; +import cn.odboy.application.system.service.UserService; +import cn.odboy.application.tools.service.CaptchaService; +import cn.odboy.base.MyMetaOption; import cn.odboy.base.PageResult; import cn.odboy.constant.CodeEnum; import cn.odboy.exception.BadRequestException; import cn.odboy.model.system.domain.Dept; import cn.odboy.model.system.domain.Role; import cn.odboy.model.system.domain.User; -import cn.odboy.model.system.dto.UserPassVo; -import cn.odboy.model.system.dto.UserQueryCriteria; +import cn.odboy.model.system.response.UserPassVo; +import cn.odboy.model.system.request.UserQueryCriteria; import cn.odboy.properties.RsaProperties; import cn.odboy.util.PageUtil; -import cn.odboy.util.RSAEncryptUtil; +import cn.odboy.util.RsaEncryptUtil; import cn.odboy.util.SecurityUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -30,9 +36,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Api(tags = "系统:用户管理") @@ -40,13 +44,12 @@ import java.util.stream.Collectors; @RequestMapping("/api/users") @RequiredArgsConstructor public class UserController { - private final PasswordEncoder passwordEncoder; private final UserService userService; private final DataService dataService; private final DeptService deptService; private final RoleService roleService; - private final VerifyService verificationCodeService; + private final CaptchaService verificationCodeService; @ApiOperation("导出用户数据") @GetMapping(value = "/download") @@ -132,8 +135,8 @@ public class UserController { @ApiOperation("修改密码") @PostMapping(value = "/updatePass") public ResponseEntity updateUserPassword(@RequestBody UserPassVo passVo) throws Exception { - String oldPass = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, passVo.getOldPass()); - String newPass = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, passVo.getNewPass()); + String oldPass = RsaEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, passVo.getOldPass()); + String newPass = RsaEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, passVo.getNewPass()); User user = userService.getUserByUsername(SecurityUtil.getCurrentUsername()); if (!passwordEncoder.matches(oldPass, user.getPassword())) { throw new BadRequestException("修改失败,旧密码错误"); @@ -162,12 +165,12 @@ public class UserController { @ApiOperation("修改邮箱") @PostMapping(value = "/updateEmail/{code}") public ResponseEntity updateUserEmail(@PathVariable String code, @RequestBody User resources) throws Exception { - String password = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, resources.getPassword()); + String password = RsaEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, resources.getPassword()); User user = userService.getUserByUsername(SecurityUtil.getCurrentUsername()); if (!passwordEncoder.matches(password, user.getPassword())) { throw new BadRequestException("密码错误"); } - verificationCodeService.validateEmailCode(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey(), resources.getEmail(), code); + verificationCodeService.checkCode(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey(), resources.getEmail(), code); userService.updateEmailByUsername(user.getUsername(), resources.getEmail()); return new ResponseEntity<>(HttpStatus.OK); } @@ -184,4 +187,33 @@ public class UserController { throw new BadRequestException("角色权限不足"); } } + + @ApiOperation("查询用户基础数据") + @PostMapping(value = "/queryUserMetaPage") + @PreAuthorize("@el.check('user:list')") + public ResponseEntity> queryUserMetaPage(@Validated @RequestBody UserQueryCriteria criteria) { + int maxPageSize = 50; + return new ResponseEntity<>(userService.page(new Page<>(criteria.getPage(), maxPageSize), new LambdaQueryWrapper() + .and(c -> { + c.eq(User::getPhone, criteria.getBlurry()); + c.or(); + c.eq(User::getEmail, criteria.getBlurry()); + c.or(); + c.like(User::getUsername, criteria.getBlurry()); + c.or(); + c.like(User::getNickName, criteria.getBlurry()); + }) + ).getRecords().stream().map(m -> { + Map ext = new HashMap<>(1); + ext.put("id", m.getId()); + ext.put("deptId", m.getDeptId()); + ext.put("email", m.getEmail()); + ext.put("phone", m.getPhone()); + return MyMetaOption.builder() + .label(m.getNickName()) + .value(m.getUsername()) + .ext(ext) + .build(); + }).collect(Collectors.toList()), HttpStatus.OK); + } } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DeptService.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DeptService.java index 15f5fa73..03a6f510 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DeptService.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DeptService.java @@ -2,13 +2,13 @@ package cn.odboy.application.system.service; import cn.odboy.base.BaseResult; import cn.odboy.model.system.domain.Dept; -import cn.odboy.model.system.dto.DeptQueryCriteria; +import cn.odboy.model.system.request.DeptQueryCriteria; +import cn.odboy.model.system.request.CreateDeptRequest; import com.baomidou.mybatisplus.extension.service.IService; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; -import java.util.Map; import java.util.Set; public interface DeptService extends IService { @@ -36,7 +36,7 @@ public interface DeptService extends IService { * * @param resources / */ - void createDept(Dept resources); + void createDept(CreateDeptRequest resources); /** * 编辑 diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DictDetailService.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DictDetailService.java index 902db6d0..0329212c 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DictDetailService.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DictDetailService.java @@ -2,7 +2,8 @@ package cn.odboy.application.system.service; import cn.odboy.base.PageResult; import cn.odboy.model.system.domain.DictDetail; -import cn.odboy.model.system.dto.DictDetailQueryCriteria; +import cn.odboy.model.system.request.DictDetailQueryCriteria; +import cn.odboy.model.system.request.CreateDictDetailRequest; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -16,7 +17,7 @@ public interface DictDetailService extends IService { * * @param resources / */ - void saveDictDetail(DictDetail resources); + void saveDictDetail(CreateDictDetailRequest resources); /** * 编辑 diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DictService.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DictService.java index afe54678..20aa831e 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DictService.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/DictService.java @@ -2,7 +2,8 @@ package cn.odboy.application.system.service; import cn.odboy.base.PageResult; import cn.odboy.model.system.domain.Dict; -import cn.odboy.model.system.dto.DictQueryCriteria; +import cn.odboy.model.system.request.DictQueryCriteria; +import cn.odboy.model.system.request.CreateDictRequest; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -36,7 +37,7 @@ public interface DictService extends IService { * * @param resources / */ - void saveDict(Dict resources); + void saveDict(CreateDictRequest resources); /** * 编辑 diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/JobService.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/JobService.java index e9a260b0..f358e2bc 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/JobService.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/JobService.java @@ -2,7 +2,8 @@ package cn.odboy.application.system.service; import cn.odboy.base.PageResult; import cn.odboy.model.system.domain.Job; -import cn.odboy.model.system.dto.JobQueryCriteria; +import cn.odboy.model.system.request.JobQueryCriteria; +import cn.odboy.model.system.request.CreateJobRequest; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -27,7 +28,7 @@ public interface JobService extends IService { * * @param resources / */ - void saveJob(Job resources); + void createJob(CreateJobRequest resources); /** * 编辑 diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/MenuService.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/MenuService.java index de8c8b8d..0a064999 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/MenuService.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/MenuService.java @@ -1,8 +1,8 @@ package cn.odboy.application.system.service; import cn.odboy.model.system.domain.Menu; -import cn.odboy.model.system.dto.MenuQueryCriteria; -import cn.odboy.model.system.dto.MenuVo; +import cn.odboy.model.system.request.MenuQueryCriteria; +import cn.odboy.model.system.response.MenuVo; import com.baomidou.mybatisplus.extension.service.IService; import javax.servlet.http.HttpServletResponse; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/RoleService.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/RoleService.java index b084c359..8945514f 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/RoleService.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/RoleService.java @@ -4,7 +4,8 @@ import cn.odboy.base.PageResult; import cn.odboy.model.system.domain.Role; import cn.odboy.model.system.domain.User; import cn.odboy.model.system.dto.RoleCodeDto; -import cn.odboy.model.system.dto.RoleQueryCriteria; +import cn.odboy.model.system.request.RoleQueryCriteria; +import cn.odboy.model.system.request.CreateRoleRequest; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -53,7 +54,7 @@ public interface RoleService extends IService { * * @param resources / */ - void createRole(Role resources); + void createRole(CreateRoleRequest resources); /** * 编辑 diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/UserService.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/UserService.java index cbbb2013..b0521a1c 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/UserService.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/UserService.java @@ -2,7 +2,7 @@ package cn.odboy.application.system.service; import cn.odboy.base.PageResult; import cn.odboy.model.system.domain.User; -import cn.odboy.model.system.dto.UserQueryCriteria; +import cn.odboy.model.system.request.UserQueryCriteria; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DataServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DataServiceImpl.java index 9067ceeb..24685e05 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DataServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DataServiceImpl.java @@ -4,8 +4,8 @@ import cn.hutool.core.collection.CollUtil; import cn.odboy.application.system.service.DataService; import cn.odboy.application.system.service.DeptService; import cn.odboy.application.system.service.RoleService; -import cn.odboy.constant.SystemRedisKey; import cn.odboy.constant.DataScopeEnum; +import cn.odboy.constant.SystemRedisKey; import cn.odboy.model.system.domain.Dept; import cn.odboy.model.system.domain.Role; import cn.odboy.model.system.domain.User; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DeptServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DeptServiceImpl.java index 4185c147..5bf2ba93 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DeptServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DeptServiceImpl.java @@ -1,5 +1,6 @@ package cn.odboy.application.system.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; @@ -8,12 +9,13 @@ import cn.odboy.application.system.mapper.RoleMapper; import cn.odboy.application.system.mapper.UserMapper; import cn.odboy.application.system.service.DeptService; import cn.odboy.base.BaseResult; -import cn.odboy.constant.SystemRedisKey; import cn.odboy.constant.DataScopeEnum; +import cn.odboy.constant.SystemRedisKey; import cn.odboy.exception.BadRequestException; import cn.odboy.model.system.domain.Dept; import cn.odboy.model.system.domain.User; -import cn.odboy.model.system.dto.DeptQueryCriteria; +import cn.odboy.model.system.request.DeptQueryCriteria; +import cn.odboy.model.system.request.CreateDeptRequest; import cn.odboy.util.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; @@ -93,8 +95,8 @@ public class DeptServiceImpl extends ServiceImpl implements De @Override @Transactional(rollbackFor = Exception.class) - public void createDept(Dept resources) { - save(resources); + public void createDept(CreateDeptRequest resources) { + save(BeanUtil.copyProperties(resources, Dept.class)); // 清理缓存 updateSubCnt(resources.getPid()); // 清理自定义角色权限的DataScope缓存 diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DictDetailServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DictDetailServiceImpl.java index bd2a4d19..0df2e0ff 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DictDetailServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/DictDetailServiceImpl.java @@ -1,5 +1,6 @@ package cn.odboy.application.system.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.odboy.application.system.mapper.DictDetailMapper; import cn.odboy.application.system.mapper.DictMapper; @@ -8,7 +9,8 @@ import cn.odboy.base.PageResult; import cn.odboy.constant.SystemRedisKey; import cn.odboy.model.system.domain.Dict; import cn.odboy.model.system.domain.DictDetail; -import cn.odboy.model.system.dto.DictDetailQueryCriteria; +import cn.odboy.model.system.request.DictDetailQueryCriteria; +import cn.odboy.model.system.request.CreateDictDetailRequest; import cn.odboy.util.PageUtil; import cn.odboy.util.RedisUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -34,11 +36,12 @@ public class DictDetailServiceImpl extends ServiceImpl implements Di @Override @Transactional(rollbackFor = Exception.class) - public void saveDict(Dict resources) { - save(resources); + public void saveDict(CreateDictRequest resources) { + save(BeanUtil.copyProperties(resources, Dict.class)); } @Override diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/JobServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/JobServiceImpl.java index 59cc35bc..c185d4f1 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/JobServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/JobServiceImpl.java @@ -1,5 +1,6 @@ package cn.odboy.application.system.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.odboy.application.system.mapper.JobMapper; import cn.odboy.application.system.mapper.UserMapper; import cn.odboy.application.system.service.JobService; @@ -8,7 +9,8 @@ import cn.odboy.constant.SystemRedisKey; import cn.odboy.exception.BadRequestException; import cn.odboy.exception.EntityExistException; import cn.odboy.model.system.domain.Job; -import cn.odboy.model.system.dto.JobQueryCriteria; +import cn.odboy.model.system.request.JobQueryCriteria; +import cn.odboy.model.system.request.CreateJobRequest; import cn.odboy.util.FileUtil; import cn.odboy.util.PageUtil; import cn.odboy.util.RedisUtil; @@ -53,12 +55,12 @@ public class JobServiceImpl extends ServiceImpl implements JobSe @Override @Transactional(rollbackFor = Exception.class) - public void saveJob(Job resources) { + public void createJob(CreateJobRequest resources) { Job job = jobMapper.getJobByName(resources.getName()); if (job != null) { throw new EntityExistException(Job.class, "name", resources.getName()); } - save(resources); + save(BeanUtil.copyProperties(resources, Job.class)); } @Override diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/MenuServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/MenuServiceImpl.java index aa937c5b..835487e5 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/MenuServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/MenuServiceImpl.java @@ -15,9 +15,9 @@ import cn.odboy.exception.EntityExistException; import cn.odboy.model.system.domain.Menu; import cn.odboy.model.system.domain.Role; import cn.odboy.model.system.domain.User; -import cn.odboy.model.system.dto.MenuMetaVo; -import cn.odboy.model.system.dto.MenuQueryCriteria; -import cn.odboy.model.system.dto.MenuVo; +import cn.odboy.model.system.response.MenuMetaVo; +import cn.odboy.model.system.request.MenuQueryCriteria; +import cn.odboy.model.system.response.MenuVo; import cn.odboy.util.ClassUtil; import cn.odboy.util.FileUtil; import cn.odboy.util.RedisUtil; diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/MonitorServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/MonitorServiceImpl.java index 7add4fe9..cdf21ee9 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/MonitorServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/MonitorServiceImpl.java @@ -5,7 +5,7 @@ import cn.hutool.core.date.DateUtil; import cn.odboy.application.system.service.MonitorService; import cn.odboy.constant.SystemConst; import cn.odboy.util.FileUtil; -import cn.odboy.util.IPUtil; +import cn.odboy.util.IpUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import oshi.SystemInfo; @@ -178,7 +178,7 @@ public class MonitorServiceImpl implements MonitorService { // 系统信息 systemInfo.put("os", os.toString()); systemInfo.put("day", formatBetween); - systemInfo.put("ip", IPUtil.getLocalIp()); + systemInfo.put("ip", IpUtil.getLocalIp()); return systemInfo; } } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/RoleServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/RoleServiceImpl.java index 65474174..e40722a2 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/RoleServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/RoleServiceImpl.java @@ -1,5 +1,6 @@ package cn.odboy.application.system.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.odboy.application.core.service.UserCacheService; @@ -16,7 +17,8 @@ import cn.odboy.model.system.domain.Menu; import cn.odboy.model.system.domain.Role; import cn.odboy.model.system.domain.User; import cn.odboy.model.system.dto.RoleCodeDto; -import cn.odboy.model.system.dto.RoleQueryCriteria; +import cn.odboy.model.system.request.RoleQueryCriteria; +import cn.odboy.model.system.request.CreateRoleRequest; import cn.odboy.util.FileUtil; import cn.odboy.util.PageUtil; import cn.odboy.util.RedisUtil; @@ -74,11 +76,11 @@ public class RoleServiceImpl extends ServiceImpl implements Ro @Override @Transactional(rollbackFor = Exception.class) - public void createRole(Role resources) { + public void createRole(CreateRoleRequest resources) { if (roleMapper.getRoleByName(resources.getName()) != null) { - throw new EntityExistException(Role.class, "username", resources.getName()); + throw new EntityExistException(Role.class, "name", resources.getName()); } - save(resources); + save(BeanUtil.copyProperties(resources, Role.class)); // 判断是否有部门数据,若有,则需创建关联 if (CollectionUtil.isNotEmpty(resources.getDepts())) { roleDeptMapper.insertBatchByRoleId(resources.getId(), resources.getDepts()); @@ -91,7 +93,7 @@ public class RoleServiceImpl extends ServiceImpl implements Ro Role role = getById(resources.getId()); Role role1 = roleMapper.getRoleByName(resources.getName()); if (role1 != null && !role1.getId().equals(role.getId())) { - throw new EntityExistException(Role.class, "username", resources.getName()); + throw new EntityExistException(Role.class, "name", resources.getName()); } role.setName(resources.getName()); role.setDescription(resources.getDescription()); diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/UserServiceImpl.java b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/UserServiceImpl.java index a483edb4..0fb4f33d 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/UserServiceImpl.java +++ b/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/UserServiceImpl.java @@ -1,7 +1,7 @@ package cn.odboy.application.system.service.impl; -import cn.odboy.application.core.service.UserOnlineService; import cn.odboy.application.core.service.UserCacheService; +import cn.odboy.application.core.service.UserOnlineService; import cn.odboy.application.system.mapper.UserJobMapper; import cn.odboy.application.system.mapper.UserMapper; import cn.odboy.application.system.mapper.UserRoleMapper; @@ -13,7 +13,7 @@ import cn.odboy.exception.EntityExistException; import cn.odboy.model.system.domain.Job; import cn.odboy.model.system.domain.Role; import cn.odboy.model.system.domain.User; -import cn.odboy.model.system.dto.UserQueryCriteria; +import cn.odboy.model.system.request.UserQueryCriteria; import cn.odboy.properties.FileProperties; import cn.odboy.util.*; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/cutejava/cutejava-system/src/main/resources/mapper/MenuMapper.xml b/cutejava/cutejava-system/src/main/resources/mapper/MenuMapper.xml index d3c022e4..435c2530 100644 --- a/cutejava/cutejava-system/src/main/resources/mapper/MenuMapper.xml +++ b/cutejava/cutejava-system/src/main/resources/mapper/MenuMapper.xml @@ -111,11 +111,11 @@ FROM sys_menu WHERE name = #{name} - + update sys_menu set sub_count = #{count} diff --git a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/mapper/LocalStorageMapper.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/mapper/LocalStorageMapper.java index 21919350..88a8de24 100644 --- a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/mapper/LocalStorageMapper.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/mapper/LocalStorageMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.tools.mapper; import cn.odboy.model.tools.domain.LocalStorage; -import cn.odboy.model.tools.dto.LocalStorageQueryCriteria; +import cn.odboy.model.tools.request.LocalStorageQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/mapper/QiniuContentMapper.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/mapper/QiniuContentMapper.java index d46c2daf..993fb55e 100644 --- a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/mapper/QiniuContentMapper.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/mapper/QiniuContentMapper.java @@ -1,7 +1,7 @@ package cn.odboy.application.tools.mapper; import cn.odboy.model.tools.domain.QiniuContent; -import cn.odboy.model.tools.dto.QiniuQueryCriteria; +import cn.odboy.model.tools.request.QiniuQueryCriteria; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; diff --git a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/rest/LocalStorageController.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/rest/LocalStorageController.java index f33ef0ec..1fe99f6a 100644 --- a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/rest/LocalStorageController.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/rest/LocalStorageController.java @@ -5,7 +5,7 @@ import cn.odboy.base.PageResult; import cn.odboy.constant.FileTypeEnum; import cn.odboy.exception.BadRequestException; import cn.odboy.model.tools.domain.LocalStorage; -import cn.odboy.model.tools.dto.LocalStorageQueryCriteria; +import cn.odboy.model.tools.request.LocalStorageQueryCriteria; import cn.odboy.util.FileUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; @@ -26,7 +26,6 @@ import java.io.IOException; @Api(tags = "工具:本地存储管理") @RequestMapping("/api/localStorage") public class LocalStorageController { - private final LocalStorageService localStorageService; @GetMapping diff --git a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/rest/QiniuController.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/rest/QiniuController.java index ca208ec1..f3f2f54c 100644 --- a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/rest/QiniuController.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/rest/QiniuController.java @@ -5,7 +5,7 @@ import cn.odboy.application.tools.service.QiniuContentService; import cn.odboy.base.PageResult; import cn.odboy.model.tools.domain.QiniuConfig; import cn.odboy.model.tools.domain.QiniuContent; -import cn.odboy.model.tools.dto.QiniuQueryCriteria; +import cn.odboy.model.tools.request.QiniuQueryCriteria; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -31,7 +31,6 @@ import java.util.Map; @RequestMapping("/api/qiNiuContent") @Api(tags = "工具:七牛云存储管理") public class QiniuController { - private final QiniuContentService qiniuContentService; private final QiNiuConfigService qiNiuConfigService; @@ -90,7 +89,7 @@ public class QiniuController { @ApiOperation("删除文件") @DeleteMapping(value = "/{id}") public ResponseEntity deleteQiNiu(@PathVariable Long id) { - qiniuContentService.delete(qiniuContentService.getById(id)); + qiniuContentService.deleteFileById(id); return new ResponseEntity<>(HttpStatus.OK); } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/VerifyService.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/CaptchaService.java similarity index 54% rename from cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/VerifyService.java rename to cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/CaptchaService.java index f3d3add1..0494d336 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/VerifyService.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/CaptchaService.java @@ -1,9 +1,9 @@ -package cn.odboy.application.system.service; +package cn.odboy.application.tools.service; import cn.odboy.model.tools.dto.EmailDto; -public interface VerifyService { +public interface CaptchaService { /** * 发送验证码 * @@ -11,7 +11,7 @@ public interface VerifyService { * @param key / * @return / */ - EmailDto sendEmailCode(String email, String key); + EmailDto renderCode(String email, String key); /** @@ -20,5 +20,5 @@ public interface VerifyService { * @param code / * @param key / */ - void validateEmailCode(String key, String email, String code); + void checkCode(String key, String email, String code); } diff --git a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/EmailService.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/EmailService.java index 741a3183..d20c802f 100644 --- a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/EmailService.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/EmailService.java @@ -29,4 +29,12 @@ public interface EmailService extends IService { * @param emailDto 邮件发送的内容 */ void sendEmail(EmailDto emailDto); + + /** + * 发送邮件验证码 + * + * @param email 邮箱地址 + * @param key 类型 + */ + void sendCaptcha(String email, String key); } diff --git a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/LocalStorageService.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/LocalStorageService.java index c3446db3..dba343e2 100644 --- a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/LocalStorageService.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/LocalStorageService.java @@ -2,7 +2,7 @@ package cn.odboy.application.tools.service; import cn.odboy.base.PageResult; import cn.odboy.model.tools.domain.LocalStorage; -import cn.odboy.model.tools.dto.LocalStorageQueryCriteria; +import cn.odboy.model.tools.request.LocalStorageQueryCriteria; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; diff --git a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/QiniuContentService.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/QiniuContentService.java index 304f4531..7c651d36 100644 --- a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/QiniuContentService.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/QiniuContentService.java @@ -2,7 +2,7 @@ package cn.odboy.application.tools.service; import cn.odboy.base.PageResult; import cn.odboy.model.tools.domain.QiniuContent; -import cn.odboy.model.tools.dto.QiniuQueryCriteria; +import cn.odboy.model.tools.request.QiniuQueryCriteria; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; @@ -47,13 +47,6 @@ public interface QiniuContentService extends IService { */ String download(QiniuContent content); - /** - * 删除文件 - * - * @param content 文件 - */ - void delete(QiniuContent content); - /** * 同步数据 */ @@ -74,4 +67,11 @@ public interface QiniuContentService extends IService { * @throws IOException / */ void downloadExcel(List queryAll, HttpServletResponse response) throws IOException; + + /** + * 删除文件 + * + * @param id 文件id + */ + void deleteFileById(Long id); } diff --git a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/VerifyServiceImpl.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/impl/CaptchaServiceImpl.java similarity index 87% rename from cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/VerifyServiceImpl.java rename to cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/impl/CaptchaServiceImpl.java index b7c9a3d7..c07d1c12 100644 --- a/cutejava/cutejava-system/src/main/java/cn/odboy/application/system/service/impl/VerifyServiceImpl.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/impl/CaptchaServiceImpl.java @@ -1,4 +1,4 @@ -package cn.odboy.application.system.service.impl; +package cn.odboy.application.tools.service.impl; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.RandomUtil; @@ -6,7 +6,7 @@ import cn.hutool.extra.template.Template; import cn.hutool.extra.template.TemplateConfig; import cn.hutool.extra.template.TemplateEngine; import cn.hutool.extra.template.TemplateUtil; -import cn.odboy.application.system.service.VerifyService; +import cn.odboy.application.tools.service.CaptchaService; import cn.odboy.exception.BadRequestException; import cn.odboy.model.tools.dto.EmailDto; import cn.odboy.util.RedisUtil; @@ -19,15 +19,14 @@ import java.util.Collections; @Service @RequiredArgsConstructor -public class VerifyServiceImpl implements VerifyService { +public class CaptchaServiceImpl implements CaptchaService { private final RedisUtil redisUtil; - @Value("${code.expiration}") private Long expiration; @Override @Transactional(rollbackFor = Exception.class) - public EmailDto sendEmailCode(String email, String key) { + public EmailDto renderCode(String email, String key) { EmailDto emailDto; String content; String redisKey = key + email; @@ -41,8 +40,8 @@ public class VerifyServiceImpl implements VerifyService { if (!redisUtil.set(redisKey, code, expiration)) { throw new BadRequestException("服务异常,请联系网站负责人"); } - content = template.render(Dict.create().set("code", code)); // 存在就再次发送原来的验证码 + content = template.render(Dict.create().set("code", code)); } else { content = template.render(Dict.create().set("code", oldCode)); } @@ -51,7 +50,7 @@ public class VerifyServiceImpl implements VerifyService { } @Override - public void validateEmailCode(String key, String email, String code) { + public void checkCode(String key, String email, String code) { String value = redisUtil.get(key + email, String.class); if (value == null || !value.equals(code)) { throw new BadRequestException("无效验证码"); diff --git a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/impl/EmailServiceImpl.java b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/impl/EmailServiceImpl.java index 9939e93d..1587a4f1 100644 --- a/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/impl/EmailServiceImpl.java +++ b/cutejava/cutejava-tools/src/main/java/cn/odboy/application/tools/service/impl/EmailServiceImpl.java @@ -3,11 +3,13 @@ package cn.odboy.application.tools.service.impl; import cn.hutool.extra.mail.Mail; import cn.hutool.extra.mail.MailAccount; import cn.odboy.application.tools.mapper.EmailConfigMapper; +import cn.odboy.application.tools.service.CaptchaService; import cn.odboy.application.tools.service.EmailService; +import cn.odboy.constant.CodeEnum; import cn.odboy.exception.BadRequestException; import cn.odboy.model.tools.domain.EmailConfig; import cn.odboy.model.tools.dto.EmailDto; -import cn.odboy.util.DESEncryptUtil; +import cn.odboy.util.DesEncryptUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; @@ -23,6 +25,8 @@ public class EmailServiceImpl extends ServiceImpl