From 3ed9ca235ab10bf079674307250321846bd9f3fb Mon Sep 17 00:00:00 2001 From: super_liu <396572590@qq.com> Date: Mon, 31 May 2021 14:56:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=90=E4=BA=A4=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 37 + adc-da-base/HELP.md | 17 + adc-da-base/pom.xml | 58 ++ .../com/adc/da/base/entity/BaseEntity.java | 6 + .../com/adc/da/base/entity/TreeEntity.java | 72 ++ .../java/com/adc/da/base/page/BasePage.java | 91 +++ .../main/java/com/adc/da/base/page/Pager.java | 169 ++++ .../com/adc/da/base/web/BaseController.java | 81 ++ .../adc/da/exception/AdcDaBaseException.java | 25 + .../com/adc/da/file/store/IFileStore.java | 14 + .../da/filter/AddExpiresHeaderResponse.java | 34 + .../java/com/adc/da/filter/CsrfFilter.java | 78 ++ .../adc/da/filter/FakeJSessionIdFilter.java | 40 + .../com/adc/da/filter/HttpCacheFilter.java | 33 + .../com/adc/da/filter/RequestInfoFilter.java | 102 +++ .../java/com/adc/da/filter/WebFilter.java | 29 + .../filter/XssHttpServletRequestWrapper.java | 124 +++ .../java/com/adc/da/filter/XssShieldUtil.java | 96 +++ .../main/java/com/adc/da/xss/SQLFilter.java | 31 + adc-da-jwtLogin/.gitignore | 33 + .../.mvn/wrapper/MavenWrapperDownloader.java | 118 +++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + adc-da-jwtLogin/mvnw | 310 ++++++++ adc-da-jwtLogin/mvnw.cmd | 182 +++++ adc-da-jwtLogin/pom.xml | 50 ++ .../da/login/rest/LoginRestController.java | 213 +++++ .../com/adc/da/login/security/JWTFilter.java | 158 ++++ .../com/adc/da/login/security/JWTRealm.java | 145 ++++ .../com/adc/da/login/security/JWTToken.java | 32 + .../src/main/java/com/adc/da/login/test.java | 4 + .../com/adc/da/login/util/CacheUtils.java | 84 ++ .../java/com/adc/da/login/util/JWTUtil.java | 79 ++ .../java/com/adc/da/login/util/UserUtils.java | 188 +++++ .../java/com/adc/da/login/vo/LoginVO.java | 64 ++ adc-da-main/.gitignore | 33 + .../.mvn/wrapper/MavenWrapperDownloader.java | 118 +++ adc-da-main/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + adc-da-main/mvnw | 310 ++++++++ adc-da-main/mvnw.cmd | 182 +++++ adc-da-main/pom.xml | 63 ++ .../java/com/adc/da/AdcDaApplication.java | 16 + .../java/com/adc/da/ServletInitializer.java | 16 + .../main/advice/AdcDaBaseExceptionAdvice.java | 38 + .../da/main/advice/ShiroExceptionAdvice.java | 41 + .../da/main/config/DefinitionUrlConfig.java | 44 ++ .../adc/da/main/config/MybatisPlusConfig.java | 22 + .../da/main/config/RestTemplateConfig.java | 50 ++ .../com/adc/da/main/config/ShiroConfig.java | 151 ++++ .../da/main/config/ShiroConfiguration.java | 92 +++ .../com/adc/da/main/config/SwaggerConfig.java | 67 ++ .../com/adc/da/main/config/WebConfig.java | 105 +++ .../filter/AuthFormAuthenticationFilter.java | 25 + .../com/adc/da/main/generate/CodeGen.java | 147 ++++ .../com/adc/da/main/generate/CodeUtil.java | 15 + .../main/resources/application-dev.properties | 44 ++ .../resources/application-prod.properties | 38 + .../resources/application-test.properties | 38 + .../src/main/resources/application.properties | 101 +++ adc-da-main/src/main/resources/banner.txt | 9 + .../src/main/resources/logback-spring.xml | 202 +++++ .../src/main/resources/logo/logo_white.png | Bin 0 -> 141020 bytes .../main/resources/mybatis/mybatis-config.xml | 14 + .../src/main/resources/temp/entity.java.ftl | 152 ++++ .../src/main/resources/temp/mapper.java.ftl | 20 + .../src/main/resources/temp/service.java.ftl | 20 + .../resources/templates/controller.java.ftl | 41 + .../main/resources/templates/entity.java.ftl | 152 ++++ .../main/resources/templates/mapper.java.ftl | 20 + .../main/resources/templates/mapper.xml.ftl | 39 + .../main/resources/templates/service.java.ftl | 20 + .../resources/templates/serviceImpl.java.ftl | 26 + .../src/main/resources/ueditor/config.json | 97 +++ .../src/main/resources/white/uploadWhite.txt | 12 + .../src/main/resources/white/xssWhite.txt | 1 + adc-da-sys/.gitignore | 33 + .../.mvn/wrapper/MavenWrapperDownloader.java | 118 +++ adc-da-sys/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + adc-da-sys/mvnw | 310 ++++++++ adc-da-sys/mvnw.cmd | 182 +++++ adc-da-sys/pom.xml | 54 ++ .../att/controller/AttFileEOController.java | 578 ++++++++++++++ .../da/att/controller/UeditorController.java | 101 +++ .../java/com/adc/da/att/dao/AttFileEODao.java | 25 + .../java/com/adc/da/att/entity/AttFileEO.java | 217 ++++++ .../com/adc/da/att/entity/UeditorImage.java | 41 + .../com/adc/da/att/page/AttFileEOPage.java | 215 +++++ .../adc/da/att/service/IAttFileEOService.java | 25 + .../service/impl/AttFileEOServiceImpl.java | 361 +++++++++ .../java/com/adc/da/att/vo/AttFileVo.java | 90 +++ .../controller/PersonCollectEOController.java | 206 +++++ .../controller/PersonConfEOController.java | 216 ++++++ .../controller/PersonCookiesEOController.java | 176 +++++ .../controller/PersonMsgEOController.java | 220 ++++++ .../controller/PersonNoteEOController.java | 168 ++++ .../controller/PersonSearchEOController.java | 143 ++++ .../controller/PersonShareEOController.java | 205 +++++ .../adc/da/person/dao/PersonCollectEODao.java | 32 + .../adc/da/person/dao/PersonConfEODao.java | 36 + .../adc/da/person/dao/PersonCookiesEODao.java | 60 ++ .../com/adc/da/person/dao/PersonMsgEODao.java | 36 + .../adc/da/person/dao/PersonNoteEODao.java | 31 + .../adc/da/person/dao/PersonSearchEODao.java | 25 + .../adc/da/person/dao/PersonShareEODao.java | 29 + .../adc/da/person/entity/PersonCollectEO.java | 211 +++++ .../adc/da/person/entity/PersonConfEO.java | 163 ++++ .../adc/da/person/entity/PersonCookiesEO.java | 188 +++++ .../com/adc/da/person/entity/PersonMsgEO.java | 191 +++++ .../adc/da/person/entity/PersonNoteEO.java | 190 +++++ .../adc/da/person/entity/PersonSearchEO.java | 131 ++++ .../adc/da/person/entity/PersonShareEO.java | 236 ++++++ .../da/person/page/PersonCollectEOPage.java | 226 ++++++ .../adc/da/person/page/PersonConfEOPage.java | 194 +++++ .../da/person/page/PersonCookiesEOPage.java | 212 +++++ .../adc/da/person/page/PersonMsgEOPage.java | 213 +++++ .../adc/da/person/page/PersonNoteEOPage.java | 212 +++++ .../da/person/page/PersonSearchEOPage.java | 158 ++++ .../adc/da/person/page/PersonShareEOPage.java | 265 +++++++ .../service/IPersonCollectEOService.java | 21 + .../person/service/IPersonConfEOService.java | 29 + .../service/IPersonCookiesEOService.java | 34 + .../person/service/IPersonMsgEOService.java | 24 + .../person/service/IPersonNoteEOService.java | 25 + .../service/IPersonSearchEOService.java | 15 + .../person/service/IPersonShareEOService.java | 22 + .../impl/PersonCollectEOServiceImpl.java | 94 +++ .../service/impl/PersonConfEOServiceImpl.java | 214 +++++ .../impl/PersonCookiesEOServiceImpl.java | 89 +++ .../service/impl/PersonMsgEOServiceImpl.java | 65 ++ .../service/impl/PersonNoteEOServiceImpl.java | 77 ++ .../impl/PersonSearchEOServiceImpl.java | 43 + .../impl/PersonShareEOServiceImpl.java | 51 ++ .../com/adc/da/sys/constant/IsBelongEnum.java | 22 + .../adc/da/sys/constant/PersonModelEnum.java | 31 + .../adc/da/sys/constant/UserSourceEnum.java | 21 + .../controller/FeedbackInfoEOController.java | 143 ++++ .../sys/controller/LinkInfoEOController.java | 110 +++ .../sys/controller/LoginInfoEOController.java | 30 + .../da/sys/controller/MenuEOController.java | 164 ++++ .../sys/controller/OrgEORestController.java | 352 +++++++++ .../da/sys/controller/RoleEOController.java | 294 +++++++ .../controller/RoleSarMenuEOController.java | 153 ++++ .../controller/UserConfigEOController.java | 98 +++ .../da/sys/controller/UserEOController.java | 557 +++++++++++++ .../sys/controller/UserInfoEOController.java | 168 ++++ .../sys/controller/WarnTimeEOController.java | 124 +++ .../com/adc/da/sys/entity/FeedbackInfoEO.java | 152 ++++ .../com/adc/da/sys/entity/LinkInfoEO.java | 117 +++ .../com/adc/da/sys/entity/LoginInfoEO.java | 148 ++++ .../java/com/adc/da/sys/entity/MenuEO.java | 219 ++++++ .../java/com/adc/da/sys/entity/OrgEO.java | 311 ++++++++ .../java/com/adc/da/sys/entity/RoleEO.java | 301 +++++++ .../com/adc/da/sys/entity/RoleMenuEO.java | 67 ++ .../com/adc/da/sys/entity/RoleSarMenuEO.java | 113 +++ .../com/adc/da/sys/entity/UserConfigEO.java | 145 ++++ .../java/com/adc/da/sys/entity/UserEO.java | 385 +++++++++ .../com/adc/da/sys/entity/UserInfoEO.java | 389 ++++++++++ .../java/com/adc/da/sys/entity/UserOrgEO.java | 67 ++ .../com/adc/da/sys/entity/UserRoleEO.java | 67 ++ .../com/adc/da/sys/entity/WarnTimeEO.java | 67 ++ .../adc/da/sys/page/FeedbackInfoEOPage.java | 222 ++++++ .../com/adc/da/sys/page/LinkInfoEOPage.java | 212 +++++ .../com/adc/da/sys/page/LoginInfoEOPage.java | 176 +++++ .../java/com/adc/da/sys/page/RoleEOPage.java | 248 ++++++ .../com/adc/da/sys/page/RoleMenuEOPage.java | 51 ++ .../adc/da/sys/page/RoleSarMenuEOPage.java | 51 ++ .../com/adc/da/sys/page/UserConfigEOPage.java | 176 +++++ .../java/com/adc/da/sys/page/UserEOPage.java | 256 ++++++ .../com/adc/da/sys/page/UserInfoEOPage.java | 339 ++++++++ .../com/adc/da/sys/page/UserOrgEOPage.java | 51 ++ .../com/adc/da/sys/page/UserRoleEOPage.java | 51 ++ .../com/adc/da/sys/page/WarnTimeEOPage.java | 51 ++ .../sys/service/IFeedbackInfoEOService.java | 17 + .../da/sys/service/ILinkInfoEOService.java | 16 + .../da/sys/service/ILoginInfoEOService.java | 18 + .../adc/da/sys/service/IMenuEOService.java | 32 + .../com/adc/da/sys/service/IOrgEOService.java | 78 ++ .../adc/da/sys/service/IRoleEOService.java | 43 + .../da/sys/service/IRoleSarMenuEOService.java | 23 + .../da/sys/service/IUserConfigEOService.java | 17 + .../adc/da/sys/service/IUserEOService.java | 73 ++ .../da/sys/service/IUserInfoEOService.java | 21 + .../da/sys/service/IUserRoleEOService.java | 7 + .../da/sys/service/IWarnTimeEOService.java | 15 + .../impl/FeedbackInfoEOServiceImpl.java | 61 ++ .../service/impl/LinkInfoEOServiceImpl.java | 50 ++ .../service/impl/LoginInfoEOServiceImpl.java | 63 ++ .../sys/service/impl/MenuEOServiceImpl.java | 166 ++++ .../da/sys/service/impl/OrgEOServiceImpl.java | 540 +++++++++++++ .../sys/service/impl/RoleEOServiceImpl.java | 182 +++++ .../impl/RoleSarMenuEOServiceImpl.java | 59 ++ .../service/impl/UserConfigEOServiceImpl.java | 59 ++ .../sys/service/impl/UserEOServiceImpl.java | 458 +++++++++++ .../service/impl/UserInfoEOServiceImpl.java | 101 +++ .../service/impl/UserRoleEOServiceImpl.java | 24 + .../service/impl/WarnTimeEOServiceImpl.java | 43 + .../main/java/com/adc/da/sys/vo/MenuVO.java | 100 +++ .../main/java/com/adc/da/sys/vo/TreeVO.java | 70 ++ .../main/java/com/adc/da/sys/vo/UserVO.java | 331 ++++++++ .../config/GetHttpSessionConfigurator.java | 28 + .../config/SpringWebSocketConfig.java | 25 + .../da/websocket/config/WebSocketConfig.java | 15 + .../websocket/constant/SocketMesTypeEnum.java | 26 + .../controller/webSocketController.java | 39 + .../da/websocket/entity/WebSocketBean.java | 57 ++ .../da/websocket/entity/WebSocketMessage.java | 36 + .../handler/SpringWebSocketHandler.java | 121 +++ .../SpringWebSocketHandlerInterceptor.java | 36 + .../da/websocket/service/WebSocketServer.java | 59 ++ .../websocket/service/WebSocketService.java | 44 ++ .../service/WebsocketServerImpl.java | 140 ++++ .../mybatis/mapper/att/AttFileEOMapper.xml | 100 +++ .../mapper/person/PersonCollectEOMapper.xml | 376 +++++++++ .../mapper/person/PersonConfEOMapper.xml | 243 ++++++ .../mapper/person/PersonCookiesEOMapper.xml | 353 +++++++++ .../mapper/person/PersonMsgEOMapper.xml | 243 ++++++ .../mapper/person/PersonNoteEOMapper.xml | 237 ++++++ .../mapper/person/PersonSearchEOMapper.xml | 165 ++++ .../mapper/person/PersonShareEOMapper.xml | 243 ++++++ .../mapper/sys/FeedbackInfoEOMapper.xml | 117 +++ .../mybatis/mapper/sys/LinkInfoEOMapper.xml | 104 +++ .../mybatis/mapper/sys/LoginInfoEOMapper.xml | 146 ++++ .../mybatis/mapper/sys/MenuEOMapper.xml | 180 +++++ .../mybatis/mapper/sys/OrgEOMapper.xml | 733 ++++++++++++++++++ .../mybatis/mapper/sys/RoleEOMapper.xml | 253 ++++++ .../mapper/sys/RoleSarMenuEOMapper.xml | 78 ++ .../mybatis/mapper/sys/UserConfigEOMapper.xml | 87 +++ .../mybatis/mapper/sys/UserEOMapper.xml | 615 +++++++++++++++ .../mybatis/mapper/sys/UserInfoEOMapper.xml | 233 ++++++ .../mybatis/mapper/sys/UserRoleEOMapper.xml | 27 + .../mybatis/mapper/sys/WarnTimeEOMapper.xml | 55 ++ pom.xml | 302 ++++++++ 234 files changed, 27792 insertions(+) create mode 100644 .gitignore create mode 100644 adc-da-base/HELP.md create mode 100644 adc-da-base/pom.xml create mode 100644 adc-da-base/src/main/java/com/adc/da/base/entity/BaseEntity.java create mode 100644 adc-da-base/src/main/java/com/adc/da/base/entity/TreeEntity.java create mode 100644 adc-da-base/src/main/java/com/adc/da/base/page/BasePage.java create mode 100644 adc-da-base/src/main/java/com/adc/da/base/page/Pager.java create mode 100644 adc-da-base/src/main/java/com/adc/da/base/web/BaseController.java create mode 100644 adc-da-base/src/main/java/com/adc/da/exception/AdcDaBaseException.java create mode 100644 adc-da-base/src/main/java/com/adc/da/file/store/IFileStore.java create mode 100644 adc-da-base/src/main/java/com/adc/da/filter/AddExpiresHeaderResponse.java create mode 100644 adc-da-base/src/main/java/com/adc/da/filter/CsrfFilter.java create mode 100644 adc-da-base/src/main/java/com/adc/da/filter/FakeJSessionIdFilter.java create mode 100644 adc-da-base/src/main/java/com/adc/da/filter/HttpCacheFilter.java create mode 100644 adc-da-base/src/main/java/com/adc/da/filter/RequestInfoFilter.java create mode 100644 adc-da-base/src/main/java/com/adc/da/filter/WebFilter.java create mode 100644 adc-da-base/src/main/java/com/adc/da/filter/XssHttpServletRequestWrapper.java create mode 100644 adc-da-base/src/main/java/com/adc/da/filter/XssShieldUtil.java create mode 100644 adc-da-base/src/main/java/com/adc/da/xss/SQLFilter.java create mode 100644 adc-da-jwtLogin/.gitignore create mode 100644 adc-da-jwtLogin/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 adc-da-jwtLogin/.mvn/wrapper/maven-wrapper.jar create mode 100644 adc-da-jwtLogin/.mvn/wrapper/maven-wrapper.properties create mode 100644 adc-da-jwtLogin/mvnw create mode 100644 adc-da-jwtLogin/mvnw.cmd create mode 100644 adc-da-jwtLogin/pom.xml create mode 100644 adc-da-jwtLogin/src/main/java/com/adc/da/login/rest/LoginRestController.java create mode 100644 adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTFilter.java create mode 100644 adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTRealm.java create mode 100644 adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTToken.java create mode 100644 adc-da-jwtLogin/src/main/java/com/adc/da/login/test.java create mode 100644 adc-da-jwtLogin/src/main/java/com/adc/da/login/util/CacheUtils.java create mode 100644 adc-da-jwtLogin/src/main/java/com/adc/da/login/util/JWTUtil.java create mode 100644 adc-da-jwtLogin/src/main/java/com/adc/da/login/util/UserUtils.java create mode 100644 adc-da-jwtLogin/src/main/java/com/adc/da/login/vo/LoginVO.java create mode 100644 adc-da-main/.gitignore create mode 100644 adc-da-main/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 adc-da-main/.mvn/wrapper/maven-wrapper.jar create mode 100644 adc-da-main/.mvn/wrapper/maven-wrapper.properties create mode 100644 adc-da-main/mvnw create mode 100644 adc-da-main/mvnw.cmd create mode 100644 adc-da-main/pom.xml create mode 100644 adc-da-main/src/main/java/com/adc/da/AdcDaApplication.java create mode 100644 adc-da-main/src/main/java/com/adc/da/ServletInitializer.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/advice/AdcDaBaseExceptionAdvice.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/advice/ShiroExceptionAdvice.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/config/DefinitionUrlConfig.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/config/MybatisPlusConfig.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/config/RestTemplateConfig.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/config/ShiroConfig.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/config/ShiroConfiguration.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/config/SwaggerConfig.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/config/WebConfig.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/filter/AuthFormAuthenticationFilter.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/generate/CodeGen.java create mode 100644 adc-da-main/src/main/java/com/adc/da/main/generate/CodeUtil.java create mode 100644 adc-da-main/src/main/resources/application-dev.properties create mode 100644 adc-da-main/src/main/resources/application-prod.properties create mode 100644 adc-da-main/src/main/resources/application-test.properties create mode 100644 adc-da-main/src/main/resources/application.properties create mode 100644 adc-da-main/src/main/resources/banner.txt create mode 100644 adc-da-main/src/main/resources/logback-spring.xml create mode 100644 adc-da-main/src/main/resources/logo/logo_white.png create mode 100644 adc-da-main/src/main/resources/mybatis/mybatis-config.xml create mode 100644 adc-da-main/src/main/resources/temp/entity.java.ftl create mode 100644 adc-da-main/src/main/resources/temp/mapper.java.ftl create mode 100644 adc-da-main/src/main/resources/temp/service.java.ftl create mode 100644 adc-da-main/src/main/resources/templates/controller.java.ftl create mode 100644 adc-da-main/src/main/resources/templates/entity.java.ftl create mode 100644 adc-da-main/src/main/resources/templates/mapper.java.ftl create mode 100644 adc-da-main/src/main/resources/templates/mapper.xml.ftl create mode 100644 adc-da-main/src/main/resources/templates/service.java.ftl create mode 100644 adc-da-main/src/main/resources/templates/serviceImpl.java.ftl create mode 100644 adc-da-main/src/main/resources/ueditor/config.json create mode 100644 adc-da-main/src/main/resources/white/uploadWhite.txt create mode 100644 adc-da-main/src/main/resources/white/xssWhite.txt create mode 100644 adc-da-sys/.gitignore create mode 100644 adc-da-sys/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 adc-da-sys/.mvn/wrapper/maven-wrapper.jar create mode 100644 adc-da-sys/.mvn/wrapper/maven-wrapper.properties create mode 100644 adc-da-sys/mvnw create mode 100644 adc-da-sys/mvnw.cmd create mode 100644 adc-da-sys/pom.xml create mode 100644 adc-da-sys/src/main/java/com/adc/da/att/controller/AttFileEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/att/controller/UeditorController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/att/dao/AttFileEODao.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/att/entity/AttFileEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/att/entity/UeditorImage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/att/page/AttFileEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/att/service/IAttFileEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/att/service/impl/AttFileEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/att/vo/AttFileVo.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/controller/PersonCollectEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/controller/PersonConfEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/controller/PersonCookiesEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/controller/PersonMsgEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/controller/PersonNoteEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/controller/PersonSearchEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/controller/PersonShareEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/dao/PersonCollectEODao.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/dao/PersonConfEODao.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/dao/PersonCookiesEODao.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/dao/PersonMsgEODao.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/dao/PersonNoteEODao.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/dao/PersonSearchEODao.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/dao/PersonShareEODao.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/entity/PersonCollectEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/entity/PersonConfEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/entity/PersonCookiesEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/entity/PersonMsgEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/entity/PersonNoteEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/entity/PersonSearchEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/entity/PersonShareEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/page/PersonCollectEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/page/PersonConfEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/page/PersonCookiesEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/page/PersonMsgEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/page/PersonNoteEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/page/PersonSearchEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/page/PersonShareEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/IPersonCollectEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/IPersonConfEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/IPersonCookiesEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/IPersonMsgEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/IPersonNoteEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/IPersonSearchEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/IPersonShareEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonCollectEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonConfEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonCookiesEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonMsgEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonNoteEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonSearchEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonShareEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/constant/IsBelongEnum.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/constant/PersonModelEnum.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/constant/UserSourceEnum.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/FeedbackInfoEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/LinkInfoEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/LoginInfoEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/MenuEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/OrgEORestController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/RoleEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/RoleSarMenuEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/UserConfigEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/UserEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/UserInfoEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/controller/WarnTimeEOController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/FeedbackInfoEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/LinkInfoEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/LoginInfoEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/MenuEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/OrgEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleMenuEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleSarMenuEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/UserConfigEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/UserEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/UserInfoEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/UserOrgEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/UserRoleEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/entity/WarnTimeEO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/FeedbackInfoEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/LinkInfoEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/LoginInfoEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/RoleEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/RoleMenuEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/RoleSarMenuEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/UserConfigEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/UserEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/UserInfoEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/UserOrgEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/UserRoleEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/page/WarnTimeEOPage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IFeedbackInfoEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/ILinkInfoEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/ILoginInfoEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IMenuEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IOrgEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IRoleEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IRoleSarMenuEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IUserConfigEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IUserEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IUserInfoEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IUserRoleEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/IWarnTimeEOService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/FeedbackInfoEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/LinkInfoEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/LoginInfoEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/MenuEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/OrgEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/RoleEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/RoleSarMenuEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserConfigEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserInfoEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserRoleEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/service/impl/WarnTimeEOServiceImpl.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/vo/MenuVO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/vo/TreeVO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/sys/vo/UserVO.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/config/GetHttpSessionConfigurator.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/config/SpringWebSocketConfig.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/config/WebSocketConfig.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/constant/SocketMesTypeEnum.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/controller/webSocketController.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/entity/WebSocketBean.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/entity/WebSocketMessage.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/handler/SpringWebSocketHandler.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/interceptor/SpringWebSocketHandlerInterceptor.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/service/WebSocketServer.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/service/WebSocketService.java create mode 100644 adc-da-sys/src/main/java/com/adc/da/websocket/service/WebsocketServerImpl.java create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/att/AttFileEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/person/PersonCollectEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/person/PersonConfEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/person/PersonCookiesEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/person/PersonMsgEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/person/PersonNoteEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/person/PersonSearchEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/person/PersonShareEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/FeedbackInfoEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/LinkInfoEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/LoginInfoEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/MenuEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/OrgEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/RoleEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/RoleSarMenuEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/UserConfigEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/UserEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/UserInfoEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/UserRoleEOMapper.xml create mode 100644 adc-da-sys/src/main/resources/mybatis/mapper/sys/WarnTimeEOMapper.xml create mode 100644 pom.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3e0d9aa6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + + +target +*.iml +*.ipr +*.iws +.idea +.classpath +.project +.settings +.DS_Store +*.bpmn/ +*logs/ +.metadata diff --git a/adc-da-base/HELP.md b/adc-da-base/HELP.md new file mode 100644 index 00000000..93b2bf9a --- /dev/null +++ b/adc-da-base/HELP.md @@ -0,0 +1,17 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/maven-plugin/reference/html/) +* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/maven-plugin/reference/html/#build-image) +* [Java Mail Sender](https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/reference/htmlsingle/#boot-features-email) +* [MyBatis Framework](https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/) + +### Guides +The following guides illustrate how to use some features concretely: + +* [MyBatis Quick Start](https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start) +* [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/) + diff --git a/adc-da-base/pom.xml b/adc-da-base/pom.xml new file mode 100644 index 00000000..df6ad64a --- /dev/null +++ b/adc-da-base/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + + com.adc + foton-slrs-system-rest + 3.0.0 + + + com.adc + adc-da-base + 3.0.0 + adc-da-base + laws system rest base + + jar + + + 1.8 + + + + + org.springframework + spring-test + 5.2.8.RELEASE + compile + + + org.assertj + assertj-core + + + eu.bitwalker + UserAgentUtils + 1.21 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + diff --git a/adc-da-base/src/main/java/com/adc/da/base/entity/BaseEntity.java b/adc-da-base/src/main/java/com/adc/da/base/entity/BaseEntity.java new file mode 100644 index 00000000..13f772ac --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/base/entity/BaseEntity.java @@ -0,0 +1,6 @@ +package com.adc.da.base.entity; + +public class BaseEntity { + public BaseEntity() { + } +} diff --git a/adc-da-base/src/main/java/com/adc/da/base/entity/TreeEntity.java b/adc-da-base/src/main/java/com/adc/da/base/entity/TreeEntity.java new file mode 100644 index 00000000..29cd23db --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/base/entity/TreeEntity.java @@ -0,0 +1,72 @@ +package com.adc.da.base.entity; + +import java.util.List; + +public abstract class TreeEntity extends BaseEntity { + protected String id; + protected String name; + protected String parentId; + protected String parentIds; + protected T parent; + protected List childList; + protected Integer delFlag; + + public TreeEntity() { + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return this.parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getParentIds() { + return this.parentIds; + } + + public void setParentIds(String parentIds) { + this.parentIds = parentIds; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public List getChildList() { + return this.childList; + } + + public void setChildList(List childList) { + this.childList = childList; + } + + public T getParent() { + return this.parent; + } + + public void setParent(T parent) { + this.parent = parent; + } + + public Integer getDelFlag() { + return this.delFlag; + } + + public void setDelFlag(Integer delFlag) { + this.delFlag = delFlag; + } +} diff --git a/adc-da-base/src/main/java/com/adc/da/base/page/BasePage.java b/adc-da-base/src/main/java/com/adc/da/base/page/BasePage.java new file mode 100644 index 00000000..8ad9eb73 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/base/page/BasePage.java @@ -0,0 +1,91 @@ +package com.adc.da.base.page; + +public class BasePage { + private Integer page = 1; + private Integer pageSize = 20; + private Integer startIndex; + private Integer endIndex; + private String orderBy; + private String order; + private String q; + private Pager pager = new Pager(); + + public BasePage() { + } + + public Pager getPager() { + this.pager.setPageId(this.getPage()); + this.pager.setPageSize(this.getPageSize()); + String orderField = ""; + if (this.orderBy != null && this.orderBy.trim().length() > 0) { + orderField = this.orderBy; + } + + if (orderField.trim().length() > 0 && this.order != null && this.order.trim().length() > 0) { + orderField = orderField + " " + this.order; + } + + this.pager.setOrderField(orderField); + return this.pager; + } + + public void setPager(Pager pager) { + this.pager = pager; + } + + public Integer getPage() { + return this.page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public Integer getPageSize() { + return this.pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getOrderBy() { + return this.orderBy; + } + + public void setOrderBy(String orderBy) { + this.orderBy = orderBy; + } + + public String getOrder() { + return this.order; + } + + public void setOrder(String order) { + this.order = order; + } + + public String getQ() { + return this.q; + } + + public void setQ(String q) { + this.q = q; + } + + public Integer getStartIndex() { + return this.startIndex; + } + + public void setStartIndex(Integer startIndex) { + this.startIndex = (this.page - 1) * this.pageSize + 1; + } + + public Integer getEndIndex() { + return this.endIndex; + } + + public void setEndIndex(Integer endIndex) { + this.endIndex = this.page * this.pageSize; + } +} diff --git a/adc-da-base/src/main/java/com/adc/da/base/page/Pager.java b/adc-da-base/src/main/java/com/adc/da/base/page/Pager.java new file mode 100644 index 00000000..92ac6ecf --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/base/page/Pager.java @@ -0,0 +1,169 @@ +package com.adc.da.base.page; + +public class Pager { + + private int pageId = 1; + private int rowCount = 0; + private int pageSize = 10; + private int pageCount = 0; + private int pageOffset = 0; + private int pageTail = 0; + private String orderField; + private boolean orderDirection = true; + private boolean pageEnabled = true; + private int length = 6; + private int startIndex = 0; + private int endIndex = 0; + private int[] indexs; + + public Pager() { + } + + public int getLength() { + return this.length; + } + + public void setLength(int length) { + this.length = length; + } + + public int[] getIndexs() { + int len = this.getEndIndex() - this.getStartIndex() + 1; + this.indexs = new int[len]; + + for(int i = 0; i < len; ++i) { + this.indexs[i] = this.getStartIndex() + i; + } + + return this.indexs; + } + + public void setIndexs(int[] indexs) { + this.indexs = indexs; + } + + public int getStartIndex() { + this.startIndex = (this.pageId - 1) * this.pageSize + 1; + return this.startIndex; + } + + public void setStartIndex(int startIndex) { + System.out.println("startIndx:" + this.pageId + ":" + this.pageSize); + this.startIndex = (this.pageId - 1) * this.pageSize + 1; + } + + public int getEndIndex() { + this.endIndex = this.pageId * this.pageSize; + return this.endIndex; + } + + public void setEndIndex(int endIndex) { + this.endIndex = this.pageId * this.pageSize; + } + + protected void doPage() { + this.pageCount = this.rowCount / this.pageSize + 1; + if (this.rowCount % this.pageSize == 0 && this.pageCount > 1) { + --this.pageCount; + } + + this.pageOffset = (this.pageId - 1) * this.pageSize; + this.pageTail = this.pageOffset + this.pageSize; + if (this.pageOffset + this.pageSize > this.rowCount) { + this.pageTail = this.rowCount; + } + + } + + public String getOrderCondition() { + String condition = ""; + if (this.orderField != null && this.orderField.length() != 0) { + condition = " order by " + this.orderField + (this.orderDirection ? " " : " desc "); + } + + return condition; + } + + public String getMysqlQueryCondition() { + String condition = ""; + if (this.pageEnabled) { + } + + return condition; + } + + public void setOrderDirection(boolean orderDirection) { + this.orderDirection = orderDirection; + } + + public boolean isOrderDirection() { + return this.orderDirection; + } + + public void setOrderField(String orderField) { + this.orderField = orderField; + } + + public String getOrderField() { + return this.orderField; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public int getPageCount() { + return this.pageCount; + } + + public void setPageId(int pageId) { + this.pageId = pageId; + } + + public int getPageId() { + return this.pageId; + } + + public void setPageOffset(int pageOffset) { + this.pageOffset = pageOffset; + } + + public int getPageOffset() { + return this.pageOffset; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getPageSize() { + return this.pageSize; + } + + public void setPageTail(int pageTail) { + this.pageTail = pageTail; + } + + public int getPageTail() { + return this.pageTail; + } + + public void setRowCount(int rowCount) { + this.rowCount = rowCount; + this.doPage(); + } + + public int getRowCount() { + return this.rowCount; + } + + public boolean isPageEnabled() { + return this.pageEnabled; + } + + public void setPageEnabled(boolean pageEnabled) { + this.pageEnabled = pageEnabled; + } + + +} diff --git a/adc-da-base/src/main/java/com/adc/da/base/web/BaseController.java b/adc-da-base/src/main/java/com/adc/da/base/web/BaseController.java new file mode 100644 index 00000000..b940e0d5 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/base/web/BaseController.java @@ -0,0 +1,81 @@ +package com.adc.da.base.web; + +import com.adc.da.base.page.Pager; +import com.adc.da.http.PageInfo; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BaseController { + private static final String DATA = "data"; + private static final String TOTAL = "total"; + + protected BaseController() { + } + + public PageInfo getPageInfo(Pager pager, List rows) { + PageInfo pageInfo = new PageInfo(); + pageInfo.setList(rows); + pageInfo.setCount((long)pager.getRowCount()); + pageInfo.setPageSize(pager.getPageSize()); + pageInfo.setPageCount((long)pager.getPageCount()); + pageInfo.setPageNo(pager.getPageId()); + return pageInfo; + } + + public static Map getGridData(int total, List rows) { + Map response = new HashMap(); + response.put("total", total); + response.put("data", rows); + return response; + } + + public static Map getData(Object data) { + Map response = new HashMap(); + response.put("data", data); + return response; + } + + public static void download(HttpServletResponse response, File file) throws IOException { + download(response, file, file.getName()); + } + + public static void download(HttpServletResponse response, File file, String fileName) throws IOException { + FileInputStream in = new FileInputStream(file); + Throwable var4 = null; + + try { + download(response, (InputStream)in, fileName); + } catch (Throwable var13) { + var4 = var13; + throw var13; + } finally { + if (in != null) { + if (var4 != null) { + try { + in.close(); + } catch (Throwable var12) { + var4.addSuppressed(var12); + } + } else { + in.close(); + } + } + + } + + } + + public static void download(HttpServletResponse response, InputStream in, String fileName) throws IOException { + response.setContentType("application/x-msdownload;"); + response.addHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + response.setCharacterEncoding("UTF-8"); + } +} diff --git a/adc-da-base/src/main/java/com/adc/da/exception/AdcDaBaseException.java b/adc-da-base/src/main/java/com/adc/da/exception/AdcDaBaseException.java new file mode 100644 index 00000000..cf76c8eb --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/exception/AdcDaBaseException.java @@ -0,0 +1,25 @@ +package com.adc.da.exception; + +public class AdcDaBaseException extends RuntimeException { + private String errorCode; + + public AdcDaBaseException() { + } + + public AdcDaBaseException(String message) { + this("-1", message); + } + + public AdcDaBaseException(String errorCode, String message) { + super(message); + this.errorCode = errorCode; + } + + public String getErrorCode() { + return this.errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } +} \ No newline at end of file diff --git a/adc-da-base/src/main/java/com/adc/da/file/store/IFileStore.java b/adc-da-base/src/main/java/com/adc/da/file/store/IFileStore.java new file mode 100644 index 00000000..8d1644d5 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/file/store/IFileStore.java @@ -0,0 +1,14 @@ +package com.adc.da.file.store; + +import java.io.IOException; +import java.io.InputStream; + + +public interface IFileStore { + + String storeFile(InputStream var1, String var2, String var3) throws IOException; + + InputStream loadFile(String var1); + + byte[] loadFileBytes(String var1); +} diff --git a/adc-da-base/src/main/java/com/adc/da/filter/AddExpiresHeaderResponse.java b/adc-da-base/src/main/java/com/adc/da/filter/AddExpiresHeaderResponse.java new file mode 100644 index 00000000..a0c7e0d1 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/filter/AddExpiresHeaderResponse.java @@ -0,0 +1,34 @@ +package com.adc.da.filter; + +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import java.util.Arrays; +import java.util.Calendar; + +public class AddExpiresHeaderResponse extends HttpServletResponseWrapper { + private static final String[] CACHEABLE_CONTENT_TYPES = new String[]{"text/css", "text/javascript", "application/javascript", "image/png", "image/jpeg", "image/gif", "image/jpg"}; + private long maxAge = 0L; + + public AddExpiresHeaderResponse(HttpServletResponse response, long maxAge) { + super(response); + this.maxAge = maxAge; + } + + public void setContentType(String contentType) { + if (contentType != null && Arrays.binarySearch(CACHEABLE_CONTENT_TYPES, contentType) > -1) { + Calendar inTwoMonths = Calendar.getInstance(); + inTwoMonths.add(2, 2); + super.setDateHeader("Expires", inTwoMonths.getTimeInMillis()); + super.setHeader("Cache-Control", "max-age=" + this.maxAge); + } else { + super.setHeader("Expires", "-1"); + super.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); + } + + super.setContentType(contentType); + } + + static { + Arrays.sort(CACHEABLE_CONTENT_TYPES); + } +} diff --git a/adc-da-base/src/main/java/com/adc/da/filter/CsrfFilter.java b/adc-da-base/src/main/java/com/adc/da/filter/CsrfFilter.java new file mode 100644 index 00000000..e17a9ab8 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/filter/CsrfFilter.java @@ -0,0 +1,78 @@ +package com.adc.da.filter; + +import com.adc.da.util.FileUtil; +import com.adc.da.util.RequestUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +public class CsrfFilter implements Filter { + private static final Log logger = LogFactory.getLog(CsrfFilter.class); + private List whiteUrls; + private int whitelistSize = 0; + + public CsrfFilter() { + } + + public void init(FilterConfig filterConfig) { + String path = CsrfFilter.class.getResource("/").getFile(); + this.whiteUrls = FileUtil.readAsStringList(path + "white/csrfWhite.txt"); + this.whitelistSize = null == this.whiteUrls ? 0 : this.whiteUrls.size(); + } + + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + try { + HttpServletRequest req = (HttpServletRequest)request; + HttpServletResponse res = (HttpServletResponse)response; + String url = req.getRequestURL().toString(); + String referurl = req.getHeader("Referer"); + if (this.isWhiteReq(referurl)) { + chain.doFilter(request, response); + } else { + req.getRequestDispatcher("/").forward(req, res); + String log = ""; + String date = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date()); + String clientIp = RequestUtils.getClientIp(req); + log = "跨站请求---->>>" + clientIp + "||" + date + "||" + referurl + "||" + url; + logger.warn(log); + } + } catch (Exception var11) { + logger.error("doFilter Exception:", var11); + } + + } + + private boolean isWhiteReq(String referUrl) { + if (referUrl != null && !"".equals(referUrl) && this.whitelistSize != 0) { + String refHost = ""; + referUrl = referUrl.toLowerCase(); + if (referUrl.startsWith("http://")) { + refHost = referUrl.substring(7); + } else if (referUrl.startsWith("https://")) { + refHost = referUrl.substring(8); + } + Iterator iterator = this.whiteUrls.iterator(); + String urlTemp; + do { + if (!iterator.hasNext()) { + return false; + } + urlTemp = (String)iterator.next(); + } while(refHost.indexOf(urlTemp.toLowerCase()) <= -1); + return true; + } else { + return true; + } + } + + public void destroy() { + } +} \ No newline at end of file diff --git a/adc-da-base/src/main/java/com/adc/da/filter/FakeJSessionIdFilter.java b/adc-da-base/src/main/java/com/adc/da/filter/FakeJSessionIdFilter.java new file mode 100644 index 00000000..61608097 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/filter/FakeJSessionIdFilter.java @@ -0,0 +1,40 @@ +package com.adc.da.filter; + + +import com.adc.da.util.IpUtil; +import eu.bitwalker.useragentutils.UserAgent; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +public class FakeJSessionIdFilter implements Filter { + public FakeJSessionIdFilter() { + } + + public void destroy() { + } + + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest)req; + String ip = (String)request.getSession().getAttribute("ip"); + String browser = (String)request.getSession().getAttribute("browser"); + UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); + String newBrowser = userAgent.getBrowser().toString(); + String newIp = IpUtil.getIpAddr(request); + if ("0:0:0:0:0:0:0:1".equals(newIp)) { + newIp = "127.0.0.1"; + } + + request.getSession().setAttribute("ip", newIp); + request.getSession().setAttribute("browser", newBrowser); + if (ip == null || browser == null || newBrowser.equals(browser) && newIp.equals(ip)) { + filterChain.doFilter(req, resp); + } else { + request.getSession().invalidate(); + } + } + + public void init(FilterConfig arg0) throws ServletException { + } +} diff --git a/adc-da-base/src/main/java/com/adc/da/filter/HttpCacheFilter.java b/adc-da-base/src/main/java/com/adc/da/filter/HttpCacheFilter.java new file mode 100644 index 00000000..e6e5ae27 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/filter/HttpCacheFilter.java @@ -0,0 +1,33 @@ +package com.adc.da.filter; + +import org.apache.commons.lang3.StringUtils; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class HttpCacheFilter implements Filter { + private long maxAge = 86400L; + + public HttpCacheFilter() { + } + + public void destroy() { + } + + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { + HttpServletRequest request = (HttpServletRequest)req; + HttpServletResponse response = (HttpServletResponse)resp; + chain.doFilter(request, new AddExpiresHeaderResponse(response, this.maxAge)); + } + + public void init(FilterConfig config) throws ServletException { + String maxAgeStr = config.getInitParameter("maxAge"); + if (StringUtils.isNotEmpty(maxAgeStr)) { + this.maxAge = Long.valueOf(maxAgeStr); + } + + } +} + diff --git a/adc-da-base/src/main/java/com/adc/da/filter/RequestInfoFilter.java b/adc-da-base/src/main/java/com/adc/da/filter/RequestInfoFilter.java new file mode 100644 index 00000000..0665ec8f --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/filter/RequestInfoFilter.java @@ -0,0 +1,102 @@ +package com.adc.da.filter; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.*; + +public class RequestInfoFilter implements Filter { + private static final Log logger = LogFactory.getLog(RequestInfoFilter.class); + private static final List ignoreList = new ArrayList(); + + public RequestInfoFilter() { + } + + public void destroy() { + } + + public void init(FilterConfig filterConfig) throws ServletException { + ignoreList.add("js"); + ignoreList.add("css"); + ignoreList.add("png"); + ignoreList.add("ico"); + ignoreList.add("gif"); + ignoreList.add("jpg"); + } + + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { + HttpServletRequest request = (HttpServletRequest)req; + HttpServletResponse response = (HttpServletResponse)resp; + + try { + long startTime = System.currentTimeMillis(); + String uri = request.getServletPath() + (request.getPathInfo() == null ? "" : request.getPathInfo()); + if (!isIgnore(uri)) { + logger.info("==================== RequestInfoFilter Start ===================="); + logger.info(request.getMethod() + " : " + uri); + logger.info("session存活时间:" + request.getSession().getMaxInactiveInterval()); + this.logHeaders(request); + this.logParams(request); + logger.info(request.getHeader("Authorization")); + chain.doFilter(request, response); + long endTime = System.currentTimeMillis(); + logger.info(request.getMethod() + " 耗时:" + (endTime - startTime) + " ms"); + logger.info("==================== RequestInfoFilter End ===================="); + } else { + chain.doFilter(request, response); + } + } catch (Exception var11) { + logger.error("doFilter error", var11); + } + + } + + private void logHeaders(HttpServletRequest request) { + Map headerMap = new HashMap(); + Enumeration headers = request.getHeaderNames(); + + while(headers.hasMoreElements()) { + String headName = (String)headers.nextElement(); + if (headName != null && !"".equals(headName)) { + headerMap.put(headName, request.getHeader(headName)); + } + } + + headerMap.put("RemoteHost", request.getRemoteHost() + ":" + request.getRemotePort()); + logger.info(headerMap); + } + + private void logParams(HttpServletRequest request) { + Map maps = new HashMap(); + Enumeration keys = request.getParameterNames(); + + while(keys.hasMoreElements()) { + String key = (String)keys.nextElement(); + if (StringUtils.isNotEmpty(key)) { + String values = request.getParameter(key); + maps.put(key, values); + } + } + + logger.info(maps.toString()); + } + + private static final boolean isIgnore(String url) { + boolean ignore = false; + int index = url.lastIndexOf(46); + if (index > 0) { + String subFix = url.substring(index + 1, url.length()); + if (ignoreList.contains(subFix)) { + ignore = true; + } + } + + return ignore; + } +} + diff --git a/adc-da-base/src/main/java/com/adc/da/filter/WebFilter.java b/adc-da-base/src/main/java/com/adc/da/filter/WebFilter.java new file mode 100644 index 00000000..6feefd68 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/filter/WebFilter.java @@ -0,0 +1,29 @@ +package com.adc.da.filter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +public class WebFilter implements Filter { + private static final Logger logger = LoggerFactory.getLogger(WebFilter.class); + public WebFilter() { + // 不做操作 + } + + public void init(FilterConfig config) throws ServletException { + // 不做操作 + } + + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest)request); + chain.doFilter(xssRequest, response); + } + + public void destroy() { + // 不做操作 + } + +} \ No newline at end of file diff --git a/adc-da-base/src/main/java/com/adc/da/filter/XssHttpServletRequestWrapper.java b/adc-da-base/src/main/java/com/adc/da/filter/XssHttpServletRequestWrapper.java new file mode 100644 index 00000000..3065b769 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/filter/XssHttpServletRequestWrapper.java @@ -0,0 +1,124 @@ +package com.adc.da.filter; + +import com.adc.da.xss.SQLFilter; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { + private static final Logger logger = LoggerFactory.getLogger(XssHttpServletRequestWrapper.class); + HttpServletRequest orgRequest; + private static final SQLFilter sqlFilter = new SQLFilter(); + + public XssHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + this.orgRequest = request; + } + + public ServletInputStream getInputStream() throws IOException { + String type = super.getHeader("Content-Type"); + if (StringUtils.indexOfIgnoreCase(type, "application/json") < 0) { + return super.getInputStream(); + } else { + String json = IOUtils.toString(super.getInputStream(), "utf-8"); + if (StringUtils.isBlank(json)) { + return super.getInputStream(); + } else { + json = this.xssSqlEncode(json); + final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes("utf-8")); + return new ServletInputStream() { + public boolean isFinished() { + return true; + } + + public boolean isReady() { + return true; + } + + public void setReadListener(ReadListener readListener) { + // 不做操作 + } + + public int read() throws IOException { + return bis.read(); + } + }; + } + } + } + + public String getParameter(String name) { + String value = super.getParameter(this.xssSqlEncode(name)); + if (StringUtils.isNotBlank(value)) { + value = this.xssSqlEncode(value); + } + + return value; + } + + public String[] getParameterValues(String name) { + String[] parameters = super.getParameterValues(name); + if (parameters != null && parameters.length != 0) { + for(int i = 0; i < parameters.length; ++i) { + parameters[i] = this.xssSqlEncode(parameters[i]); + } + + return parameters; + } else { + return null; + } + } + + public Map getParameterMap() { + Map map = new LinkedHashMap(); + Map parameters = super.getParameterMap(); + Iterator i$ = parameters.keySet().iterator(); + + while(i$.hasNext()) { + String key = (String)i$.next(); + String[] values = (String[])parameters.get(key); + + for(int i = 0; i < values.length; ++i) { + values[i] = this.xssSqlEncode(values[i]); + } + + map.put(key, values); + } + + return map; + } + + public String getHeader(String name) { + String value = super.getHeader(this.xssSqlEncode(name)); + if (StringUtils.isNotBlank(value)) { + value = this.xssSqlEncode(value); + } + + return value; + } + + private String xssSqlEncode(String input) { + String htmlOutput = XssShieldUtil.stripXss(input); + // SQLFilter var10000 = sqlFilter; + return SQLFilter.sqlInject(htmlOutput); + } + + public HttpServletRequest getOrgRequest() { + return this.orgRequest; + } + + public static HttpServletRequest getOrgRequest(HttpServletRequest request) { + return request instanceof XssHttpServletRequestWrapper ? ((XssHttpServletRequestWrapper)request).getOrgRequest() : request; + } +} diff --git a/adc-da-base/src/main/java/com/adc/da/filter/XssShieldUtil.java b/adc-da-base/src/main/java/com/adc/da/filter/XssShieldUtil.java new file mode 100644 index 00000000..55fde63e --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/filter/XssShieldUtil.java @@ -0,0 +1,96 @@ +package com.adc.da.filter; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class XssShieldUtil { + + private static final Logger logger = LoggerFactory.getLogger(XssShieldUtil.class); + private static List patterns = null; + + private XssShieldUtil(){ + super(); + } + + + private static List getXssPatternList() + { + List ret = new ArrayList(); + + ret.add(new Object[] { "<(no)?script[^>]*>.*?", Integer.valueOf(2) }); + ret.add(new Object[] { "eval\\((.*?)\\)", Integer.valueOf(42) }); + ret.add(new Object[] { "expression\\((.*?)\\)", Integer.valueOf(42) }); + ret.add(new Object[] { "(javascript:|vbscript:|view-source:)*", Integer.valueOf(2) }); +// ret.add(new Object[] { "<(\"[^\"]*\"|'[^']*'|[^'\">])*>", Integer.valueOf(42) }); + ret.add(new Object[] { "(window\\.location|window\\.|\\.location|document\\.cookie|document\\.|alert\\(.*?\\)|window\\.open\\()*", Integer.valueOf(42) }); + ret.add(new Object[] { "<+\\s*\\w*\\s*(oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondragstart|ondrop|onerror=|onerroupdate|onfilterchange|onfinish|onfocus|onfocusin|onfocusout|onhelp|onkeydown|onkeypress|onkeyup|onlayoutcomplete|onload|onlosecapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmousout|onmouseover|onmouseup|onmousewheel|onmove|onmoveend|onmovestart|onabort|onactivate|onafterprint|onafterupdate|onbefore|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditocus|onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onblur|onbounce|oncellchange|onchange|onclick|oncontextmenu|onpaste|onpropertychange|onreadystatechange|onreset|onresize|onresizend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onselect|onselectionchange|onselectstart|onstart|onstop|onsubmit|onunload)+\\s*=+", Integer.valueOf(42) }); + return ret; + } + + private static List getPatterns() + { + if (patterns == null) + { + List list = new ArrayList(); + + String regex = null; + Integer flag = null; + int arrLength = 0; + int i; + Iterator localIterator = getXssPatternList().iterator(); + while (localIterator.hasNext()){ + Object[] arr = (Object[])localIterator.next(); + if(arr.length==0){ + continue; + } + regex = (String)arr[0]; + flag = (Integer)arr[1]; + list.add(Pattern.compile(regex, flag.intValue())); + } +/* for (Iterator localIterator = getXssPatternList().iterator(); localIterator.hasNext();i < arrLength) { + Object[] arr = (Object[])localIterator.next(); + arrLength = arr.length; + i = 0; + continue; + regex = (String)arr[0]; + flag = (Integer)arr[1]; + list.add(Pattern.compile(regex, flag.intValue())); + i++; + }*/ + patterns = list; + } + return patterns; + } + + public static String stripXss(String value) + { + if (StringUtils.isNotBlank(value)) + { + Matcher matcher = null; + for (Pattern pattern : getPatterns()) + { + matcher = pattern.matcher(value); + if (matcher.find()) { + value = matcher.replaceAll(""); + } + } +// value = value.replaceAll("<", "<").replaceAll(">", ">"); + + String[] pattern = { "%", " select ", " insert ", " delete ", " from ", + "count\\(", "drop table", " update ", " truncate ", "asc\\(", + "mid\\(", "char\\(", "xp_cmdshell", " exec ", " master ", + "netlocalgroup administrators", "net user", " or ", " and " }; + for (int i = 0; i < pattern.length; i++) { + value = value.replaceAll(pattern[i],""); + } + } + return value; + } +} diff --git a/adc-da-base/src/main/java/com/adc/da/xss/SQLFilter.java b/adc-da-base/src/main/java/com/adc/da/xss/SQLFilter.java new file mode 100644 index 00000000..60584f33 --- /dev/null +++ b/adc-da-base/src/main/java/com/adc/da/xss/SQLFilter.java @@ -0,0 +1,31 @@ +package com.adc.da.xss; + +import com.adc.da.exception.AdcDaBaseException; +import org.apache.commons.lang3.StringUtils; + +public class SQLFilter { + + + public static String sqlInject(String str) { + if (StringUtils.isBlank(str)) { + return null; + } else { + String checkStr= str; + checkStr = StringUtils.replace(checkStr, "\\", ""); + checkStr = checkStr.toLowerCase(); + String[] keywords = new String[]{"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"}; + String[] arr$ = keywords; + int len$ = keywords.length; + + for(int i$ = 0; i$ < len$; ++i$) { + String keyword = arr$[i$]; + if (checkStr.indexOf(keyword) != -1) { + throw new AdcDaBaseException("包含非法字符"); + } + } + + return str; + } + } + +} diff --git a/adc-da-jwtLogin/.gitignore b/adc-da-jwtLogin/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/adc-da-jwtLogin/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/adc-da-jwtLogin/.mvn/wrapper/MavenWrapperDownloader.java b/adc-da-jwtLogin/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 00000000..a45eb6ba --- /dev/null +++ b/adc-da-jwtLogin/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/adc-da-jwtLogin/.mvn/wrapper/maven-wrapper.jar b/adc-da-jwtLogin/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/adc-da-jwtLogin/.mvn/wrapper/maven-wrapper.properties b/adc-da-jwtLogin/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..642d572c --- /dev/null +++ b/adc-da-jwtLogin/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/adc-da-jwtLogin/mvnw b/adc-da-jwtLogin/mvnw new file mode 100644 index 00000000..a16b5431 --- /dev/null +++ b/adc-da-jwtLogin/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/adc-da-jwtLogin/mvnw.cmd b/adc-da-jwtLogin/mvnw.cmd new file mode 100644 index 00000000..c8d43372 --- /dev/null +++ b/adc-da-jwtLogin/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/adc-da-jwtLogin/pom.xml b/adc-da-jwtLogin/pom.xml new file mode 100644 index 00000000..930ab3c1 --- /dev/null +++ b/adc-da-jwtLogin/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + com.adc + foton-slrs-system-rest + 3.0.0 + + + com.adc + adc-da-jwtLogin + 3.1.0 + adc-da-jwtLogin + laws system rest JwtLogin + + jar + + + 1.8 + UTF-8 + UTF-8 + + + + + com.adc + adc-da-sys + 3.0.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/rest/LoginRestController.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/rest/LoginRestController.java new file mode 100644 index 00000000..9ab1480c --- /dev/null +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/rest/LoginRestController.java @@ -0,0 +1,213 @@ +package com.adc.da.login.rest; + + +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.login.util.JWTUtil; +import com.adc.da.login.util.UserUtils; +import com.adc.da.login.vo.LoginVO; +import com.adc.da.sys.entity.MenuEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.service.IUserEOService; +import com.adc.da.util.Encodes; +import com.adc.da.util.PasswordUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotNull; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + + +@Validated +@Controller +@RequestMapping(value = "/auth") +@Api(description = "登录接口") +@Slf4j +public class LoginRestController { + + @Autowired + private IUserEOService userService; + + + /** + * 读取配置文件判断是否需要开启Base64加密,默认值为false + */ + @Value("${isPassEncrypted:false}") + private boolean isPassEncrypted; + + /** + * 无缓存,用于校验 + */ + private static final String NO_CACHE = "no-cache"; + + /** + * 登录失败Map字段 + */ + private static final String LOGIN_FAIL_MAP = "loginFailMap"; + + /** + * 验证码 + */ + private static final Object VERIFY_CODE = "VerifyCode"; + + /** + * 10分钟内最大错误次数 + */ + @Value("${maxLoginErrorCount:3}") + private int maxLoginErrorCount; + + + /** + * 读取验证码模式配置, + * 1为不开启,2为开启,3为三次输错用户名或密码才开启, + * 默认为1 + *

+ * 若配置文件缺少该参数,将设置为1 + */ + @Value("${verifyCodeMode:1}") + private int verifyCodeMode; + + + @ApiOperation(value = "登录") + @PostMapping(value = "/login") + @ResponseBody + public ResponseMessage loginWithVerifyCode(HttpServletResponse response, @RequestBody LoginVO loginVO) { + String username = loginVO.getUsername(); + String password = loginVO.getPassword(); + String key = loginVO.getKey(); + + if (StringUtils.isBlank(username)) { + return Result.error("r0014", "登录名不能为空"); + } + if (StringUtils.isBlank(password)) { + return Result.error("r0016", "密码不能为空"); + } + if (StringUtils.isBlank(key)) { + return Result.error("key不能为空"); + } + + + + UserEO userEO = userService.getUserByLoginNameNotDeleted(username); + if (null == userEO) { + log.info("用户[{}]身份验证失败", username); + return Result.error("r0011", "您输入的帐号或密码有误"); + } + if (PasswordUtils.validatePassword(password, userEO.getPassword())) { + String token = JWTUtil.sign(username, userEO.getPassword(), userEO.getUsid()); + response.setHeader("Authorization", token); + response.addHeader("Access-Control-Allow-Headers", "Authorization"); + return Result.success(token); + } else { + log.info("用户[{}]密码验证失败", username); + return Result.error("r0011", "您输入的帐号或密码有误"); + } + } + + + + @ApiOperation(value = "登录") + @GetMapping(value = "/login") + @ResponseBody + public ResponseMessage loginRest(HttpServletRequest request, HttpServletResponse response, + @RequestParam @NotNull(message = "请输入用户名") String username, + @RequestParam @NotNull(message = "请输入密码") String password, + @RequestParam(value = "isRememberMe", defaultValue = "false") Boolean isRememberMe, String verifyCode) { + UserEO userEO = userService.getUserByLoginNameNotDeleted(username); + if (null == userEO) { + log.info("用户[{}]身份验证失败", username); + return Result.error("r0011", "您输入的帐号或密码有误"); + } + if(userEO.getDisableFlag()==1){ + log.info("用户[{}]身份验证失败", username); + return Result.error("r0011", "您输入的帐号已禁用"); + } + if (PasswordUtils.validatePassword(password, userEO.getPassword())) { + String token = JWTUtil.sign(username, userEO.getUsid(),userEO.getPassword()); + response.setHeader("Authorization", token); + response.addHeader("Access-Control-Allow-Headers", "Authorization"); + return Result.success(token); + } else { + log.info("用户[{}]密码验证失败", username); + return Result.error("r0011", "您输入的帐号或密码有误"); + } + } + + + + + /** + * 退出登录,客户端把Token丢弃就可以 + */ + @ApiOperation(value = "退出登录") + @GetMapping("/logout") + @ResponseBody + public ResponseMessage logout(HttpServletResponse response,String ticket) { + UserUtils.logout(); + return Result.success(); + } + + @ApiOperation(value = "未授权访问") + @RequestMapping(path = "/401") + @ResponseBody + public ResponseMessage unauthorized() { + return Result.error("401", "Unauthorized"); + } + + /** + * 登录成功之后获取当前登录用户信息的接口 + */ + @ApiOperation(value = "获取登录用户信息") + @GetMapping("/userInfo") + @ResponseBody + public ResponseMessage userInfo(HttpServletResponse response) throws NumberFormatException { + UserEO user = UserUtils.getUser(); + if (user != null) { + return Result.success(user); + } + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return Result.error(); + } + + /** + * 获取用户菜单,已用菜单管理实现 + */ + @ApiOperation(value = "获取登录用户菜单权限") + @GetMapping("/userMenu") + @ResponseBody + public ResponseMessage> userMenu(){ + return Result.success(UserUtils.getMenuList()); + } + + /** + * 修改当前登录用户密码 + */ + @ApiOperation(value = "修改密码") + @PutMapping("/updatePassword") + @ResponseBody + public ResponseMessage updatePassword(@NotNull(message = "请输入旧密码") @RequestParam String oldPassword, + @NotNull(message = "请输入新密码") @RequestParam String newPassword) { + // 前台如果base64传输密文,则需要解码 + if (isPassEncrypted) { + oldPassword = new String(Encodes.decodeBase64(oldPassword), StandardCharsets.UTF_8); + newPassword = new String(Encodes.decodeBase64(newPassword), StandardCharsets.UTF_8); + } + if (!newPassword.matches("^(?![0-9]*$)[a-zA-Z0-9]{6,10}$")) { + return Result.error("r0018", "新密码必须6-10位且不能纯数字"); + } + userService.updatePassword(UserUtils.getUserId(), oldPassword, newPassword); + return Result.success(); + } + +} diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTFilter.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTFilter.java new file mode 100644 index 00000000..03366e66 --- /dev/null +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTFilter.java @@ -0,0 +1,158 @@ +package com.adc.da.login.security; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * JWT过滤器,针对请求进行拦截过滤 + */ +@Slf4j +public class JWTFilter extends BasicHttpAuthenticationFilter { + //10分钟后刷新token + private static final int tokenRefreshInterval = 60 * 10; + + /** + * 这里我们详细说明下为什么最终返回的都是true,即允许访问 + *例如我们提供一个地址 GET /article + *登入用户和游客看到的内容是不同的 + *如果在这里返回了false,请求会被直接拦截,用户看不到任何东西 + *所以我们在这里返回true,Controller中可以通过 subject.isAuthenticated() 来判断用户是否登入 + *如果有些资源只有登入用户才能访问,我们只需要在方法上面加上 @RequiresAuthentication 注解即可 + *但是这样做有一个缺点,就是不能够对GET,POST等请求进行分别过滤鉴权(因为我们重写了官方的方法),但实际上对应用影响不大 + */ + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { + if (isLoginAttempt(request, response)) { + try { + return executeLogin(request, response); + } catch (Exception e) { + responseError(request, response); + return false; + } + }else{ + return false; + } + + } + + + /** + * 检测header里面是否包含Authorization字段 + * @param request + * @param response + * @return + */ + @Override + protected boolean isLoginAttempt(ServletRequest request, ServletResponse response) { + HttpServletRequest req = (HttpServletRequest) request; + String authorization = req.getHeader("Authorization"); + log.debug("判断用户是否想要登录:{}",authorization); + return authorization != null; + } + + + /** + * 认证失败后调用的方法 + * @param request + * @param response + * @return + * @throws Exception + */ + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { + this.responseError(request,response); + return false; + } + + @Override + protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception{ + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + String authorization = httpServletRequest.getHeader("Authorization"); + log.debug("用户开始认证x:{}",authorization); + JWTToken token = new JWTToken(authorization); + // 提交给realm进行登入,如果错误他会抛出异常并被捕获 + getSubject(request, response).login(token); + // 如果没有抛出异常则代表登入成功,返回true + return true; + } + + @Override + protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception { + if(token instanceof JWTToken){ + JWTToken jwtToken= (JWTToken) token; + //TODO 此处需要设置token自动续期功能 + } + + return true; + } + + @Override + protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin")); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); + httpServletResponse.addHeader("Access-Control-Allow-Headers", "Authorization"); + // 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态 + if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { + httpServletResponse.setStatus(HttpStatus.OK.value()); + return false; + } + return super.preHandle(request, response); + } + + /** + * 将非法请求跳转到 /401 + */ + private void responseError(ServletRequest req, ServletResponse resp) { + try { + HttpServletResponse httpServletResponse = (HttpServletResponse) resp; + if(httpServletResponse.isCommitted()){ + return; + } + //此处需要返回统一的错误对象 以便应对统一的异常处理 + JSONObject result=new JSONObject(); + result.put("respCode","A404"); + result.put("ok",false); + result.put("message","认证失败"); + result.put("data",null); + httpServletResponse.setHeader("Content-Type", "application/json"); + httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET, POST"); + httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); + httpServletResponse.setHeader("Access-Control-Max-Age", "3600"); + // response.setHeader("Content-type", "application/json;charset=UTF-8"); + httpServletResponse.setStatus(HttpServletResponse.SC_OK); + httpServletResponse.setContentType("application/json;charset=UTF-8"); + httpServletResponse.setCharacterEncoding("UTF-8"); + PrintWriter printWriter = httpServletResponse.getWriter(); + printWriter.append(result.toString(SerializerFeature.WriteMapNullValue)); + printWriter.flush(); +// httpServletResponse.sendRedirect("/401"); + } catch (IOException e) { + log.error(e.getMessage()); + } + } + + + private boolean shouldTokenRefresh(JWTToken jwtToken) { +// LocalDateTime issueTime = LocalDateTime.ofInstant(issueAt.toInstant(), ZoneId.systemDefault()); +// return LocalDateTime.now().minusSeconds(tokenRefreshInterval).isAfter(issueTime); + return true; + } + +} diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTRealm.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTRealm.java new file mode 100644 index 00000000..e70c347e --- /dev/null +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTRealm.java @@ -0,0 +1,145 @@ +package com.adc.da.login.security; + +import com.adc.da.login.util.JWTUtil; +import com.adc.da.login.util.UserUtils; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.service.IUserEOService; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.Serializable; +import java.util.*; + +//@Service +public class JWTRealm extends AuthorizingRealm { + + private static final Logger logger = LoggerFactory.getLogger(JWTRealm.class); + + private IUserEOService userEOService; + + /** + * JWT签名密钥 + */ + public static final String SECRET = "AyX3TWpHIkPfE9rqaDiYV416d0nguURLQ8vhNzBlK7MGcOJjmoZ2w5stSeCFxb16"; + + @Autowired + public void setUserEOService(IUserEOService userEOService) { + this.userEOService = userEOService; + } + + /** + * 必须重写此方法,不然Shiro会报错 + */ + @Override + public boolean supports(AuthenticationToken token) { + return token instanceof JWTToken; + } + + + + /** + * 此方法调用hasRole,hasPermission的时候才会进行回调. + *

+ * 权限信息.(授权): + * 1、如果用户正常退出,缓存自动清空; + * 2、如果用户非正常退出,缓存自动清空; + * 3、如果我们修改了用户的权限,而用户不退出系统,修改的权限无法立即生效。 + * (需要手动编程进行实现;放在service进行调用) + * 在权限修改后调用realm中的方法,realm已经由spring管理,所以从spring中获取realm实例,调用clearCached方法; + * :Authorization 是授权访问控制,用于对用户进行的操作授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等。 + * + * @param principalCollection + * @return + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + String username = JWTUtil.getUsername(principalCollection.toString()); + if (username == null) { + return null; + } + UserEO user = userEOService.getUserByLoginNameNotDeleted(username); + if (user != null) { + try { + return UserUtils.getAuthInfo(); + } catch (NumberFormatException e) { + logger.error("AuthorizationInfo NumberFormatException", e); + } catch (Exception e) { + logger.error("AuthorizationInfo Exception", e); + } + } + return null; + } + + /** + * 认证信息(身份验证) + * Authentication 是用来验证用户身份 + * + * @param authenticationToken + * @return + * @throws AuthenticationException + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { + String token = (String) authenticationToken.getCredentials(); + // 解密获得username,用于和数据库进行对比 + String username = JWTUtil.getUsername(token); + if (username == null) { + throw new AuthenticationException("token 无效!"); + } + + UserEO user = userEOService.getUserByLoginNameNotDeleted(username); + if (user == null) { + throw new AuthenticationException("用户"+username+"不存在") ; + } + + if (!JWTUtil.verify(token, username,user.getUsid(),user.getPassword())) { + throw new AuthenticationException("账户密码错误!"); + } + return new SimpleAuthenticationInfo(token, token, "jwtRealm"); + } + + /** + * 授权用户信息 + */ + public static class Principal implements Serializable { + + private static final long serialVersionUID = 1L; + + private String id; + + private String loginName; + + private transient Map cacheMap; + + public Principal(UserEO user) { + this.id = user.getUsid() == null ? "" : String.valueOf(user.getUsid()); + this.loginName = user.getAccount(); + } + + public String getId() { + return id; + } + + public String getLoginName() { + return loginName; + } + + public Map getCacheMap() { + if (cacheMap == null) { + cacheMap = new HashMap<>(); + } + return cacheMap; + } + } + +} diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTToken.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTToken.java new file mode 100644 index 00000000..6d857613 --- /dev/null +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/JWTToken.java @@ -0,0 +1,32 @@ +package com.adc.da.login.security; + +import org.apache.shiro.authc.AuthenticationToken; + +/** + * JWT认证token实体对象 + */ +public class JWTToken implements AuthenticationToken { + + + private static final long serialVersionUID = 613047528940906064L; + // 秘钥 + private String token; + + public JWTToken(String token) { + this.token = token; + } + + @Override + public Object getPrincipal() { + return getToken(); + } + + @Override + public Object getCredentials() { + return getToken(); + } + + public String getToken() { + return token; + } +} diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/test.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/test.java new file mode 100644 index 00000000..77a9eab0 --- /dev/null +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/test.java @@ -0,0 +1,4 @@ +package com.adc.da.login; + +public class test { +} diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/util/CacheUtils.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/util/CacheUtils.java new file mode 100644 index 00000000..079403f4 --- /dev/null +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/util/CacheUtils.java @@ -0,0 +1,84 @@ +package com.adc.da.login.util; + +import com.adc.da.util.SpringContextHolder; +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; +import net.sf.ehcache.Element; + +/** + * Cache工具类 + */ +public class CacheUtils { + + private CacheUtils() { + super(); + } + + private static CacheManager cacheManager = (CacheManager) SpringContextHolder.getBean("ehCacheManagerFactoryBean"); + + private static final String SYS_CACHE = "sysCache"; + + private static final String ERROR_CACHE = "errorCache"; + + public static Object get(String key) { + return get(SYS_CACHE, key); + } + + public static void put(String key, Object value) { + put(SYS_CACHE, key, value); + } + + public static void remove(String key) { + remove(SYS_CACHE, key); + } + + //配合main模块下resource/cache/ehcache-local.xml + // + public static Object getErrorCache(String key) { + return get(ERROR_CACHE, key); + } + + public static void putErrorCache(String key, Object value) { + put(ERROR_CACHE, key, value); + } + + public static void removeErrorCache(String key) { + remove(ERROR_CACHE, key); + } + + + + public static Object get(String cacheName, String key) { + Element element = getCache(cacheName).get(key); + return element == null ? null : element.getObjectValue(); + } + + public static void put(String cacheName, String key, Object value) { + Element element = new Element(key, value); + getCache(cacheName).put(element); + } + + public static void remove(String cacheName, String key) { + getCache(cacheName).remove(key); + } + + /** + * 获得一个Cache,没有则创建一个。 + * @param cacheName + * @return + */ + private static Cache getCache(String cacheName) { + Cache cache = cacheManager.getCache(cacheName); + if (cache == null) { + cacheManager.addCache(cacheName); + cache = cacheManager.getCache(cacheName); + cache.getCacheConfiguration().setEternal(true); + } + return cache; + } + + public static CacheManager getCacheManager() { + return cacheManager; + } + +} diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/util/JWTUtil.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/util/JWTUtil.java new file mode 100644 index 00000000..1cd681d0 --- /dev/null +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/util/JWTUtil.java @@ -0,0 +1,79 @@ +package com.adc.da.login.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTDecodeException; +import com.auth0.jwt.interfaces.DecodedJWT; +import org.springframework.beans.factory.annotation.Value; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +public class JWTUtil { + + // 设置过期时间,默认为2小时 + private static long EXPIRE_TIME = 120; + + @Value("${EXPIRE_TIME}") + public void setEnv(long expireTime) { + setExpireTime(expireTime); + } + + public static synchronized void setExpireTime(long expireTime) { + EXPIRE_TIME = expireTime; + } + + public static boolean verify(String token, String username,String userId, String secret) { + try { + Algorithm algorithm = Algorithm.HMAC512(secret); + JWTVerifier verifier = JWT.require(algorithm) + .withClaim("username", username).withClaim("userid", userId) + .build(); + verifier.verify(token); + return true; + } catch (Exception e) { + return false; + } + } + /** + * @Title: getUsername + * @Description: 获取token中的信息无需secret解密也能获得 + * @Author 刘仁 + * @DateTime 2019年4月1日 下午4:42:39 + * @param token + * @return + */ + public static String getUsername(String token) { + try { + DecodedJWT jwt = JWT.decode(token); + return jwt.getClaim("username").asString(); + } catch (JWTDecodeException e) { + return null; + } + } + + public static String getUserId(String token){ + try { + DecodedJWT jwt = JWT.decode(token); + return jwt.getClaim("userid").asString(); + } catch (JWTDecodeException e) { + return null; + } + } + + public static String sign(String username,String userId, String secret) { + Date date = Date + .from(LocalDateTime.now().plusMinutes(EXPIRE_TIME).atZone(ZoneId.systemDefault()).toInstant()); + Algorithm algorithm = Algorithm.HMAC512(secret); + String sign = JWT.create() + .withClaim("username", username).withClaim("userid", userId) + .withExpiresAt(date) + .sign(algorithm); + + // 附带username信息 + return sign; + } + +} diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/util/UserUtils.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/util/UserUtils.java new file mode 100644 index 00000000..ad20df07 --- /dev/null +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/util/UserUtils.java @@ -0,0 +1,188 @@ +package com.adc.da.login.util; + +import com.adc.da.login.security.JWTRealm; +import com.adc.da.login.security.JWTRealm.Principal; +import com.adc.da.sys.entity.MenuEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.service.IMenuEOService; +import com.adc.da.sys.service.IUserEOService; +import com.adc.da.util.SpringContextHolder; +import com.google.common.collect.Maps; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.UnavailableSecurityManagerException; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.session.InvalidSessionException; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; + +public class UserUtils { + + private UserUtils() { + super(); + } + + private static Logger logger = LoggerFactory.getLogger(UserUtils.class); + /** + * 当前登陆用户 + */ + public static final String CURRENT_USER = "currentUser"; + + /** + * 菜单信息 + */ + public static final String CACHE_MENU_LIST = "menuList"; + + /** + * @see IUserEOService + */ + private static IUserEOService userService = SpringContextHolder.getBean(IUserEOService.class); + + /** + * @see IMenuEOService + */ + private static IMenuEOService menuService = SpringContextHolder.getBean(IMenuEOService.class); + + /** + * 退出 + */ + public static void logout() { + try { + SecurityUtils.getSubject().logout(); + } catch (UnavailableSecurityManagerException e) { + logger.error(e.getMessage(),e); + } catch (InvalidSessionException e) { + logger.error(e.getMessage(),e); + } + } + + /** + * 获取当前登录用户名 + */ + public static String getUserName() { + JWTRealm.Principal principal = (Principal) SecurityUtils.getSubject().getPrincipal(); + if (principal != null) { + return principal.getLoginName(); + } + return null; + } + + /** + * 获取当前登陆用户ID + * @throws Exception + */ + public static String getUserId() { + UserEO userEO = getUser(); + if (userEO != null) { + return userEO.getUsid(); + } + return null; + } + + /** + * 获取当前登录用户信息 + */ + public static UserEO getUser() { + UserEO user = (UserEO) CacheUtils.getCache(CURRENT_USER); + if (user == null) { + String userName = getUserName(); + + if (StringUtils.isNotEmpty(userName)) { + UserEO userInDb = userService.getUserByLoginNameNotDeleted(userName); + user = ObjectUtils.clone(userInDb); + user.setPassword(null); + CacheUtils.putCache(CURRENT_USER, user); + } + } + return user; + } + + /** + * 获取当前登录用户菜单列表 + */ + public static List getMenuList() { + List menuList = (List) CacheUtils.getCache(CACHE_MENU_LIST); + if (menuList == null) { + UserEO user = getUser(); + if (user != null) { + if (isAdmin(user)) { + menuList = menuService.findAll(); + } else { + menuList = menuService.listMenuEOByUserId(String.valueOf(user.getUsid())); + } + CacheUtils.putCache(CACHE_MENU_LIST, menuList); + } + } + return menuList; + } + + /** + * 判断用户是否是超级管理员 + * + * @param userVo 用户信息 + * @return 返回判断 + */ + public static boolean isAdmin(UserEO userVo) { + return userVo != null && userVo.getUsid().equals("1"); + } + + /** + * 获取用户菜单权限信息 + */ + public static SimpleAuthorizationInfo getAuthInfo() { + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + List list = UserUtils.getMenuList(); + for (MenuEO menu : list) { + if (StringUtils.isNotBlank(menu.getPermission())) { + // 添加基于Permission的权限信息 + for (String permission : StringUtils.split(menu.getPermission(), ",")) { + info.addStringPermission(permission); + } + } + } + return info; + } + + public static void flush() { + CacheUtils.removeCache(CURRENT_USER); + } + + private static final class CacheUtils { + + public static Object getCache(String key) { + return getCache(key, null); + } + + public static Object getCache(String key, Object defaultValue) { + Object obj = getCacheMap().get(key); + return obj == null ? defaultValue : obj; + } + + public static void putCache(String key, Object value) { + getCacheMap().put(key, value); + } + + public static void removeCache(String key) { + getCacheMap().remove(key); + } + + public static Map getCacheMap() { + Map map = Maps.newHashMap(); + try { + Subject subject = SecurityUtils.getSubject(); + JWTRealm.Principal principal = (JWTRealm.Principal) subject.getPrincipal(); + return principal != null ? principal.getCacheMap() : map; + } catch (UnavailableSecurityManagerException e) { + logger.error(e.getMessage(),e); + } catch (InvalidSessionException e) { + logger.error(e.getMessage(),e); + } + return map; + } + } +} \ No newline at end of file diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/vo/LoginVO.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/vo/LoginVO.java new file mode 100644 index 00000000..2432ce4b --- /dev/null +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/vo/LoginVO.java @@ -0,0 +1,64 @@ +package com.adc.da.login.vo; + +import com.adc.da.base.entity.BaseEntity; + +/** + * 功能:LoginVO
+ * 作者:Wei Jinjin
+ * 日期: 2019-10-09
+ * 版权所有:版权归天津卡达克数据技术中心所有。
+ */ +public class LoginVO extends BaseEntity { + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + + private String password; + + /** + * 验证码 + */ + private String verifyCode; + + /** + * 服务端存储验证码的key + */ + private String key; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getVerifyCode() { + return verifyCode; + } + + public void setVerifyCode(String verifyCode) { + this.verifyCode = verifyCode; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } +} \ No newline at end of file diff --git a/adc-da-main/.gitignore b/adc-da-main/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/adc-da-main/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/adc-da-main/.mvn/wrapper/MavenWrapperDownloader.java b/adc-da-main/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 00000000..a45eb6ba --- /dev/null +++ b/adc-da-main/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/adc-da-main/.mvn/wrapper/maven-wrapper.jar b/adc-da-main/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/adc-da-main/.mvn/wrapper/maven-wrapper.properties b/adc-da-main/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..642d572c --- /dev/null +++ b/adc-da-main/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/adc-da-main/mvnw b/adc-da-main/mvnw new file mode 100644 index 00000000..a16b5431 --- /dev/null +++ b/adc-da-main/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/adc-da-main/mvnw.cmd b/adc-da-main/mvnw.cmd new file mode 100644 index 00000000..c8d43372 --- /dev/null +++ b/adc-da-main/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/adc-da-main/pom.xml b/adc-da-main/pom.xml new file mode 100644 index 00000000..e5259ca9 --- /dev/null +++ b/adc-da-main/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + + com.adc + foton-slrs-system-rest + 3.0.0 + + com.adc + adc-da-main + adc-da-main + laws system rest main + + jar + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + com.adc + adc-da-sys + 3.0.0 + + + com.adc + adc-da-base + 3.0.0 + + + com.adc + adc-da-jwtLogin + 3.1.0 + + + + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + diff --git a/adc-da-main/src/main/java/com/adc/da/AdcDaApplication.java b/adc-da-main/src/main/java/com/adc/da/AdcDaApplication.java new file mode 100644 index 00000000..5525d6cc --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/AdcDaApplication.java @@ -0,0 +1,16 @@ +package com.adc.da; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.boot.web.servlet.ServletComponentScan; + +@ServletComponentScan +@SpringBootApplication(exclude = SecurityAutoConfiguration.class) +public class AdcDaApplication { + + public static void main(String[] args) { + SpringApplication.run(AdcDaApplication.class, args); + } + +} diff --git a/adc-da-main/src/main/java/com/adc/da/ServletInitializer.java b/adc-da-main/src/main/java/com/adc/da/ServletInitializer.java new file mode 100644 index 00000000..9413d00e --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/ServletInitializer.java @@ -0,0 +1,16 @@ +package com.adc.da; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * Springboot打war包的启动口 + */ +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + // 注意这里要指向原先用main方法执行的Application启动类 + return builder.sources(AdcDaApplication.class); + } +} \ No newline at end of file diff --git a/adc-da-main/src/main/java/com/adc/da/main/advice/AdcDaBaseExceptionAdvice.java b/adc-da-main/src/main/java/com/adc/da/main/advice/AdcDaBaseExceptionAdvice.java new file mode 100644 index 00000000..59b6ce91 --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/advice/AdcDaBaseExceptionAdvice.java @@ -0,0 +1,38 @@ +package com.adc.da.main.advice; + +import com.adc.da.exception.AdcDaBaseException; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.ResponseMessageCodeEnum; +import com.adc.da.http.Result; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Slf4j +@ControllerAdvice +@Order(value=4) +public class AdcDaBaseExceptionAdvice { + + + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(AdcDaBaseException.class) + @ResponseBody + public ResponseMessage handlerAdcDaBaseException(AdcDaBaseException exception) { + log.warn(exception.getMessage(), exception); + return Result.error(exception.getErrorCode(), exception.getMessage()); + } + + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(Exception.class) + @ResponseBody + public ResponseMessage handlerAdcDaBaseException(Exception exception) { + log.error(exception.getMessage(), exception); + // TODO 在数据库中记录程序异常,这个地方的异常是未处理的异常,需要管理员查看并进行处理以防重复出现 + return Result.error(ResponseMessageCodeEnum.ERROR.getCode(), "程序异常,请重试。如果重复出现请联系管理员处理!"); + } + +} diff --git a/adc-da-main/src/main/java/com/adc/da/main/advice/ShiroExceptionAdvice.java b/adc-da-main/src/main/java/com/adc/da/main/advice/ShiroExceptionAdvice.java new file mode 100644 index 00000000..65bed1de --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/advice/ShiroExceptionAdvice.java @@ -0,0 +1,41 @@ +package com.adc.da.main.advice; + +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authz.UnauthenticatedException; +import org.apache.shiro.authz.UnauthorizedException; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Slf4j +@ControllerAdvice +@Order(value=2) +public class ShiroExceptionAdvice { + + + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ExceptionHandler({AuthenticationException.class, UnknownAccountException.class, + UnauthenticatedException.class, IncorrectCredentialsException.class}) + @ResponseBody + public ResponseMessage unauthorized(Exception exception) { + log.warn(exception.getMessage(), exception); + log.info("catch UnknownAccountException"); + return Result.error("A404", "无权访问"); + } + + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ExceptionHandler(UnauthorizedException.class) + @ResponseBody + public ResponseMessage unauthorized1(UnauthorizedException exception) { + log.warn(exception.getMessage(), exception); + return Result.error("A404","无权访问"); + } +} diff --git a/adc-da-main/src/main/java/com/adc/da/main/config/DefinitionUrlConfig.java b/adc-da-main/src/main/java/com/adc/da/main/config/DefinitionUrlConfig.java new file mode 100644 index 00000000..ed910f84 --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/config/DefinitionUrlConfig.java @@ -0,0 +1,44 @@ +package com.adc.da.main.config; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * shiro 自定义URL规则设置 + */ +public class DefinitionUrlConfig { + + + + /** + * 匿名用户,无需登录 + */ + private static final String ANON = "anon"; + + + + // 拦截器 + //rest:比如/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。 + //port:比如/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。 + //perms:比如/admins/user/**=perms[user:add:*],perms参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,比如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。 + //roles:比如/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,比如/admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。//要实现or的效果看http://zgzty.blog.163.com/blog/static/83831226201302983358670/ + //anon:比如/admins/**=anon 没有参数,表示可以匿名使用。 + //authc:比如/admins/user/**=authc表示需要认证才能使用,没有参数 + //authcBasic:比如/admins/user/**=authcBasic没有参数表示httpBasic认证 + //ssl:比如/admins/user/**=ssl没有参数,表示安全的url请求,协议为https + //user:比如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查 + public static Map definitionUrlOptions(){ + Map filterRuleMap = new LinkedHashMap<>(); + //TODO 此处设置URL过滤规则 默认是全部请求进行拦截,此处设置为不拦截的URL地址 + filterRuleMap.put("/api/auth/login",ANON);//登录接口 + // swagger接口文档 + filterRuleMap.put("/v2/api-docs", "anon"); + filterRuleMap.put("/webjars/**", "anon"); + filterRuleMap.put("/swagger-resources/**", "anon"); + filterRuleMap.put("/swagger-ui.html", "anon"); + filterRuleMap.put("/doc.html", "anon"); + return filterRuleMap; + } + + +} diff --git a/adc-da-main/src/main/java/com/adc/da/main/config/MybatisPlusConfig.java b/adc-da-main/src/main/java/com/adc/da/main/config/MybatisPlusConfig.java new file mode 100644 index 00000000..0ca71a89 --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/config/MybatisPlusConfig.java @@ -0,0 +1,22 @@ +package com.adc.da.main.config; + +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * Mybatis Plus 配置 + */ +@EnableTransactionManagement +@Configuration +@MapperScan("com.adc.da.**.dao") +public class MybatisPlusConfig { + + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } + +} diff --git a/adc-da-main/src/main/java/com/adc/da/main/config/RestTemplateConfig.java b/adc-da-main/src/main/java/com/adc/da/main/config/RestTemplateConfig.java new file mode 100644 index 00000000..870c415d --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/config/RestTemplateConfig.java @@ -0,0 +1,50 @@ +package com.adc.da.main.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.Charset; +import java.util.Iterator; +import java.util.List; + +/** + * restTemplate设置 + */ +@Configuration +public class RestTemplateConfig { + + private static final Logger logger = LoggerFactory.getLogger(RestTemplateConfig.class); + + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory){ + RestTemplate restTemplate = new RestTemplate(factory); + // 使用 utf-8 编码集的 conver 替换默认的 conver(默认的 string conver 的编码集为"ISO-8859-1") + List> messageConverters = restTemplate.getMessageConverters(); + Iterator> iterator = messageConverters.iterator(); + while (iterator.hasNext()) { + HttpMessageConverter converter = iterator.next(); + if (converter instanceof StringHttpMessageConverter) { + iterator.remove(); + } + } + messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8"))); + + return restTemplate; + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(50000);//单位为ms + factory.setConnectTimeout(50000);//单位为ms + return factory; + } + +} diff --git a/adc-da-main/src/main/java/com/adc/da/main/config/ShiroConfig.java b/adc-da-main/src/main/java/com/adc/da/main/config/ShiroConfig.java new file mode 100644 index 00000000..3ab198c6 --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/config/ShiroConfig.java @@ -0,0 +1,151 @@ +package com.adc.da.main.config; + +import com.adc.da.login.security.JWTFilter; +import com.adc.da.login.security.JWTRealm; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.apache.shiro.mgt.DefaultSecurityManager; +import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; +import org.apache.shiro.mgt.DefaultSubjectDAO; +import org.apache.shiro.spring.LifecycleBeanPostProcessor; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; +import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; +import org.springframework.core.annotation.Order; +import org.springframework.core.io.ClassPathResource; + +import javax.servlet.Filter; +import java.util.HashMap; +import java.util.Map; + +@Configuration +@Order(value=1) +public class ShiroConfig { + + private static final String JWT_FILTER_NAME = "jwt"; + + private static final String URL_SUFFIX="/api"; + + /** + * 自定义realm,实现登录授权流程 + * @return + */ + @Bean(name="jwtRealm") + public JWTRealm jwtRealm() { + return new JWTRealm(); + } + + /** + * 配置securityManager 管理subject(默认),并把自定义realm交由manager + */ + @Bean + public DefaultSecurityManager securityManager() { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + // 设置realm. + securityManager.setRealm(jwtRealm()); + //注入缓存管理器 + securityManager.setCacheManager(ehCacheManager()); + /* + * 关闭shiro自带的session,详情见文档 + * http://shiro.apache.org/session-management.html#SessionManagement-StatelessApplications%28Sessionless%29 + */ + DefaultSubjectDAO defaultSubjectDAO = new DefaultSubjectDAO(); + DefaultSessionStorageEvaluator storageEvaluator = new DefaultSessionStorageEvaluator(); + storageEvaluator.setSessionStorageEnabled(false); + defaultSubjectDAO.setSessionStorageEvaluator(storageEvaluator); + securityManager.setSubjectDAO(defaultSubjectDAO); + + return securityManager; + } + + /** + * 拦截链 + */ + @Bean + public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultSecurityManager securityManager) { + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(securityManager); + shiroFilterFactoryBean.setFilters(filterMap()); + shiroFilterFactoryBean.setFilterChainDefinitionMap(definitionMap()); + + return shiroFilterFactoryBean; + } + + /** + * 自定义拦截器,处理所有请求 + */ + private Map filterMap() { + Map filterMap = new HashMap<>(); + filterMap.put(JWT_FILTER_NAME, new JWTFilter()); + return filterMap; + } + + /** + * url拦截规则 + */ + private Map definitionMap() { + // 拦截器 + //rest:比如/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。 + //port:比如/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。 + //perms:比如/admins/user/**=perms[user:add:*],perms参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,比如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。 + //roles:比如/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,比如/admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。//要实现or的效果看http://zgzty.blog.163.com/blog/static/83831226201302983358670/ + //anon:比如/admins/**=anon 没有参数,表示可以匿名使用。 + //authc:比如/admins/user/**=authc表示需要认证才能使用,没有参数 + //authcBasic:比如/admins/user/**=authcBasic没有参数表示httpBasic认证 + //ssl:比如/admins/user/**=ssl没有参数,表示安全的url请求,协议为https + //user:比如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查 + Map definitionMap = DefinitionUrlConfig.definitionUrlOptions(); + definitionMap.put(URL_SUFFIX+"/**", JWT_FILTER_NAME); + return definitionMap; + } + +/* *//** + * 开启注解 + *//* + @Bean + @DependsOn("lifecycleBeanPostProcessor") + public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { + DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); + // 强制使用cglib代理,防止和aop冲突 + defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); + return defaultAdvisorAutoProxyCreator; + } + + @Bean + public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { + return new LifecycleBeanPostProcessor(); + }*/ + + /** + * 开启shiro aop注解支持. 使用代理方式; 所以需要开启代码支持; + * + * @param securityManager 安全管理器 + * @return 授权Advisor + */ + @Bean("authorizationAttributeSourceAdvisor") + public AuthorizationAttributeSourceAdvisor advisor(DefaultSecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); + advisor.setSecurityManager(securityManager); + return advisor; + } + + /** + * shiro缓存管理器; + * 需要注入对应的其它的实体类中: + * 1、安全管理器:securityManager + * 可见securityManager是整个shiro的核心; + * + * @return + */ + @Bean + public EhCacheManager ehCacheManager() { + EhCacheManager cacheManager = new EhCacheManager(); + cacheManager.setCacheManagerConfigFile("classpath:cache/ehcache.xml"); + return cacheManager; + } + +} diff --git a/adc-da-main/src/main/java/com/adc/da/main/config/ShiroConfiguration.java b/adc-da-main/src/main/java/com/adc/da/main/config/ShiroConfiguration.java new file mode 100644 index 00000000..f40d34ce --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/config/ShiroConfiguration.java @@ -0,0 +1,92 @@ +package com.adc.da.main.config; + +import com.adc.da.login.security.JWTRealm; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.credential.HashedCredentialsMatcher; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; +import org.apache.shiro.mgt.DefaultSubjectDAO; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.LifecycleBeanPostProcessor; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; +import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; +import org.springframework.core.io.ClassPathResource; + + +//@Configuration +public class ShiroConfiguration { + + @Bean(name = "ehCacheManagerFactoryBean") + public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() { + EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean(); + ClassPathResource classPathResource = new ClassPathResource("cache/ehcache-local.xml"); + ehCacheManagerFactoryBean.setConfigLocation(classPathResource); + return ehCacheManagerFactoryBean; + } + + @Bean(name = "shiroCacheManager") + @DependsOn({ "ehCacheManagerFactoryBean" }) + public EhCacheManager shiroCacheManager() { + EhCacheManager ehCacheManager = new EhCacheManager(); + ehCacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject()); + return ehCacheManager; + } + + @Bean + @DependsOn({ "lifecycleBeanPostProcessor" }) + public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { + DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator(); + proxyCreator.setProxyTargetClass(true); + return proxyCreator; + } + + @Bean(name = "lifecycleBeanPostProcessor") + public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { + return new LifecycleBeanPostProcessor(); + } + + @Bean(name = "securityManager") + public SecurityManager securityManager() { + DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); + defaultWebSecurityManager.setRealm(jwtRealm()); + + // 关闭shiro自带的session + DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO(); + DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator(); + defaultSessionStorageEvaluator.setSessionStorageEnabled(false); + subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator); + defaultWebSecurityManager.setSubjectDAO(subjectDAO); + + // 自定义缓存管理器 + defaultWebSecurityManager.setCacheManager(shiroCacheManager()); + SecurityUtils.setSecurityManager(defaultWebSecurityManager); + return defaultWebSecurityManager; + } + + @Bean + public HashedCredentialsMatcher hashedCredentialsMatcher() { + HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); + hashedCredentialsMatcher.setHashAlgorithmName("md5");// 散列算法:这里使用MD5算法; + hashedCredentialsMatcher.setHashIterations(2);// 散列的次数,比如散列两次,相当于 + // md5(md5("")); + return hashedCredentialsMatcher; + } + + @Bean + public JWTRealm jwtRealm() { + JWTRealm jwtRealm = new JWTRealm(); + return jwtRealm; + } + + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() { + AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); + advisor.setSecurityManager(securityManager()); + return advisor; + } +} \ No newline at end of file diff --git a/adc-da-main/src/main/java/com/adc/da/main/config/SwaggerConfig.java b/adc-da-main/src/main/java/com/adc/da/main/config/SwaggerConfig.java new file mode 100644 index 00000000..acba54fe --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/config/SwaggerConfig.java @@ -0,0 +1,67 @@ +package com.adc.da.main.config; + + +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Parameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; +import java.util.List; + +/** + * swagger UI 配置we年 + */ +@Configuration +@EnableSwagger2 +@EnableKnife4j +@Import(BeanValidatorPluginsConfiguration.class) +public class SwaggerConfig { + + + @Bean + public Docket createRestApiByDefault() { + + ParameterBuilder tokenPar = new ParameterBuilder(); + List pars = new ArrayList<>(); + tokenPar.name("Authorization") + .description("令牌") + .modelRef(new ModelRef("string")) + .parameterType("header") + .required(true) + .build(); + pars.add(tokenPar.build()); + + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.adc.da")) + .paths(PathSelectors.any()) + .build() + .globalOperationParameters(pars).groupName("默认"); + } + + + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("FOTON-SLRS-SYSTEM-REST APIs") + .description("标准法规1.0") + .termsOfServiceUrl("http://localhost:8888/") + .contact("developer@mail.com") + .version("1.0.0") + .build(); + } + +} diff --git a/adc-da-main/src/main/java/com/adc/da/main/config/WebConfig.java b/adc-da-main/src/main/java/com/adc/da/main/config/WebConfig.java new file mode 100644 index 00000000..e1ed920f --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/config/WebConfig.java @@ -0,0 +1,105 @@ +package com.adc.da.main.config; + +import com.adc.da.filter.*; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +/** + * Web配置,用于注入过滤器,拦截器等 + */ +@Configuration +@Order(value =3) +public class WebConfig { + + /** + * xss过滤器(高标准) + */ + @Bean + public FilterRegistrationBean xssFilter() { + FilterRegistrationBean registration = new FilterRegistrationBean(); +// registration.setFilter(new XssFilter()); + registration.setFilter(new WebFilter()); + registration.addUrlPatterns("/*"); + registration.setName("xssFilter"); + registration.setOrder(10); + return registration; + } + + /** + * xss过滤器(低标准) + */ +// @Bean +// public FilterRegistrationBean xssShieldFilter() { +// FilterRegistrationBean registration = new FilterRegistrationBean(); +// registration.setFilter(new XssShieldFilter()); +// registration.addUrlPatterns("/*"); +// registration.setName("xssShieldFilter"); +// registration.setOrder(10); +// return registration; +// } + + @Bean + public FilterRegistrationBean csrfFilter() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new CsrfFilter()); + registration.addUrlPatterns("/*"); + registration.setName("csrfFilter"); + registration.setOrder(9); + return registration; + } + + @Bean + public FilterRegistrationBean requestInfoFilter() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new RequestInfoFilter()); + registration.addUrlPatterns("/*"); + registration.setName("RequestInfoFilter"); + registration.setOrder(8); + return registration; + } + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", buildConfig()); // 4 + return new CorsFilter(source); + } + + private CorsConfiguration buildConfig() { + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用 + corsConfiguration.addAllowedHeader("*"); // 2允许任何头 + corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等) + return corsConfiguration; + } + + + @Bean + public FilterRegistrationBean httpCacheFilter() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new HttpCacheFilter()); + registration.addUrlPatterns("/*"); + registration.setName("httpCacheFilter"); + registration.addInitParameter("maxAge", String.valueOf(60 * 60 * 24 * 7)); + registration.setOrder(6); + return registration; + } + + /** + * 防伪造jsessionid + */ + @Bean + public FilterRegistrationBean fakeJSessionIdFilter() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new FakeJSessionIdFilter()); + registration.addUrlPatterns("/*"); + registration.setName("fakeJSessionIdFilter"); + registration.setOrder(5); + return registration; + } +} \ No newline at end of file diff --git a/adc-da-main/src/main/java/com/adc/da/main/filter/AuthFormAuthenticationFilter.java b/adc-da-main/src/main/java/com/adc/da/main/filter/AuthFormAuthenticationFilter.java new file mode 100644 index 00000000..76efcf6a --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/filter/AuthFormAuthenticationFilter.java @@ -0,0 +1,25 @@ +package com.adc.da.main.filter; + +import cn.hutool.json.JSONUtil; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +public class AuthFormAuthenticationFilter extends FormAuthenticationFilter { + + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + httpServletResponse.setStatus(200); + httpServletResponse.setContentType("application/json;charset=utf-8"); + PrintWriter out = httpServletResponse.getWriter(); + ResponseMessage responseMessage = Result.error("A404", "无权访问"); + out.print(JSONUtil.toJsonStr(responseMessage)); + return false; + } +} diff --git a/adc-da-main/src/main/java/com/adc/da/main/generate/CodeGen.java b/adc-da-main/src/main/java/com/adc/da/main/generate/CodeGen.java new file mode 100644 index 00000000..ed1cb70c --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/generate/CodeGen.java @@ -0,0 +1,147 @@ +package com.adc.da.main.generate; + +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.generator.AutoGenerator; +import com.baomidou.mybatisplus.generator.InjectionConfig; +import com.baomidou.mybatisplus.generator.config.*; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class CodeGen { + + private static final String PACKAGE_PATH="/adc-da-sys/src/main"; + + private static final String AUTHOR="91isoft"; + + private static final String DB_IP="192.168.10.140:1521:orcl"; + + private static final String DB_USER="GSAR_TEST"; + + private static final String DB_PWD="1q2w3e4r"; + + + /** + *

+ * 读取控制台内容 + *

+ */ + public static String scanner(String tip) { + Scanner scanner = new Scanner(System.in); + StringBuilder help = new StringBuilder(); + help.append("请输入" + tip + ":"); + System.out.println(help.toString()); + if (scanner.hasNext()) { + String ipt = scanner.next(); + if (StringUtils.isNotEmpty(ipt)) { + return ipt; + } + } + throw new MybatisPlusException("请输入正确的" + tip + "!"); + } + + public static void main(String[] args) { + // 代码生成器 + AutoGenerator mpg = new AutoGenerator(); + + // 全局配置 + GlobalConfig gc = new GlobalConfig(); + String projectPath = System.getProperty("user.dir"); + gc.setOutputDir(projectPath + PACKAGE_PATH+"/java"); + gc.setAuthor(AUTHOR); + gc.setOpen(false); + gc.setSwagger2(true); //实体属性 Swagger2 注解 + gc.setMapperName("%sDao"); + mpg.setGlobalConfig(gc); + + // 数据源配置 + DataSourceConfig dsc = new DataSourceConfig(); + dsc.setUrl("jdbc:oracle:thin:@"+DB_IP); + // dsc.setSchemaName("public"); + dsc.setDriverName("oracle.jdbc.OracleDriver"); + dsc.setUsername(DB_USER); + dsc.setPassword(DB_PWD); + mpg.setDataSource(dsc); + + // 包配置 + PackageConfig pc = new PackageConfig(); + pc.setModuleName(scanner("模块名")); + pc.setMapper("dao"); + pc.setParent("com.adc.da"); + mpg.setPackageInfo(pc); + + // 自定义配置 + InjectionConfig cfg = new InjectionConfig() { + @Override + public void initMap() { + // to do nothing + } + }; + + // 如果模板引擎是 freemarker + String templatePath = "/templates/mapper.xml.ftl"; + // 如果模板引擎是 velocity + // String templatePath = "/templates/mapper.xml.vm"; + + // 自定义输出配置 + List focList = new ArrayList<>(); + // 自定义配置会被优先输出 + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! + return projectPath +PACKAGE_PATH+ "/resources/mybatis/mapper/" + pc.getModuleName() + + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; + } + }); + /* + cfg.setFileCreate(new IFileCreate() { + @Override + public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { + // 判断自定义文件夹是否需要创建 + checkDir("调用默认方法创建的目录"); + return false; + } + }); + */ + cfg.setFileOutConfigList(focList); + mpg.setCfg(cfg); + + // 配置模板 + TemplateConfig templateConfig = new TemplateConfig(); + + // 配置自定义输出模板 + //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别 + templateConfig.setController("templates/controller.java"); + templateConfig.setMapper("templates/mapper.java"); + templateConfig.setEntity("templates/entity.java"); + templateConfig.setService("templates/service.java"); + templateConfig.setServiceImpl("templates/serviceImpl.java"); + templateConfig.setXml(null); + mpg.setTemplate(templateConfig); + + // 策略配置 + StrategyConfig strategy = new StrategyConfig(); + strategy.setNaming(NamingStrategy.underline_to_camel); + strategy.setColumnNaming(NamingStrategy.underline_to_camel); + strategy.setSuperEntityClass("com.adc.da.base.entity.BaseEntity"); + strategy.setEntityLombokModel(true); + strategy.setRestControllerStyle(true); + // 公共父类 + strategy.setSuperControllerClass("com.adc.da.base.web.BaseController"); + // 写于父类中的公共字段 + strategy.setSuperEntityColumns("id"); + strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); + strategy.setControllerMappingHyphenStyle(true); + strategy.setTablePrefix(pc.getModuleName() + "_"); + mpg.setStrategy(strategy); + mpg.setTemplateEngine(new FreemarkerTemplateEngine()); + mpg.execute(); + } +} diff --git a/adc-da-main/src/main/java/com/adc/da/main/generate/CodeUtil.java b/adc-da-main/src/main/java/com/adc/da/main/generate/CodeUtil.java new file mode 100644 index 00000000..cbd1d9cc --- /dev/null +++ b/adc-da-main/src/main/java/com/adc/da/main/generate/CodeUtil.java @@ -0,0 +1,15 @@ +package com.adc.da.main.generate; + +//import com.codemagic.DbCodeGenerateFactory; + +public class CodeUtil { + + public CodeUtil() {} + + + public static void main(String[] args) { + String entityPackage="sys"; +// DbCodeGenerateFactory.codeGenerate("ECP_CHANGE_HIS_PLAN", entityPackage); + } + +} diff --git a/adc-da-main/src/main/resources/application-dev.properties b/adc-da-main/src/main/resources/application-dev.properties new file mode 100644 index 00000000..1b77a4b0 --- /dev/null +++ b/adc-da-main/src/main/resources/application-dev.properties @@ -0,0 +1,44 @@ +# dev config +#============================================= +# 数据库配置 +#============================================= +spring.datasource.driverClassName = oracle.jdbc.OracleDriver +spring.datasource.url = jdbc:oracle:thin:@//192.168.10.140:1521/orcl +spring.datasource.username = LAWSDB +spring.datasource.password = 1q2w3e4r + +#============================================== +# 应用设置 +spring.application.name=gsar +application.code=20200101 +application.center=1 +#============================================== + +#============================================== +# 邮箱配置 +#============================================== +mail.state=false +spring.mail.host=outlook.geely.com +spring.mail.protocol=smtp +spring.mail.username=e-shiwei@geely.com +spring.mail.password=YtfaaJauPjq21 +spring.mail.properties.smtp.auth=true +spring.mail.properties.smtp.starttls.enable=false +spring.mail.properties.smtp.starttls.required=false +spring.mail.properties.mail.smtp.ssl.enable=false +spring.mail.port=587 + +# ============================================== +# rabbitMQ +# ============================================== +spring.rabbitmq.host=rabbitmq-cluster-01.vs.test.geely.svc +spring.rabbitmq.port=5672 +spring.rabbitmq.virtual-host=uat_pcms +spring.rabbitmq.username=uat_pcms +spring.rabbitmq.password=VxsBLL5bJruwzXfS +# spring.rabbitmq.publisher-confirms=true + +# ============================================== +# 文档存储路径指向 +# ============================================== +file.path=/usr/laws/file/ \ No newline at end of file diff --git a/adc-da-main/src/main/resources/application-prod.properties b/adc-da-main/src/main/resources/application-prod.properties new file mode 100644 index 00000000..203e71c7 --- /dev/null +++ b/adc-da-main/src/main/resources/application-prod.properties @@ -0,0 +1,38 @@ +#prod config +#============================================= +# 数据库配置 +#============================================= +spring.datasource.driverClassName = oracle.jdbc.OracleDriver +spring.datasource.url = jdbc:oracle:thin:@//10.190.228.33:1521/geely +spring.datasource.username = scyzx_uat +spring.datasource.password = b#Lf5z0^QrF4J3Km + + +#============================================== +# 邮箱配置 +#============================================== +mail.state=false +spring.mail.host=outlook.geely.com +spring.mail.protocol=smtp +spring.mail.username=e-shiwei@geely.com +spring.mail.password=YtfaaJauPjq21 +spring.mail.properties.smtp.auth=true +spring.mail.properties.smtp.starttls.enable=false +spring.mail.properties.smtp.starttls.required=false +spring.mail.properties.mail.smtp.ssl.enable=false +spring.mail.port=587 + +# ============================================== +# rabbitMQ +# ============================================== +spring.rabbitmq.host=rabbitmq-cluster-01.vs.test.geely.svc +spring.rabbitmq.port=5672 +spring.rabbitmq.virtual-host=uat_pcms +spring.rabbitmq.username=uat_pcms +spring.rabbitmq.password=VxsBLL5bJruwzXfS +# spring.rabbitmq.publisher-confirms=true + +# ============================================== +# 文档存储路径指向 +# ============================================== +file.path=/usr/laws/file/ \ No newline at end of file diff --git a/adc-da-main/src/main/resources/application-test.properties b/adc-da-main/src/main/resources/application-test.properties new file mode 100644 index 00000000..55f14c4b --- /dev/null +++ b/adc-da-main/src/main/resources/application-test.properties @@ -0,0 +1,38 @@ +# test config +#============================================= +# 数据库配置 +#============================================= +spring.datasource.driverClassName = oracle.jdbc.OracleDriver +spring.datasource.url = jdbc:oracle:thin:@//10.190.228.33:1521/geely +spring.datasource.username = scyzx_uat +spring.datasource.password = b#Lf5z0^QrF4J3Km + + +#============================================== +# 邮箱配置 +#============================================== +mail.state=false +spring.mail.host=outlook.geely.com +spring.mail.protocol=smtp +spring.mail.username=e-shiwei@geely.com +spring.mail.password=YtfaaJauPjq21 +spring.mail.properties.smtp.auth=true +spring.mail.properties.smtp.starttls.enable=false +spring.mail.properties.smtp.starttls.required=false +spring.mail.properties.mail.smtp.ssl.enable=false +spring.mail.port=587 + +# ============================================== +# rabbitMQ +# ============================================== +spring.rabbitmq.host=rabbitmq-cluster-01.vs.test.geely.svc +spring.rabbitmq.port=5672 +spring.rabbitmq.virtual-host=uat_pcms +spring.rabbitmq.username=uat_pcms +spring.rabbitmq.password=VxsBLL5bJruwzXfS +# spring.rabbitmq.publisher-confirms=true + +# ============================================== +# 文档存储路径指向 +# ============================================== +file.path=/usr/laws/file/ \ No newline at end of file diff --git a/adc-da-main/src/main/resources/application.properties b/adc-da-main/src/main/resources/application.properties new file mode 100644 index 00000000..3bd3954c --- /dev/null +++ b/adc-da-main/src/main/resources/application.properties @@ -0,0 +1,101 @@ +############################################## +# 项目启动模式 +############################################## +spring.profiles.active=dev + +############################################## +#公共配置信息 +############################################## +server.compression.enabled=true +server.compression.mime-types=application/json,application/xml,text/html,text/plain,text/css,application/x-javascript +# 端口号设置 +server.port=9999 +#主服务session超时 +server.servlet.session.timeout =600 + +# http-only +server.session.cookie.http-only=true +spring.mvc.async.request-timeout=20000 + +# file模块上传文件大小限制 +spring.http.multipart.max-request-size=100MB +spring.http.multipart.max-file-size=100MB + +#显示sql +logging.level.com.adc=DEBUG +logging.level.org.springframework=info + +# 请求前缀 +restPath=/api +#server.servlet.context-path=/api + +# =============================== +# = DATA SOURCE +# =============================== +spring.datasource.type = com.alibaba.druid.pool.DruidDataSource +# 下面为连接池的补充设置,应用到上面所有数据源中 +# 初始化大小,最小,最大 +spring.datasource.druid.initial-size= 5 +spring.datasource.druid.min-idle= 5 +spring.datasource.druid.max-active= 50 +# 配置获取连接等待超时的时间 +spring.datasource.druid.max-wait= 60000 +# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 +spring.datasource.druid.time-between-eviction-runs-millis= 60000 +# 配置一个连接在池中最小生存的时间,单位是毫秒 +spring.datasource.druid.min-evictable-idle-time-millis= 300000 +spring.datasource.druid.validation-query= SELECT 1 FROM DUAL +# 空闲时间监测连接是否优秀奥 +spring.datasource.druid.test-while-idle= true +# 数据库连接心跳监测 +spring.datasource.druid.keep-alive= true +# 获取链接前检查链接是否有效 +spring.datasource.druid.test-on-borrow= true +# 返回连接池时检查链接是否可用 +spring.datasource.druid.test-on-return= false +# 打开PSCache,并且指定每个连接上PSCache的大小 +spring.datasource.druid.pool-prepared-statements= true +spring.datasource.druid.max-pool-prepared-statement-per-connection-size= 20 +# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 +spring.datasource.druid.filters=stat,wall +#合并多个DruidDataSource的监控数据 +spring.datasource.druid.use-global-data-source-stat=true +# druid web管理页面开启 +spring.datasource.druid.stat-view-servlet.enabled=true +# druid web管理页面白名单 +#spring.datasource.druid.stat-view-servlet.allow=127.0.0.1 +# druid web管理页面账号 +spring.datasource.druid.stat-view-servlet.login-username=druid +# druid web管理页面密码 +spring.datasource.druid.stat-view-servlet.login-password=laws1q2w3e4r +# druid web管理页面URL访问前缀地址 +spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* +# =============================== + +# ======================================= +# Mybatis Plus config +# ======================================= +mybatis-plus.config-location=classpath:mybatis/mybatis-config.xml +mybatis-plus.mapper-locations=classpath*:mybatis/mapper/**/*.xml + +# ======================================== +# activiti 配置信息 +# ======================================== +#spring.activiti.database-schema=ACT +spring.activiti.database-schema-update=false +spring.activiti.check-process-definitions=false +spring.activiti.job-executor-activate=false +spring.activiti.process-definition-location-prefix=classpath:/mybatis/mapper/activiti/ + + +# ========================================= +# login value +# ========================================= +maxLoginErrorCount=3 +verifyCodeMode=1 + +# ========================================= +# 上传文件配置 +# ========================================= +#上传文件白名单-以,分隔 +upload.file.white.lists = doc,docx,xls,xlsx,pdf,PDF,png,jpg \ No newline at end of file diff --git a/adc-da-main/src/main/resources/banner.txt b/adc-da-main/src/main/resources/banner.txt new file mode 100644 index 00000000..a4f9a525 --- /dev/null +++ b/adc-da-main/src/main/resources/banner.txt @@ -0,0 +1,9 @@ +${AnsiColor.RED} _ _ + __ _ __| | ___ __| | __ _ + / _` |/ _` |/ __|____ / _` |/ _` | + | (_| | (_| | (_|_____| (_| | (_| | + \__,_|\__,_|\___| \__,_|\__,_| + +${AnsiColor.YELLOW}------------------------------------------------ +${AnsiColor.YELLOW} :: ${AnsiColor.YELLOW}@数据资源中心 +${AnsiColor.YELLOW}------------------------------------------------${AnsiColor.WHITE} \ No newline at end of file diff --git a/adc-da-main/src/main/resources/logback-spring.xml b/adc-da-main/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..dec4b3f5 --- /dev/null +++ b/adc-da-main/src/main/resources/logback-spring.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n + UTF-8 + + + + + + + + + + INFO + + ACCEPT + + ACCEPT + + + + + ${LOG_HOME}/${LOG_HOME_SYSTEM}/${PROJECT_NAME}.system_all.%d{yyyy-MM-dd}.%i.log + + 7 + + 100MB + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n + UTF-8 + + + + + + + + ERROR + ACCEPT + DENY + + + + ${LOG_HOME}/${LOG_HOME_SYSTEM}/${PROJECT_NAME}.system_error.%d{yyyy-MM-dd}.%i.log + + 30 + + 100MB + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n + UTF-8 + + + + + + + + INFO + ACCEPT + DENY + + + + ${LOG_HOME}/${LOG_HOME_DRUID}/${PROJECT_NAME}.druid_info.%d{yyyy-MM-dd}.%i.log + + 15 + + 50MB + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n + UTF-8 + + + + + + + WARN + + + + + ${LOG_HOME}/${LOG_HOME_DRUID}/${PROJECT_NAME}.druid_warn.%d{yyyy-MM-dd}.%i.log + + 30 + + 50MB + + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n + UTF-8 + + + + + + INFO + ACCEPT + DENY + + + + ${LOG_HOME}/${LOG_HOME_OPERATION}/${PROJECT_NAME}.operation.%d{yyyy-MM-dd}.%i.log + + 120 + + 300MB + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %logger{50} - %msg%n + UTF-8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/adc-da-main/src/main/resources/logo/logo_white.png b/adc-da-main/src/main/resources/logo/logo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..e744da1be62a38f45e56e9b8d2e36f0341cbd2dd GIT binary patch literal 141020 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

q-W7Quesgj$$a9Bn5@>-bRW(RnQ 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 Tlt|nQczfielqD<0O#=Q0j)#Pn literal 0 HcmV?d00001 diff --git a/adc-da-main/src/main/resources/mybatis/mybatis-config.xml b/adc-da-main/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 00000000..e041bc2e --- /dev/null +++ b/adc-da-main/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/adc-da-main/src/main/resources/temp/entity.java.ftl b/adc-da-main/src/main/resources/temp/entity.java.ftl new file mode 100644 index 00000000..c698d363 --- /dev/null +++ b/adc-da-main/src/main/resources/temp/entity.java.ftl @@ -0,0 +1,152 @@ +package ${package.Entity}; + +<#list table.importPackages as pkg> +import ${pkg}; + +<#if swagger2> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +<#if entityLombokModel> +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + + +/** + *

+ * ${table.comment!} + *

+ * + * @author ${author} + * @since ${date} + */ +<#if entityLombokModel> +@Data + <#if superEntityClass??> +@EqualsAndHashCode(callSuper = true) + <#else> +@EqualsAndHashCode(callSuper = false) + +@Accessors(chain = true) + +<#if table.convert> +@TableName("${table.name}") + +<#if swagger2> +@ApiModel(value="${entity}对象", description="${table.comment!}") + +<#if superEntityClass??> +public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}> { +<#elseif activeRecord> +public class ${entity} extends Model<${entity}> { +<#else> +public class ${entity} implements Serializable { + + +<#if entitySerialVersionUID> + private static final long serialVersionUID = 1L; + +<#-- ---------- BEGIN 字段循环遍历 ----------> +<#list table.fields as field> + <#if field.keyFlag> + <#assign keyPropertyName="${field.propertyName}"/> + + + <#if field.comment!?length gt 0> + <#if swagger2> + @ApiModelProperty(value = "${field.comment}") + <#else> + /** + * ${field.comment} + */ + + + <#if field.keyFlag> + <#-- 主键 --> + <#if field.keyIdentityFlag> + @TableId(value = "${field.name}", type = IdType.AUTO) + <#elseif idType??> + @TableId(value = "${field.name}", type = IdType.${idType}) + <#elseif field.convert> + @TableId("${field.name}") + + <#-- 普通字段 --> + <#elseif field.fill??> + <#-- ----- 存在字段填充设置 -----> + <#if field.convert> + @TableField(value = "${field.name}", fill = FieldFill.${field.fill}) + <#else> + @TableField(fill = FieldFill.${field.fill}) + + <#elseif field.convert> + @TableField("${field.name}") + + <#-- 乐观锁注解 --> + <#if (versionFieldName!"") == field.name> + @Version + + <#-- 逻辑删除注解 --> + <#if (logicDeleteFieldName!"") == field.name> + @TableLogic + + private ${field.propertyType} ${field.propertyName}; + +<#------------ END 字段循环遍历 ----------> + +<#if !entityLombokModel> + <#list table.fields as field> + <#if field.propertyType == "boolean"> + <#assign getprefix="is"/> + <#else> + <#assign getprefix="get"/> + + public ${field.propertyType} ${getprefix}${field.capitalName}() { + return ${field.propertyName}; + } + + <#if entityBuilderModel> + public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + <#else> + public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + + this.${field.propertyName} = ${field.propertyName}; + <#if entityBuilderModel> + return this; + + } + + + +<#if entityColumnConstant> + <#list table.fields as field> + public static final String ${field.name?upper_case} = "${field.name}"; + + + +<#if activeRecord> + @Override + protected Serializable pkVal() { + <#if keyPropertyName??> + return this.${keyPropertyName}; + <#else> + return null; + + } + + +<#if !entityLombokModel> + @Override + public String toString() { + return "${entity}{" + + <#list table.fields as field> + <#if field_index==0> + "${field.propertyName}=" + ${field.propertyName} + + <#else> + ", ${field.propertyName}=" + ${field.propertyName} + + + + "}"; + } + +} diff --git a/adc-da-main/src/main/resources/temp/mapper.java.ftl b/adc-da-main/src/main/resources/temp/mapper.java.ftl new file mode 100644 index 00000000..53da4ae3 --- /dev/null +++ b/adc-da-main/src/main/resources/temp/mapper.java.ftl @@ -0,0 +1,20 @@ +package ${package.Mapper}; + +import ${package.Entity}.${entity}; +import ${superMapperClassPackage}; + +/** + *

+ * ${table.comment!} Mapper 接口 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.mapperName} : ${superMapperClass}<${entity}> +<#else> +public interface ${table.mapperName} extends ${superMapperClass}<${entity}> { + +} + diff --git a/adc-da-main/src/main/resources/temp/service.java.ftl b/adc-da-main/src/main/resources/temp/service.java.ftl new file mode 100644 index 00000000..e3232f3a --- /dev/null +++ b/adc-da-main/src/main/resources/temp/service.java.ftl @@ -0,0 +1,20 @@ +package ${package.Service}; + +import ${package.Entity}.${entity}; +import ${superServiceClassPackage}; + +/** + *

+ * ${table.comment!} 服务类 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.serviceName} : ${superServiceClass}<${entity}> +<#else> +public interface ${table.serviceName} extends ${superServiceClass}<${entity}> { + +} + diff --git a/adc-da-main/src/main/resources/templates/controller.java.ftl b/adc-da-main/src/main/resources/templates/controller.java.ftl new file mode 100644 index 00000000..df485cbe --- /dev/null +++ b/adc-da-main/src/main/resources/templates/controller.java.ftl @@ -0,0 +1,41 @@ +package ${package.Controller}; + + +import org.springframework.web.bind.annotation.RequestMapping; +import ${package.Entity}.${entity}; +import io.swagger.annotations.Api; +<#if restControllerStyle> +import org.springframework.web.bind.annotation.RestController; +<#else> +import org.springframework.stereotype.Controller; + +<#if superControllerClassPackage??> +import ${superControllerClassPackage}; + + +/** +*

+ * ${table.comment!} 前端控制器 + *

+* +* @author ${author} +* @since ${date} +*/ +<#if restControllerStyle> +@RestController +<#else> +@Controller + +@Api(description = "|${entity}|") +@RequestMapping("<#if package.ModuleName?? && package.ModuleName != "">/${package.ModuleName}/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}") +<#if kotlin> +class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}() +<#else> + <#if superControllerClass??> +public class ${table.controllerName} extends ${superControllerClass}<${entity}> { + <#else> +public class ${table.controllerName} extends ${superControllerClass}<${entity}>{ + + +} + diff --git a/adc-da-main/src/main/resources/templates/entity.java.ftl b/adc-da-main/src/main/resources/templates/entity.java.ftl new file mode 100644 index 00000000..c698d363 --- /dev/null +++ b/adc-da-main/src/main/resources/templates/entity.java.ftl @@ -0,0 +1,152 @@ +package ${package.Entity}; + +<#list table.importPackages as pkg> +import ${pkg}; + +<#if swagger2> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +<#if entityLombokModel> +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + + +/** + *

+ * ${table.comment!} + *

+ * + * @author ${author} + * @since ${date} + */ +<#if entityLombokModel> +@Data + <#if superEntityClass??> +@EqualsAndHashCode(callSuper = true) + <#else> +@EqualsAndHashCode(callSuper = false) + +@Accessors(chain = true) + +<#if table.convert> +@TableName("${table.name}") + +<#if swagger2> +@ApiModel(value="${entity}对象", description="${table.comment!}") + +<#if superEntityClass??> +public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}> { +<#elseif activeRecord> +public class ${entity} extends Model<${entity}> { +<#else> +public class ${entity} implements Serializable { + + +<#if entitySerialVersionUID> + private static final long serialVersionUID = 1L; + +<#-- ---------- BEGIN 字段循环遍历 ----------> +<#list table.fields as field> + <#if field.keyFlag> + <#assign keyPropertyName="${field.propertyName}"/> + + + <#if field.comment!?length gt 0> + <#if swagger2> + @ApiModelProperty(value = "${field.comment}") + <#else> + /** + * ${field.comment} + */ + + + <#if field.keyFlag> + <#-- 主键 --> + <#if field.keyIdentityFlag> + @TableId(value = "${field.name}", type = IdType.AUTO) + <#elseif idType??> + @TableId(value = "${field.name}", type = IdType.${idType}) + <#elseif field.convert> + @TableId("${field.name}") + + <#-- 普通字段 --> + <#elseif field.fill??> + <#-- ----- 存在字段填充设置 -----> + <#if field.convert> + @TableField(value = "${field.name}", fill = FieldFill.${field.fill}) + <#else> + @TableField(fill = FieldFill.${field.fill}) + + <#elseif field.convert> + @TableField("${field.name}") + + <#-- 乐观锁注解 --> + <#if (versionFieldName!"") == field.name> + @Version + + <#-- 逻辑删除注解 --> + <#if (logicDeleteFieldName!"") == field.name> + @TableLogic + + private ${field.propertyType} ${field.propertyName}; + +<#------------ END 字段循环遍历 ----------> + +<#if !entityLombokModel> + <#list table.fields as field> + <#if field.propertyType == "boolean"> + <#assign getprefix="is"/> + <#else> + <#assign getprefix="get"/> + + public ${field.propertyType} ${getprefix}${field.capitalName}() { + return ${field.propertyName}; + } + + <#if entityBuilderModel> + public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + <#else> + public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + + this.${field.propertyName} = ${field.propertyName}; + <#if entityBuilderModel> + return this; + + } + + + +<#if entityColumnConstant> + <#list table.fields as field> + public static final String ${field.name?upper_case} = "${field.name}"; + + + +<#if activeRecord> + @Override + protected Serializable pkVal() { + <#if keyPropertyName??> + return this.${keyPropertyName}; + <#else> + return null; + + } + + +<#if !entityLombokModel> + @Override + public String toString() { + return "${entity}{" + + <#list table.fields as field> + <#if field_index==0> + "${field.propertyName}=" + ${field.propertyName} + + <#else> + ", ${field.propertyName}=" + ${field.propertyName} + + + + "}"; + } + +} diff --git a/adc-da-main/src/main/resources/templates/mapper.java.ftl b/adc-da-main/src/main/resources/templates/mapper.java.ftl new file mode 100644 index 00000000..53da4ae3 --- /dev/null +++ b/adc-da-main/src/main/resources/templates/mapper.java.ftl @@ -0,0 +1,20 @@ +package ${package.Mapper}; + +import ${package.Entity}.${entity}; +import ${superMapperClassPackage}; + +/** + *

+ * ${table.comment!} Mapper 接口 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.mapperName} : ${superMapperClass}<${entity}> +<#else> +public interface ${table.mapperName} extends ${superMapperClass}<${entity}> { + +} + diff --git a/adc-da-main/src/main/resources/templates/mapper.xml.ftl b/adc-da-main/src/main/resources/templates/mapper.xml.ftl new file mode 100644 index 00000000..d9ca71c4 --- /dev/null +++ b/adc-da-main/src/main/resources/templates/mapper.xml.ftl @@ -0,0 +1,39 @@ + + + + +<#if enableCache> + + + + +<#if baseResultMap> + + +<#list table.fields as field> +<#if field.keyFlag><#--生成主键排在第一位--> + + + +<#list table.commonFields as field><#--生成公共字段 --> + + +<#list table.fields as field> +<#if !field.keyFlag><#--生成普通字段 --> + + + + + + +<#if baseColumnList> + + +<#list table.commonFields as field> + ${field.name}, + + ${table.fieldNames} + + + + diff --git a/adc-da-main/src/main/resources/templates/service.java.ftl b/adc-da-main/src/main/resources/templates/service.java.ftl new file mode 100644 index 00000000..e3232f3a --- /dev/null +++ b/adc-da-main/src/main/resources/templates/service.java.ftl @@ -0,0 +1,20 @@ +package ${package.Service}; + +import ${package.Entity}.${entity}; +import ${superServiceClassPackage}; + +/** + *

+ * ${table.comment!} 服务类 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.serviceName} : ${superServiceClass}<${entity}> +<#else> +public interface ${table.serviceName} extends ${superServiceClass}<${entity}> { + +} + diff --git a/adc-da-main/src/main/resources/templates/serviceImpl.java.ftl b/adc-da-main/src/main/resources/templates/serviceImpl.java.ftl new file mode 100644 index 00000000..aeebd14c --- /dev/null +++ b/adc-da-main/src/main/resources/templates/serviceImpl.java.ftl @@ -0,0 +1,26 @@ +package ${package.ServiceImpl}; + +import ${package.Entity}.${entity}; +import ${package.Mapper}.${table.mapperName}; +import ${package.Service}.${table.serviceName}; +import ${superServiceImplClassPackage}; +import org.springframework.stereotype.Service; + +/** + *

+ * ${table.comment!} 服务实现类 + *

+ * + * @author ${author} + * @since ${date} + */ +@Service +<#if kotlin> +open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} { + +} +<#else> +public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} { + +} + diff --git a/adc-da-main/src/main/resources/ueditor/config.json b/adc-da-main/src/main/resources/ueditor/config.json new file mode 100644 index 00000000..77a0a70f --- /dev/null +++ b/adc-da-main/src/main/resources/ueditor/config.json @@ -0,0 +1,97 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "/api/ueditor/uploadImageData", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "", /* 图片访问路径前缀 */ + "localSavePathPrefix":"upload/images/inform", + "imagePathFormat": "", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": "", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + /*抓取远程图片是否开启,默认true*/ + "catchRemoteImageEnable": false, + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": "/ueditor/jsp/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "", /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": "/ueditor/jsp/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "/ueditor/jsp/upload/image/", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "/ueditor/jsp/upload/file/", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file diff --git a/adc-da-main/src/main/resources/white/uploadWhite.txt b/adc-da-main/src/main/resources/white/uploadWhite.txt new file mode 100644 index 00000000..fd4a3ae3 --- /dev/null +++ b/adc-da-main/src/main/resources/white/uploadWhite.txt @@ -0,0 +1,12 @@ +pdf +doc +docx +xlsx +xls +zip +rar +jpg +jpge +png +gif +ppt \ No newline at end of file diff --git a/adc-da-main/src/main/resources/white/xssWhite.txt b/adc-da-main/src/main/resources/white/xssWhite.txt new file mode 100644 index 00000000..b724e4db --- /dev/null +++ b/adc-da-main/src/main/resources/white/xssWhite.txt @@ -0,0 +1 @@ +/upload/ \ No newline at end of file diff --git a/adc-da-sys/.gitignore b/adc-da-sys/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/adc-da-sys/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/adc-da-sys/.mvn/wrapper/MavenWrapperDownloader.java b/adc-da-sys/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 00000000..a45eb6ba --- /dev/null +++ b/adc-da-sys/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/adc-da-sys/.mvn/wrapper/maven-wrapper.jar b/adc-da-sys/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 zcmbTd1CVCTmM+|7+wQV$+qP}n>auOywyU~q+qUhh+uxis_~*a##hm*_WW?9E7Pb7N%LRFiwbEGCJ0XP=%-6oeT$XZcYgtzC2~q zk(K08IQL8oTl}>>+hE5YRgXTB@fZ4TH9>7=79e`%%tw*SQUa9~$xKD5rS!;ZG@ocK zQdcH}JX?W|0_Afv?y`-NgLum62B&WSD$-w;O6G0Sm;SMX65z)l%m1e-g8Q$QTI;(Q z+x$xth4KFvH@Bs6(zn!iF#nenk^Y^ce;XIItAoCsow38eq?Y-Auh!1in#Rt-_D>H^ z=EjbclGGGa6VnaMGmMLj`x3NcwA43Jb(0gzl;RUIRAUDcR1~99l2SAPkVhoRMMtN} zXvC<tOmX83grD8GSo_Lo?%lNfhD#EBgPo z*nf@ppMC#B!T)Ae0RG$mlJWmGl7CkuU~B8-==5i;rS;8i6rJ=PoQxf446XDX9g|c> zU64ePyMlsI^V5Jq5A+BPe#e73+kpc_r1tv#B)~EZ;7^67F0*QiYfrk0uVW;Qb=NsG zN>gsuCwvb?s-KQIppEaeXtEMdc9dy6Dfduz-tMTms+i01{eD9JE&h?Kht*$eOl#&L zJdM_-vXs(V#$Ed;5wyNWJdPNh+Z$+;$|%qR(t`4W@kDhd*{(7-33BOS6L$UPDeE_53j${QfKN-0v-HG z(QfyvFNbwPK%^!eIo4ac1;b>c0vyf9}Xby@YY!lkz-UvNp zwj#Gg|4B~?n?G^{;(W;|{SNoJbHTMpQJ*Wq5b{l9c8(%?Kd^1?H1om1de0Da9M;Q=n zUfn{f87iVb^>Exl*nZ0hs(Yt>&V9$Pg`zX`AI%`+0SWQ4Zc(8lUDcTluS z5a_KerZWe}a-MF9#Cd^fi!y3%@RFmg&~YnYZ6<=L`UJ0v={zr)>$A;x#MCHZy1st7 ztT+N07NR+vOwSV2pvWuN1%lO!K#Pj0Fr>Q~R40{bwdL%u9i`DSM4RdtEH#cW)6}+I-eE< z&tZs+(Ogu(H_;$a$!7w`MH0r%h&@KM+<>gJL@O~2K2?VrSYUBbhCn#yy?P)uF3qWU z0o09mIik+kvzV6w>vEZy@&Mr)SgxPzUiDA&%07m17udz9usD82afQEps3$pe!7fUf z0eiidkJ)m3qhOjVHC_M(RYCBO%CZKZXFb8}s0-+}@CIn&EF(rRWUX2g^yZCvl0bI} zbP;1S)iXnRC&}5-Tl(hASKqdSnO?ASGJ*MIhOXIblmEudj(M|W!+I3eDc}7t`^mtg z)PKlaXe(OH+q-)qcQ8a@!llRrpGI8DsjhoKvw9T;TEH&?s=LH0w$EzI>%u;oD@x83 zJL7+ncjI9nn!TlS_KYu5vn%f*@qa5F;| zEFxY&B?g=IVlaF3XNm_03PA)=3|{n-UCgJoTr;|;1AU9|kPE_if8!Zvb}0q$5okF$ zHaJdmO&gg!9oN|M{!qGE=tb|3pVQ8PbL$}e;NgXz<6ZEggI}wO@aBP**2Wo=yN#ZC z4G$m^yaM9g=|&!^ft8jOLuzc3Psca*;7`;gnHm}tS0%f4{|VGEwu45KptfNmwxlE~ z^=r30gi@?cOm8kAz!EylA4G~7kbEiRlRIzwrb~{_2(x^$-?|#e6Bi_**(vyr_~9Of z!n>Gqf+Qwiu!xhi9f53=PM3`3tNF}pCOiPU|H4;pzjcsqbwg*{{kyrTxk<;mx~(;; z1NMrpaQ`57yn34>Jo3b|HROE(UNcQash!0p2-!Cz;{IRv#Vp5!3o$P8!%SgV~k&Hnqhp`5eLjTcy93cK!3Hm-$`@yGnaE=?;*2uSpiZTs_dDd51U%i z{|Zd9ou-;laGS_x=O}a+ zB||za<795A?_~Q=r=coQ+ZK@@ zId~hWQL<%)fI_WDIX#=(WNl!Dm$a&ROfLTd&B$vatq!M-2Jcs;N2vps$b6P1(N}=oI3<3luMTmC|0*{ zm1w8bt7vgX($!0@V0A}XIK)w!AzUn7vH=pZEp0RU0p?}ch2XC-7r#LK&vyc2=-#Q2 z^L%8)JbbcZ%g0Du;|8=q8B>X=mIQirpE=&Ox{TiuNDnOPd-FLI^KfEF729!!0x#Es z@>3ursjFSpu%C-8WL^Zw!7a0O-#cnf`HjI+AjVCFitK}GXO`ME&on|^=~Zc}^LBp9 zj=-vlN;Uc;IDjtK38l7}5xxQF&sRtfn4^TNtnzXv4M{r&ek*(eNbIu!u$>Ed%` z5x7+&)2P&4>0J`N&ZP8$vcR+@FS0126s6+Jx_{{`3ZrIMwaJo6jdrRwE$>IU_JTZ} z(||hyyQ)4Z1@wSlT94(-QKqkAatMmkT7pCycEB1U8KQbFX&?%|4$yyxCtm3=W`$4fiG0WU3yI@c zx{wfmkZAYE_5M%4{J-ygbpH|(|GD$2f$3o_Vti#&zfSGZMQ5_f3xt6~+{RX=$H8at z?GFG1Tmp}}lmm-R->ve*Iv+XJ@58p|1_jRvfEgz$XozU8#iJS})UM6VNI!3RUU!{5 zXB(+Eqd-E;cHQ>)`h0(HO_zLmzR3Tu-UGp;08YntWwMY-9i^w_u#wR?JxR2bky5j9 z3Sl-dQQU$xrO0xa&>vsiK`QN<$Yd%YXXM7*WOhnRdSFt5$aJux8QceC?lA0_if|s> ze{ad*opH_kb%M&~(~&UcX0nFGq^MqjxW?HJIP462v9XG>j(5Gat_)#SiNfahq2Mz2 zU`4uV8m$S~o9(W>mu*=h%Gs(Wz+%>h;R9Sg)jZ$q8vT1HxX3iQnh6&2rJ1u|j>^Qf`A76K%_ubL`Zu?h4`b=IyL>1!=*%!_K)=XC z6d}4R5L+sI50Q4P3upXQ3Z!~1ZXLlh!^UNcK6#QpYt-YC=^H=EPg3)z*wXo*024Q4b2sBCG4I# zlTFFY=kQ>xvR+LsuDUAk)q%5pEcqr(O_|^spjhtpb1#aC& zghXzGkGDC_XDa%t(X`E+kvKQ4zrQ*uuQoj>7@@ykWvF332)RO?%AA&Fsn&MNzmFa$ zWk&&^=NNjxLjrli_8ESU)}U|N{%j&TQmvY~lk!~Jh}*=^INA~&QB9em!in_X%Rl1&Kd~Z(u z9mra#<@vZQlOY+JYUwCrgoea4C8^(xv4ceCXcejq84TQ#sF~IU2V}LKc~Xlr_P=ry zl&Hh0exdCbVd^NPCqNNlxM3vA13EI8XvZ1H9#bT7y*U8Y{H8nwGpOR!e!!}*g;mJ#}T{ekSb}5zIPmye*If(}}_=PcuAW#yidAa^9-`<8Gr0 z)Fz=NiZ{)HAvw{Pl5uu)?)&i&Us$Cx4gE}cIJ}B4Xz~-q7)R_%owbP!z_V2=Aq%Rj z{V;7#kV1dNT9-6R+H}}(ED*_!F=~uz>&nR3gb^Ce%+0s#u|vWl<~JD3MvS0T9thdF zioIG3c#Sdsv;LdtRv3ml7%o$6LTVL>(H`^@TNg`2KPIk*8-IB}X!MT0`hN9Ddf7yN z?J=GxPL!uJ7lqwowsl?iRrh@#5C$%E&h~Z>XQcvFC*5%0RN-Opq|=IwX(dq(*sjs+ zqy99+v~m|6T#zR*e1AVxZ8djd5>eIeCi(b8sUk)OGjAsKSOg^-ugwl2WSL@d#?mdl zib0v*{u-?cq}dDGyZ%$XRY=UkQwt2oGu`zQneZh$=^! zj;!pCBWQNtvAcwcWIBM2y9!*W|8LmQy$H~5BEx)78J`4Z0(FJO2P^!YyQU{*Al+fs z){!4JvT1iLrJ8aU3k0t|P}{RN)_^v%$$r;+p0DY7N8CXzmS*HB*=?qaaF9D@#_$SN zSz{moAK<*RH->%r7xX~9gVW$l7?b|_SYI)gcjf0VAUJ%FcQP(TpBs; zg$25D!Ry_`8xpS_OJdeo$qh#7U+cepZ??TII7_%AXsT$B z=e)Bx#v%J0j``00Zk5hsvv6%T^*xGNx%KN-=pocSoqE5_R)OK%-Pbu^1MNzfds)mL zxz^F4lDKV9D&lEY;I+A)ui{TznB*CE$=9(wgE{m}`^<--OzV-5V4X2w9j(_!+jpTr zJvD*y6;39&T+==$F&tsRKM_lqa1HC}aGL0o`%c9mO=fts?36@8MGm7Vi{Y z^<7m$(EtdSr#22<(rm_(l_(`j!*Pu~Y>>xc>I9M#DJYDJNHO&4=HM%YLIp?;iR&$m z#_$ZWYLfGLt5FJZhr3jpYb`*%9S!zCG6ivNHYzNHcI%khtgHBliM^Ou}ZVD7ehU9 zS+W@AV=?Ro!=%AJ>Kcy9aU3%VX3|XM_K0A+ZaknKDyIS3S-Hw1C7&BSW5)sqj5Ye_ z4OSW7Yu-;bCyYKHFUk}<*<(@TH?YZPHr~~Iy%9@GR2Yd}J2!N9K&CN7Eq{Ka!jdu; zQNB*Y;i(7)OxZK%IHGt#Rt?z`I|A{q_BmoF!f^G}XVeTbe1Wnzh%1g>j}>DqFf;Rp zz7>xIs12@Ke0gr+4-!pmFP84vCIaTjqFNg{V`5}Rdt~xE^I;Bxp4)|cs8=f)1YwHz zqI`G~s2~qqDV+h02b`PQpUE#^^Aq8l%y2|ByQeXSADg5*qMprEAE3WFg0Q39`O+i1 z!J@iV!`Y~C$wJ!5Z+j5$i<1`+@)tBG$JL=!*uk=2k;T<@{|s1$YL079FvK%mPhyHV zP8^KGZnp`(hVMZ;s=n~3r2y;LTwcJwoBW-(ndU-$03{RD zh+Qn$ja_Z^OuMf3Ub|JTY74s&Am*(n{J3~@#OJNYuEVVJd9*H%)oFoRBkySGm`hx! zT3tG|+aAkXcx-2Apy)h^BkOyFTWQVeZ%e2@;*0DtlG9I3Et=PKaPt&K zw?WI7S;P)TWED7aSH$3hL@Qde?H#tzo^<(o_sv_2ci<7M?F$|oCFWc?7@KBj-;N$P zB;q!8@bW-WJY9do&y|6~mEruZAVe$!?{)N9rZZxD-|oltkhW9~nR8bLBGXw<632!l z*TYQn^NnUy%Ds}$f^=yQ+BM-a5X4^GHF=%PDrRfm_uqC zh{sKwIu|O0&jWb27;wzg4w5uA@TO_j(1X?8E>5Zfma|Ly7Bklq|s z9)H`zoAGY3n-+&JPrT!>u^qg9Evx4y@GI4$n-Uk_5wttU1_t?6><>}cZ-U+&+~JE) zPlDbO_j;MoxdLzMd~Ew|1o^a5q_1R*JZ=#XXMzg?6Zy!^hop}qoLQlJ{(%!KYt`MK z8umEN@Z4w!2=q_oe=;QttPCQy3Nm4F@x>@v4sz_jo{4m*0r%J(w1cSo;D_hQtJs7W z><$QrmG^+<$4{d2bgGo&3-FV}avg9zI|Rr(k{wTyl3!M1q+a zD9W{pCd%il*j&Ft z5H$nENf>>k$;SONGW`qo6`&qKs*T z2^RS)pXk9b@(_Fw1bkb)-oqK|v}r$L!W&aXA>IpcdNZ_vWE#XO8X`#Yp1+?RshVcd zknG%rPd*4ECEI0wD#@d+3NbHKxl}n^Sgkx==Iu%}HvNliOqVBqG?P2va zQ;kRJ$J6j;+wP9cS za#m;#GUT!qAV%+rdWolk+)6kkz4@Yh5LXP+LSvo9_T+MmiaP-eq6_k;)i6_@WSJ zlT@wK$zqHu<83U2V*yJ|XJU4farT#pAA&@qu)(PO^8PxEmPD4;Txpio+2)#!9 z>&=i7*#tc0`?!==vk>s7V+PL#S1;PwSY?NIXN2=Gu89x(cToFm))7L;< z+bhAbVD*bD=}iU`+PU+SBobTQ%S!=VL!>q$rfWsaaV}Smz>lO9JXT#`CcH_mRCSf4%YQAw`$^yY z3Y*^Nzk_g$xn7a_NO(2Eb*I=^;4f!Ra#Oo~LLjlcjke*k*o$~U#0ZXOQ5@HQ&T46l z7504MUgZkz2gNP1QFN8Y?nSEnEai^Rgyvl}xZfMUV6QrJcXp;jKGqB=D*tj{8(_pV zqyB*DK$2lgYGejmJUW)*s_Cv65sFf&pb(Yz8oWgDtQ0~k^0-wdF|tj}MOXaN@ydF8 zNr={U?=;&Z?wr^VC+`)S2xl}QFagy;$mG=TUs7Vi2wws5zEke4hTa2)>O0U?$WYsZ z<8bN2bB_N4AWd%+kncgknZ&}bM~eDtj#C5uRkp21hWW5gxWvc6b*4+dn<{c?w9Rmf zIVZKsPl{W2vQAlYO3yh}-{Os=YBnL8?uN5(RqfQ=-1cOiUnJu>KcLA*tQK3FU`_bM zM^T28w;nAj5EdAXFi&Kk1Nnl2)D!M{@+D-}bIEe+Lc4{s;YJc-{F#``iS2uk;2!Zp zF9#myUmO!wCeJIoi^A+T^e~20c+c2C}XltaR!|U-HfDA=^xF97ev}$l6#oY z&-&T{egB)&aV$3_aVA51XGiU07$s9vubh_kQG?F$FycvS6|IO!6q zq^>9|3U^*!X_C~SxX&pqUkUjz%!j=VlXDo$!2VLH!rKj@61mDpSr~7B2yy{>X~_nc zRI+7g2V&k zd**H++P9dg!-AOs3;GM`(g<+GRV$+&DdMVpUxY9I1@uK28$az=6oaa+PutlO9?6#? zf-OsgT>^@8KK>ggkUQRPPgC7zjKFR5spqQb3ojCHzj^(UH~v+!y*`Smv)VpVoPwa6 zWG18WJaPKMi*F6Zdk*kU^`i~NNTfn3BkJniC`yN98L-Awd)Z&mY? zprBW$!qL-OL7h@O#kvYnLsfff@kDIegt~?{-*5A7JrA;#TmTe?jICJqhub-G@e??D zqiV#g{)M!kW1-4SDel7TO{;@*h2=_76g3NUD@|c*WO#>MfYq6_YVUP+&8e4|%4T`w zXzhmVNziAHazWO2qXcaOu@R1MrPP{t)`N)}-1&~mq=ZH=w=;-E$IOk=y$dOls{6sRR`I5>|X zpq~XYW4sd;J^6OwOf**J>a7u$S>WTFPRkjY;BfVgQst)u4aMLR1|6%)CB^18XCz+r ztkYQ}G43j~Q&1em(_EkMv0|WEiKu;z2zhb(L%$F&xWwzOmk;VLBYAZ8lOCziNoPw1 zv2BOyXA`A8z^WH!nXhKXM`t0;6D*-uGds3TYGrm8SPnJJOQ^fJU#}@aIy@MYWz**H zvkp?7I5PE{$$|~{-ZaFxr6ZolP^nL##mHOErB^AqJqn^hFA=)HWj!m3WDaHW$C)i^ z9@6G$SzB=>jbe>4kqr#sF7#K}W*Cg-5y6kun3u&0L7BpXF9=#7IN8FOjWrWwUBZiU zT_se3ih-GBKx+Uw0N|CwP3D@-C=5(9T#BH@M`F2!Goiqx+Js5xC92|Sy0%WWWp={$(am!#l~f^W_oz78HX<0X#7 zp)p1u~M*o9W@O8P{0Qkg@Wa# z2{Heb&oX^CQSZWSFBXKOfE|tsAm#^U-WkDnU;IowZ`Ok4!mwHwH=s|AqZ^YD4!5!@ zPxJj+Bd-q6w_YG`z_+r;S86zwXb+EO&qogOq8h-Ect5(M2+>(O7n7)^dP*ws_3U6v zVsh)sk^@*c>)3EML|0<-YROho{lz@Nd4;R9gL{9|64xVL`n!m$-Jjrx?-Bacp!=^5 z1^T^eB{_)Y<9)y{-4Rz@9_>;_7h;5D+@QcbF4Wv7hu)s0&==&6u)33 zHRj+&Woq-vDvjwJCYES@$C4{$?f$Ibi4G()UeN11rgjF+^;YE^5nYprYoJNoudNj= zm1pXSeG64dcWHObUetodRn1Fw|1nI$D9z}dVEYT0lQnsf_E1x2vBLql7NrHH!n&Sq z6lc*mvU=WS6=v9Lrl}&zRiu_6u;6g%_DU{9b+R z#YHqX7`m9eydf?KlKu6Sb%j$%_jmydig`B*TN`cZL-g!R)iE?+Q5oOqBFKhx z%MW>BC^(F_JuG(ayE(MT{S3eI{cKiwOtPwLc0XO*{*|(JOx;uQOfq@lp_^cZo=FZj z4#}@e@dJ>Bn%2`2_WPeSN7si^{U#H=7N4o%Dq3NdGybrZgEU$oSm$hC)uNDC_M9xc zGzwh5Sg?mpBIE8lT2XsqTt3j3?We8}3bzLBTQd639vyg^$0#1epq8snlDJP2(BF)K zSx30RM+{f+b$g{9usIL8H!hCO117Xgv}ttPJm9wVRjPk;ePH@zxv%j9k5`TzdXLeT zFgFX`V7cYIcBls5WN0Pf6SMBN+;CrQ(|EsFd*xtwr#$R{Z9FP`OWtyNsq#mCgZ7+P z^Yn$haBJ)r96{ZJd8vlMl?IBxrgh=fdq_NF!1{jARCVz>jNdC)H^wfy?R94#MPdUjcYX>#wEx+LB#P-#4S-%YH>t-j+w zOFTI8gX$ard6fAh&g=u&56%3^-6E2tpk*wx3HSCQ+t7+*iOs zPk5ysqE}i*cQocFvA68xHfL|iX(C4h*67@3|5Qwle(8wT&!&{8*{f%0(5gH+m>$tq zp;AqrP7?XTEooYG1Dzfxc>W%*CyL16q|fQ0_jp%%Bk^k!i#Nbi(N9&T>#M{gez_Ws zYK=l}adalV(nH}I_!hNeb;tQFk3BHX7N}}R8%pek^E`X}%ou=cx8InPU1EE0|Hen- zyw8MoJqB5=)Z%JXlrdTXAE)eqLAdVE-=>wGHrkRet}>3Yu^lt$Kzu%$3#(ioY}@Gu zjk3BZuQH&~7H+C*uX^4}F*|P89JX;Hg2U!pt>rDi(n(Qe-c}tzb0#6_ItoR0->LSt zR~UT<-|@TO%O`M+_e_J4wx7^)5_%%u+J=yF_S#2Xd?C;Ss3N7KY^#-vx+|;bJX&8r zD?|MetfhdC;^2WG`7MCgs>TKKN=^=!x&Q~BzmQio_^l~LboTNT=I zC5pme^P@ER``p$2md9>4!K#vV-Fc1an7pl>_|&>aqP}+zqR?+~Z;f2^`a+-!Te%V? z;H2SbF>jP^GE(R1@%C==XQ@J=G9lKX+Z<@5}PO(EYkJh=GCv#)Nj{DkWJM2}F&oAZ6xu8&g7pn1ps2U5srwQ7CAK zN&*~@t{`31lUf`O;2w^)M3B@o)_mbRu{-`PrfNpF!R^q>yTR&ETS7^-b2*{-tZAZz zw@q5x9B5V8Qd7dZ!Ai$9hk%Q!wqbE1F1c96&zwBBaRW}(^axoPpN^4Aw}&a5dMe+*Gomky_l^54*rzXro$ z>LL)U5Ry>~FJi=*{JDc)_**c)-&faPz`6v`YU3HQa}pLtb5K)u%K+BOqXP0)rj5Au$zB zW1?vr?mDv7Fsxtsr+S6ucp2l#(4dnr9sD*v+@*>g#M4b|U?~s93>Pg{{a5|rm2xfI z`>E}?9S@|IoUX{Q1zjm5YJT|3S>&09D}|2~BiMo=z4YEjXlWh)V&qs;*C{`UMxp$9 zX)QB?G$fPD6z5_pNs>Jeh{^&U^)Wbr?2D6-q?)`*1k@!UvwQgl8eG$r+)NnFoT)L6 zg7lEh+E6J17krfYJCSjWzm67hEth24pomhz71|Qodn#oAILN)*Vwu2qpJirG)4Wnv}9GWOFrQg%Je+gNrPl8mw7ykE8{ z=|B4+uwC&bpp%eFcRU6{mxRV32VeH8XxX>v$du<$(DfinaaWxP<+Y97Z#n#U~V zVEu-GoPD=9$}P;xv+S~Ob#mmi$JQmE;Iz4(){y*9pFyW-jjgdk#oG$fl4o9E8bo|L zWjo4l%n51@Kz-n%zeSCD`uB?T%FVk+KBI}=ve zvlcS#wt`U6wrJo}6I6Rwb=1GzZfwE=I&Ne@p7*pH84XShXYJRgvK)UjQL%R9Zbm(m zxzTQsLTON$WO7vM)*vl%Pc0JH7WhP;$z@j=y#avW4X8iqy6mEYr@-}PW?H)xfP6fQ z&tI$F{NNct4rRMSHhaelo<5kTYq+(?pY)Ieh8*sa83EQfMrFupMM@nfEV@EmdHUv9 z35uzIrIuo4#WnF^_jcpC@uNNaYTQ~uZWOE6P@LFT^1@$o&q+9Qr8YR+ObBkpP9=F+$s5+B!mX2~T zAuQ6RenX?O{IlLMl1%)OK{S7oL}X%;!XUxU~xJN8xk z`xywS*naF(J#?vOpB(K=o~lE;m$zhgPWDB@=p#dQIW>xe_p1OLoWInJRKbEuoncf; zmS1!u-ycc1qWnDg5Nk2D)BY%jmOwCLC+Ny>`f&UxFowIsHnOXfR^S;&F(KXd{ODlm z$6#1ccqt-HIH9)|@fHnrKudu!6B$_R{fbCIkSIb#aUN|3RM>zuO>dpMbROZ`^hvS@ z$FU-;e4W}!ubzKrU@R*dW*($tFZ>}dd*4_mv)#O>X{U@zSzQt*83l9mI zI$8O<5AIDx`wo0}f2fsPC_l>ONx_`E7kdXu{YIZbp1$(^oBAH({T~&oQ&1{X951QW zmhHUxd)t%GQ9#ak5fTjk-cahWC;>^Rg7(`TVlvy0W@Y!Jc%QL3Ozu# zDPIqBCy&T2PWBj+d-JA-pxZlM=9ja2ce|3B(^VCF+a*MMp`(rH>Rt6W1$;r{n1(VK zLs>UtkT43LR2G$AOYHVailiqk7naz2yZGLo*xQs!T9VN5Q>eE(w zw$4&)&6xIV$IO^>1N-jrEUg>O8G4^@y+-hQv6@OmF@gy^nL_n1P1-Rtyy$Bl;|VcV zF=p*&41-qI5gG9UhKmmnjs932!6hceXa#-qfK;3d*a{)BrwNFeKU|ge?N!;zk+kB! zMD_uHJR#%b54c2tr~uGPLTRLg$`fupo}cRJeTwK;~}A>(Acy4k-Xk&Aa1&eWYS1ULWUj@fhBiWY$pdfy+F z@G{OG{*v*mYtH3OdUjwEr6%_ZPZ3P{@rfbNPQG!BZ7lRyC^xlMpWH`@YRar`tr}d> z#wz87t?#2FsH-jM6m{U=gp6WPrZ%*w0bFm(T#7m#v^;f%Z!kCeB5oiF`W33W5Srdt zdU?YeOdPG@98H7NpI{(uN{FJdu14r(URPH^F6tOpXuhU7T9a{3G3_#Ldfx_nT(Hec zo<1dyhsVsTw;ZkVcJ_0-h-T3G1W@q)_Q30LNv)W?FbMH+XJ* zy=$@39Op|kZv`Rt>X`zg&at(?PO^I=X8d9&myFEx#S`dYTg1W+iE?vt#b47QwoHI9 zNP+|3WjtXo{u}VG(lLUaW0&@yD|O?4TS4dfJI`HC-^q;M(b3r2;7|FONXphw-%7~* z&;2!X17|05+kZOpQ3~3!Nb>O94b&ZSs%p)TK)n3m=4eiblVtSx@KNFgBY_xV6ts;NF;GcGxMP8OKV^h6LmSb2E#Qnw ze!6Mnz7>lE9u{AgQ~8u2zM8CYD5US8dMDX-5iMlgpE9m*s+Lh~A#P1er*rF}GHV3h z=`STo?kIXw8I<`W0^*@mB1$}pj60R{aJ7>C2m=oghKyxMbFNq#EVLgP0cH3q7H z%0?L93-z6|+jiN|@v>ix?tRBU(v-4RV`}cQH*fp|)vd3)8i9hJ3hkuh^8dz{F5-~_ zUUr1T3cP%cCaTooM8dj|4*M=e6flH0&8ve32Q)0dyisl))XkZ7Wg~N}6y`+Qi2l+e zUd#F!nJp{#KIjbQdI`%oZ`?h=5G^kZ_uN`<(`3;a!~EMsWV|j-o>c?x#;zR2ktiB! z);5rrHl?GPtr6-o!tYd|uK;Vbsp4P{v_4??=^a>>U4_aUXPWQ$FPLE4PK$T^3Gkf$ zHo&9$U&G`d(Os6xt1r?sg14n)G8HNyWa^q8#nf0lbr4A-Fi;q6t-`pAx1T*$eKM*$ z|CX|gDrk#&1}>5H+`EjV$9Bm)Njw&7-ZR{1!CJTaXuP!$Pcg69`{w5BRHysB$(tWUes@@6aM69kb|Lx$%BRY^-o6bjH#0!7b;5~{6J+jKxU!Kmi# zndh@+?}WKSRY2gZ?Q`{(Uj|kb1%VWmRryOH0T)f3cKtG4oIF=F7RaRnH0Rc_&372={_3lRNsr95%ZO{IX{p@YJ^EI%+gvvKes5cY+PE@unghjdY5#9A!G z70u6}?zmd?v+{`vCu-53_v5@z)X{oPC@P)iA3jK$`r zSA2a7&!^zmUiZ82R2=1cumBQwOJUPz5Ay`RLfY(EiwKkrx%@YN^^XuET;tE zmr-6~I7j!R!KrHu5CWGSChO6deaLWa*9LLJbcAJsFd%Dy>a!>J`N)Z&oiU4OEP-!Ti^_!p}O?7`}i7Lsf$-gBkuY*`Zb z7=!nTT;5z$_5$=J=Ko+Cp|Q0J=%oFr>hBgnL3!tvFoLNhf#D0O=X^h+x08iB;@8pXdRHxX}6R4k@i6%vmsQwu^5z zk1ip`#^N)^#Lg#HOW3sPI33xqFB4#bOPVnY%d6prwxf;Y-w9{ky4{O6&94Ra8VN@K zb-lY;&`HtxW@sF!doT5T$2&lIvJpbKGMuDAFM#!QPXW87>}=Q4J3JeXlwHys?!1^#37q_k?N@+u&Ns20pEoBeZC*np;i;M{2C0Z4_br2gsh6eL z#8`#sn41+$iD?^GL%5?cbRcaa-Nx0vE(D=*WY%rXy3B%gNz0l?#noGJGP728RMY#q z=2&aJf@DcR?QbMmN)ItUe+VM_U!ryqA@1VVt$^*xYt~-qvW!J4Tp<-3>jT=7Zow5M z8mSKp0v4b%a8bxFr>3MwZHSWD73D@+$5?nZAqGM#>H@`)mIeC#->B)P8T$zh-Pxnc z8)~Zx?TWF4(YfKuF3WN_ckpCe5;x4V4AA3(i$pm|78{%!q?|~*eH0f=?j6i)n~Hso zmTo>vqEtB)`%hP55INf7HM@taH)v`Fw40Ayc*R!T?O{ziUpYmP)AH`euTK!zg9*6Z z!>M=$3pd0!&TzU=hc_@@^Yd3eUQpX4-33}b{?~5t5lgW=ldJ@dUAH%`l5US1y_`40 zs(X`Qk}vvMDYYq+@Rm+~IyCX;iD~pMgq^KY)T*aBz@DYEB={PxA>)mI6tM*sx-DmGQHEaHwRrAmNjO!ZLHO4b;;5mf@zzlPhkP($JeZGE7 z?^XN}Gf_feGoG~BjUgVa*)O`>lX=$BSR2)uD<9 z>o^|nb1^oVDhQbfW>>!;8-7<}nL6L^V*4pB=>wwW+RXAeRvKED(n1;R`A6v$6gy0I(;Vf?!4;&sgn7F%LpM}6PQ?0%2Z@b{It<(G1CZ|>913E0nR2r^Pa*Bp z@tFGi*CQ~@Yc-?{cwu1 zsilf=k^+Qs>&WZG(3WDixisHpR>`+ihiRwkL(3T|=xsoNP*@XX3BU8hr57l3k;pni zI``=3Nl4xh4oDj<%>Q1zYXHr%Xg_xrK3Nq?vKX3|^Hb(Bj+lONTz>4yhU-UdXt2>j z<>S4NB&!iE+ao{0Tx^N*^|EZU;0kJkx@zh}S^P{ieQjGl468CbC`SWnwLRYYiStXm zOxt~Rb3D{dz=nHMcY)#r^kF8|q8KZHVb9FCX2m^X*(|L9FZg!5a7((!J8%MjT$#Fs)M1Pb zq6hBGp%O1A+&%2>l0mpaIzbo&jc^!oN^3zxap3V2dNj3x<=TwZ&0eKX5PIso9j1;e zwUg+C&}FJ`k(M|%%}p=6RPUq4sT3-Y;k-<68ciZ~_j|bt>&9ZLHNVrp#+pk}XvM{8 z`?k}o-!if>hVlCP9j%&WI2V`5SW)BCeR5>MQhF)po=p~AYN%cNa_BbV6EEh_kk^@a zD>4&>uCGCUmyA-c)%DIcF4R6!>?6T~Mj_m{Hpq`*(wj>foHL;;%;?(((YOxGt)Bhx zuS+K{{CUsaC++%}S6~CJ=|vr(iIs-je)e9uJEU8ZJAz)w166q)R^2XI?@E2vUQ!R% zn@dxS!JcOimXkWJBz8Y?2JKQr>`~SmE2F2SL38$SyR1^yqj8_mkBp)o$@+3BQ~Mid z9U$XVqxX3P=XCKj0*W>}L0~Em`(vG<>srF8+*kPrw z20{z(=^w+ybdGe~Oo_i|hYJ@kZl*(9sHw#Chi&OIc?w`nBODp?ia$uF%Hs(X>xm?j zqZQ`Ybf@g#wli`!-al~3GWiE$K+LCe=Ndi!#CVjzUZ z!sD2O*;d28zkl))m)YN7HDi^z5IuNo3^w(zy8 zszJG#mp#Cj)Q@E@r-=NP2FVxxEAeOI2e=|KshybNB6HgE^(r>HD{*}S}mO>LuRGJT{*tfTzw_#+er-0${}%YPe@CMJ1Ng#j#)i)SnY@ss3gL;g zg2D~#Kpdfu#G;q1qz_TwSz1VJT(b3zby$Vk&;Y#1(A)|xj`_?i5YQ;TR%jice5E;0 zYHg;`zS5{S*9xI6o^j>rE8Ua*XhIw{_-*&@(R|C(am8__>+Ws&Q^ymy*X4~hR2b5r zm^p3sw}yv=tdyncy_Ui7{BQS732et~Z_@{-IhHDXAV`(Wlay<#hb>%H%WDi+K$862nA@BDtM#UCKMu+kM`!JHyWSi?&)A7_ z3{cyNG%a~nnH_!+;g&JxEMAmh-Z}rC!o7>OVzW&PoMyTA_g{hqXG)SLraA^OP**<7 zjWbr7z!o2n3hnx7A=2O=WL;`@9N{vQIM@&|G-ljrPvIuJHYtss0Er0fT5cMXNUf1B z7FAwBDixt0X7C3S)mPe5g`YtME23wAnbU)+AtV}z+e8G;0BP=bI;?(#|Ep!vVfDbK zvx+|CKF>yt0hWQ3drchU#XBU+HiuG*V^snFAPUp-5<#R&BUAzoB!aZ+e*KIxa26V}s6?nBK(U-7REa573wg-jqCg>H8~>O{ z*C0JL-?X-k_y%hpUFL?I>0WV{oV`Nb)nZbJG01R~AG>flIJf)3O*oB2i8~;!P?Wo_ z0|QEB*fifiL6E6%>tlAYHm2cjTFE@*<);#>689Z6S#BySQ@VTMhf9vYQyLeDg1*F} zjq>i1*x>5|CGKN{l9br3kB0EHY|k4{%^t7-uhjd#NVipUZa=EUuE5kS1_~qYX?>hJ z$}!jc9$O$>J&wnu0SgfYods^z?J4X;X7c77Me0kS-dO_VUQ39T(Kv(Y#s}Qqz-0AH z^?WRL(4RzpkD+T5FG_0NyPq-a-B7A5LHOCqwObRJi&oRi(<;OuIN7SV5PeHU$<@Zh zPozEV`dYmu0Z&Tqd>t>8JVde9#Pt+l95iHe$4Xwfy1AhI zDM4XJ;bBTTvRFtW>E+GzkN)9k!hA5z;xUOL2 zq4}zn-DP{qc^i|Y%rvi|^5k-*8;JZ~9a;>-+q_EOX+p1Wz;>i7c}M6Nv`^NY&{J-> z`(mzDJDM}QPu5i44**2Qbo(XzZ-ZDu%6vm8w@DUarqXj41VqP~ zs&4Y8F^Waik3y1fQo`bVUH;b=!^QrWb)3Gl=QVKr+6sxc=ygauUG|cm?|X=;Q)kQ8 zM(xrICifa2p``I7>g2R~?a{hmw@{!NS5`VhH8+;cV(F>B94M*S;5#O`YzZH1Z%yD? zZ61w(M`#aS-*~Fj;x|J!KM|^o;MI#Xkh0ULJcA?o4u~f%Z^16ViA27FxU5GM*rKq( z7cS~MrZ=f>_OWx8j#-Q3%!aEU2hVuTu(7`TQk-Bi6*!<}0WQi;_FpO;fhpL4`DcWp zGOw9vx0N~6#}lz(r+dxIGZM3ah-8qrqMmeRh%{z@dbUD2w15*_4P?I~UZr^anP}DB zU9CCrNiy9I3~d#&!$DX9e?A});BjBtQ7oGAyoI$8YQrkLBIH@2;lt4E^)|d6Jwj}z z&2_E}Y;H#6I4<10d_&P0{4|EUacwFHauvrjAnAm6yeR#}f}Rk27CN)vhgRqEyPMMS7zvunj2?`f;%?alsJ+-K+IzjJx>h8 zu~m_y$!J5RWAh|C<6+uiCNsOKu)E72M3xKK(a9Okw3e_*O&}7llNV!=P87VM2DkAk zci!YXS2&=P0}Hx|wwSc9JP%m8dMJA*q&VFB0yMI@5vWoAGraygwn){R+Cj6B1a2Px z5)u(K5{+;z2n*_XD!+Auv#LJEM)(~Hx{$Yb^ldQmcYF2zNH1V30*)CN_|1$v2|`LnFUT$%-tO0Eg|c5$BB~yDfzS zcOXJ$wpzVK0MfTjBJ0b$r#_OvAJ3WRt+YOLlJPYMx~qp>^$$$h#bc|`g0pF-Ao43? z>*A+8lx>}L{p(Tni2Vvk)dtzg$hUKjSjXRagj)$h#8=KV>5s)J4vGtRn5kP|AXIz! zPgbbVxW{2o4s-UM;c#We8P&mPN|DW7_uLF!a|^0S=wr6Esx9Z$2|c1?GaupU6$tb| zY_KU`(_29O_%k(;>^|6*pZURH3`@%EuKS;Ns z1lujmf;r{qAN&Q0&m{wJSZ8MeE7RM5+Sq;ul_ z`+ADrd_Um+G37js6tKsArNB}n{p*zTUxQr>3@wA;{EUbjNjlNd6$Mx zg0|MyU)v`sa~tEY5$en7^PkC=S<2@!nEdG6L=h(vT__0F=S8Y&eM=hal#7eM(o^Lu z2?^;05&|CNliYrq6gUv;|i!(W{0N)LWd*@{2q*u)}u*> z7MQgk6t9OqqXMln?zoMAJcc zMKaof_Up})q#DzdF?w^%tTI7STI^@8=Wk#enR*)&%8yje>+tKvUYbW8UAPg55xb70 zEn5&Ba~NmOJlgI#iS8W3-@N%>V!#z-ZRwfPO1)dQdQkaHsiqG|~we2ALqG7Ruup(DqSOft2RFg_X%3w?6VqvV1uzX_@F(diNVp z4{I|}35=11u$;?|JFBEE*gb;T`dy+8gWJ9~pNsecrO`t#V9jW-6mnfO@ff9od}b(3s4>p0i30gbGIv~1@a^F2kl7YO;DxmF3? zWi-RoXhzRJV0&XE@ACc?+@6?)LQ2XNm4KfalMtsc%4!Fn0rl zpHTrHwR>t>7W?t!Yc{*-^xN%9P0cs0kr=`?bQ5T*oOo&VRRu+1chM!qj%2I!@+1XF z4GWJ=7ix9;Wa@xoZ0RP`NCWw0*8247Y4jIZ>GEW7zuoCFXl6xIvz$ezsWgKdVMBH> z{o!A7f;R-@eK9Vj7R40xx)T<2$?F2E<>Jy3F;;=Yt}WE59J!1WN367 zA^6pu_zLoZIf*x031CcwotS{L8bJE(<_F%j_KJ2P_IusaZXwN$&^t716W{M6X2r_~ zaiMwdISX7Y&Qi&Uh0upS3TyEIXNDICQlT5fHXC`aji-c{U(J@qh-mWl-uMN|T&435 z5)a1dvB|oe%b2mefc=Vpm0C%IUYYh7HI*;3UdgNIz}R##(#{(_>82|zB0L*1i4B5j-xi9O4x10rs_J6*gdRBX=@VJ+==sWb&_Qc6tSOowM{BX@(zawtjl zdU!F4OYw2@Tk1L^%~JCwb|e#3CC>srRHQ*(N%!7$Mu_sKh@|*XtR>)BmWw!;8-mq7 zBBnbjwx8Kyv|hd*`5}84flTHR1Y@@uqjG`UG+jN_YK&RYTt7DVwfEDXDW4U+iO{>K zw1hr{_XE*S*K9TzzUlJH2rh^hUm2v7_XjwTuYap|>zeEDY$HOq3X4Tz^X}E9z)x4F zs+T?Ed+Hj<#jY-`Va~fT2C$=qFT-5q$@p9~0{G&eeL~tiIAHXA!f6C(rAlS^)&k<- zXU|ZVs}XQ>s5iONo~t!XXZgtaP$Iau;JT%h)>}v54yut~pykaNye4axEK#5@?TSsQ zE;Jvf9I$GVb|S`7$pG)4vgo9NXsKr?u=F!GnA%VS2z$@Z(!MR9?EPcAqi5ft)Iz6sNl`%kj+_H-X`R<>BFrBW=fSlD|{`D%@Rcbu2?%>t7i34k?Ujb)2@J-`j#4 zLK<69qcUuniIan-$A1+fR=?@+thwDIXtF1Tks@Br-xY zfB+zblrR(ke`U;6U~-;p1Kg8Lh6v~LjW@9l2P6s+?$2!ZRPX`(ZkRGe7~q(4&gEi<$ch`5kQ?*1=GSqkeV z{SA1EaW_A!t{@^UY2D^YO0(H@+kFVzZaAh0_`A`f(}G~EP~?B|%gtxu&g%^x{EYSz zk+T;_c@d;+n@$<>V%P=nk36?L!}?*=vK4>nJSm+1%a}9UlmTJTrfX4{Lb7smNQn@T zw9p2%(Zjl^bWGo1;DuMHN(djsEm)P8mEC2sL@KyPjwD@d%QnZ$ zMJ3cnn!_!iP{MzWk%PI&D?m?C(y2d|2VChluN^yHya(b`h>~GkI1y;}O_E57zOs!{ zt2C@M$^PR2U#(dZmA-sNreB@z-yb0Bf7j*yONhZG=onhx>t4)RB`r6&TP$n zgmN*)eCqvgriBO-abHQ8ECN0bw?z5Bxpx z=jF@?zFdVn?@gD5egM4o$m`}lV(CWrOKKq(sv*`mNcHcvw&Xryfw<{ch{O&qc#WCTXX6=#{MV@q#iHYba!OUY+MGeNTjP%Fj!WgM&`&RlI^=AWTOqy-o zHo9YFt!gQ*p7{Fl86>#-JLZo(b^O`LdFK~OsZBRR@6P?ad^Ujbqm_j^XycM4ZHFyg ziUbIFW#2tj`65~#2V!4z7DM8Z;fG0|APaQ{a2VNYpNotB7eZ5kp+tPDz&Lqs0j%Y4tA*URpcfi z_M(FD=fRGdqf430j}1z`O0I=;tLu81bwJXdYiN7_&a-?ly|-j*+=--XGvCq#32Gh(=|qj5F?kmihk{%M&$}udW5)DHK zF_>}5R8&&API}o0osZJRL3n~>76nUZ&L&iy^s>PMnNcYZ|9*1$v-bzbT3rpWsJ+y{ zPrg>5Zlery96Um?lc6L|)}&{992{_$J&=4%nRp9BAC6!IB=A&=tF>r8S*O-=!G(_( zwXbX_rGZgeiK*&n5E;f=k{ktyA1(;x_kiMEt0*gpp_4&(twlS2e5C?NoD{n>X2AT# zY@Zp?#!b1zNq96MQqeO*M1MMBin5v#RH52&Xd~DO6-BZLnA6xO1$sou(YJ1Dlc{WF zVa%2DyYm`V#81jP@70IJ;DX@y*iUt$MLm)ByAD$eUuji|5{ptFYq(q)mE(5bOpxjM z^Q`AHWq44SG3`_LxC9fwR)XRVIp=B%<(-lOC3jI#bb@dK(*vjom!=t|#<@dZql%>O z15y^{4tQoeW9Lu%G&V$90x6F)xN6y_oIn;!Q zs)8jT$;&;u%Y>=T3hg34A-+Y*na=|glcStr5D;&5*t5*DmD~x;zQAV5{}Ya`?RRGa zT*t9@$a~!co;pD^!J5bo?lDOWFx%)Y=-fJ+PDGc0>;=q=s?P4aHForSB+)v0WY2JH z?*`O;RHum6j%#LG)Vu#ciO#+jRC3!>T(9fr+XE7T2B7Z|0nR5jw@WG)kDDzTJ=o4~ zUpeyt7}_nd`t}j9BKqryOha{34erm)RmST)_9Aw)@ zHbiyg5n&E{_CQR@h<}34d7WM{s{%5wdty1l+KX8*?+-YkNK2Be*6&jc>@{Fd;Ps|| z26LqdI3#9le?;}risDq$K5G3yoqK}C^@-8z^wj%tdgw-6@F#Ju{Sg7+y)L?)U$ez> zoOaP$UFZ?y5BiFycir*pnaAaY+|%1%8&|(@VB)zweR%?IidwJyK5J!STzw&2RFx zZV@qeaCB01Hu#U9|1#=Msc8Pgz5P*4Lrp!Q+~(G!OiNR{qa7|r^H?FC6gVhkk3y7=uW#Sh;&>78bZ}aK*C#NH$9rX@M3f{nckYI+5QG?Aj1DM)@~z_ zw!UAD@gedTlePB*%4+55naJ8ak_;))#S;4ji!LOqY5VRI){GMwHR~}6t4g>5C_#U# ztYC!tjKjrKvRy=GAsJVK++~$|+s!w9z3H4G^mACv=EErXNSmH7qN}%PKcN|8%9=i)qS5+$L zu&ya~HW%RMVJi4T^pv?>mw*Gf<)-7gf#Qj|e#w2|v4#t!%Jk{&xlf;$_?jW*n!Pyx zkG$<18kiLOAUPuFfyu-EfWX%4jYnjBYc~~*9JEz6oa)_R|8wjZA|RNrAp%}14L7fW zi7A5Wym*K+V8pkqqO-X#3ft{0qs?KVt^)?kS>AicmeO&q+~J~ zp0YJ_P~_a8j= zsAs~G=8F=M{4GZL{|B__UorX@MRNQLn?*_gym4aW(~+i13knnk1P=khoC-ViMZk+x zLW(l}oAg1H`dU+Fv**;qw|ANDSRs>cGqL!Yw^`; zv;{E&8CNJcc)GHzTYM}f&NPw<6j{C3gaeelU#y!M)w-utYEHOCCJo|Vgp7K6C_$14 zqIrLUB0bsgz^D%V%fbo2f9#yb#CntTX?55Xy|Kps&Xek*4_r=KDZ z+`TQuv|$l}MWLzA5Ay6Cvsa^7xvwXpy?`w(6vx4XJ zWuf1bVSb#U8{xlY4+wlZ$9jjPk)X_;NFMqdgq>m&W=!KtP+6NL57`AMljW+es zzqjUjgz;V*kktJI?!NOg^s_)ph45>4UDA!Vo0hn>KZ+h-3=?Y3*R=#!fOX zP$Y~+14$f66ix?UWB_6r#fMcC^~X4R-<&OD1CSDNuX~y^YwJ>sW0j`T<2+3F9>cLo z#!j57$ll2K9(%$4>eA7(>FJX5e)pR5&EZK!IMQzOfik#FU*o*LGz~7u(8}XzIQRy- z!U7AlMTIe|DgQFmc%cHy_9^{o`eD%ja_L>ckU6$O4*U**o5uR7`FzqkU8k4gxtI=o z^P^oGFPm5jwZMI{;nH}$?p@uV8FT4r=|#GziKXK07bHJLtK}X%I0TON$uj(iJ`SY^ zc$b2CoxCQ>7LH@nxcdW&_C#fMYBtTxcg46dL{vf%EFCZ~eErMvZq&Z%Lhumnkn^4A zsx$ay(FnN7kYah}tZ@0?-0Niroa~13`?hVi6`ndno`G+E8;$<6^gsE-K3)TxyoJ4M zb6pj5=I8^FD5H@`^V#Qb2^0cx7wUz&cruA5g>6>qR5)O^t1(-qqP&1g=qvY#s&{bx zq8Hc%LsbK1*%n|Y=FfojpE;w~)G0-X4i*K3{o|J7`krhIOd*c*$y{WIKz2n2*EXEH zT{oml3Th5k*vkswuFXdGDlcLj15Nec5pFfZ*0?XHaF_lVuiB%Pv&p7z)%38}%$Gup zVTa~C8=cw%6BKn_|4E?bPNW4PT7}jZQLhDJhvf4z;~L)506IE0 zX!tWXX(QOQPRj-p80QG79t8T2^az4Zp2hOHziQlvT!|H)jv{Ixodabzv6lBj)6WRB z{)Kg@$~~(7$-az?lw$4@L%I&DI0Lo)PEJJziWP33a3azb?jyXt1v0N>2kxwA6b%l> zZqRpAo)Npi&loWbjFWtEV)783BbeIAhqyuc+~>i7aQ8shIXt)bjCWT6$~ro^>99G} z2XfmT0(|l!)XJb^E!#3z4oEGIsL(xd; zYX1`1I(cG|u#4R4T&C|m*9KB1`UzKvho5R@1eYtUL9B72{i(ir&ls8g!pD ztR|25xGaF!4z5M+U@@lQf(12?xGy`!|3E}7pI$k`jOIFjiDr{tqf0va&3pOn6Pu)% z@xtG2zjYuJXrV)DUrIF*y<1O1<$#54kZ#2;=X51J^F#0nZ0(;S$OZDt_U2bx{RZ=Q zMMdd$fH|!s{ zXq#l;{`xfV`gp&C>A`WrQU?d{!Ey5(1u*VLJt>i27aZ-^&2IIk=zP5p+{$q(K?2(b z8?9h)kvj9SF!Dr zoyF}?V|9;6abHxWk2cEvGs$-}Pg}D+ZzgkaN&$Snp%;5m%zh1E#?Wac-}x?BYlGN#U#Mek*}kek#I9XaHt?mz3*fDrRTQ#&#~xyeqJk1QJ~E$7qsw6 z?sV;|?*=-{M<1+hXoj?@-$y+(^BJ1H~wQ9G8C0#^aEAyhDduNX@haoa=PuPp zYsGv8UBfQaRHgBgLjmP^eh>fLMeh{8ic)?xz?#3kX-D#Z{;W#cd_`9OMFIaJg-=t`_3*!YDgtNQ2+QUEAJB9M{~AvT$H`E)IKmCR21H532+ata8_i_MR@ z2Xj<3w<`isF~Ah$W{|9;51ub*f4#9ziKrOR&jM{x7I_7()O@`F*5o$KtZ?fxU~g`t zUovNEVKYn$U~VX8eR)qb`7;D8pn*Pp$(otYTqL)5KH$lUS-jf}PGBjy$weoceAcPp z&5ZYB$r&P$MN{0H0AxCe4Qmd3T%M*5d4i%#!nmBCN-WU-4m4Tjxn-%j3HagwTxCZ9 z)j5vO-C7%s%D!&UfO>bi2oXiCw<-w{vVTK^rVbv#W=WjdADJy8$khnU!`ZWCIU`># zyjc^1W~pcu>@lDZ{zr6gv%)2X4n27~Ve+cQqcND%0?IFSP4sH#yIaXXYAq^z3|cg` z`I3$m%jra>e2W-=DiD@84T!cb%||k)nPmEE09NC%@PS_OLhkrX*U!cgD*;;&gIaA(DyVT4QD+q_xu z>r`tg{hiGY&DvD-)B*h+YEd+Zn)WylQl}<4>(_NlsKXCRV;a)Rcw!wtelM2_rWX`j zTh5A|i6=2BA(iMCnj_fob@*eA;V?oa4Z1kRBGaU07O70fb6-qmA$Hg$ps@^ka1=RO zTbE_2#)1bndC3VuK@e!Sftxq4=Uux}fDxXE#Q5_x=E1h>T5`DPHz zbH<_OjWx$wy7=%0!mo*qH*7N4tySm+R0~(rbus`7;+wGh;C0O%x~fEMkt!eV>U$`i z5>Q(o z=t$gPjgGh0&I7KY#k50V7DJRX<%^X z>6+ebc9efB3@eE2Tr){;?_w`vhgF>`-GDY(YkR{9RH(MiCnyRtd!LxXJ75z+?2 zGi@m^+2hKJ5sB1@Xi@s_@p_Kwbc<*LQ_`mr^Y%j}(sV_$`J(?_FWP)4NW*BIL~sR>t6 zM;qTJZ~GoY36&{h-Pf}L#y2UtR}>ZaI%A6VkU>vG4~}9^i$5WP2Tj?Cc}5oQxe2=q z8BeLa$hwCg_psjZyC2+?yX4*hJ58Wu^w9}}7X*+i5Rjqu5^@GzXiw#SUir1G1`jY% zOL=GE_ENYxhcyUrEt9XlMNP6kx6h&%6^u3@zB8KUCAa18T(R2J`%JjWZ z!{7cXaEW+Qu*iJPu+m>QqW}Lo$4Z+!I)0JNzZ&_M%=|B1yejFRM04bGAvu{=lNPd+ zJRI^DRQ(?FcVUD+bgEcAi@o(msqys9RTCG#)TjI!9~3-dc`>gW;HSJuQvH~d`MQs86R$|SKXHh zqS9Qy)u;T`>>a!$LuaE2keJV%;8g)tr&Nnc;EkvA-RanHXsy)D@XN0a>h}z2j81R; zsUNJf&g&rKpuD0WD@=dDrPHdBoK42WoBU|nMo17o(5^;M|dB4?|FsAGVrSyWcI`+FVw^vTVC`y}f(BwJl zrw3Sp151^9=}B})6@H*i4-dIN_o^br+BkcLa^H56|^2XsT0dESw2 zMX>(KqNl=x2K5=zIKg}2JpGAZu{I_IO}0$EQ5P{4zol**PCt3F4`GX}2@vr8#Y)~J zKb)gJeHcFnR@4SSh%b;c%J`l=W*40UPjF#q{<}ywv-=vHRFmDjv)NtmC zQx9qm)d%0zH&qG7AFa3VAU1S^(n8VFTC~Hb+HjYMjX8r#&_0MzlNR*mnLH5hi}`@{ zK$8qiDDvS_(L9_2vHgzEQ${DYSE;DqB!g*jhJghE&=LTnbgl&Xepo<*uRtV{2wDHN z)l;Kg$TA>Y|K8Lc&LjWGj<+bp4Hiye_@BfU(y#nF{fpR&|Ltbye?e^j0}8JC4#xi% zv29ZR%8%hk=3ZDvO-@1u8KmQ@6p%E|dlHuy#H1&MiC<*$YdLkHmR#F3ae;bKd;@*i z2_VfELG=B}JMLCO-6UQy^>RDE%K4b>c%9ki`f~Z2Qu8hO7C#t%Aeg8E%+}6P7Twtg z-)dj(w}_zFK&86KR@q9MHicUAucLVshUdmz_2@32(V`y3`&Kf8Q2I)+!n0mR=rrDU zXvv^$ho;yh*kNqJ#r1}b0|i|xRUF6;lhx$M*uG3SNLUTC@|htC z-=fsw^F%$qqz4%QdjBrS+ov}Qv!z00E+JWas>p?z@=t!WWU3K*?Z(0meTuTOC7OTx zU|kFLE0bLZ+WGcL$u4E}5dB0g`h|uwv3=H6f+{5z9oLv-=Q45+n~V4WwgO=CabjM% zBAN+RjM65(-}>Q2V#i1Na@a0`08g&y;W#@sBiX6Tpy8r}*+{RnyGUT`?XeHSqo#|J z^ww~c;ou|iyzpErDtlVU=`8N7JSu>4M z_pr9=tX0edVn9B}YFO2y(88j#S{w%E8vVOpAboK*27a7e4Ekjt0)hIX99*1oE;vex z7#%jhY=bPijA=Ce@9rRO(Vl_vnd00!^TAc<+wVvRM9{;hP*rqEL_(RzfK$er_^SN; z)1a8vo8~Dr5?;0X0J62Cusw$A*c^Sx1)dom`-)Pl7hsW4i(r*^Mw`z5K>!2ixB_mu z*Ddqjh}zceRFdmuX1akM1$3>G=#~|y?eYv(e-`Qy?bRHIq=fMaN~fB zUa6I8Rt=)jnplP>yuS+P&PxeWpJ#1$F`iqRl|jF$WL_aZFZl@kLo&d$VJtu&w?Q0O zzuXK>6gmygq(yXJy0C1SL}T8AplK|AGNUOhzlGeK_oo|haD@)5PxF}rV+5`-w{Aag zus45t=FU*{LguJ11Sr-28EZkq;!mJO7AQGih1L4rEyUmp>B!%X0YemsrV3QFvlgt* z5kwlPzaiJ+kZ^PMd-RRbl(Y?F*m`4*UIhIuf#8q>H_M=fM*L_Op-<_r zBZagV=4B|EW+KTja?srADTZXCd3Yv%^Chfpi)cg{ED${SI>InNpRj5!euKv?=Xn92 zsS&FH(*w`qLIy$doc>RE&A5R?u zzkl1sxX|{*fLpXvIW>9d<$ePROttn3oc6R!sN{&Y+>Jr@yeQN$sFR z;w6A<2-0%UA?c8Qf;sX7>>uKRBv3Ni)E9pI{uVzX|6Bb0U)`lhLE3hK58ivfRs1}d zNjlGK0hdq0qjV@q1qI%ZFMLgcpWSY~mB^LK)4GZ^h_@H+3?dAe_a~k*;9P_d7%NEFP6+ zgV(oGr*?W(ql?6SQ~`lUsjLb%MbfC4V$)1E0Y_b|OIYxz4?O|!kRb?BGrgiH5+(>s zoqM}v*;OBfg-D1l`M6T6{K`LG+0dJ1)!??G5g(2*vlNkm%Q(MPABT$r13q?|+kL4- zf)Mi5r$sn;u41aK(K#!m+goyd$c!KPl~-&-({j#D4^7hQkV3W|&>l_b!}!z?4($OA z5IrkfuT#F&S1(`?modY&I40%gtroig{YMvF{K{>5u^I51k8RriGd${z)=5k2tG zM|&Bp5kDTfb#vfuTTd?)a=>bX=lokw^y9+2LS?kwHQIWI~pYgy7 zb?A-RKVm_vM5!9?C%qYdfRAw& zAU7`up~%g=p@}pg#b7E)BFYx3g%(J36Nw(Dij!b>cMl@CSNbrW!DBDbTD4OXk!G4x zi}JBKc8HBYx$J~31PXH+4^x|UxK~(<@I;^3pWN$E=sYma@JP|8YL`L(zI6Y#c%Q{6 z*APf`DU$S4pr#_!60BH$FGViP14iJmbrzSrOkR;f3YZa{#E7Wpd@^4E-zH8EgPc-# zKWFPvh%WbqU_%ZEt`=Q?odKHc7@SUmY{GK`?40VuL~o)bS|is$Hn=<=KGHOsEC5tB zFb|q}gGlL97NUf$G$>^1b^3E18PZ~Pm9kX%*ftnolljiEt@2#F2R5ah$zbXd%V_Ev zyDd{1o_uuoBga$fB@Fw!V5F3jIr=a-ykqrK?WWZ#a(bglI_-8pq74RK*KfQ z0~Dzus7_l;pMJYf>Bk`)`S8gF!To-BdMnVw5M-pyu+aCiC5dwNH|6fgRsIKZcF&)g zr}1|?VOp}I3)IR@m1&HX1~#wsS!4iYqES zK}4J{Ei>;e3>LB#Oly>EZkW14^@YmpbgxCDi#0RgdM${&wxR+LiX}B+iRioOB0(pDKpVEI;ND?wNx>%e|m{RsqR_{(nmQ z3ZS}@t!p4a(BKx_-CYwrcyJ5u1TO9bcXti$8sy>xcLKqKCc#~UOZYD{llKTSFEjJ~ zyNWt>tLU}*>^`TvPxtP%F`ZJQw@W0^>x;!^@?k_)9#bF$j0)S3;mH-IR5y82l|%=F z2lR8zhP?XNP-ucZZ6A+o$xOyF!w;RaLHGh57GZ|TCXhJqY~GCh)aXEV$1O&$c}La1 zjuJxkY9SM4av^Hb;i7efiYaMwI%jGy`3NdY)+mcJhF(3XEiSlU3c|jMBi|;m-c?~T z+x0_@;SxcoY=(6xNgO$bBt~Pj8`-<1S|;Bsjrzw3@zSjt^JC3X3*$HI79i~!$RmTz zsblZsLYs7L$|=1CB$8qS!tXrWs!F@BVuh?kN(PvE5Av-*r^iYu+L^j^m9JG^#=m>@ z=1soa)H*w6KzoR$B8mBCXoU;f5^bVuwQ3~2LKg!yxomG1#XPmn(?YH@E~_ED+W6mxs%x{%Z<$pW`~ON1~2XjP5v(0{C{+6Dm$00tsd3w=f=ZENy zOgb-=f}|Hb*LQ$YdWg<(u7x3`PKF)B7ZfZ6;1FrNM63 z?O6tE%EiU@6%rVuwIQjvGtOofZBGZT1Sh(xLIYt9c4VI8`!=UJd2BfLjdRI#SbVAX ziT(f*RI^T!IL5Ac>ql7uduF#nuCRJ1)2bdvAyMxp-5^Ww5p#X{rb5)(X|fEhDHHW{ zw(Lfc$g;+Q`B0AiPGtmK%*aWfQQ$d!*U<|-@n2HZvCWSiw^I>#vh+LyC;aaVWGbmkENr z&kl*8o^_FW$T?rDYLO1Pyi%>@&kJKQoH2E0F`HjcN}Zlnx1ddoDA>G4Xu_jyp6vuT zPvC}pT&Owx+qB`zUeR|4G;OH(<<^_bzkjln0k40t`PQxc$7h(T8Ya~X+9gDc8Z9{Z z&y0RAU}#_kQGrM;__MK9vwIwK^aoqFhk~dK!ARf1zJqHMxF2?7-8|~yoO@_~Ed;_wvT%Vs{9RK$6uUQ|&@#6vyBsFK9eZW1Ft#D2)VpQRwpR(;x^ zdoTgMqfF9iBl%{`QDv7B0~8{8`8k`C4@cbZAXBu00v#kYl!#_Wug{)2PwD5cNp?K^ z9+|d-4z|gZ!L{57>!Ogfbzchm>J1)Y%?NThxIS8frAw@z>Zb9v%3_3~F@<=LG%r*U zaTov}{{^z~SeX!qgSYow`_5)ij*QtGp4lvF`aIGQ>@3ZTkDmsl#@^5*NGjOuu82}o zzLF~Q9SW+mP=>88%eSA1W4_W7-Q>rdq^?t=m6}^tDPaBRGFLg%ak93W!kOp#EO{6& zP%}Iff5HZQ9VW$~+9r=|Quj#z*=YwcnssS~9|ub2>v|u1JXP47vZ1&L1O%Z1DsOrDfSIMHU{VT>&>H=9}G3i@2rP+rx@eU@uE8rJNec zij~#FmuEBj03F1~ct@C@$>y)zB+tVyjV3*n`mtAhIM0$58vM9jOQC}JJOem|EpwqeMuYPxu3sv}oMS?S#o6GGK@8PN59)m&K4Dc&X% z(;XL_kKeYkafzS3Wn5DD>Yiw{LACy_#jY4op(>9q>>-*9@C0M+=b#bknAWZ37^(Ij zq>H%<@>o4a#6NydoF{_M4i4zB_KG)#PSye9bk0Ou8h%1Dtl7Q_y#7*n%g)?m>xF~( zjqvOwC;*qvN_3(*a+w2|ao0D?@okOvg8JskUw(l7n`0fncglavwKd?~l_ryKJ^Ky! zKCHkIC-o7%fFvPa$)YNh022lakMar^dgL=t#@XLyNHHw!b?%WlM)R@^!)I!smZL@k zBi=6wE5)2v&!UNV(&)oOYW(6Qa!nUjDKKBf-~Da=#^HE4(@mWk)LPvhyN3i4goB$3K8iV7uh zsv+a?#c4&NWeK(3AH;ETrMOIFgu{_@%XRwCZ;L=^8Ts)hix4Pf3yJRQ<8xb^CkdmC z?c_gB)XmRsk`9ch#tx4*hO=#qS7={~Vb4*tTf<5P%*-XMfUUYkI9T1cEF;ObfxxI-yNuA=I$dCtz3ey znVkctYD*`fUuZ(57+^B*R=Q}~{1z#2!ca?)+YsRQb+lt^LmEvZt_`=j^wqig+wz@n@ z`LIMQJT3bxMzuKg8EGBU+Q-6cs5(@5W?N>JpZL{$9VF)veF`L5%DSYTNQEypW%6$u zm_~}T{HeHj1bAlKl8ii92l9~$dm=UM21kLemA&b$;^!wB7#IKWGnF$TVq!!lBlG4 z{?Rjz?P(uvid+|i$VH?`-C&Gcb3{(~Vpg`w+O);Wk1|Mrjxrht0GfRUnZqz2MhrXa zqgVC9nemD5)H$to=~hp)c=l9?#~Z_7i~=U-`FZxb-|TR9@YCxx;Zjo-WpMNOn2)z) zFPGGVl%3N$f`gp$gPnWC+f4(rmts%fidpo^BJx72zAd7|*Xi{2VXmbOm)1`w^tm9% znM=0Fg4bDxH5PxPEm{P3#A(mxqlM7SIARP?|2&+c7qmU8kP&iApzL|F>Dz)Ixp_`O zP%xrP1M6@oYhgo$ZWwrAsYLa4 z|I;DAvJxno9HkQrhLPQk-8}=De{9U3U%)dJ$955?_AOms!9gia%)0E$Mp}$+0er@< zq7J&_SzvShM?e%V?_zUu{niL@gt5UFOjFJUJ}L?$f%eU%jUSoujr{^O=?=^{19`ON zlRIy8Uo_nqcPa6@yyz`CM?pMJ^^SN^Fqtt`GQ8Q#W4kE7`V9^LT}j#pMChl!j#g#J zr-=CCaV%xyFeQ9SK+mG(cTwW*)xa(eK;_Z(jy)woZp~> zA(4}-&VH+TEeLzPTqw&FOoK(ZjD~m{KW05fiGLe@E3Z2`rLukIDahE*`u!ubU)9`o zn^-lyht#E#-dt~S>}4y$-mSbR8{T@}22cn^refuQ08NjLOv?JiEWjyOnzk<^R5%gO zhUH_B{oz~u#IYwVnUg8?3P*#DqD8#X;%q%HY**=I>>-S|!X*-!x1{^l#OnR56O>iD zc;i;KS+t$koh)E3)w0OjWJl_aW2;xF=9D9Kr>)(5}4FqUbk# zI#$N8o0w;IChL49m9CJTzoC!|u{Ljd%ECgBOf$}&jA^$(V#P#~)`&g`H8E{uv52pp zwto`xUL-L&WTAVREEm$0g_gYPL(^vHq(*t1WCH_6alhkeW&GCZ3hL)|{O-jiFOBrF z!EW=Jej|dqQitT6!B-7&io2K)WIm~Q)v@yq%U|VpV+I?{y0@Yd%n8~-NuuM*pM~KA z85YB};IS~M(c<}4Hxx>qRK0cdl&e?t253N%vefkgds>Ubn8X}j6Vpgs>a#nFq$osY z1ZRwLqFv=+BTb=i%D2Wv>_yE0z}+niZ4?rE|*a3d7^kndWGwnFqt+iZ(7+aln<}jzbAQ(#Z2SS}3S$%Bd}^ zc9ghB%O)Z_mTZMRC&H#)I#fiLuIkGa^`4e~9oM5zKPx?zjkC&Xy0~r{;S?FS%c7w< zWbMpzc(xSw?9tGxG~_l}Acq}zjt5ClaB7-!vzqnlrX;}$#+PyQ9oU)_DfePh2E1<7 ztok6g6K^k^DuHR*iJ?jw?bs_whk|bx`dxu^nC6#e{1*m~z1eq7m}Cf$*^Eua(oi_I zAL+3opNhJteu&mWQ@kQWPucmiP)4|nFG`b2tpC;h{-PI@`+h?9v=9mn|0R-n8#t=+Z*FD(c5 zjj79Jxkgck*DV=wpFgRZuwr%}KTm+dx?RT@aUHJdaX-ODh~gByS?WGx&czAkvkg;x zrf92l8$Or_zOwJVwh>5rB`Q5_5}ef6DjS*$x30nZbuO3dijS*wvNEqTY5p1_A0gWr znH<(Qvb!os14|R)n2Ost>jS2;d1zyLHu`Svm|&dZD+PpP{Bh>U&`Md;gRl64q;>{8MJJM$?UNUd`aC>BiLe>*{ zJY15->yW+<3rLgYeTruFDtk1ovU<$(_y7#HgUq>)r0{^}Xbth}V#6?%5jeFYt;SG^ z3qF)=uWRU;Jj)Q}cpY8-H+l_n$2$6{ZR?&*IGr{>ek!69ZH0ZoJ*Ji+ezzlJ^%qL3 zO5a`6gwFw(moEzqxh=yJ9M1FTn!eo&qD#y5AZXErHs%22?A+JmS&GIolml!)rZTnUDM3YgzYfT#;OXn)`PWv3Ta z!-i|-Wojv*k&bC}_JJDjiAK(Ba|YZgUI{f}TdEOFT2+}nPmttytw7j%@bQZDV1vvj z^rp{gRkCDmYJHGrE1~e~AE!-&6B6`7UxVQuvRrfdFkGX8H~SNP_X4EodVd;lXd^>eV1jN+Tt4}Rsn)R0LxBz0c=NXU|pUe!MQQFkGBWbR3&(jLm z%RSLc#p}5_dO{GD=DEFr=Fc% z85CBF>*t!6ugI?soX(*JNxBp+-DdZ4X0LldiK}+WWGvXV(C(Ht|!3$psR=&c*HIM=BmX;pRIpz@Ale{9dhGe(U2|Giv;# zOc|;?p67J=Q(kamB*aus=|XP|m{jN^6@V*Bpm?ye56Njh#vyJqE=DweC;?Rv7faX~ zde03n^I~0B2vUmr;w^X37tVxUK?4}ifsSH5_kpKZIzpYu0;Kv}SBGfI2AKNp+VN#z`nI{UNDRbo-wqa4NEls zICRJpu)??cj^*WcZ^MAv+;bDbh~gpN$1Cor<{Y2oyIDws^JsfW^5AL$azE(T0p&pP z1Mv~6Q44R&RHoH95&OuGx2srIr<@zYJTOMKiVs;Bx3py89I87LOb@%mr`0)#;7_~Z zzcZj8?w=)>%5@HoCHE_&hnu(n_yQ-L(~VjpjjkbT7e)Dk5??fApg(d>vwLRJ-x{um z*Nt?DqTSxh_MIyogY!vf1mU1`Gld-&L)*43f6dilz`Q@HEz;+>MDDYv9u!s;WXeao zUq=TaL$P*IFgJzrGc>j1dDOd zed+=ZBo?w4mr$2)Ya}?vedDopomhW1`#P<%YOJ_j=WwClX0xJH-f@s?^tmzs_j7t!k zK@j^zS0Q|mM4tVP5Ram$VbS6|YDY&y?Q1r1joe9dj08#CM{RSMTU}(RCh`hp_Rkl- zGd|Cv~G@F{DLhCizAm9AN!^{rNs8hu!G@8RpnGx7e`-+K$ffN<0qjR zGq^$dj_Tv!n*?zOSyk5skI7JVKJ)3jysnjIu-@VSzQiP8r6MzudCU=~?v-U8yzo^7 zGf~SUTvEp+S*!X9uX!sq=o}lH;r{pzk~M*VA(uyQ`3C8!{C;)&6)95fv(cK!%Cuz$ z_Zal57H6kPN>25KNiI6z6F)jzEkh#%OqU#-__Xzy)KyH};81#N6OfX$$IXWzOn`Q& z4f$Z1t>)8&8PcYfEwY5UadU1yg+U*(1m2ZlHoC-!2?gB!!fLhmTl))D@dhvkx#+Yj z1O=LV{(T%{^IeCuFK>%QR!VZ4GnO5tK8a+thWE zg4VytZrwcS?7^ zuZfhYnB8dwd%VLO?DK7pV5Wi<(`~DYqOXn8#jUIL^)12*Dbhk4GmL_E2`WX&iT16o zk(t|hok(Y|v-wzn?4x34T)|+SfZP>fiq!><*%vnxGN~ypST-FtC+@TPv*vYv@iU!_ z@2gf|PrgQ?Ktf*9^CnJ(x*CtZVB8!OBfg0%!wL;Z8(tYYre0vcnPGlyCc$V(Ipl*P z_(J!a=o@vp^%Efme!K74(Ke7A>Y}|sxV+JL^aYa{~m%5#$$+R1? zGaQhZTTX!#s#=Xtpegqero$RNt&`4xn3g$)=y*;=N=Qai)}~`xtxI_N*#MMCIq#HFifT zz(-*m;pVH&+4bixL&Bbg)W5FN^bH87pAHp)zPkWNMfTFqS=l~AC$3FX3kQUSh_C?-ZftyClgM)o_D7cX$RGlEYblux0jv5 zTr|i-I3@ZPCGheCl~BGhImF)K4!9@?pC(gi3ozX=a!|r1)LFxy_8c&wY0<^{2cm|P zv6Y`QktY*;I)IUd5y3ne1CqpVanlY45z8hf4&$EUBnucDj16pDa4&GI&TArYhf*xh zdj>*%APH8(h~c>o@l#%T>R$e>rwVx_WUB|~V`p^JHsg*y12lzj&zF}w6W09HwB2yb z%Q~`es&(;7#*DUC_w-Dmt7|$*?TA_m;zB+-u{2;Bg{O}nV7G_@7~<)Bv8fH^G$XG8$(&{A zwXJK5LRK%M34(t$&NI~MHT{UQ9qN-V_yn|%PqC81EIiSzmMM=2zb`mIwiP_b)x+2M z7Gd`83h79j#SItpQ}luuf2uOU`my_rY5T{6P#BNlb%h%<#MZb=m@y5aW;#o1^2Z)SWo+b`y0gV^iRcZtz5!-05vF z7wNo=hc6h4hc&s@uL^jqRvD6thVYtbErDK9k!;+a0xoE0WL7zLixjn5;$fXvT=O3I zT6jI&^A7k6R{&5#lVjz#8%_RiAa2{di{`kx79K+j72$H(!ass|B%@l%KeeKchYLe_ z>!(JC2fxsv>XVen+Y42GeYPxMWqm`6F$(E<6^s|g(slNk!lL*6v^W2>f6hh^mE$s= z3D$)}{V5(Qm&A6bp%2Q}*GZ5Qrf}n7*Hr51?bJOyA-?B4vg6y_EX<*-e20h{=0Mxs zbuQGZ$fLyO5v$nQ&^kuH+mNq9O#MWSfThtH|0q1i!NrWj^S}_P;Q1OkYLW6U^?_7G zx2wg?CULj7))QU(n{$0JE%1t2dWrMi2g-Os{v|8^wK{@qlj%+1b^?NI z$}l2tjp0g>K3O+p%yK<9!XqmQ?E9>z&(|^Pi~aSRwI5x$jaA62GFz9%fmO3t3a>cq zK8Xbv=5Ps~4mKN5+Eqw12(!PEyedFXv~VLxMB~HwT1Vfo51pQ#D8e$e4pFZ{&RC2P z5gTIzl{3!&(tor^BwZfR8j4k{7Rq#`riKXP2O-Bh66#WWK2w=z;iD9GLl+3 zpHIaI4#lQ&S-xBK8PiQ%dwOh?%BO~DCo06pN7<^dnZCN@NzY{_Z1>rrB0U|nC&+!2 z2y!oBcTd2;@lzyk(B=TkyZ)zy0deK05*Q0zk+o$@nun`VI1Er7pjq>8V zNmlW{p7S^Btgb(TA}jL(uR>`0w8gHP^T~Sh5Tkip^spk4SBAhC{TZU}_Z)UJw-}zm zPq{KBm!k)?P{`-(9?LFt&YN4s%SIZ-9lJ!Ws~B%exHOeVFk3~}HewnnH(d)qkLQ_d z6h>O)pEE{vbOVw}E+jdYC^wM+AAhaI(YAibUc@B#_mDss0Ji&BK{WG`4 zOk>vSNq(Bq2IB@s>>Rxm6Wv?h;ZXkpb1l8u|+_qXWdC*jjcPCixq;!%BVPSp#hP zqo`%cNf&YoQXHC$D=D45RiT|5ngPlh?0T~?lUf*O)){K@*Kbh?3RW1j9-T?%lDk@y z4+~?wKI%Y!-=O|_IuKz|=)F;V7ps=5@g)RrE;;tvM$gUhG>jHcw2Hr@fS+k^Zr~>G z^JvPrZc}_&d_kEsqAEMTMJw!!CBw)u&ZVzmq+ZworuaE&TT>$pYsd9|g9O^0orAe8 z221?Va!l1|Y5X1Y?{G7rt1sX#qFA^?RLG^VjoxPf63;AS=_mVDfGJKg73L zsGdnTUD40y(>S##2l|W2Cy!H(@@5KBa(#gs`vlz}Y~$ot5VsqPQ{{YtjYFvIumZzt zA{CcxZLJR|4#{j7k~Tu*jkwz8QA|5G1$Cl895R`Zyp;irp1{KN){kB30O8P1W5;@bG znvX74roeMmQlUi=v9Y%(wl$ZC#9tKNFpvi3!C}f1m6Ct|l2g%psc{TJp)@yu)*e2> z((p0Fg*8gJ!|3WZke9;Z{8}&NRkv7iP=#_y-F}x^y?2m%-D_aj^)f04%mneyjo_;) z6qc_Zu$q37d~X``*eP~Q>I2gg%rrV8v=kDfpp$=%Vj}hF)^dsSWygoN(A$g*E=Do6FX?&(@F#7pbiJ`;c0c@Ul zDqW_90Wm#5f2L<(Lf3)3TeXtI7nhYwRm(F;*r_G6K@OPW4H(Y3O5SjUzBC}u3d|eQ8*8d@?;zUPE+i#QNMn=r(ap?2SH@vo*m z3HJ%XuG_S6;QbWy-l%qU;8x;>z>4pMW7>R}J%QLf%@1BY(4f_1iixd-6GlO7Vp*yU zp{VU^3?s?90i=!#>H`lxT!q8rk>W_$2~kbpz7eV{3wR|8E=8**5?qn8#n`*(bt1xRQrdGxyx2y%B$qmw#>ZV$c7%cO#%JM1lY$Y0q?Yuo> ze9KdJoiM)RH*SB%^;TAdX-zEjA7@%y=!0=Zg%iWK7jVI9b&Dk}0$Af&08KHo+ zOwDhFvA(E|ER%a^cdh@^wLUlmIv6?_3=BvX8jKk92L=Y}7Jf5OGMfh` zBdR1wFCi-i5@`9km{isRb0O%TX+f~)KNaEz{rXQa89`YIF;EN&gN)cigu6mNh>?Cm zAO&Im2flv6D{jwm+y<%WsPe4!89n~KN|7}Cb{Z;XweER73r}Qp2 zz}WP4j}U0&(uD&9yGy6`!+_v-S(yG*iytsTR#x_Rc>=6u^vnRDnf1gP{#2>`ffrAC% zTZ5WQ@hAK;P;>kX{D)mIXe4%a5p=LO1xXH@8T?mz7Q@d)$3pL{{B!2{-v70L*o1AO+|n5beiw~ zk@(>m?T3{2k2c;NWc^`4@P&Z?BjxXJ@;x1qhn)9Mn*IFdt_J-dIqx5#d`NfyfX~m( zIS~5)MfZ2Uy?_4W`47i}u0ZgPh<{D|w_d#;D}Q&U$Q-G}xM1A@1f{#%A$jh6Qp&0hQ<0bPOM z-{1Wm&p%%#eb_?x7i;bol EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/adc-da-sys/.mvn/wrapper/maven-wrapper.properties b/adc-da-sys/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..642d572c --- /dev/null +++ b/adc-da-sys/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/adc-da-sys/mvnw b/adc-da-sys/mvnw new file mode 100644 index 00000000..a16b5431 --- /dev/null +++ b/adc-da-sys/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/adc-da-sys/mvnw.cmd b/adc-da-sys/mvnw.cmd new file mode 100644 index 00000000..c8d43372 --- /dev/null +++ b/adc-da-sys/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/adc-da-sys/pom.xml b/adc-da-sys/pom.xml new file mode 100644 index 00000000..66956665 --- /dev/null +++ b/adc-da-sys/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + + com.adc + foton-slrs-system-rest + 3.0.0 + + + com.adc + adc-da-sys + 3.0.0 + adc-da-sys + laws system rest system config + + jar + + + 1.8 + + + + + org.springframework + spring-test + 5.2.8.RELEASE + compile + + + com.adc + adc-da-base + 3.0.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + diff --git a/adc-da-sys/src/main/java/com/adc/da/att/controller/AttFileEOController.java b/adc-da-sys/src/main/java/com/adc/da/att/controller/AttFileEOController.java new file mode 100644 index 00000000..e3de920f --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/att/controller/AttFileEOController.java @@ -0,0 +1,578 @@ +package com.adc.da.att.controller; + +import com.adc.da.att.entity.AttFileEO; +import com.adc.da.att.service.IAttFileEOService; +import com.adc.da.att.vo.AttFileVo; +import com.adc.da.file.store.IFileStore; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.util.MD5Util; +import com.adc.da.util.UUIDUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import sun.misc.BASE64Encoder; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotNull; +import java.io.*; +import java.net.URLEncoder; +import java.nio.file.Files; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@RestController +@RequestMapping("/${restPath}/att/attFile") +@Api(description = "|AttFileEO|文件上传") +public class AttFileEOController { + + private static final Logger logger = LoggerFactory.getLogger(AttFileEOController.class); + + @Autowired + private IAttFileEOService attFileEOService; + + @Autowired + private IFileStore iFileStore; + + @Value("${file.path}") + private String filePath;//文件存储路径 + +// @Autowired +// private RoleEOService roleEOService; +// +// @Autowired +// private UserEOService userEOService; + + @Value("${upload.file.white.lists}") + private String uploadFileWhiteLists; //上传文件白名单 + + + @ApiOperation(value="|File|上传文件") + @PostMapping(value="/upload",consumes="multipart/*",headers="content-type=multipart/form-data" ) + @CrossOrigin(origins = "*", maxAge = 3600) + // @RequiresPermissions("att:attFile:uploadFile") + public ResponseMessage uploadFile(@RequestParam("file") @ApiParam(value="上传文件",required=true) MultipartFile file) throws Exception{ + if(StringUtils.isNotEmpty(uploadFileWhiteLists)){ + String[] fileLists = uploadFileWhiteLists.split(","); + List arrList = Arrays.asList(fileLists); + String getFileName = file.getOriginalFilename(); + Pattern pReg = Pattern.compile("\\/|\\/|\\||:|\\?|\\%|\\*|\"|<|>|\\p{Cntrl}"); +// getFileName = getFileName.replaceAll(, "_"); + Matcher matcher = pReg.matcher(getFileName); + if (matcher.find()) { + return Result.error("文件上传失败,该文件名可能导致文件类型改变,请修改后重试"); + } + //截取文件后缀 + int pos = getFileName.lastIndexOf("."); + String str = getFileName.substring(pos+1).toLowerCase(); + if (arrList.contains(str)) { + AttFileVo fileInfo = attFileEOService.saveFileInfo(file); + if (fileInfo != null && fileInfo.getId() != null) { + String oriFileName = fileInfo.getOldFileName(); + if (StringUtils.isNotEmpty(oriFileName)) { + String standNumber = ""; + oriFileName = oriFileName.replaceAll("."+fileInfo.getFileSuffix(),""); + Pattern ptest = Pattern.compile("[A-Z]{1,}/{0,1}[A-Z]{1,}\\s{0,1}[0-9]\\d*\\.?\\d*"); + Pattern ptest2 = Pattern.compile("[A-Z]{1,}/{0,1}[A-Z]{1,}\\s{0,1}[0-9]\\d*\\.?\\d*-[0-9]{1,4}"); + Matcher matcher1 = ptest.matcher(oriFileName); + Matcher matcher2 = ptest2.matcher(oriFileName); + if (matcher2.find()) { + standNumber = matcher2.group(); + } else if (matcher1.find()) { + standNumber = matcher1.group(); + } + fileInfo.setStandNum(standNumber); + String standName = oriFileName.replace(standNumber,""); + fileInfo.setStandName(standName); + } + return Result.success("true", "上传成功", fileInfo); + } else { + return Result.error("文件上传失败"); + } + } else { + return Result.error("文件上传失败,不允许上传该类型文件"); + } + } else { + return Result.error("文件上传失败,不允许上传该类型文件"); + } + } + + @ApiOperation(value="|File|上传文件") + @PostMapping(value="/uploadFiles",consumes="multipart/*",headers="content-type=multipart/form-data" ) + @CrossOrigin(origins = "*", maxAge = 3600) + public ResponseMessage> uploadFile(@RequestParam("files") @ApiParam(value="上传文件",required=true) MultipartFile[] files) throws Exception{ + List fileInfoList= attFileEOService.saveFilesInfo(files); + return Result.success(fileInfoList); + } + + /** + * @Author yangxuenan + * @Description 下载文件 + * Date 2018/10/10 18:36 + * @Param [response, fileId] + * @return void + **/ + @ApiOperation(value = "|File|下载文件") + @GetMapping("/downloadFile") + // @RequiresPermissions("sys:file:download") + public void downloadFile(String fileId, HttpServletResponse response, HttpServletRequest request) throws Exception { + AttFileEO attFileEO = attFileEOService.getFileInfo(fileId); + InputStream is = null; + OutputStream os = null; + response.reset(); + try { + String fileOldName = fileNameEncoding(attFileEO.getOldFileName(),request); + response.setHeader("Content-Disposition", "attachment; filename=\""+ fileOldName +"\""); + response.setContentType("application/octet-stream"); + is = iFileStore.loadFile(attFileEO.getFilePath()+attFileEO.getFileName()); + os = response.getOutputStream(); + IOUtils.copy(is, os); + os.flush(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } finally { + IOUtils.closeQuietly(is); + IOUtils.closeQuietly(os); + } + } + + + @ApiOperation(value = "|File|手机下载文件") + @GetMapping("/downloadFileByPhone") + // @RequiresPermissions("sys:file:download") + public ResponseMessage downloadFileByPhone(@RequestParam("fileId")@NotNull String fileId,@RequestParam("sign")@NotNull String sign, HttpServletResponse response, HttpServletRequest request) throws Exception { + logger.info("手机下载文件调取到了----------------------"+fileId); + String key = "dufy20170329java"; + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH"); + String time = df.format(new Date()); + String signConvert = fileId + time + key; + String signEncrypt = MD5Util.string2MD5(signConvert); + + if(StringUtils.isEmpty(sign)){ + logger.info("非法请求"); + return Result.error("非法请求"); + }else { + if(!signEncrypt.equals(sign)){ + logger.info("非法请求"); + return Result.error("非法请求"); + } + } + + logger.info("手机下载验证已过----------------------"+sign); + AttFileEO attFileEO = attFileEOService.getFileInfo(fileId); + String filePathResult = ""; + try { + if (attFileEO != null) { + File oldFile = new File(filePath + attFileEO.getFilePath()+attFileEO.getFileName()); + String fileOldName = attFileEO.getOldFileName(); + String timeStr = String.valueOf(System.currentTimeMillis()); + String fileOutputPath = filePath + "/" + "phoneLoadFiles/" + timeStr; + File dir = new File(fileOutputPath); + if (!dir.exists()) { + dir.mkdirs(); + } + String newFilePath = fileOutputPath + "/" + fileOldName; + File newFile = new File(newFilePath); + if (!newFile.exists()) { + Files.copy(oldFile.toPath(), newFile.toPath()); + } + filePathResult = "uploadPath/phoneLoadFiles/" + timeStr + "/" + fileOldName; + return Result.success(filePathResult); + } else { + return Result.error("获取文件信息失败"); + } + } catch (IOException e){ + logger.error(e.getMessage(), e); + } + return Result.error("获取文件信息失败"); + /*InputStream is = null; + OutputStream os = null; + response.reset(); + try { + String fileOldName = fileNameEncoding(attFileEO.getOldFileName(),request); + response.setHeader("Content-Disposition", "attachment; filename=\""+ fileOldName +"\""); + response.setContentType("application/octet-stream"); + logger.info("请求头设置完毕"); + is = iFileStore.loadFile(attFileEO.getFilePath()+attFileEO.getFileName()); + logger.info("序列化流完毕"); + os = response.getOutputStream(); + IOUtils.copy(is, os); + logger.info("文件复制完毕"); + os.flush(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } finally { + IOUtils.closeQuietly(is); + IOUtils.closeQuietly(os); + }*/ + } + + + @ApiOperation(value = "|File|下载文件") + @GetMapping("/downloadFileForSar") + // @RequiresPermissions("sys:file:downloadFileForSar") + public void downloadFileForSar(String fileId, HttpServletResponse response, HttpServletRequest request) throws Exception { + AttFileEO attFileEO = attFileEOService.getFileInfo(fileId); + InputStream is = null; + OutputStream os = null; + response.reset(); + try { + String fileOldName = fileNameEncoding(attFileEO.getOldFileName(),request); + response.setHeader("Content-Disposition", "attachment;filename=\""+fileOldName+"\""); + response.setContentType("application/octet-stream"); + is = iFileStore.loadFile(attFileEO.getFilePath()+attFileEO.getFileName()); + os = response.getOutputStream(); + IOUtils.copy(is, os); + os.flush(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } finally { + IOUtils.closeQuietly(is); + IOUtils.closeQuietly(os); + } + } + + @ApiOperation(value = "|File|下载文件加水印") + @GetMapping("/downloadFileForSarWaterMark") + // @RequiresPermissions("sys:file:downloadFileForSar") + public void downloadFileForSarWaterMark(String fileId, HttpServletResponse response, HttpServletRequest request) throws Exception { + AttFileEO attFileEO = attFileEOService.getFileInfo(fileId); + InputStream is = null; + OutputStream os = null; + response.reset(); + try { + String fileOldName = fileNameEncoding(attFileEO.getOldFileName(),request); + //生成一份水印文件 + String oldFilePath = filePath + attFileEO.getFilePath()+attFileEO.getFileName(); + String newFilePath = filePath + attFileEO.getFilePath()+"waterPath/"; + File dir = new File(newFilePath); + if (!dir.exists()) { + dir.mkdirs(); + } + String waterFilePath = newFilePath + attFileEO.getOldFileName(); + // 添加水印 + String waterContent = ""; +// String userId = LoginUserUtil.getUserId(); +// String userMsg = ""; +// UserEO userEO = userEOService.selectByPrimaryKey(userId); +// if (userEO != null) { +// userMsg = userEO.getUname() + ","; +// if (StringUtils.isNotEmpty(userEO.getWorkNum())) { +// userMsg += userEO.getWorkNum() + ","; +// } +// } + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");//设置日期格式 + String date = df.format(new Date()); +// waterContent = userMsg + date; + //2020年9月5日 去掉水印处理 +// WaterMarkUtil.waterMark(oldFilePath,waterFilePath,waterContent); + response.setHeader("Content-Disposition", "attachment;filename=\""+fileOldName+"\""); + response.setContentType("application/octet-stream"); + is = iFileStore.loadFile(attFileEO.getFilePath()+"waterPath/"+attFileEO.getOldFileName()); + os = response.getOutputStream(); + IOUtils.copy(is, os); + os.flush(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } finally { + IOUtils.closeQuietly(is); + IOUtils.closeQuietly(os); + } + } + + /** + * @Author yangxuenan + * @Description 根据不同浏览器定义下载文件编码 + * Date 2018/10/11 10:40 + * @Param [fileName, request] + * @return java.lang.String + **/ + public String fileNameEncoding(String fileName, HttpServletRequest request) throws IOException { + String agent = request.getHeader("User-Agent"); + if (agent.contains("Firefox")) { + /*BASE64Encoder base64Encoder = new BASE64Encoder(); + fileName = "=?utf-8?B?" + + base64Encoder.encode(fileName.getBytes("utf-8")) + "?=";*/ + fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器 + } else { + fileName = URLEncoder.encode(fileName, "utf-8"); + //谷歌中空格变为+问题 + fileName = fileName.replaceAll("\\+","%20"); + } + return fileName; + } + + + /** + * @Author yangxuenan + * @Description 查询文件信息 + * Date 2018/10/10 18:41 + * @Param [fileId] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|File|查询文件信息") + @GetMapping("/getAttFileInfo") + public ResponseMessage getAttFileInfo(String fileId){ + AttFileEO attFileEO = attFileEOService.getFileInfo(fileId); + return Result.success(attFileEO); + } + + /** + * @Author yangxuenan + * @Description 查询多个文件信息 + * Date 2018/10/24 9:47 + * @Param [fileIds] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|File|查询多个文件信息") + @GetMapping("/getMultiFileInfos") + // @RequiresPermissions("att:attFile:getMultiFileInfos") + public ResponseMessage> getMultiFileInfos(String fileIds){ + List fileObj = attFileEOService.getMultiFileInfos(fileIds); + return Result.success(fileObj); + } + + + @ApiOperation(value = "|File|下载文件") + @GetMapping("/uploadModalFile") + // @RequiresPermissions("att:attFile:uploadModalFile") + public void uploadModalFile(String fileName, HttpServletResponse response, HttpServletRequest request) throws Exception { + InputStream is = null; + OutputStream os = null; + response.reset(); + try { + String fileOldName = fileNameEncoding(fileName,request); + response.setHeader("Content-Disposition", "attachment; filename=" + fileOldName); + response.setContentType("application/octet-stream"); + is = iFileStore.loadFile("/modal/"+fileName); + os = response.getOutputStream(); + IOUtils.copy(is, os); + os.flush(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } finally { + IOUtils.closeQuietly(is); + IOUtils.closeQuietly(os); + } + } + + + @ApiOperation(value = "|File|获取文件流") + @GetMapping("/getFileInfo") +// @RequiresPermissions("sys:file:getFileInfo") + public void getPdfFileSteam(String fileId,HttpServletRequest request,HttpServletResponse response) { + AttFileEO attFileEO = attFileEOService.getFileInfo(fileId); + InputStream is = null; + OutputStream os = null; + response.reset(); + try { + String fileOldName = fileNameEncoding(attFileEO.getOldFileName(), request); + response.setHeader("Content-Disposition", "attachment; filename=" + fileOldName); + response.setContentType("application/octet-stream"); + String readFilePath = filePath + "/" + attFileEO.getFilePath() + attFileEO.getFileName(); + File readFile = new File(readFilePath); + if (readFile.exists()) { + byte[] data = null; + try (FileInputStream input = new FileInputStream(readFile)){ + data = new byte[10000]; + int readIndex=0; + while((readIndex=input.read(data)) > 0){ + response.getOutputStream().write(data,0,readIndex); + } + } + } else { + return; + } +/* is = iFileStore.loadFile(attFileEO.getFilePath()+attFileEO.getFileName()); + os = response.getOutputStream(); + IOUtils.copy(is, os); + os.flush();*/ + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + + @ApiOperation(value = "|File|获取转换后的pdf文件流") + @GetMapping("/getPdfFileInfo") +// @RequiresPermissions("sys:file:getFileInfo") + public ResponseMessage getPdfFileInfo(String fileId,HttpServletRequest request,HttpServletResponse response) { + AttFileEO attFileEO = attFileEOService.getFileInfo(fileId); + InputStream is = null; + OutputStream os = null; + response.reset(); + String encreptFileStr = ""; + try { + String fileOldName = fileNameEncoding(attFileEO.getOldFileName(), request); + response.setHeader("Content-Disposition", "attachment; filename=" + fileOldName); + response.setContentType("application/octet-stream"); + String readFilePath = filePath + "/" + attFileEO.getFilePath() + attFileEO.getFileName(); + File readFile = new File(readFilePath); + String codeStr = ""; + BASE64Encoder encoder = new BASE64Encoder(); + if (readFile.exists()) { + byte[] data = null; + try (FileInputStream input = new FileInputStream(readFile)){ + data = new byte[(int) readFile.length()]; + input.read(data); + input.close(); + } catch (IOException e) { + logger.info(e.getMessage(),e); + } + //base64编码 + codeStr = encoder.encode(data); + codeStr = codeStr.replaceAll("\r|\n", ""); + //加密处理,前30后50拼上随机生成字符串 + encreptFileStr = UUIDUtils.randomUUID(30) + codeStr + UUIDUtils.randomUUID(50); + } +/* is = iFileStore.loadFile(attFileEO.getFilePath()+attFileEO.getFileName()); + os = response.getOutputStream(); + IOUtils.copy(is, os); + os.flush();*/ + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + if(StringUtils.isNotEmpty(encreptFileStr)){ + return Result.success("0","",encreptFileStr); + } else { + return Result.error("获取文件信息失败"); + } + } + + @ApiOperation(value = "|File|分段获取转换后的pdf文件流") + @GetMapping("/getSyncPdfFileInfo") + public void getSyncPdfFileInfo(String fileId,HttpServletRequest request,HttpServletResponse response) { + AttFileEO attFileEO = attFileEOService.getFileInfo(fileId); + InputStream is = null; + OutputStream os = null; + response.reset(); + try { + String fileOldName = fileNameEncoding(attFileEO.getOldFileName(), request); + response.setHeader("Content-Disposition", "attachment; filename=" + fileOldName); + String readFilePath = filePath + "/" + attFileEO.getFilePath() + attFileEO.getFileName(); + File readFile = new File(readFilePath); + if (readFile.exists()) { + downloadExistsFile(request,response,readFile); + } else { + return; + } +/* is = iFileStore.loadFile(attFileEO.getFilePath()+attFileEO.getFileName()); + os = response.getOutputStream(); + IOUtils.copy(is, os); + os.flush();*/ + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + + private void downloadExistsFile(HttpServletRequest request, HttpServletResponse response, File proposeFile) throws IOException,FileNotFoundException { + logger.debug("下载文件路径:" + proposeFile.getPath()); + long fSize = proposeFile.length(); + // 下载 + response.setContentType("application/x-download"); + response.setHeader("Accept-Ranges", "bytes"); + response.setHeader("Content-Length", String.valueOf(fSize)); + long pos = 0; + if (null != request.getHeader("Range")) { + // 断点续传 + response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); + try { +// pos = Long.parseLong(request.getHeader("Range").replaceAll( +// "bytes=", "").replaceAll("-", "")); + pos = Long.parseLong((request.getHeader("Range").replaceAll("bytes=", "").split("-")[0])); + } catch (NumberFormatException e) { + logger.error(request.getHeader("Range") + " is not Number!"); + pos = 0; + } + } + ServletOutputStream out = response.getOutputStream(); + BufferedOutputStream bufferOut = new BufferedOutputStream(out); + InputStream inputStream = new FileInputStream(proposeFile); + String contentRange = new StringBuffer("bytes ").append( + new Long(pos).toString()).append("-").append( + new Long(fSize - 1).toString()).append("/").append( + new Long(fSize).toString()).toString(); + response.setHeader("Content-Range", contentRange); + logger.debug("Content-Range", contentRange); + inputStream.skip(pos); + byte[] buffer = new byte[64 * 1024]; + int length = 0; + while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) { + bufferOut.write(buffer, 0, length); + } + bufferOut.flush(); + bufferOut.close(); + out.close(); + inputStream.close(); + } + + + + @ApiOperation(value = "|File|获取转换后图片流") + @GetMapping("/getFileImgInfo") +// @RequiresPermissions("sys:file:getFileInfo") + public ResponseMessage> getFileImgInfo(String fileId,int pageNo,HttpServletRequest request,HttpServletResponse response) { + Map resultMap = new HashMap<>(); + AttFileEO attFileEO = attFileEOService.getFileInfo(fileId); + InputStream is = null; + OutputStream os = null; + response.reset(); + String encreptFileStr = ""; + try { + String fileOldName = fileNameEncoding(attFileEO.getOldFileName(), request); + response.setHeader("Content-Disposition", "attachment; filename=" + fileOldName); + response.setContentType("application/octet-stream"); + String fileName = attFileEO.getFileName().substring(0, attFileEO.getFileName().indexOf(".")); + String readFilePath = filePath + attFileEO.getFilePath() + fileName + "img/" + pageNo + ".png"; + String fileDic = filePath + attFileEO.getFilePath() + fileName + "img"; + File readFile = new File(readFilePath); + String codeStr = ""; + BASE64Encoder encoder = new BASE64Encoder(); + if (readFile.exists()) { + byte[] data = null; + try (FileInputStream input = new FileInputStream(readFile)){ + data = new byte[(int) readFile.length()]; + input.read(data); + input.close(); + } catch (IOException e) { + logger.info(e.getMessage(),e); + } + //base64编码 + codeStr = encoder.encode(data); + codeStr = codeStr.replaceAll("\r|\n", ""); + //加密处理,前30后50拼上随机生成字符串 + encreptFileStr = UUIDUtils.randomUUID(30) + codeStr + UUIDUtils.randomUUID(50); + resultMap.put("data",encreptFileStr); + //获取文件夹下图片数量 + int imgCount = 0; + File readFileDic = new File(fileDic); + if (readFileDic.isDirectory()) { + File[] files = readFileDic.listFiles(); + if (files != null && files.length>0) { + imgCount = files.length; + } + } + resultMap.put("count",String.valueOf(imgCount)); + } + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + if(StringUtils.isNotEmpty(encreptFileStr)){ + return Result.success("0","获取成功",resultMap); + } else { + return Result.error("获取文件信息失败"); + } + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/att/controller/UeditorController.java b/adc-da-sys/src/main/java/com/adc/da/att/controller/UeditorController.java new file mode 100644 index 00000000..f566df77 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/att/controller/UeditorController.java @@ -0,0 +1,101 @@ +package com.adc.da.att.controller; + +import com.adc.da.att.entity.UeditorImage; +import com.adc.da.att.service.IAttFileEOService; +import com.adc.da.att.vo.AttFileVo; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import javax.servlet.http.HttpServletRequest; +import java.nio.charset.Charset; +import java.util.List; + +/*import com.adc.da.att.common.ueditor.ActionEnter;*/ + + +/** + * 用于处理关于ueditor插件相关的请求 + * @author zhangyanduan + * @date 2018年9月25日 + * + */ +@Slf4j +@RestController +@CrossOrigin +@RequestMapping("/${restPath}/ueditor") +public class UeditorController { + @Value("classpath:ueditor/config.json") + private Resource ueditorConfig; + @Autowired + private IAttFileEOService attFileEOService; + + + @RequestMapping(value = "/getConfig") + @ResponseBody + public String getUeditorConfig(HttpServletRequest request) throws Exception{ + String path = request.getContextPath(); + String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; + log.info(path); + log.info(basePath); + String ueditorData = IOUtils.toString(ueditorConfig.getInputStream(), Charset.forName("UTF-8")); + return ueditorData; + } + + @RequestMapping("/uploadImageData") + @ResponseBody + public String uploadImageData(HttpServletRequest request) { + UeditorImage msg = uploadFile(request); + return JSONObject.toJSONString(msg); + } + + private UeditorImage uploadFile(HttpServletRequest request) { + UeditorImage image = new UeditorImage(); + try{ + List files = ((MultipartHttpServletRequest) request).getFiles("upfile"); + String referer = request.getHeader("referer"); + if(files!=null && !files.isEmpty()){ + MultipartFile uploadFile=files.get(0); + AttFileVo attFileVo= attFileEOService.saveFileInfo(uploadFile); + String picUrlPath =""; + if(StringUtils.isNotEmpty(referer)){ + picUrlPath=referer+"uploadPath"+ attFileVo.getFilePath()+attFileVo.getFileName(); + }else{ + picUrlPath="uploadPath"+attFileVo.getFilePath()+attFileVo.getFileName(); + } + log.info("Ueditor 上传图片返回路径:"+picUrlPath); + image.setState("SUCCESS"); + image.setUrl(picUrlPath); + image.setTitle(attFileVo.getOldFileName()); +// image.setState(attFileVo.getOldFileName()); + image.setOriginal(attFileVo.getOldFileName()); + }else{ + image.setState("FAIL"); + } + }catch (Exception e){ + image.setState("FAIL"); + log.error(e.getMessage()); + } + + +/* image.setUrl(serverPath + path); + image.setState("SUCCESS"); + image.setOriginal(fileName); + image.setTitle(fileName);*/ + + + return image; + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/att/dao/AttFileEODao.java b/adc-da-sys/src/main/java/com/adc/da/att/dao/AttFileEODao.java new file mode 100644 index 00000000..1e2b9c43 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/att/dao/AttFileEODao.java @@ -0,0 +1,25 @@ +package com.adc.da.att.dao; + +import com.adc.da.att.entity.AttFileEO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * + *
+ * 功能:ATT_FILE AttFileEODao
+ * 作者:code generator
+ * 日期: 2018-09-07
+ * 版权所有:版权归北京卡达克数据技术中心所有。
+ */ +public interface AttFileEODao extends BaseMapper { + + public void creatTableInfo(@Param("tableName") String tableName); + + public int existTable(@Param("tableName") String tableName); + + public AttFileEO selectFileInfoById(AttFileEO attFileEO); + + public int insertData(AttFileEO attFileEO); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/att/entity/AttFileEO.java b/adc-da-sys/src/main/java/com/adc/da/att/entity/AttFileEO.java new file mode 100644 index 00000000..b99fc909 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/att/entity/AttFileEO.java @@ -0,0 +1,217 @@ +package com.adc.da.att.entity; + +import com.adc.da.base.entity.BaseEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Serializable; +import java.util.Date; + +/** + * 功能:ATT_FILE AttFileEOEntity
+ * 作者:code generator
+ * 日期: 2018-09-07
+ * 版权所有:版权归北京卡达克数据技术中心所有。
+ */ +public class AttFileEO extends BaseEntity implements Serializable{ + + private static final long serialVersionUID = 1284335706608668758L; + + private static final Logger logger = LoggerFactory.getLogger(AttFileEO.class); + + private String id; + private String fileName; + private String oldFileName; + private String fileSuffix; + private String filePath; + private Integer validFlag; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date creationTime; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + + private String tableName; + + private String resId; + + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
+ *

字段列表:

+ *
  • id -> id
  • + *
  • fileName -> file_name
  • + *
  • oldFileName -> old_file_name
  • + *
  • fileSuffix -> file_suffix
  • + *
  • filePath -> file_path
  • + *
  • validFlag -> valid_flag
  • + *
  • creationTime -> creation_time
  • + *
  • modifyTime -> modify_time
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ + return null; + } + switch (fieldName) { + case "id": return "id"; + case "fileName": return "file_name"; + case "oldFileName": return "old_file_name"; + case "fileSuffix": return "file_suffix"; + case "filePath": return "file_path"; + case "validFlag": return "valid_flag"; + case "creationTime": return "creation_time"; + case "modifyTime": return "modify_time"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • id -> id
  • + *
  • file_name -> fileName
  • + *
  • old_file_name -> oldFileName
  • + *
  • file_suffix -> fileSuffix
  • + *
  • file_path -> filePath
  • + *
  • valid_flag -> validFlag
  • + *
  • creation_time -> creationTime
  • + *
  • modify_time -> modifyTime
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ + return null; + } + switch (columnName) { + case "id": return "id"; + case "file_name": return "fileName"; + case "old_file_name": return "oldFileName"; + case "file_suffix": return "fileSuffix"; + case "file_path": return "filePath"; + case "valid_flag": return "validFlag"; + case "creation_time": return "creationTime"; + case "modify_time": return "modifyTime"; + default: return null; + } + } + + /** **/ + public String getId() { + int tableNameIndex = this.id.lastIndexOf("_"); + if(tableNameIndex!= -1){ + String tableName = this.id.substring(0, tableNameIndex); + this.tableName=tableName; + }else{ + logger.error("文件ID格式错误:"+this.id); + } + return this.id; + } + + /** **/ + public void setId(String id) { + if(tableName!=null && !tableName.isEmpty()){ + this.id = tableName+"_"+id; + } + //此处注意保存时表结构是否存在 + this.id=id; + } + + /** **/ + public String getFileName() { + return this.fileName; + } + + /** **/ + public void setFileName(String fileName) { + this.fileName = fileName; + } + + /** **/ + public String getOldFileName() { + return this.oldFileName; + } + + /** **/ + public void setOldFileName(String oldFileName) { + this.oldFileName = oldFileName; + } + + /** **/ + public String getFileSuffix() { + return this.fileSuffix; + } + + /** **/ + public void setFileSuffix(String fileSuffix) { + this.fileSuffix = fileSuffix; + } + + /** **/ + public String getFilePath() { + return this.filePath; + } + + /** **/ + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public String getTableName() { + if(this.tableName !=null && !this.tableName.isEmpty()){ + return this.tableName; + }else{ + int tableNameIndex = this.id.lastIndexOf("_"); + if(tableNameIndex !=-1){ + String tableName = this.id.substring(0, tableNameIndex); + this.tableName=tableName; + }else{ + logger.error("文件ID格式错误:"+this.id); + } + return this.tableName; + } + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getResId() { + return resId; + } + + public void setResId(String resId) { + this.resId = resId; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/att/entity/UeditorImage.java b/adc-da-sys/src/main/java/com/adc/da/att/entity/UeditorImage.java new file mode 100644 index 00000000..1ec8016b --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/att/entity/UeditorImage.java @@ -0,0 +1,41 @@ +package com.adc.da.att.entity; + +public class UeditorImage { + + private String state; + private String url; + private String title; + private String original; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getOriginal() { + return original; + } + + public void setOriginal(String original) { + this.original = original; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/att/page/AttFileEOPage.java b/adc-da-sys/src/main/java/com/adc/da/att/page/AttFileEOPage.java new file mode 100644 index 00000000..d34dba4c --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/att/page/AttFileEOPage.java @@ -0,0 +1,215 @@ +package com.adc.da.att.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:ATT_FILE AttFileEOPage
    + * 作者:code generator
    + * 日期: 2018-09-07
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class AttFileEOPage extends BasePage { + + private String id; + private String idOperator = "="; + private String fileName; + private String fileNameOperator = "="; + private String oldFileName; + private String oldFileNameOperator = "="; + private String fileSuffix; + private String fileSuffixOperator = "="; + private String filePath; + private String filePathOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "="; + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + + private String tableName; + + public String getId() { + int tableNameIndex = this.id.lastIndexOf("_"); + String tableName = this.id.substring(0, tableNameIndex); + this.tableName=tableName; + return this.id; + } + + public void setId(String id) { + this.id = id; + int tableNameIndex = id.lastIndexOf("_"); + String tableName = id.substring(0, tableNameIndex); + this.tableName=tableName; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + + public String getFileName() { + return this.fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileNameOperator() { + return this.fileNameOperator; + } + + public void setFileNameOperator(String fileNameOperator) { + this.fileNameOperator = fileNameOperator; + } + + public String getOldFileName() { + return this.oldFileName; + } + + public void setOldFileName(String oldFileName) { + this.oldFileName = oldFileName; + } + + public String getOldFileNameOperator() { + return this.oldFileNameOperator; + } + + public void setOldFileNameOperator(String oldFileNameOperator) { + this.oldFileNameOperator = oldFileNameOperator; + } + + public String getFileSuffix() { + return this.fileSuffix; + } + + public void setFileSuffix(String fileSuffix) { + this.fileSuffix = fileSuffix; + } + + public String getFileSuffixOperator() { + return this.fileSuffixOperator; + } + + public void setFileSuffixOperator(String fileSuffixOperator) { + this.fileSuffixOperator = fileSuffixOperator; + } + + public String getFilePath() { + return this.filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFilePathOperator() { + return this.filePathOperator; + } + + public void setFilePathOperator(String filePathOperator) { + this.filePathOperator = filePathOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getTableName() { + int tableNameIndex = this.id.lastIndexOf("_"); + String tableName = this.id.substring(0, tableNameIndex); + this.tableName=tableName; + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/att/service/IAttFileEOService.java b/adc-da-sys/src/main/java/com/adc/da/att/service/IAttFileEOService.java new file mode 100644 index 00000000..952fdc7f --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/att/service/IAttFileEOService.java @@ -0,0 +1,25 @@ +package com.adc.da.att.service; + +import com.adc.da.att.entity.AttFileEO; +import com.adc.da.att.vo.AttFileVo; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; + +public interface IAttFileEOService extends IService { + + public AttFileVo saveFileInfo(File file); + + public AttFileVo saveFileInfo(MultipartFile file); + + public List saveFilesInfo(MultipartFile[] files); + + public AttFileEO getFileInfo(String attId); + + public List getMultiFileInfos(String fileIds); + + public String saveFileAttId(File file); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/att/service/impl/AttFileEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/att/service/impl/AttFileEOServiceImpl.java new file mode 100644 index 00000000..07f8c0c0 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/att/service/impl/AttFileEOServiceImpl.java @@ -0,0 +1,361 @@ +package com.adc.da.att.service.impl; + +import com.adc.da.att.dao.AttFileEODao; +import com.adc.da.att.entity.AttFileEO; +import com.adc.da.att.service.IAttFileEOService; +import com.adc.da.att.vo.AttFileVo; +import com.adc.da.common.ValidFlagEnum; +import com.adc.da.util.FileUtil; +import com.adc.da.util.UUIDUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Service("attFileEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +@Slf4j +public class AttFileEOServiceImpl extends ServiceImpl implements IAttFileEOService { + + + @Value("${file.path}") + private String filePath;//文件存储路径 + + + /** + * 保存文件并返回文件ID + * + * @param file + */ + @Transactional(rollbackFor = Exception.class) + public AttFileVo saveFileInfo(File file) { + /** + * 1、首先生成文件保存的主键ID + * 2、根据文件ID生成随机路径 + * 3、生成文件名 + * 3、保存文件 + * 4、获取文件相关信息 + * 5、判断当前表是否有存在,如果存在则执行insert语句 如果不存在则创建表结构 + * 5、保存入库并返回主键ID + */ + AttFileVo attFileVo = new AttFileVo(); + String fileId = UUIDUtils.randomUUID20(); + try { + String uuidPath = UUIDUtils.getUUIDPath(fileId); + + String FileSavePath = filePath + uuidPath + "/"; + File dir = new File(FileSavePath); + if (!dir.exists()) { + dir.mkdirs(); + } + + String fileName = file.getName(); + String fileSuffix = fileName.substring(fileName.lastIndexOf(".")+1, fileName.length()); + String newFileName = fileId +"."+ fileSuffix; + File saveFile = new File(FileSavePath + newFileName); + FileUtils.copyFile(file,saveFile); + //开始存储文件信息 + String tableName = UUIDUtils.getAttTable(); + int existTable = this.baseMapper.existTable(tableName); + if (existTable == 0) { + this.baseMapper.creatTableInfo(tableName); + } + fileId = tableName + "_" + fileId; + AttFileEO attFileEO = new AttFileEO(); + attFileEO.setTableName(tableName); + attFileEO.setId(fileId); + attFileEO.setOldFileName(fileName); + attFileEO.setFileSuffix(fileSuffix); + attFileEO.setFilePath(uuidPath); + attFileEO.setFileName(newFileName); + attFileEO.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()); + attFileEO.setCreationTime(new Date()); + attFileEO.setModifyTime(new Date()); + this.baseMapper.insertData(attFileEO); + attFileVo.setId(fileId); + attFileVo.setFileName(newFileName); + attFileVo.setFilePath(uuidPath); + attFileVo.setFileSuffix(fileSuffix); + attFileVo.setOldFileName(fileName); + } catch (IOException e) { + log.error(e.getMessage(),e); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + return attFileVo; + } + + /** + * 保存文件并返回文件ID + * + * @param file + */ + @Transactional(rollbackFor = Exception.class) + public AttFileVo saveFileInfo(MultipartFile file) { + /** + * 1、首先生成文件保存的主键ID + * 2、根据文件ID生成随机路径 + * 3、生成文件名 + * 3、保存文件 + * 4、获取文件相关信息 + * 5、判断当前表是否有存在,如果存在则执行insert语句 如果不存在则创建表结构 + * 5、保存入库并返回主键ID + */ + AttFileVo attFileVo = new AttFileVo(); + String fileId = UUIDUtils.randomUUID20(); + try { + String uuidPath = UUIDUtils.getUUIDPath(fileId); + + String FileSavePath = filePath + uuidPath; + File dir = new File(FileSavePath); + if (!dir.exists()) { + dir.mkdirs(); + } + //开始存储文件 + String fileName = file.getOriginalFilename(); + // 此处发现在IE 11中存在获取文件名时获取了文件路径,此处将文件路径去除 + if(fileName.indexOf(":\\")>-1){ + // 此时说明存在从根路径获取的内容 需要处理 + fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length()); + } + String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()); + String newFileName = fileId + "." + fileSuffix; + FileUtils.copyInputStreamToFile(file.getInputStream(), new File(FileSavePath + newFileName)); + //开始存储文件信息 + String tableName = UUIDUtils.getAttTable(); + int existTable = this.baseMapper.existTable(tableName); + if (existTable == 0) { + this.baseMapper.creatTableInfo(tableName); + } + fileId = tableName + "_" + fileId; + AttFileEO attFileEO = new AttFileEO(); + attFileEO.setTableName(tableName); + attFileEO.setId(fileId); + attFileEO.setOldFileName(fileName); + attFileEO.setFileSuffix(fileSuffix); + attFileEO.setFilePath(uuidPath); + attFileEO.setFileName(newFileName); + attFileEO.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()); + attFileEO.setCreationTime(new Date()); + attFileEO.setModifyTime(new Date()); + this.baseMapper.insertData(attFileEO); + attFileVo.setId(fileId); + attFileVo.setFileName(newFileName); + attFileVo.setFilePath(uuidPath); + attFileVo.setFileSuffix(fileSuffix); + attFileVo.setOldFileName(fileName); + } catch (IOException e) { + log.error(e.getMessage(),e); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return attFileVo; + } + + + /*** + * 保存文件列表 + * @MethodName:saveFilesInfo + * @author: zhangyanduan + * @param:[files] + * @return:java.lang.String + * date: 2018/9/19 9:48 + */ + @Transactional(rollbackFor = Exception.class) + public List saveFilesInfo(MultipartFile[] files) { + /** + * 1、首先生成文件保存的主键ID + * 2、根据文件ID生成随机路径 + * 3、生成文件名 + * 3、保存文件 + * 4、获取文件相关信息 + * 5、判断当前表是否有存在,如果存在则执行insert语句 如果不存在则创建表结构 + * 5、保存入库并返回主键ID + */ + List fileInfoList = new ArrayList(); + if (files != null && files.length > 0) { + for (int index = 0; index < files.length; index++) { + MultipartFile file = files[index]; + AttFileVo attFileVo = new AttFileVo(); + String fileId = UUIDUtils.randomUUID20(); + try { + String uuidPath = UUIDUtils.getUUIDPath(fileId); + String FileSavePath = filePath + uuidPath; + File dir = new File(FileSavePath); + if (!dir.exists()) { + dir.mkdirs(); + } + //开始存储文件 + String fileName = file.getOriginalFilename(); + if(fileName.indexOf(":\\")>-1){ + // 此时说明存在从根路径获取的内容 需要处理 + fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length()); + } + String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()); + String newFileName = fileId + "." + fileSuffix; + FileUtils.copyInputStreamToFile(file.getInputStream(), new File(FileSavePath + newFileName)); + //开始存储文件信息 + String tableName = UUIDUtils.getAttTable(); + int existTable = this.baseMapper.existTable(tableName); + if (existTable == 0) { + this.baseMapper.creatTableInfo(tableName); + } + fileId = tableName + "_" + fileId; + AttFileEO attFileEO = new AttFileEO(); + attFileEO.setTableName(tableName); + attFileEO.setId(fileId); + attFileEO.setOldFileName(fileName); + attFileEO.setFileSuffix(fileSuffix); + attFileEO.setFilePath(uuidPath); + attFileEO.setFileName(newFileName); + attFileEO.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()); + attFileEO.setCreationTime(new Date()); + attFileEO.setModifyTime(new Date()); + this.baseMapper.insertData(attFileEO); + attFileVo.setId(fileId); + attFileVo.setFileName(newFileName); + attFileVo.setFilePath(uuidPath); + attFileVo.setFileSuffix(fileSuffix); + attFileVo.setOldFileName(fileName); + fileInfoList.add(attFileVo); + } catch (IOException e) { + log.error(e.getMessage(),e); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + } + } + + return fileInfoList; + } + + + /** + * 根据文件ID获取文件信息 + * + * @param attId + * @return + */ + public AttFileEO getFileInfo(String attId) { + /** + * 根据ID获取文件信息 + */ + AttFileEO attFileEO = new AttFileEO(); + AttFileEO attFileInfo=null; + try { + attFileEO.setId(attId); + attFileInfo = this.baseMapper.selectFileInfoById(attFileEO); + return attFileInfo; + } catch (Exception e) { + log.error(e.getMessage(),e); + } + return attFileEO; + } + + + /** + * @Author yangxuenan + * @Description 多文件查询 + * Date 2018/10/24 11:08 + * @Param [fileIds] + * @return java.util.List + **/ + public List getMultiFileInfos(String fileIds) { + List fileObj = new ArrayList<>(); + if(StringUtils.isNotEmpty(fileIds)){ + String idList[] = fileIds.split(","); + for(int i=0;i { + + private static final Logger logger = LoggerFactory.getLogger(PersonCollectEOController.class); + + @Autowired + private IPersonCollectEOService personCollectEOService; + + + /* + * @Author liuyinnan + * @Description //判断是法规,标准,动态 + * @Date 17:39 2018/9/28 + * @Param [pageNo, pageSize, modeType] + * @return com.adc.da.util.http.ResponseMessage> + **/ + @ApiOperation(value = "|PersonCollectEO|分页查询") + @GetMapping("/page") + public ResponseMessage> page(Integer pageNo, Integer pageSize, String modeType, String collectTitle) throws Exception { + PersonCollectEOPage page = new PersonCollectEOPage(); + if (StringUtils.isNotEmpty(modeType)) { + List collectTypes = new ArrayList<>(); + switch (modeType) { + case "STAND": + collectTypes.add("INLAND_STAND"); + collectTypes.add("FOREIGN_STAND"); + collectTypes.add("BUSINESS_STAND"); + break; + case "LAWS": + collectTypes.add("INLAND_LAWS"); + collectTypes.add("FOREIGN_LAWS"); + break; + case "MSG": + collectTypes.add("INLAND_MSG"); + collectTypes.add("FOREIGN_MSG"); + collectTypes.add("RESOURCE_MSG"); + break; + default:break; + } + page.setCollectTypeList(collectTypes); + } + if (pageNo != null) { + page.setPage(pageNo); + }else{ + page.setPage(1); + } + if (pageSize != null) { + page.setPageSize(pageSize); + }else{ + page.setPageSize(10); + } + if (StringUtils.isNotEmpty(collectTitle)) { + page.setCollectTitle(collectTitle); + } + page.setUserId(LoginUserUtil.getUserId()); + List rows = personCollectEOService.queryByPersonCollectPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + + } + + + @ApiOperation(value = "|PersonCollectEO|查询") + @GetMapping("") +// @RequiresPermissions("person:personCollect:list") + public ResponseMessage> list(PersonCollectEOPage page) throws Exception { + return Result.success(personCollectEOService.queryByList(page)); + } + + + @ApiOperation(value = "|PersonCollectEO|详情") + @GetMapping("/{id}") +// @RequiresPermissions("person:personCollect:get") + public ResponseMessage find(@PathVariable String id) throws Exception { + return Result.success(personCollectEOService.getById(id)); + } + + + /** + * 刘寅楠 + * @param personCollectEO + * @return com.adc.da.person.entity.PersonCollectEO + * @throws Exception + */ + @ApiOperation(value = "|PersonCollectEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) +// @RequiresPermissions("person:personCollect:create") + public ResponseMessage create(@RequestBody PersonCollectEO personCollectEO) throws Exception { + String userId = LoginUserUtil.getUserId(); + personCollectEO.setId(UUIDUtils.randomUUID20()); + personCollectEO.setUserId(userId); + personCollectEO.setValidFlag(0); + personCollectEO.setCreationTime(new Date()); + personCollectEO.setModifyTime(new Date()); + personCollectEOService.save(personCollectEO); + return Result.success("0","收藏成功,请到'我的收藏'中查看相关信息。",personCollectEO); + } + + + @ApiOperation(value = "|PersonCollectEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) +// @RequiresPermissions("person:personCollect:update") + public ResponseMessage update(@RequestBody PersonCollectEO personCollectEO) throws Exception { + personCollectEO.setModifyTime(new Date()); + personCollectEOService.updateById(personCollectEO); + return Result.success(personCollectEO); + } + + + + + @ApiOperation(value = "|PersonCollectEO|删除") + @DeleteMapping("/{id}") +// @RequiresPermissions("person:personCollect:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + personCollectEOService.removeById(id); + logger.info("delete from TS_PERSON_COLLECT where id = {}", id); + return Result.success(); + } + + + + /* + * @Author liuyinnan + * @Description //对收藏数据进行取消收藏 + * @Date 17:31 2018/9/28 + * @Param [personCollectEO] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "取消收藏") + @PutMapping("/updateByUserId") +// @RequiresPermissions("person:personCollect:updateByUserId") + public ResponseMessage updateByUserId(PersonCollectEO personCollectEO) throws Exception { + personCollectEO.setValidFlag(1); + boolean result = personCollectEOService.updateById(personCollectEO); + if(result){ + return Result.success("0","取消成功",personCollectEO); + } else { + return Result.error("0","取消失败",personCollectEO); + } + } + + @ApiOperation(value = "|批量取消收藏") + @PostMapping("/cancelCollectByBatch") + public ResponseMessage cancelCollectByBatch(String ids) throws Exception { + try { + String arr[] = ids.split(","); + List idList = Arrays.asList(arr); + int count = personCollectEOService.deleteByIdList(idList); + if (count > 0) { + return Result.success("200","取消收藏成功",true); + } else { + return Result.error("400","取消收藏失败"); + } + }catch (Exception e){ + logger.error(e.getMessage(),e); + return Result.error("400","取消收藏失败"); + } + } + + + + /* + * @Author liuyinnan + * @Description //通过检索模糊查询 + * @Date 17:38 2018/9/28 + * @Param [page] + * @return com.adc.da.util.http.ResponseMessage + **/ +// @ApiOperation(value = "通过内容标题模糊查询") +// @GetMapping("/selectByCollectTitle") +//// @RequiresPermissions("person:personCollect:list") +// public ResponseMessage> selectByCollectTitle(PersonCollectEOPage page) throws Exception { +// page.setValidFlag("0"); +// List personCollectEO=personCollectEOService.queryByList(page); +// return Result.success(personCollectEO); +// } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonConfEOController.java b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonConfEOController.java new file mode 100644 index 00000000..ec6ed530 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonConfEOController.java @@ -0,0 +1,216 @@ +package com.adc.da.person.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.person.entity.PersonConfEO; +import com.adc.da.person.page.PersonConfEOPage; +import com.adc.da.person.service.IPersonConfEOService; +import com.adc.da.util.LoginUserUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +@RestController +@RequestMapping("/${restPath}/person/personConf") +@Api(description = "|PersonConfEO|") +public class PersonConfEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(PersonConfEOController.class); + + @Autowired + private IPersonConfEOService personConfEOService; + + + + @ApiOperation(value = "|PersonConfEO|分页查询") + @GetMapping("/page") + //@RequiresPermissions("person:personConf:page") + public ResponseMessage> page(PersonConfEOPage page) throws Exception { + List rows = personConfEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|PersonConfEO|查询") + @GetMapping("") + //@RequiresPermissions("person:personConf:list") + public ResponseMessage> list(PersonConfEOPage page) throws Exception { + return Result.success(personConfEOService.queryByList(page)); + } + + @ApiOperation(value = "|PersonConfEO|详情") + @GetMapping("/{id}") + //@RequiresPermissions("person:personConf:get") + public ResponseMessage find(@PathVariable String id) throws Exception { + return Result.success(personConfEOService.getById(id)); + } + + /** + * gaoyan 用户新增过程中,默认全部新增 + * @param + * @param + * @return + */ + @ApiOperation(value = "|PersonConfEO|新增") + @PostMapping(value="addConfList") + // @RequiresPermissions("person:personConf:save") + public ResponseMessage> addConfList(String userId) throws Exception { + List list = personConfEOService.saveConfList(userId); + return Result.success(list); + } + + /* + * @Author liuyinnan + * @Description //按一个对象更新个人板块 + * @Date 8:38 2018/9/25 + * @Param [personConfEO] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|PersonConfEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + //@RequiresPermissions("person:personConf:update") + public ResponseMessage update(@RequestBody PersonConfEO personConfEO) throws Exception { + personConfEOService.updateById(personConfEO); + personConfEO.setCreationTime(new Date()); + personConfEO.setModifyTime(new Date()); + boolean result=personConfEOService.updateById(personConfEO); + if(!result){ + return Result.error("修改失败"); + } + return Result.success(personConfEO); + } + + +// @ApiOperation(value = "根据前台传来的对象保存") +// @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) +// public ResponseMessage insertByList(PersonConfEO personConfEO)throws Exception{ +// personConfEOService.updateByPrimaryKeySelective(personConfEO); +// personConfEOService.insertByList(personConfEO); +// return Result.success(personConfEO); +// } + + + @ApiOperation(value = "根据前台传来的对象保存") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + public ResponseMessage insertByList(@RequestBody List personConfEOList) throws Exception { + if (personConfEOList != null && personConfEOList.size() > 0) { + + // String[] personConfEO=personConfEO.split(","); + for (int i = 0; i < personConfEOList.size(); i++) { + PersonConfEO personConfEO = personConfEOList.get(i); + personConfEO.setUserId("1"); + personConfEO.setDisplaySeq(i+1); + personConfEO.setCreationTime(new Date()); + personConfEO.setModifyTime(new Date()); + System.out.println(personConfEOList.get(i)); + personConfEOService.updateById(personConfEOList.get(i)); + personConfEOService.insert1(personConfEOList.get(i)); + } + }else { + return Result.error("操作失败"); + } + return Result.success("","操作成功",personConfEOList); + } + + + @ApiOperation(value = "|PersonConfEO|删除") + @DeleteMapping("/{id}") + //@RequiresPermissions("person:personConf:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + personConfEOService.removeById(id); + logger.info("delete from TS_PERSON_CONF where id = {}", id); + return Result.success(); + } + + + /* + * @Author liuyinnan + * @Description //排序查询 + * @Date 16:13 2018/9/21 + * @Param [] + * @return com.adc.da.util.http.ResponseMessage> + **/ +// @ApiOperation(value = "排序查询") +// @GetMapping("/selectByDisplay") +// //@RequiresPermissions("person:personConf:list") +// public ResponseMessage> updateById() throws Exception { +// List personConfEO = personConfEOService.updateById(); +// return Result.success(personConfEO); +// } + + + /* + * @Author liuyinnan + * @Description //批量删除 + * @Date 16:12 2018/9/21 + * @Param [ids] + * @return com.adc.da.util.http.ResponseMessage> + **/ +// @ApiOperation(value = "批量删除") +// @DeleteMapping("/{ids}") +// public ResponseMessage> deleteByIdList(@PathVariable String ids) throws Exception { +// String[] idList = ids.split(","); +// if (idList != null && idList.length > 0) { +// for (String id : idList) { +// List list = personConfEOService.deleteByIdList(id); +// } +// } +// return Result.success(); +// } + + /** + * gaoyan + * 查询左侧可显示的目录 + * @param + * @return + * @throws Exception + */ + @ApiOperation(value = "|PersonConfEO|详情") + @GetMapping("/getPersonConf") + //@RequiresPermissions("person:personConf:get") + public ResponseMessage> getPersonConf() throws Exception { + List list = personConfEOService.selectByUserid(LoginUserUtil.getUserId()); + return Result.success(list); + } + + /** + * gaoyan + * 个人板块信息查询 + * @param + * @return + * @throws Exception + */ + @ApiOperation(value = "|PersonConfEO|详情") + @GetMapping("/getPersonConfList") + //@RequiresPermissions("person:personConf:getPersonConfList") + public ResponseMessage getPersonConfList() throws Exception { + Map result = personConfEOService.selectPersonConfByUserid(LoginUserUtil.getUserId()); + return Result.success(result); + } + + /** + * gaoyan + * 个人登录后修改自己显示板块 + * @param + * @return + * @throws Exception + */ + @ApiOperation(value = "|PersonConfEO|详情") + @PostMapping("/updatePersonConfList") + //@RequiresPermissions("person:personConf:updatePersonConfList") + public ResponseMessage updatePersonConfList(String[] targetKeys) throws Exception { + personConfEOService.updatePersonConfList(targetKeys, LoginUserUtil.getUserId()); + return Result.success("","保存成功",targetKeys); + } +} \ No newline at end of file diff --git a/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonCookiesEOController.java b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonCookiesEOController.java new file mode 100644 index 00000000..d7f6cff5 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonCookiesEOController.java @@ -0,0 +1,176 @@ +package com.adc.da.person.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.person.entity.PersonCookiesEO; +import com.adc.da.person.page.PersonCookiesEOPage; +import com.adc.da.person.service.IPersonCookiesEOService; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.UUIDUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +@RestController +@RequestMapping("/${restPath}/person/personCookies") +@Api(description = "|PersonCookiesEO|") +public class PersonCookiesEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(PersonCookiesEOController.class); + + @Autowired + private IPersonCookiesEOService personCookiesEOService; + + @ApiOperation(value = "|PersonCookiesEO|分页查询") + @GetMapping("/page") + //@RequiresPermissions("person:personCookies:page") + public ResponseMessage> page(PersonCookiesEOPage page) throws Exception { + page.setValidFlag("0"); + String userId= LoginUserUtil.getUserId(); + page.setUserId(userId); + List rows = personCookiesEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|PersonCookiesEO|查询") + @GetMapping("") + //@RequiresPermissions("person:personCookies:list") + public ResponseMessage> list(PersonCookiesEOPage page) throws Exception { + return Result.success(personCookiesEOService.queryByList(page)); + } + + @ApiOperation(value = "|PersonCookiesEO|详情") + @GetMapping("/{id}") + //@RequiresPermissions("person:personCookies:get") + public ResponseMessage find(@PathVariable String id) throws Exception { + return Result.success(personCookiesEOService.getById(id)); + } + + /*@ApiOperation(value = "|PersonCookiesEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + //@RequiresPermissions("person:personCookies:save") + public ResponseMessage create(@RequestBody PersonCookiesEO personCookiesEO) throws Exception { + personCookiesEOService.insertSelective(personCookiesEO); + return Result.success(personCookiesEO); + }*/ + + + @ApiOperation(value = "|PersonCookiesEO|新增") + @PostMapping("/create") + //@RequiresPermissions("person:personCookies:save") + public ResponseMessage create(@RequestBody PersonCookiesEO personCookiesEO) throws Exception { + personCookiesEO.setUserId(LoginUserUtil.getUserId()); + personCookiesEO.setId(UUIDUtils.randomUUID20()); + personCookiesEO.setCreationTime(new Date()); + personCookiesEO.setModifyTime(new Date()); + personCookiesEO.setValidFlag(0); + personCookiesEOService.saveBean(personCookiesEO); + return Result.success(personCookiesEO); + } + + @ApiOperation(value = "|PersonCookiesEO|批量删除") + @PostMapping("/deleteByBacth") + public ResponseMessage deleteByBacth(String ids) throws Exception { + try { + String arr[] = ids.split(","); + List idList = Arrays.asList(arr); + int count = personCookiesEOService.deleteByIdList(idList); + if (count > 0) { + return Result.success("200","删除成功",true); + } else { + return Result.error("400","删除失败"); + } + }catch (Exception e){ + logger.error(e.getMessage(),e); + return Result.error("400","删除失败"); + } + } + + + + + + /* + * @Author liuyinnan + * @Description //删除我的浏览所有记录 + * @Date 9:51 2018/9/27 + * @Param [ids] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|PersonCookiesEO|批量删除") + @PutMapping("/deleteBacth") + //@RequiresPermissions("person:personCookies:update") + public ResponseMessage update(PersonCookiesEO personCookiesEO) throws Exception { + personCookiesEO.setUserId(LoginUserUtil.getUserId()); + personCookiesEOService.updateByAll(personCookiesEO); + return Result.success("true","清除成功",personCookiesEO); + } + + @ApiOperation(value = "|PersonCookiesEO|删除") + @DeleteMapping("/{id}") + //@RequiresPermissions("person:personCookies:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + personCookiesEOService.removeById(id); + logger.info("delete from TS_PERSON_COOKIES where id = {}", id); + return Result.success("true","删除成功",1); + } + + + /* + * @Author liuyinnan + * @Description //单句删除 + * @Date 9:51 2018/9/27 + * @Param [personCookiesEO] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "根据用户id删除浏览记录") + @PutMapping("/deleteBySimple") + //@RequiresPermissions("person:personCookies:updateByUserId") + public ResponseMessage updateByUserId(PersonCookiesEO personCookiesEO) throws Exception { + int personCookiesEO1=personCookiesEOService.updateByUserId(personCookiesEO); + return Result.success("true","删除成功",1); + } + + + +// @ApiOperation(value = "根据浏览类型查询") +// @GetMapping("/cookieType") +// @ResponseBody +// public ResponseMessage> queryByCookieType(String cookieType) throws Exception{ +// List personCookiesEO=personCookiesEOService.queryByCookieType(cookieType); +// if(personCookiesEO==null){ +// return Result.error("查询失败"); +// } +// return Result.success(personCookiesEO); +// } + + +// @ApiOperation(value = "根据用户id查询") +// @GetMapping("/userId") +// public ResponseMessage> queryByUserId(String ids) throws Exception { +// String[] idList = ids.split(","); +// if (idList != null && idList.length > 0) { +// for (String id : idList) { +// List list = personConfEOService.deleteByIdList(id); +// } +// } +// return Result.success(); +// } + + @ApiOperation(value = "|PersonCookiesEO|计算浏览数") + @GetMapping("/countPageCookie") + public ResponseMessage countPageCookie(PersonCookiesEO personCookiesEO){ + int count = personCookiesEOService.countPageCookie(personCookiesEO); + return Result.success(count); + } +} + diff --git a/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonMsgEOController.java b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonMsgEOController.java new file mode 100644 index 00000000..ca3913e2 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonMsgEOController.java @@ -0,0 +1,220 @@ +package com.adc.da.person.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.person.entity.PersonMsgEO; +import com.adc.da.person.page.PersonMsgEOPage; +import com.adc.da.person.page.PersonShareEOPage; +import com.adc.da.person.service.IPersonMsgEOService; +import com.adc.da.person.service.IPersonShareEOService; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.UUIDUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + + +@RestController +@RequestMapping("/${restPath}/person/personMsg") +@Api(description = "|PersonMsgEO|") +public class PersonMsgEOController extends BaseController{ + + private static final Logger logger = LoggerFactory.getLogger(PersonMsgEOController.class); + + @Autowired + private IPersonMsgEOService personMsgEOService; + + @Autowired + private IPersonShareEOService personShareEOService; + + @ApiOperation(value = "|PersonMsgEO|分页查询") + @GetMapping("/page") + //@RequiresPermissions("person:personMsg:page") + public ResponseMessage> page(PersonMsgEOPage page) throws Exception { + page.setValidFlag("0"); + List rows = personMsgEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|PersonMsgEO|查询") + @GetMapping("") + //@RequiresPermissions("person:personMsg:list") + public ResponseMessage> list(PersonMsgEOPage page) throws Exception { + return Result.success(personMsgEOService.queryByList(page)); + } + + @ApiOperation(value = "|PersonMsgEO|详情") + @GetMapping("/{id}") + //@RequiresPermissions("person:personMsg:get") + public ResponseMessage find(@PathVariable String id) throws Exception { + return Result.success(personMsgEOService.getById(id)); + } + + @ApiOperation(value = "|PersonMsgEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + //@RequiresPermissions("person:personMsg:save") + public ResponseMessage create(@RequestBody PersonMsgEO personMsgEO) throws Exception { + personMsgEO.setUserId(LoginUserUtil.getUserId()); + personMsgEO.setId(UUIDUtils.randomUUID20()); + personMsgEO.setCreationTime(new Date()); + personMsgEO.setModifyTime(new Date()); + personMsgEO.setReadFlag(0); + personMsgEO.setValidFlag(0); + personMsgEOService.save(personMsgEO); + return Result.success(personMsgEO); + } + + @ApiOperation(value = "|PersonMsgEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + //@RequiresPermissions("person:personMsg:update") + public ResponseMessage update(@RequestBody PersonMsgEO personMsgEO) throws Exception { + personMsgEOService.updateById(personMsgEO); + return Result.success(personMsgEO); + } + + @ApiOperation(value = "|PersonMsgEO|删除") + @DeleteMapping("/{id}") + //@RequiresPermissions("person:personMsg:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + personMsgEOService.removeById(id); + logger.info("delete from TS_PERSON_MSG where id = {}", id); + return Result.success(); + } + + + + /* + * @Author liuyinnan + * @Description 根据id查询详细信息 + * @Date 14:10 2018/10/19 + * @Param [id] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|PersonMsgEO|根据id查询详细信息") + @GetMapping("/selectByInfoId") + //@RequiresPermissions("person:personMsg:list") + public ResponseMessage selectByInfoId(String id) throws Exception { + PersonMsgEO personMsgEO = personMsgEOService.selectByInfoId(id); + + // 查询详情表示查看过这条数据同时去修改是否已读 + if( null !=personMsgEO.getReadFlag() && personMsgEO.getReadFlag() == 0) { + PersonMsgEO updatete = new PersonMsgEO(); + updatete.setId(personMsgEO.getId()); + updatete.setReadFlag(1); + updatete.setModifyTime(new Date()); + personMsgEOService.updateById(updatete); + } + return Result.success(personMsgEO); + } + + /* + * @Author liuyinnan + * @Description 查询当前登录人一共有多少条未读动态 + * @Date 14:10 2018/10/19 + * @Param [id] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|PersonMsgEO|查询当前登录人一共有多少条未读动态") + @GetMapping("/selectNotRed") + //@RequiresPermissions("person:personMsg:selectNotRed") + public ResponseMessage> selectNotRed() throws Exception { + Map resultMap = new HashMap(); + PersonMsgEOPage page = new PersonMsgEOPage(); + page.setValidFlag("0"); + page.setReadFlag("0"); + page.setUserId(LoginUserUtil.getUserId()); + int msgCount = personMsgEOService.selectByNotRed(page); + resultMap.put("msgCount",msgCount); + PersonShareEOPage personShareEOPage = new PersonShareEOPage(); + personShareEOPage.setReadFlag("0"); + personShareEOPage.setValidFlag("0"); + personShareEOPage.setRecipientId(LoginUserUtil.getUserId()); + int shareCount = personShareEOService.queryByCount(personShareEOPage); + resultMap.put("shareCount",shareCount); + int allCount = msgCount+shareCount; + resultMap.put("allCount",allCount); + return Result.success(resultMap); + } + + @ApiOperation(value = "批量删除") + @PostMapping("/deleteByIdList") + public ResponseMessage deleteByIdList(String ids){ + try { + String arr[] = ids.split(","); + List idList = Arrays.asList(arr); + personMsgEOService.deletePersonMsgByIdList(idList); + return Result.success("200","删除成功",true); + }catch (Exception e){ + logger.error(e.getMessage(),e); + return Result.error("400","删除失败"); + } + } + + + /* + * @Author yuzhong + * @Description 根据流程编号更改动态信息 + * @Date 14:10 2018/10/19 + * @Param [id] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "根据流程编号更改动态信息") + @GetMapping("/updateMsgInfoByProcessNum") + //@RequiresPermissions("person:personMsg:selectNotRed") + public ResponseMessage> updateMsgInfoByProcessNum(String processNum) throws Exception { + Map resultMap = new HashMap(); + //为了把动态的信息关闭掉 + PersonMsgEOPage personMsgEOPage = new PersonMsgEOPage(); + personMsgEOPage.setProcessnum(processNum); + personMsgEOPage.setValidFlag("0"); + List personMsgEOList = personMsgEOService.queryByList(personMsgEOPage); + if(personMsgEOList!=null && !personMsgEOList.isEmpty()){ + for(PersonMsgEO personMsgEO : personMsgEOList){ + personMsgEO.setReadFlag(1); + personMsgEOService.updateById(personMsgEO); + } + } + PersonMsgEOPage page = new PersonMsgEOPage(); + page.setValidFlag("0"); + page.setReadFlag("0"); + page.setUserId(LoginUserUtil.getUserId()); + int msgCount = personMsgEOService.selectByNotRed(page); + resultMap.put("msgCount",msgCount); + PersonShareEOPage personShareEOPage = new PersonShareEOPage(); + personShareEOPage.setReadFlag("0"); + personShareEOPage.setValidFlag("0"); + personShareEOPage.setRecipientId(LoginUserUtil.getUserId()); + int shareCount = personShareEOService.queryByCount(personShareEOPage); + resultMap.put("shareCount",shareCount); + int allCount = msgCount+shareCount; + resultMap.put("allCount",allCount); + return Result.success(resultMap); + } + + @ApiOperation(value = "批量标记已读") + @PostMapping("/markIsReadByBatch") + public ResponseMessage markIsReadByBatch(String ids){ + try { + String arr[] = ids.split(","); + List idList = Arrays.asList(arr); + int count = personMsgEOService.markIsReadByBatch(idList); + if (count > 0) { + return Result.success("200","标记成功",true); + } else { + return Result.error("400","标记失败"); + } + }catch (Exception e){ + logger.error(e.getMessage(),e); + return Result.error("400","标记失败"); + } + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonNoteEOController.java b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonNoteEOController.java new file mode 100644 index 00000000..f905a37c --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonNoteEOController.java @@ -0,0 +1,168 @@ +package com.adc.da.person.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.person.entity.PersonNoteEO; +import com.adc.da.person.page.PersonNoteEOPage; +import com.adc.da.person.service.IPersonNoteEOService; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.UUIDUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; + +@RestController +@RequestMapping("/${restPath}/person/personNote") +@Api(description = "|PersonNoteEO|") +public class PersonNoteEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(PersonNoteEOController.class); + + @Autowired + private IPersonNoteEOService personNoteEOService; + + + @ApiOperation(value = "|PersonNoteEO|分页查询") + @GetMapping("/page") + //@RequiresPermissions("person:personNote:page") + public ResponseMessage> page(PersonNoteEOPage page) throws Exception { + List rows = personNoteEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|PersonNoteEO|查询") + @GetMapping("") + //@RequiresPermissions("person:personNote:list") + public ResponseMessage> list(PersonNoteEOPage page) throws Exception { + return Result.success(personNoteEOService.queryByList(page)); + } + + @ApiOperation(value = "|PersonNoteEO|详情") + @GetMapping("/{id}") + //@RequiresPermissions("person:personNote:get") + public ResponseMessage find(@PathVariable String id) throws Exception { + return Result.success(personNoteEOService.getById(id)); + } + + + + /* + * @Author liuyinnan + * @Description //保存笔记 + * @Date 18:30 2018/9/28 + * @Param [personNoteEO] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "保存笔记") + @PostMapping("/save") + //@RequiresPermissions("person:personNote:save") + public ResponseMessage save(@RequestBody PersonNoteEO personNoteEO) throws Exception { + personNoteEO.setId(personNoteEO.getId()); + personNoteEO.setUserId(personNoteEO.getUserId()); + boolean result=personNoteEOService.save(personNoteEO); + if(!result){ + return Result.error("保存失败"); + } + return Result.success("true","修改成功",personNoteEO); +} + + +/* @ApiOperation(value = "|PersonNoteEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + @RequiresPermissions("person:personNote:update") + public ResponseMessage update(@RequestBody PersonNoteEO personNoteEO) throws Exception { + personNoteEOService.updateByPrimaryKeySelective(personNoteEO); + return Result.success(personNoteEO); + }*/ + + @ApiOperation(value = "|PersonNoteEO|删除") + @DeleteMapping("/{id}") + // @RequiresPermissions("person:personNote:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + personNoteEOService.removeById(id); + logger.info("delete from TS_PERSON_NOTE where id = {}", id); + return Result.success(); + } + + + /* + * @Author liuyinnan + * @Description //通过笔记的id和收藏id进行修改笔记内容 + * @Date 8:49 2018/9/28 + * @Param [personNoteEO] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "修改笔记") + @PutMapping("/updateById") + //@RequiresPermissions("person:personNote:updateByCollectId") + public ResponseMessage updateByCollectId(PersonNoteEO personNoteEO) throws Exception { + personNoteEOService.updateByCollectId(personNoteEO); + return Result.success("true","修改成功",personNoteEO); + } + + + /* + * @Author liuyinnan + * @Description //通过传入的收藏表的id对笔记表进行查询 + * @Date 8:44 2018/9/28 + * @Param [collectId] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "查询笔记") + @GetMapping("/collectId") + public ResponseMessage> queryByCollectId(PersonNoteEO personNoteEO) throws Exception { + //获取当前登录人 + System.err.println("zzzzzzzz "+personNoteEO); + List personNoteEO1 = personNoteEOService.queryByCollectId(personNoteEO); + System.err.println("xxxxxxxx "+personNoteEO1); + return Result.success(personNoteEO1); + } + + + /* + * @Author liuyinnan + * @Description //根据用户id和笔记id删除 + * @Date 8:38 2018/9/28 + * @Param [personNoteEO] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "删除笔记") + @PutMapping("/updatePersonNote") + //@RequiresPermissions("person:personNote:updatePersonNote") + public ResponseMessage updatePersonNote(PersonNoteEO personNoteEO) throws Exception { + personNoteEOService.updateById(personNoteEO); + return Result.success("true", "删除成功",personNoteEO); + } + + + /* + * @Author liuyinnan + * @Description //根据收藏的id插入笔记 + * @Date 21:15 2018/9/27 + * @Param [personNoteEO] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "插入笔记") + @PostMapping("/insertByCollectId") + //@RequiresPermissions("person:personNote:insert") + public ResponseMessage insert(PersonNoteEO personNoteEO) throws Exception { + personNoteEO.setId(UUIDUtils.randomUUID20()); + personNoteEO.setUserId(LoginUserUtil.getUserId()); + personNoteEO.setCreartionTime(new Date()); + personNoteEO.setModifyTime(new Date()); + personNoteEO.setValidFlag(0); + boolean result=personNoteEOService.save(personNoteEO); + if(!result){ + return Result.error("添加失败"); + } + return Result.success("true", "新增成功",personNoteEO); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonSearchEOController.java b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonSearchEOController.java new file mode 100644 index 00000000..461afb3b --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/controller/PersonSearchEOController.java @@ -0,0 +1,143 @@ +package com.adc.da.person.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.person.entity.PersonSearchEO; +import com.adc.da.person.page.PersonSearchEOPage; +import com.adc.da.person.service.IPersonSearchEOService; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.UUIDUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +@RestController +@RequestMapping("/${restPath}/person/personSearch") +@Api(description = "|PersonSearchEO|") +public class PersonSearchEOController extends BaseController{ + + private static final Logger logger = LoggerFactory.getLogger(PersonSearchEOController.class); + + @Autowired + private IPersonSearchEOService personSearchEOService; + + @ApiOperation(value = "|PersonSearchEO|分页查询") + @GetMapping("/page") + //@RequiresPermissions("person:personSearch:page") + public ResponseMessage> page(PersonSearchEOPage page) throws Exception { + List rows = personSearchEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|PersonSearchEO|查询") + @GetMapping("") + //@RequiresPermissions("person:personSearch:list") + public ResponseMessage> list(PersonSearchEOPage page) throws Exception { + return Result.success(personSearchEOService.queryByList(page)); + } + + @ApiOperation(value = "|PersonSearchEO|详情") + @GetMapping("/{id}") + //@RequiresPermissions("person:personSearch:get") + public ResponseMessage find(@PathVariable String id) throws Exception { + return Result.success(personSearchEOService.getById(id)); + } + + @ApiOperation(value = "|PersonSearchEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + //@RequiresPermissions("person:personSearch:save") + public ResponseMessage create(@RequestBody PersonSearchEO personSearchEO) throws Exception { + personSearchEO.setId(UUIDUtils.randomUUID20()); + personSearchEO.setCreationTime(new Date()); + personSearchEO.setModifyTime(new Date()); + personSearchEOService.save(personSearchEO); + return Result.success(personSearchEO); + } + + @ApiOperation(value = "|PersonSearchEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + //@RequiresPermissions("person:personSearch:update") + public ResponseMessage update(@RequestBody PersonSearchEO personSearchEO) throws Exception { + personSearchEOService.updateById(personSearchEO); + return Result.success(personSearchEO); + } + + @ApiOperation(value = "|PersonSearchEO|删除") + @DeleteMapping("/{id}") + //@RequiresPermissions("person:personSearch:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + personSearchEOService.removeById(id); + logger.info("delete from TS_PERSON_SEARCH where id = {}", id); + return Result.success(); + } + + /** + * gaoyan + * 查询各人检索记录 + * @param page + * @return + * @throws Exception + */ + @ApiOperation(value = "|PersonSearchEO|查询") + @GetMapping("/selectPersonSearch") + //@RequiresPermissions("person:personSearch:list") + public ResponseMessage> selectPersonSearch(PersonSearchEOPage page) throws Exception { + page.setUserId(LoginUserUtil.getUserId()); + page.setOrderBy("creation_time desc"); + page.setValidFlag("0"); + List result = personSearchEOService.queryByList(page); + int i = 5; + if(result.size()<5){ + i = result.size(); + } + List newresult = result.subList(0,i); + return Result.success(newresult); + } + + /** + * gaoyan + * 删除或清空检索历史 + * @param + * @return + * @throws Exception + */ + @ApiOperation(value = "|PersonSearchEO|查询") + @PostMapping("/deletePersonSearch") + //@RequiresPermissions("person:personSearch:list") + public ResponseMessage> deletePersonSearch(String id,String type) throws Exception { + List idlist = new ArrayList<>(); + if(StringUtils.isNotEmpty(type) && type.equals("all")){ + // 清空当前登录人所有浏览记录 + PersonSearchEOPage personSearchEOPage = new PersonSearchEOPage(); + personSearchEOPage.setUserId(LoginUserUtil.getUserId()); + personSearchEOPage.setValidFlag("0"); + List resulist = personSearchEOService.queryByList(personSearchEOPage); + for(int i=0;i { + + private static final Logger logger = LoggerFactory.getLogger(PersonShareEOController.class); + + @Autowired + private IPersonShareEOService personShareEOService; + + @Autowired + private IUserEOService userEOService; + + @ApiOperation(value = "|PersonShareEO|推送分页查询") + @GetMapping("/page") + //@RequiresPermissions("person:personShare:page") + public ResponseMessage> page(PersonShareEOPage page) { + page.setValidFlag("0"); + page.setRecipientId(LoginUserUtil.getUserId()); + List rows = personShareEOService.queryByPage(page); + //加载分享人名称到前台 + if (rows != null && rows.size() > 0) { + for (PersonShareEO personShareEO : rows) { + String userid = personShareEO.getShareUserId(); + UserEO user = userEOService.selectByPrimaryKey(userid); + personShareEO.setShareUserId(user != null ? user.getUname() : null); + } + } + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|PersonShareEO|转发分页查询") + @GetMapping("/forwardPage") + //@RequiresPermissions("person:personShare:page") + public ResponseMessage> forwardPage(PersonShareEOPage page) throws Exception { + page.setFvalidFlag("0"); + page.setShareUserId(LoginUserUtil.getUserId()); + List rows = personShareEOService.queryByPage(page); + //加载转发人名称到前台 + if (rows != null && rows.size() > 0) { + for (PersonShareEO personShareEO : rows) { + String userid = personShareEO.getRecipientId(); + UserEO user = userEOService.selectByPrimaryKey(userid); + personShareEO.setShareUserId(user != null ? user.getUname() : null); + } + } + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|PersonShareEO|查询") + @GetMapping("") + //@RequiresPermissions("person:personShare:list") + public ResponseMessage> list(PersonShareEOPage page) throws Exception { + return Result.success(personShareEOService.queryByList(page)); + } + + @ApiOperation(value = "|PersonShareEO|详情") + @GetMapping("/{id}") + //@RequiresPermissions("person:personShare:get") + public ResponseMessage find(@PathVariable String id) throws Exception { + return Result.success(personShareEOService.getById(id)); + } + + /** + * 功能描述: 消息推送新增 + * + * @param: [personShareEO] + * @return: com.adc.da.util.http.ResponseMessage + * @auther: SYT + * @date: 2018/10/15 14:00 + */ + @ApiOperation(value = "|PersonShareEO|分享新增") + @PostMapping("/savePersonShare") + //@RequiresPermissions("person:personShare:create") + public ResponseMessage create(PersonShareEO personShareEO) throws Exception { + + String[] split = personShareEO.getRecipientId().split(","); +// 去掉重复选择的人 + List idList = Arrays.asList(split); + List idListNew = new ArrayList<>(); + for (String id : idList) { + if (!idListNew.contains(id)) { + idListNew.add(id); + } + } + for (String s : idListNew) { + //前台传递的值 resType recipientId RES_ID RES_TITLE + personShareEO.setRecipientId(s); + personShareEO.setId(UUIDUtils.randomUUID20()); + personShareEO.setShareUserId(LoginUserUtil.getUserId()); + personShareEO.setValidFlag(0); + personShareEO.setResUri("推送信息"); + personShareEO.setReadFlag(0); + personShareEO.setModifyTime(new Date()); + personShareEO.setCreationTime(new Date()); + System.out.println(personShareEO); + personShareEOService.save(personShareEO); + } + return Result.success(personShareEO); + } + + @ApiOperation(value = "|PersonShareEO|转发新增") + @PostMapping("/savePersonForward") + //@RequiresPermissions("person:personShare:create") + public ResponseMessage forwardCreate(PersonShareEO personShareEO) throws Exception { + + String[] split = personShareEO.getRecipientId().split(","); +// 去掉重复选择的人 + List idList = Arrays.asList(split); + List idListNew = new ArrayList<>(); + for (String id : idList) { + if (!idListNew.contains(id)) { + idListNew.add(id); + } + } + for (String s : idListNew) { + //前台传递的值 resType recipientId RES_ID RES_TITLE + personShareEO.setRecipientId(s); + personShareEO.setId(UUIDUtils.randomUUID20()); + personShareEO.setShareUserId(LoginUserUtil.getUserId()); + personShareEO.setFvalidFlag(0); + personShareEO.setResUri("转发消息"); + personShareEO.setReadFlag(0); + personShareEO.setModifyTime(new Date()); + personShareEO.setCreationTime(new Date()); + System.out.println(personShareEO); + personShareEOService.save(personShareEO); + } + return Result.success(personShareEO); + } + + @ApiOperation(value = "|PersonShareEO|修改") + @PostMapping("/updateReadFlag") + //@RequiresPermissions("person:personShare:update") + public ResponseMessage updateReadFlag(@RequestBody PersonShareEO personShareEO) throws Exception { + personShareEO.setReadFlag(1); + personShareEOService.updateById(personShareEO); + return Result.success(personShareEO); + } + + @ApiOperation(value = "|PersonShareEO|删除") + @DeleteMapping("/{id}") + //@RequiresPermissions("person:personShare:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + personShareEOService.removeById(id); + logger.info("delete from TS_PERSON_SHARE where id = {}", id); + return Result.success(); + } + + @ApiOperation(value = "批量删除") + @PostMapping("/deleteByIdList") + public ResponseMessage deleteByIdList(String ids){ + try { + String arr[] = ids.split(","); + List idList = Arrays.asList(arr); + personShareEOService.deleteByIdList(idList); + return Result.success("200","删除成功",true); + }catch (Exception e){ + logger.error(e.getMessage(),e); + return Result.error("400","删除失败"); + } + } + + @ApiOperation(value = "转发批量删除") + @PostMapping("/deleteByIdListForward") + public ResponseMessage deleteByIdListForward(String ids){ + try { + String arr[] = ids.split(","); + List idList = Arrays.asList(arr); + personShareEOService.deleteByIdListForward(idList); + return Result.success("200","删除成功",true); + }catch (Exception e){ + logger.error(e.getMessage(),e); + return Result.error("400","删除失败"); + } + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonCollectEODao.java b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonCollectEODao.java new file mode 100644 index 00000000..cd1fe6e9 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonCollectEODao.java @@ -0,0 +1,32 @@ +package com.adc.da.person.dao; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.entity.PersonCollectEO; +import com.adc.da.person.page.PersonCollectEOPage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * + *
    + * 功能:TS_PERSON_COLLECT PersonCollectEODao
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public interface PersonCollectEODao extends BaseMapper { + + List queryByList(BasePage page); + + int queryByCount(BasePage var1); + + List queryByPage(BasePage page); + + public List queryByPersonCollectPage(PersonCollectEOPage page); + + int queryByPersonCollectPageCount(PersonCollectEOPage page); + + int deleteByIdList(@Param("idList") List idList); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonConfEODao.java b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonConfEODao.java new file mode 100644 index 00000000..86b36d86 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonConfEODao.java @@ -0,0 +1,36 @@ +package com.adc.da.person.dao; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.entity.PersonConfEO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + * + *
    + * 功能:TS_PERSON_CONF PersonConfEODao
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public interface PersonConfEODao extends BaseMapper { + + List queryByList(BasePage page); + + int queryByCount(BasePage var1); + + List queryByPage(BasePage page); + +// List updateById(); +// List deleteByIdList(String ids); + +// List insertByList(PersonConfEO personConfEO); +// public void insertSelective(@Param("Id")); + + List insert1(PersonConfEO personConfEO); + + List selectByUserid(String userId); + + int updateConfByUserIdModuleCode(PersonConfEO personConfEO); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonCookiesEODao.java b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonCookiesEODao.java new file mode 100644 index 00000000..c425927f --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonCookiesEODao.java @@ -0,0 +1,60 @@ +package com.adc.da.person.dao; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.entity.PersonCookiesEO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * + *
    + * 功能:TS_PERSON_COOKIES PersonCookiesEODao
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public interface PersonCookiesEODao extends BaseMapper { + + List queryByList(BasePage page); + + int queryByCount(BasePage var1); + + List queryByPage(BasePage page); + + List queryByCookieType(String cookieType); + + List queryByUserId(String userId); + + int updateByUserId(PersonCookiesEO personCookiesEO); + + public void update(String id); + + + //删除我的浏览所有记录 + public void updateByAll(PersonCookiesEO personCookiesEO); + + //liwenxuan:标准法规被查阅次数:国内标准 + List MonthlyNumberOfDomesticStandards(@Param("visitTime") Date visitTime, @Param("cookieType") String cookieType); + + + //liwenxuan:数据报表的系统用户访问数量 + int sysUserVisitCount(Date visitTime); + /** + * + * 功能描述: + * + * @param: 当前时间 + * @return: 动态信息访问量top10 + * @auther: bayulei + * @date: 2018/10/11 20:40 + */ + ArrayList selectMsgConsultNumber(Date date); + + int countPageCookie(PersonCookiesEO personCookiesEO); + + int deleteByIdList(@Param("idList") List idList); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonMsgEODao.java b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonMsgEODao.java new file mode 100644 index 00000000..8e77d2aa --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonMsgEODao.java @@ -0,0 +1,36 @@ +package com.adc.da.person.dao; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.entity.PersonMsgEO; +import com.adc.da.person.page.PersonMsgEOPage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * + *
    + * 功能:TS_PERSON_MSG PersonMsgEODao
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public interface PersonMsgEODao extends BaseMapper { + + List queryByList(BasePage page); + + int queryByCount(BasePage var1); + + List queryByPage(BasePage page); + + public PersonMsgEO selectByInfoId(String id); + + public int selectByNotRed(PersonMsgEOPage page); + + void deleteByIdList(@Param("idList") List idList); + + void deletePersonMsgByIdList(@Param("idList") List idList); + + int markIsReadByBatch(@Param("idList") List idList); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonNoteEODao.java b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonNoteEODao.java new file mode 100644 index 00000000..68c57aad --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonNoteEODao.java @@ -0,0 +1,31 @@ +package com.adc.da.person.dao; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.entity.PersonNoteEO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + * + *
    + * 功能:TS_PERSON_NOTE PersonNoteEODao
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public interface PersonNoteEODao extends BaseMapper { + + List queryByList(BasePage page); + + int queryByCount(BasePage var1); + + List queryByPage(BasePage page); + + Integer updateByCollectId(PersonNoteEO personNoteEO); + + List queryByCollectId(PersonNoteEO personNoteEO); + + int update(PersonNoteEO personNoteEO); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonSearchEODao.java b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonSearchEODao.java new file mode 100644 index 00000000..2fe55c65 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonSearchEODao.java @@ -0,0 +1,25 @@ +package com.adc.da.person.dao; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.entity.PersonSearchEO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; + +/** + * + *
    + * 功能:TS_PERSON_SEARCH PersonSearchEODao
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public interface PersonSearchEODao extends BaseMapper { + + List queryByList(BasePage page); + + int queryByCount(BasePage var1); + + List queryByPage(BasePage page); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonShareEODao.java b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonShareEODao.java new file mode 100644 index 00000000..926fa370 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/dao/PersonShareEODao.java @@ -0,0 +1,29 @@ +package com.adc.da.person.dao; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.entity.PersonShareEO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * + *
    + * 功能:TS_PERSON_SHARE PersonShareEODao
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public interface PersonShareEODao extends BaseMapper { + + List queryByList(BasePage page); + + int queryByCount(BasePage var1); + + List queryByPage(BasePage page); + + void deleteByIdList(@Param("idList") List idList); + + void deleteByIdListForward(@Param("idList") List idList); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonCollectEO.java b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonCollectEO.java new file mode 100644 index 00000000..c7200d51 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonCollectEO.java @@ -0,0 +1,211 @@ +package com.adc.da.person.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 功能:TS_PERSON_COLLECT PersonCollectEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonCollectEO extends BaseEntity { + + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + + private Date creationTime; + private Integer validFlag; + private String collectResId; + private String collectInfoUri; + private String collectTitle; + private String collectType; + private String userId; + private String id; + + //追加字段 + private List noteList = new ArrayList<>(); + + + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • collectResId -> collect_res_id
  • + *
  • collectInfoUri -> collect_info_uri
  • + *
  • collectTitle -> collect_title
  • + *
  • collectType -> collect_type
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "collectResId": return "collect_res_id"; + case "collectInfoUri": return "collect_info_uri"; + case "collectTitle": return "collect_title"; + case "collectType": return "collect_type"; + case "userId": return "user_id"; + case "id": return "id"; + case "noteContent": return "noteContent"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • collect_res_id -> collectResId
  • + *
  • collect_info_uri -> collectInfoUri
  • + *
  • collect_title -> collectTitle
  • + *
  • collect_type -> collectType
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "collect_res_id": return "collectResId"; + case "collect_info_uri": return "collectInfoUri"; + case "collect_title": return "collectTitle"; + case "collect_type": return "collectType"; + case "user_id": return "userId"; + case "id": return "id"; + case "noteContent": return "noteContent"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public String getCollectResId() { + return this.collectResId; + } + + /** **/ + public void setCollectResId(String collectResId) { + this.collectResId = collectResId; + } + + /** **/ + public String getCollectInfoUri() { + return this.collectInfoUri; + } + + /** **/ + public void setCollectInfoUri(String collectInfoUri) { + this.collectInfoUri = collectInfoUri; + } + + /** **/ + public String getCollectTitle() { + return this.collectTitle; + } + + /** **/ + public void setCollectTitle(String collectTitle) { + this.collectTitle = collectTitle; + } + + /** **/ + public String getCollectType() { + return this.collectType; + } + + /** **/ + public void setCollectType(String collectType) { + this.collectType = collectType; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + public List getNoteList() { + return noteList; + } + + public void setNoteList(List noteList) { + this.noteList = noteList; + } + + @Override + public String toString() { + return "PersonCollectEO{" + + "modifyTime=" + modifyTime + + ", creationTime=" + creationTime + + ", validFlag=" + validFlag + + ", collectResId='" + collectResId + '\'' + + ", collectInfoUri='" + collectInfoUri + '\'' + + ", collectTitle='" + collectTitle + '\'' + + ", collectType='" + collectType + '\'' + + ", userId='" + userId + '\'' + + ", id='" + id + '\'' + + ", noteList=" + noteList + + '}'; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonConfEO.java b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonConfEO.java new file mode 100644 index 00000000..2d673838 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonConfEO.java @@ -0,0 +1,163 @@ +package com.adc.da.person.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 功能:TS_PERSON_CONF PersonConfEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonConfEO extends BaseEntity { + + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private Integer displaySeq; + private String moduleCode; + private String moduleName; + private String userId; + private String id; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • displaySeq -> display_seq
  • + *
  • moduleCode -> module_code
  • + *
  • moduleName -> module_name
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "displaySeq": return "display_seq"; + case "moduleCode": return "module_code"; + case "moduleName": return "module_name"; + case "userId": return "user_id"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • display_seq -> displaySeq
  • + *
  • module_code -> moduleCode
  • + *
  • module_name -> moduleName
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "display_seq": return "displaySeq"; + case "module_code": return "moduleCode"; + case "module_name": return "moduleName"; + case "user_id": return "userId"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Integer getDisplaySeq() { + return this.displaySeq; + } + + /** **/ + public void setDisplaySeq(Integer displaySeq) { + this.displaySeq = displaySeq; + } + + /** **/ + public String getModuleCode() { + return this.moduleCode; + } + + /** **/ + public void setModuleCode(String moduleCode) { + this.moduleCode = moduleCode; + } + + /** **/ + public String getModuleName() { + return this.moduleName; + } + + /** **/ + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonCookiesEO.java b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonCookiesEO.java new file mode 100644 index 00000000..bca3e60a --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonCookiesEO.java @@ -0,0 +1,188 @@ +package com.adc.da.person.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 功能:TS_PERSON_COOKIES PersonCookiesEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonCookiesEO extends BaseEntity { + + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + + private Date creationTime; + private Integer validFlag; + private String resUri; + private String resId; + private String resTitle; + private String cookieType; + private String userId; + private String id; + //新增字段 + private String resCount; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • resUri -> res_uri
  • + *
  • resId -> res_id
  • + *
  • resTitle -> res_title
  • + *
  • cookieType -> cookie_type
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "resUri": return "res_uri"; + case "resId": return "res_id"; + case "resTitle": return "res_title"; + case "cookieType": return "cookie_type"; + case "userId": return "user_id"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • res_uri -> resUri
  • + *
  • res_id -> resId
  • + *
  • res_title -> resTitle
  • + *
  • cookie_type -> cookieType
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "res_uri": return "resUri"; + case "res_id": return "resId"; + case "res_title": return "resTitle"; + case "cookie_type": return "cookieType"; + case "user_id": return "userId"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public String getResUri() { + return this.resUri; + } + + /** **/ + public void setResUri(String resUri) { + this.resUri = resUri; + } + + /** **/ + public String getResId() { + return this.resId; + } + + /** **/ + public void setResId(String resId) { + this.resId = resId; + } + + /** **/ + public String getResTitle() { + return this.resTitle; + } + + /** **/ + public void setResTitle(String resTitle) { + this.resTitle = resTitle; + } + + /** **/ + public String getCookieType() { + return this.cookieType; + } + + /** **/ + public void setCookieType(String cookieType) { + this.cookieType = cookieType; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + public String getResCount() { + return resCount; + } + + public void setResCount(String resCount) { + this.resCount = resCount; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonMsgEO.java b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonMsgEO.java new file mode 100644 index 00000000..a155e078 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonMsgEO.java @@ -0,0 +1,191 @@ +package com.adc.da.person.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 功能:TS_PERSON_MSG PersonMsgEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonMsgEO extends BaseEntity { + + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private Integer readFlag; + private String msgContent; + private String msgTitle; + private String userId; + private String id; + + // 发送预警判断是否出现在产品中时使用 + private String warningId; + private String warningType; + + // 与流程相关,流程编号 + private String processnum; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • readFlag -> read_flag
  • + *
  • msgContent -> msg_content
  • + *
  • msgTitle -> msg_title
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "readFlag": return "read_flag"; + case "msgContent": return "msg_content"; + case "msgTitle": return "msg_title"; + case "userId": return "user_id"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • read_flag -> readFlag
  • + *
  • msg_content -> msgContent
  • + *
  • msg_title -> msgTitle
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "read_flag": return "readFlag"; + case "msg_content": return "msgContent"; + case "msg_title": return "msgTitle"; + case "user_id": return "userId"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Integer getReadFlag() { + return this.readFlag; + } + + /** **/ + public void setReadFlag(Integer readFlag) { + this.readFlag = readFlag; + } + + /** **/ + public String getMsgContent() { + return this.msgContent; + } + + /** **/ + public void setMsgContent(String msgContent) { + this.msgContent = msgContent; + } + + public String getMsgTitle() { + return msgTitle; + } + + public void setMsgTitle(String msgTitle) { + this.msgTitle = msgTitle; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + public String getWarningId() { + return warningId; + } + + public void setWarningId(String warningId) { + this.warningId = warningId; + } + + public String getWarningType() { + return warningType; + } + + public void setWarningType(String warningType) { + this.warningType = warningType; + } + + public String getProcessnum() { + return processnum; + } + + public void setProcessnum(String processnum) { + this.processnum = processnum; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonNoteEO.java b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonNoteEO.java new file mode 100644 index 00000000..fe79d5f4 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonNoteEO.java @@ -0,0 +1,190 @@ +package com.adc.da.person.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 功能:TS_PERSON_NOTE PersonNoteEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonNoteEO extends BaseEntity { + + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creartionTime; + private Integer validFlag; + private String noteContent; + private String resType; + private String resId; + private String collectId; + private String userId; + private String id; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creartionTime -> creartion_time
  • + *
  • validFlag -> valid_flag
  • + *
  • noteContent -> note_content
  • + *
  • resType -> res_type
  • + *
  • resId -> res_id
  • + *
  • collectId -> collect_id
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creartionTime": return "creartion_time"; + case "validFlag": return "valid_flag"; + case "noteContent": return "note_content"; + case "resType": return "res_type"; + case "resId": return "res_id"; + case "collectId": return "collect_id"; + case "userId": return "user_id"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creartion_time -> creartionTime
  • + *
  • valid_flag -> validFlag
  • + *
  • note_content -> noteContent
  • + *
  • res_type -> resType
  • + *
  • res_id -> resId
  • + *
  • collect_id -> collectId
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creartion_time": return "creartionTime"; + case "valid_flag": return "validFlag"; + case "note_content": return "noteContent"; + case "res_type": return "resType"; + case "res_id": return "resId"; + case "collect_id": return "collectId"; + case "user_id": return "userId"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreartionTime() { + return this.creartionTime; + } + + /** **/ + public void setCreartionTime(Date creartionTime) { + this.creartionTime = creartionTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + public String getNoteContent() { + return noteContent; + } + + public void setNoteContent(String noteContent) { + this.noteContent = noteContent; + } + + /** **/ + public String getResType() { + return this.resType; + } + + /** **/ + public void setResType(String resType) { + this.resType = resType; + } + + /** **/ + public String getResId() { + return this.resId; + } + + /** **/ + public void setResId(String resId) { + this.resId = resId; + } + + /** **/ + public String getCollectId() { + return this.collectId; + } + + /** **/ + public void setCollectId(String collectId) { + this.collectId = collectId; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + @Override + public String toString() { + return "PersonNoteEO{" + + "modifyTime=" + modifyTime + + ", creartionTime=" + creartionTime + + ", validFlag=" + validFlag + + ", noteContent='" + noteContent + '\'' + + ", resType='" + resType + '\'' + + ", resId='" + resId + '\'' + + ", collectId='" + collectId + '\'' + + ", userId='" + userId + '\'' + + ", id='" + id + '\'' + + '}'; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonSearchEO.java b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonSearchEO.java new file mode 100644 index 00000000..6d4ab3df --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonSearchEO.java @@ -0,0 +1,131 @@ +package com.adc.da.person.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 功能:TS_PERSON_SEARCH PersonSearchEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonSearchEO extends BaseEntity { + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private String searchContent; + private String userId; + private String id; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • searchContent -> search_content
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "searchContent": return "search_content"; + case "userId": return "user_id"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • search_content -> searchContent
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "search_content": return "searchContent"; + case "user_id": return "userId"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public String getSearchContent() { + return this.searchContent; + } + + /** **/ + public void setSearchContent(String searchContent) { + this.searchContent = searchContent; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonShareEO.java b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonShareEO.java new file mode 100644 index 00000000..de3def17 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/entity/PersonShareEO.java @@ -0,0 +1,236 @@ +package com.adc.da.person.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 功能:TS_PERSON_SHARE PersonShareEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonShareEO extends BaseEntity { + + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + + private Date creationTime; + private Integer validFlag; + private Integer fvalidFlag; + private Integer readFlag; + private String resTitle; + private String resUri; + private String resId; + + private String resType; + private String shareUserId; + private String recipientId; + private String id; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • readFlag -> read_flag
  • + *
  • resTitle -> res_title
  • + *
  • resUri -> res_uri
  • + *
  • resId -> res_id
  • + *
  • resType -> res_type
  • + *
  • shareUserId -> share_user_id
  • + *
  • recipientId -> recipient_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "readFlag": return "read_flag"; + case "resTitle": return "res_title"; + case "resUri": return "res_uri"; + case "resId": return "res_id"; + case "resType": return "res_type"; + case "shareUserId": return "share_user_id"; + case "recipientId": return "recipient_id"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • read_flag -> readFlag
  • + *
  • res_title -> resTitle
  • + *
  • res_uri -> resUri
  • + *
  • res_id -> resId
  • + *
  • res_type -> resType
  • + *
  • share_user_id -> shareUserId
  • + *
  • recipient_id -> recipientId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "read_flag": return "readFlag"; + case "res_title": return "resTitle"; + case "res_uri": return "resUri"; + case "res_id": return "resId"; + case "res_type": return "resType"; + case "share_user_id": return "shareUserId"; + case "recipient_id": return "recipientId"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Integer getReadFlag() { + return this.readFlag; + } + + /** **/ + public void setReadFlag(Integer readFlag) { + this.readFlag = readFlag; + } + + /** **/ + public String getResTitle() { + return this.resTitle; + } + + /** **/ + public void setResTitle(String resTitle) { + this.resTitle = resTitle; + } + + /** **/ + public String getResUri() { + return this.resUri; + } + + /** **/ + public void setResUri(String resUri) { + this.resUri = resUri; + } + + /** **/ + public String getResId() { + return this.resId; + } + + /** **/ + public void setResId(String resId) { + this.resId = resId; + } + + /** **/ + public String getResType() { + return this.resType; + } + + /** **/ + public void setResType(String resType) { + this.resType = resType; + } + + /** **/ + public String getShareUserId() { + return this.shareUserId; + } + + /** **/ + public void setShareUserId(String shareUserId) { + this.shareUserId = shareUserId; + } + + /** **/ + public String getRecipientId() { + return this.recipientId; + } + + /** **/ + public void setRecipientId(String recipientId) { + this.recipientId = recipientId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + public Integer getFvalidFlag() { + return fvalidFlag; + } + + public void setFvalidFlag(Integer fvalidFlag) { + this.fvalidFlag = fvalidFlag; + } + + @Override + public String toString() { + return "PersonShareEO{" + + "modifyTime=" + modifyTime + + ", creationTime=" + creationTime + + ", validFlag=" + validFlag + + ", fvalidFlag=" + fvalidFlag + + ", readFlag=" + readFlag + + ", resTitle='" + resTitle + '\'' + + ", resUri='" + resUri + '\'' + + ", resId='" + resId + '\'' + + ", resType='" + resType + '\'' + + ", shareUserId='" + shareUserId + '\'' + + ", recipientId='" + recipientId + '\'' + + ", id='" + id + '\'' + + '}'; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/page/PersonCollectEOPage.java b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonCollectEOPage.java new file mode 100644 index 00000000..f2ee78b6 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonCollectEOPage.java @@ -0,0 +1,226 @@ +package com.adc.da.person.page; + + +import com.adc.da.base.page.BasePage; + +import java.util.ArrayList; +import java.util.List; + +/** + * 功能:TS_PERSON_COLLECT PersonCollectEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonCollectEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "LIKE"; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "LIKE"; + private String validFlag; + private String validFlagOperator = "="; + private String collectResId; + private String collectResIdOperator = "LIKE"; + private String collectInfoUri; + private String collectInfoUriOperator = "LIKE"; + private String collectTitle; + private String collectTitleOperator = "LIKE"; + private String collectType; + private String collectTypeOperator = "LIKE"; + private String userId; + private String userIdOperator = "="; + private String id; + private String idOperator = "LIKE"; + + private List collectTypeList = new ArrayList<>(); + + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getCollectResId() { + return this.collectResId; + } + + public void setCollectResId(String collectResId) { + this.collectResId = collectResId; + } + + public String getCollectResIdOperator() { + return this.collectResIdOperator; + } + + public void setCollectResIdOperator(String collectResIdOperator) { + this.collectResIdOperator = collectResIdOperator; + } + + public String getCollectInfoUri() { + return this.collectInfoUri; + } + + public void setCollectInfoUri(String collectInfoUri) { + this.collectInfoUri = collectInfoUri; + } + + public String getCollectInfoUriOperator() { + return this.collectInfoUriOperator; + } + + public void setCollectInfoUriOperator(String collectInfoUriOperator) { + this.collectInfoUriOperator = collectInfoUriOperator; + } + + public String getCollectTitle() { + return this.collectTitle; + } + + public void setCollectTitle(String collectTitle) { + this.collectTitle = collectTitle; + } + + public String getCollectTitleOperator() { + return this.collectTitleOperator; + } + + public void setCollectTitleOperator(String collectTitleOperator) { + this.collectTitleOperator = collectTitleOperator; + } + + public String getCollectType() { + return this.collectType; + } + + public void setCollectType(String collectType) { + this.collectType = collectType; + } + + public String getCollectTypeOperator() { + return this.collectTypeOperator; + } + + public void setCollectTypeOperator(String collectTypeOperator) { + this.collectTypeOperator = collectTypeOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + + public List getCollectTypeList() { + return collectTypeList; + } + + public void setCollectTypeList(List collectTypeList) { + this.collectTypeList = collectTypeList; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/page/PersonConfEOPage.java b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonConfEOPage.java new file mode 100644 index 00000000..ddd52ce2 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonConfEOPage.java @@ -0,0 +1,194 @@ +package com.adc.da.person.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_PERSON_CONF PersonConfEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonConfEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String displaySeq; + private String displaySeqOperator = "="; + private String moduleCode; + private String moduleCodeOperator = "="; + private String moduleName; + private String moduleNameOperator = "="; + private String userId; + private String userIdOperator = "="; + private String id; + private String idOperator = "="; + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getDisplaySeq() { + return this.displaySeq; + } + + public void setDisplaySeq(String displaySeq) { + this.displaySeq = displaySeq; + } + + public String getDisplaySeqOperator() { + return this.displaySeqOperator; + } + + public void setDisplaySeqOperator(String displaySeqOperator) { + this.displaySeqOperator = displaySeqOperator; + } + + public String getModuleCode() { + return this.moduleCode; + } + + public void setModuleCode(String moduleCode) { + this.moduleCode = moduleCode; + } + + public String getModuleCodeOperator() { + return this.moduleCodeOperator; + } + + public void setModuleCodeOperator(String moduleCodeOperator) { + this.moduleCodeOperator = moduleCodeOperator; + } + + public String getModuleName() { + return this.moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getModuleNameOperator() { + return this.moduleNameOperator; + } + + public void setModuleNameOperator(String moduleNameOperator) { + this.moduleNameOperator = moduleNameOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/page/PersonCookiesEOPage.java b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonCookiesEOPage.java new file mode 100644 index 00000000..03e9e6b5 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonCookiesEOPage.java @@ -0,0 +1,212 @@ +package com.adc.da.person.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_PERSON_COOKIES PersonCookiesEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonCookiesEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String resUri; + private String resUriOperator = "="; + private String resId; + private String resIdOperator = "="; + private String resTitle; + private String resTitleOperator = "="; + private String cookieType; + private String cookieTypeOperator = "="; + private String userId; + private String userIdOperator = "="; + private String id; + private String idOperator = "="; + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getResUri() { + return this.resUri; + } + + public void setResUri(String resUri) { + this.resUri = resUri; + } + + public String getResUriOperator() { + return this.resUriOperator; + } + + public void setResUriOperator(String resUriOperator) { + this.resUriOperator = resUriOperator; + } + + public String getResId() { + return this.resId; + } + + public void setResId(String resId) { + this.resId = resId; + } + + public String getResIdOperator() { + return this.resIdOperator; + } + + public void setResIdOperator(String resIdOperator) { + this.resIdOperator = resIdOperator; + } + + public String getResTitle() { + return this.resTitle; + } + + public void setResTitle(String resTitle) { + this.resTitle = resTitle; + } + + public String getResTitleOperator() { + return this.resTitleOperator; + } + + public void setResTitleOperator(String resTitleOperator) { + this.resTitleOperator = resTitleOperator; + } + + public String getCookieType() { + return this.cookieType; + } + + public void setCookieType(String cookieType) { + this.cookieType = cookieType; + } + + public String getCookieTypeOperator() { + return this.cookieTypeOperator; + } + + public void setCookieTypeOperator(String cookieTypeOperator) { + this.cookieTypeOperator = cookieTypeOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/page/PersonMsgEOPage.java b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonMsgEOPage.java new file mode 100644 index 00000000..28d6dcc3 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonMsgEOPage.java @@ -0,0 +1,213 @@ +package com.adc.da.person.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_PERSON_MSG PersonMsgEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonMsgEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "LIKE"; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "LIKE"; + private String validFlag; + private String validFlagOperator = "="; + private String readFlag; + private String readFlagOperator = "LIKE"; + private String msgContent; + private String msgContentOperator = "LIKE"; + private String msgTitle; + private String msgTitleOperator = "LIKE"; + private String userId; + private String userIdOperator = "="; + private String id; + private String idOperator = "LIKE"; + + private String processnum; + private String processnumOperator = "="; + + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getReadFlag() { + return this.readFlag; + } + + public void setReadFlag(String readFlag) { + this.readFlag = readFlag; + } + + public String getReadFlagOperator() { + return this.readFlagOperator; + } + + public void setReadFlagOperator(String readFlagOperator) { + this.readFlagOperator = readFlagOperator; + } + + public String getMsgContent() { + return this.msgContent; + } + + public void setMsgContent(String msgContent) { + this.msgContent = msgContent; + } + + public String getMsgContentOperator() { + return this.msgContentOperator; + } + + public void setMsgContentOperator(String msgContentOperator) { + this.msgContentOperator = msgContentOperator; + } + + public String getMsgTitle() { + return this.msgTitle; + } + + public void setMsgTitle(String msgTitle) { + this.msgTitle = msgTitle; + } + + public String getMsgTitleOperator() { + return this.msgTitleOperator; + } + + public void setMsgTitleOperator(String msgTitleOperator) { + this.msgTitleOperator = msgTitleOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + + public String getProcessnum() { + return processnum; + } + + public void setProcessnum(String processnum) { + this.processnum = processnum; + } + + public String getProcessnumOperator() { + return processnumOperator; + } + + public void setProcessnumOperator(String processnumOperator) { + this.processnumOperator = processnumOperator; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/page/PersonNoteEOPage.java b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonNoteEOPage.java new file mode 100644 index 00000000..e4a2509c --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonNoteEOPage.java @@ -0,0 +1,212 @@ +package com.adc.da.person.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_PERSON_NOTE PersonNoteEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonNoteEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + private String creartionTime; + private String creartionTime1; + private String creartionTime2; + private String creartionTimeOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String noteContent; + private String noteContentOperator = "="; + private String resType; + private String resTypeOperator = "="; + private String resId; + private String resIdOperator = "="; + private String collectId; + private String collectIdOperator = "="; + private String userId; + private String userIdOperator = "="; + private String id; + private String idOperator = "="; + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreartionTime() { + return this.creartionTime; + } + + public void setCreartionTime(String creartionTime) { + this.creartionTime = creartionTime; + } + + public String getCreartionTime1() { + return this.creartionTime1; + } + + public void setCreartionTime1(String creartionTime1) { + this.creartionTime1 = creartionTime1; + } + + public String getCreartionTime2() { + return this.creartionTime2; + } + + public void setCreartionTime2(String creartionTime2) { + this.creartionTime2 = creartionTime2; + } + + public String getCreartionTimeOperator() { + return this.creartionTimeOperator; + } + + public void setCreartionTimeOperator(String creartionTimeOperator) { + this.creartionTimeOperator = creartionTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getNoteContent() { + return this.noteContent; + } + + public void setNoteContent(String noteContent) { + this.noteContent = noteContent; + } + + public String getNoteContentOperator() { + return this.noteContentOperator; + } + + public void setNoteContentOperator(String noteContentOperator) { + this.noteContentOperator = noteContentOperator; + } + + public String getResType() { + return this.resType; + } + + public void setResType(String resType) { + this.resType = resType; + } + + public String getResTypeOperator() { + return this.resTypeOperator; + } + + public void setResTypeOperator(String resTypeOperator) { + this.resTypeOperator = resTypeOperator; + } + + public String getResId() { + return this.resId; + } + + public void setResId(String resId) { + this.resId = resId; + } + + public String getResIdOperator() { + return this.resIdOperator; + } + + public void setResIdOperator(String resIdOperator) { + this.resIdOperator = resIdOperator; + } + + public String getCollectId() { + return this.collectId; + } + + public void setCollectId(String collectId) { + this.collectId = collectId; + } + + public String getCollectIdOperator() { + return this.collectIdOperator; + } + + public void setCollectIdOperator(String collectIdOperator) { + this.collectIdOperator = collectIdOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/page/PersonSearchEOPage.java b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonSearchEOPage.java new file mode 100644 index 00000000..882ae627 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonSearchEOPage.java @@ -0,0 +1,158 @@ +package com.adc.da.person.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_PERSON_SEARCH PersonSearchEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonSearchEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "LIKE"; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "LIKE"; + private String validFlag; + private String validFlagOperator = "LIKE"; + private String searchContent; + private String searchContentOperator = "LIKE"; + private String userId; + private String userIdOperator = "LIKE"; + private String id; + private String idOperator = "LIKE"; + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getSearchContent() { + return this.searchContent; + } + + public void setSearchContent(String searchContent) { + this.searchContent = searchContent; + } + + public String getSearchContentOperator() { + return this.searchContentOperator; + } + + public void setSearchContentOperator(String searchContentOperator) { + this.searchContentOperator = searchContentOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/page/PersonShareEOPage.java b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonShareEOPage.java new file mode 100644 index 00000000..74c0021b --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/page/PersonShareEOPage.java @@ -0,0 +1,265 @@ +package com.adc.da.person.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_PERSON_SHARE PersonShareEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonShareEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "LIKE"; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "LIKE"; + private String validFlag; + private String validFlagOperator = "="; + private String fvalidFlag; + private String fvalidFlagOperator = "="; + private String readFlag; + private String readFlagOperator = "LIKE"; + private String resTitle; + private String resTitleOperator = "LIKE"; + private String resUri; + private String resUriOperator = "LIKE"; + private String resId; + private String resIdOperator = "LIKE"; + private String resType; + private String resTypeOperator = "LIKE"; + private String shareUserId; + private String shareUserIdOperator = "LIKE"; + private String recipientId; + private String recipientIdOperator = "="; + private String id; + private String idOperator = "LIKE"; + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getReadFlag() { + return this.readFlag; + } + + public void setReadFlag(String readFlag) { + this.readFlag = readFlag; + } + + public String getReadFlagOperator() { + return this.readFlagOperator; + } + + public void setReadFlagOperator(String readFlagOperator) { + this.readFlagOperator = readFlagOperator; + } + + public String getResTitle() { + return this.resTitle; + } + + public void setResTitle(String resTitle) { + this.resTitle = resTitle; + } + + public String getResTitleOperator() { + return this.resTitleOperator; + } + + public void setResTitleOperator(String resTitleOperator) { + this.resTitleOperator = resTitleOperator; + } + + public String getResUri() { + return this.resUri; + } + + public void setResUri(String resUri) { + this.resUri = resUri; + } + + public String getResUriOperator() { + return this.resUriOperator; + } + + public void setResUriOperator(String resUriOperator) { + this.resUriOperator = resUriOperator; + } + + public String getResId() { + return this.resId; + } + + public void setResId(String resId) { + this.resId = resId; + } + + public String getResIdOperator() { + return this.resIdOperator; + } + + public void setResIdOperator(String resIdOperator) { + this.resIdOperator = resIdOperator; + } + + public String getResType() { + return this.resType; + } + + public void setResType(String resType) { + this.resType = resType; + } + + public String getResTypeOperator() { + return this.resTypeOperator; + } + + public void setResTypeOperator(String resTypeOperator) { + this.resTypeOperator = resTypeOperator; + } + + public String getShareUserId() { + return this.shareUserId; + } + + public void setShareUserId(String shareUserId) { + this.shareUserId = shareUserId; + } + + public String getShareUserIdOperator() { + return this.shareUserIdOperator; + } + + public void setShareUserIdOperator(String shareUserIdOperator) { + this.shareUserIdOperator = shareUserIdOperator; + } + + public String getRecipientId() { + return this.recipientId; + } + + public void setRecipientId(String recipientId) { + this.recipientId = recipientId; + } + + public String getRecipientIdOperator() { + return this.recipientIdOperator; + } + + public void setRecipientIdOperator(String recipientIdOperator) { + this.recipientIdOperator = recipientIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + + public String getFvalidFlag() { + return fvalidFlag; + } + + public void setFvalidFlag(String fvalidFlag) { + this.fvalidFlag = fvalidFlag; + } + + public String getFvalidFlagOperator() { + return fvalidFlagOperator; + } + + public void setFvalidFlagOperator(String fvalidFlagOperator) { + this.fvalidFlagOperator = fvalidFlagOperator; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonCollectEOService.java b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonCollectEOService.java new file mode 100644 index 00000000..37ddc989 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonCollectEOService.java @@ -0,0 +1,21 @@ +package com.adc.da.person.service; + +import com.adc.da.person.entity.PersonCollectEO; +import com.adc.da.person.page.PersonCollectEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IPersonCollectEOService extends IService { + + public List queryByPage(PersonCollectEOPage page); + + public List queryByList(PersonCollectEOPage page); + + public List queryByPersonCollectPage(PersonCollectEOPage page); + + public String queryCollectByUserAndId(String collectResId); + + public int deleteByIdList(List idList); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonConfEOService.java b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonConfEOService.java new file mode 100644 index 00000000..3bf183e5 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonConfEOService.java @@ -0,0 +1,29 @@ +package com.adc.da.person.service; + +import com.adc.da.person.entity.PersonConfEO; +import com.adc.da.person.page.PersonConfEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public interface IPersonConfEOService extends IService { + + public List queryByPage(PersonConfEOPage page); + + public List queryByList(PersonConfEOPage page); + + public PersonConfEO saveBean(PersonConfEO personConfEO); + + public PersonConfEO insert1(PersonConfEO personConfEO ); + + public List selectByUserid(String userId); + + public Map selectPersonConfByUserid(String userId); + + public String[] updatePersonConfList(String[] kes,String userId); + + public List saveConfList(String userId); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonCookiesEOService.java b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonCookiesEOService.java new file mode 100644 index 00000000..1611fac7 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonCookiesEOService.java @@ -0,0 +1,34 @@ +package com.adc.da.person.service; + +import com.adc.da.person.entity.PersonCookiesEO; +import com.adc.da.person.page.PersonCookiesEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IPersonCookiesEOService extends IService { + + public List queryByPage(PersonCookiesEOPage page); + + public List queryByList(PersonCookiesEOPage page); + + + public PersonCookiesEO saveBean(PersonCookiesEO personCookiesEO); + + public void delete(String id); + + public List queryByCookieType(String cookieType); + + public List queryByUserId(String userId); + + + public int updateByUserId(PersonCookiesEO personCookiesEO); + + public void updateByAll(PersonCookiesEO personCookiesEO); + + public int countPageCookie(PersonCookiesEO personCookiesEO); + + public int deleteByIdList(List idList); + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonMsgEOService.java b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonMsgEOService.java new file mode 100644 index 00000000..2cd8495e --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonMsgEOService.java @@ -0,0 +1,24 @@ +package com.adc.da.person.service; + +import com.adc.da.person.entity.PersonMsgEO; +import com.adc.da.person.page.PersonMsgEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IPersonMsgEOService extends IService { + + public List queryByPage(PersonMsgEOPage page); + + public List queryByList(PersonMsgEOPage page); + + public PersonMsgEO selectByInfoId(String id); + + public int selectByNotRed(PersonMsgEOPage page); + + public void deleteByIdList(List idList); + + public void deletePersonMsgByIdList(List idList); + + public int markIsReadByBatch(List idList); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonNoteEOService.java b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonNoteEOService.java new file mode 100644 index 00000000..3d96c656 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonNoteEOService.java @@ -0,0 +1,25 @@ +package com.adc.da.person.service; + +import com.adc.da.person.entity.PersonNoteEO; +import com.adc.da.person.page.PersonNoteEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IPersonNoteEOService extends IService { + + + public List queryByPage(PersonNoteEOPage page); + + public List queryByList(PersonNoteEOPage page); + + public PersonNoteEO saveBean(PersonNoteEO personNoteEO); + + public void updateBeanById(PersonNoteEO personNoteEO); + + public void delete(String id); + + public Integer updateByCollectId(PersonNoteEO personNoteEO); + + public List queryByCollectId(PersonNoteEO personNoteEO); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonSearchEOService.java b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonSearchEOService.java new file mode 100644 index 00000000..2dba666e --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonSearchEOService.java @@ -0,0 +1,15 @@ +package com.adc.da.person.service; + +import com.adc.da.person.entity.PersonSearchEO; +import com.adc.da.person.page.PersonSearchEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IPersonSearchEOService extends IService { + + public List queryByPage(PersonSearchEOPage page); + + public List queryByList(PersonSearchEOPage page); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonShareEOService.java b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonShareEOService.java new file mode 100644 index 00000000..53125c08 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/IPersonShareEOService.java @@ -0,0 +1,22 @@ +package com.adc.da.person.service; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.entity.PersonShareEO; +import com.adc.da.person.page.PersonShareEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IPersonShareEOService extends IService { + + public List queryByPage(PersonShareEOPage page); + + public int queryByCount(BasePage page); + + public List queryByList(PersonShareEOPage page); + + public void deleteByIdList(List idList); + + public void deleteByIdListForward(List idList); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonCollectEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonCollectEOServiceImpl.java new file mode 100644 index 00000000..c8c256a4 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonCollectEOServiceImpl.java @@ -0,0 +1,94 @@ +package com.adc.da.person.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.dao.PersonCollectEODao; +import com.adc.da.person.dao.PersonNoteEODao; +import com.adc.da.person.entity.PersonCollectEO; +import com.adc.da.person.entity.PersonNoteEO; +import com.adc.da.person.page.PersonCollectEOPage; +import com.adc.da.person.service.IPersonCollectEOService; +import com.adc.da.util.LoginUserUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +/** + * + *
    + * 功能:TS_PERSON_COLLECT PersonCollectEOService
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("personCollectEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class PersonCollectEOServiceImpl extends ServiceImpl implements IPersonCollectEOService { + + + + @Autowired + private PersonNoteEODao personNoteEODao; + + + @Override + public List queryByPage(PersonCollectEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(PersonCollectEOPage page) { + return this.baseMapper.queryByList(page); + } + + public List queryByPersonCollectPage(PersonCollectEOPage page){ + page.setValidFlag("0"); + int ire = this.baseMapper.queryByPersonCollectPageCount(page); + page.getPager().setRowCount(ire); + List list = this.baseMapper.queryByPersonCollectPage(page); + for(int i =0;i notelist = personNoteEODao.queryByCollectId(personNoteEO); + list.get(i).setNoteList(notelist); + } + return list; + } + + /** + * @Author yangxuenan + * @Description 根据当前登录人及资源id查询收藏信息 + * Date 2018/10/12 14:31 + * @Param [collectResId] + * @return com.adc.da.person.entity.PersonCollectEO + **/ + public String queryCollectByUserAndId(String collectResId) { + PersonCollectEOPage page = new PersonCollectEOPage(); + String userId = LoginUserUtil.getUserId(); + page.setCollectResId(collectResId); + page.setUserId(userId); + page.setValidFlag("0"); + List getCollects = this.baseMapper.queryByList(page); + String collectId = ""; + if(getCollects != null){ + if(getCollects.size()>0){ + collectId = getCollects.get(0).getId(); + } + } + return collectId; + } + + public int deleteByIdList(List idList){ + return this.baseMapper.deleteByIdList(idList); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonConfEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonConfEOServiceImpl.java new file mode 100644 index 00000000..f4810480 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonConfEOServiceImpl.java @@ -0,0 +1,214 @@ +package com.adc.da.person.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.dao.PersonConfEODao; +import com.adc.da.person.entity.PersonConfEO; +import com.adc.da.person.page.PersonConfEOPage; +import com.adc.da.person.service.IPersonConfEOService; +import com.adc.da.sys.constant.PersonModelEnum; +import com.adc.da.util.UUIDUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + + +/** + * + *
    + * 功能:TS_PERSON_CONF PersonConfEOService
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("personConfEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class PersonConfEOServiceImpl extends ServiceImpl implements IPersonConfEOService { + + + @Override + public List queryByPage(PersonConfEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(PersonConfEOPage page) { + return this.baseMapper.queryByList(page); + } + + public PersonConfEO saveBean(PersonConfEO personConfEO){ + personConfEO.setCreationTime(new Date()); + personConfEO.setModifyTime(new Date()); + this.baseMapper.insert(personConfEO); + return personConfEO; + } + + public PersonConfEO insert1(PersonConfEO personConfEO ){ + if(personConfEO!=null){ + this.baseMapper.insert(personConfEO); + } + return personConfEO; + } + +// public List insertByList(PersonConfEO personConfEO){ +// if(CollectionUtils.isNotEmpty(personConfEO.)){ +// dao.updateByPrimaryKeySelective(personConfEO.getId()); +// for(){ +// +// } +// } +// return dao.insertByList(personConfEO); +// } + + +// public void updateById(PersonConfEO personConfEO){ +// personConfEO.setCreationTime(new Date()); +// personConfEO.setModifyTime(new Date()); +// dao.updateById(personConfEO); +// +// } + + +// public List selectByDisplay(){ +// return dao.selectByDisplay(); +// } + + +// public List deleteByIdList(String ids){ +// return dao.deleteByIdList(ids); +// } + + /** + * gaoyan + */ + public List selectByUserid(String userId){ + List list = this.baseMapper.selectByUserid(userId); + List listresult = new ArrayList<>(); + for(int i=0;i alllist = new ArrayList<>(); + for(PersonModelEnum type : PersonModelEnum.values()) { + HashMap map = new HashMap(); + map.put("label",type.getLable()); + map.put("key",type.getValue()); + if(type.getValue().equals(PersonModelEnum.PLATE.getValue())){ + map.put("disabled",true); + } else { + map.put("disabled",false); + } + alllist.add(map); + } + List listresult = new ArrayList<>(); + List list = this.baseMapper.selectByUserid(userId); + for(int i=0;i getPath(String code){ + String result = ""; + String name = ""; + if(code.equals(PersonModelEnum.COLLECT.getValue())){ + result= PersonModelEnum.COLLECT.getPath(); + name = PersonModelEnum.COLLECT.getLable(); + } else if(code.equals(PersonModelEnum.COOKIES.getValue())){ + result= PersonModelEnum.COOKIES.getPath(); + name = PersonModelEnum.COOKIES.getLable(); + }else if(code.equals(PersonModelEnum.MSG.getValue())){ + result= PersonModelEnum.MSG.getPath(); + name = PersonModelEnum.MSG.getLable(); + }else if(code.equals(PersonModelEnum.SHARE.getValue())){ + result= PersonModelEnum.SHARE.getPath(); + name = PersonModelEnum.SHARE.getLable(); + }else if(code.equals(PersonModelEnum.FEEDBACK.getValue())){ + result= PersonModelEnum.FEEDBACK.getPath(); + name = PersonModelEnum.FEEDBACK.getLable(); + }else if(code.equals(PersonModelEnum.INFO.getValue())){ + result= PersonModelEnum.INFO.getPath(); + name = PersonModelEnum.INFO.getLable(); + }else if(code.equals(PersonModelEnum.PLATE.getValue())){ + result= PersonModelEnum.PLATE.getPath(); + name = PersonModelEnum.PLATE.getLable(); + } + Map map = new HashMap(); + map.put("name",name); + map.put("path",result); + return map; + } + + /** + * gaoyan 个人登录后,个人板块修改 + * @param kes + * @param userId + * @return + */ + public String[] updatePersonConfList(String[] kes,String userId){ + PersonConfEO personConfEO = new PersonConfEO(); + List alllist = new ArrayList<>(); + for(PersonModelEnum type : PersonModelEnum.values()) { + alllist.add(type.getValue()); + } + for(int i=0;i saveConfList(String userId){ + List list = new ArrayList<>(); + int i=0; + for(PersonModelEnum type : PersonModelEnum.values()) { + PersonConfEO personConfEO = new PersonConfEO(); + personConfEO.setId(UUIDUtils.randomUUID20()); + personConfEO.setUserId(userId); + personConfEO.setValidFlag(0); + personConfEO.setModuleCode(type.getValue()); + personConfEO.setModuleName(type.getLable()); + personConfEO.setDisplaySeq(i++); + personConfEO.setModifyTime(new Date()); + personConfEO.setCreationTime(new Date()); + this.baseMapper.insert(personConfEO); + list.add(personConfEO); + } + return list; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonCookiesEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonCookiesEOServiceImpl.java new file mode 100644 index 00000000..24dc817c --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonCookiesEOServiceImpl.java @@ -0,0 +1,89 @@ +package com.adc.da.person.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.dao.PersonCookiesEODao; +import com.adc.da.person.entity.PersonCookiesEO; +import com.adc.da.person.page.PersonCookiesEOPage; +import com.adc.da.person.service.IPersonCookiesEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + + +/** + * + *
    + * 功能:TS_PERSON_COOKIES PersonCookiesEOService
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("personCookiesEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class PersonCookiesEOServiceImpl extends ServiceImpl implements IPersonCookiesEOService { + + + @Override + public List queryByPage(PersonCookiesEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(PersonCookiesEOPage page) { + return this.baseMapper.queryByList(page); + } + + public PersonCookiesEO saveBean(PersonCookiesEO personCookiesEO){ + personCookiesEO.setCreationTime(new Date()); + personCookiesEO.setModifyTime(new Date()); + this.baseMapper.insert(personCookiesEO); + return personCookiesEO; + } + + //删除个人浏览记录 + public void delete(String id){ + this.baseMapper.deleteById(id); + } + +// public void updateById(PersonCookiesEO personCookiesEO){ +// personCookiesEO.setCreationTime(new Date()); +// personCookiesEO.setModifyTime(new Date()); +// dao.updateByPrimaryKeySelective(personCookiesEO); +// } + + + public List queryByCookieType(String cookieType){ + return this.baseMapper.queryByCookieType(cookieType); + } + + public List queryByUserId(String userId){ + return this.baseMapper.queryByUserId(userId); + } + + public int updateByUserId(PersonCookiesEO personCookiesEO){ + return this.baseMapper.updateByUserId(personCookiesEO); + } + + //删除我的浏览所有记录 + public void updateByAll(PersonCookiesEO personCookiesEO){ + this.baseMapper.updateByAll(personCookiesEO); + } + + public int countPageCookie(PersonCookiesEO personCookiesEO){ + return this.baseMapper.countPageCookie(personCookiesEO); + } + + public int deleteByIdList(List idList){ + return this.baseMapper.deleteByIdList(idList); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonMsgEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonMsgEOServiceImpl.java new file mode 100644 index 00000000..75d83cfb --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonMsgEOServiceImpl.java @@ -0,0 +1,65 @@ +package com.adc.da.person.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.dao.PersonMsgEODao; +import com.adc.da.person.entity.PersonMsgEO; +import com.adc.da.person.page.PersonMsgEOPage; +import com.adc.da.person.service.IPersonMsgEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * + *
    + * 功能:TS_PERSON_MSG PersonMsgEOService
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("personMsgEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class PersonMsgEOServiceImpl extends ServiceImpl implements IPersonMsgEOService { + + + @Override + public List queryByPage(PersonMsgEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(PersonMsgEOPage page) { + return this.baseMapper.queryByList(page); + } + + public PersonMsgEO selectByInfoId(String id){ + return this.baseMapper.selectByInfoId(id); + } + + //查询未读动态 + public int selectByNotRed(PersonMsgEOPage page){ + return this.baseMapper.selectByNotRed(page); + } + + public void deleteByIdList(List idList){ + this.baseMapper.deleteByIdList(idList); + } + + public void deletePersonMsgByIdList(List idList) { + this.baseMapper.deletePersonMsgByIdList(idList); + } + + public int markIsReadByBatch(List idList){ + return this.baseMapper.markIsReadByBatch(idList); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonNoteEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonNoteEOServiceImpl.java new file mode 100644 index 00000000..def49626 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonNoteEOServiceImpl.java @@ -0,0 +1,77 @@ +package com.adc.da.person.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.dao.PersonNoteEODao; +import com.adc.da.person.entity.PersonNoteEO; +import com.adc.da.person.page.PersonNoteEOPage; +import com.adc.da.person.service.IPersonNoteEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + + +/** + *
    + * 功能:TS_PERSON_NOTE PersonNoteEOService
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("personNoteEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class PersonNoteEOServiceImpl extends ServiceImpl implements IPersonNoteEOService { + + @Override + public List queryByPage(PersonNoteEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(PersonNoteEOPage page) { + return this.baseMapper.queryByList(page); + } + + //刘寅楠 + public PersonNoteEO saveBean(PersonNoteEO personNoteEO) { + personNoteEO.setCreartionTime(new Date()); + personNoteEO.setModifyTime(new Date()); + this.baseMapper.insert(personNoteEO); + return personNoteEO; + } + + + public void updateBeanById(PersonNoteEO personNoteEO) { + personNoteEO.setCreartionTime(new Date()); + personNoteEO.setModifyTime(new Date()); + this.baseMapper.updateById(personNoteEO); + } + + + public void delete(String id) { + this.baseMapper.deleteById(id); + } + + + public Integer updateByCollectId(PersonNoteEO personNoteEO) { + personNoteEO.setModifyTime(new Date()); + return this.baseMapper.updateByCollectId(personNoteEO); + } + + + public List queryByCollectId(PersonNoteEO personNoteEO) { + + return this.baseMapper.queryByCollectId(personNoteEO); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonSearchEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonSearchEOServiceImpl.java new file mode 100644 index 00000000..f59b61f0 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonSearchEOServiceImpl.java @@ -0,0 +1,43 @@ +package com.adc.da.person.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.dao.PersonSearchEODao; +import com.adc.da.person.entity.PersonSearchEO; +import com.adc.da.person.page.PersonSearchEOPage; +import com.adc.da.person.service.IPersonSearchEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +/** + * + *
    + * 功能:TS_PERSON_SEARCH PersonSearchEOService
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("personSearchEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class PersonSearchEOServiceImpl extends ServiceImpl implements IPersonSearchEOService { + + @Override + public List queryByPage(PersonSearchEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(PersonSearchEOPage page) { + return this.baseMapper.queryByList(page); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonShareEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonShareEOServiceImpl.java new file mode 100644 index 00000000..93008101 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/person/service/impl/PersonShareEOServiceImpl.java @@ -0,0 +1,51 @@ +package com.adc.da.person.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.person.dao.PersonShareEODao; +import com.adc.da.person.entity.PersonShareEO; +import com.adc.da.person.page.PersonShareEOPage; +import com.adc.da.person.service.IPersonShareEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * + *
    + * 功能:TS_PERSON_SHARE PersonShareEOService
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("personShareEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class PersonShareEOServiceImpl extends ServiceImpl implements IPersonShareEOService { + + @Override + public List queryByPage(PersonShareEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(PersonShareEOPage page) { + return this.baseMapper.queryByList(page); + } + + public void deleteByIdList(List idList){ + this.baseMapper.deleteByIdList(idList); + } + + public void deleteByIdListForward(List idList){ + this.baseMapper.deleteByIdListForward(idList); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/constant/IsBelongEnum.java b/adc-da-sys/src/main/java/com/adc/da/sys/constant/IsBelongEnum.java new file mode 100644 index 00000000..b57b8cc5 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/constant/IsBelongEnum.java @@ -0,0 +1,22 @@ +package com.adc.da.sys.constant; + +public enum IsBelongEnum { + BELONG(1, "属于"); + + private int value; + private String label; + + IsBelongEnum(int value, String label) { + this.value = value; + this.label = label; + } + + public int getValue() { + return value; + } + + public String getLabel() { + return label; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/constant/PersonModelEnum.java b/adc-da-sys/src/main/java/com/adc/da/sys/constant/PersonModelEnum.java new file mode 100644 index 00000000..1e2fdc7a --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/constant/PersonModelEnum.java @@ -0,0 +1,31 @@ +package com.adc.da.sys.constant; + +public enum PersonModelEnum { + + INFO("INFO","个人信息","/info"), + PLATE("PLATE","个人板块","/plate"), + MSG("MSG","我的动态","/dynamics"), + COLLECT("COLLECT","我的收藏","/collection"), + SHARE("SHARE","我的推送","/push"), + COOKIES("COOKIES","我的浏览","/browsing"), + FEEDBACK("FEEDBACK","意见反馈","/feedback"); + + private String value; + private String lable; + private String path; + + private PersonModelEnum(String value, String lable, String path) { + this.value = value; + this.lable = lable; + this.path = path; + } + public String getValue() { + return value; + } + public String getLable() { + return lable; + } + public String getPath() { return path;} + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/constant/UserSourceEnum.java b/adc-da-sys/src/main/java/com/adc/da/sys/constant/UserSourceEnum.java new file mode 100644 index 00000000..3563b294 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/constant/UserSourceEnum.java @@ -0,0 +1,21 @@ +package com.adc.da.sys.constant; + +public enum UserSourceEnum { + + SSO_USER("SSO","SSO用户"),LOCAL_USER("LOCAL","本地用户"); + + private String value; + private String lable; + private UserSourceEnum(String value, String lable) { + this.value = value; + this.lable = lable; + } + public String getValue() { + return value; + } + public String getLable() { + return lable; + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/FeedbackInfoEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/FeedbackInfoEOController.java new file mode 100644 index 00000000..c8c33204 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/FeedbackInfoEOController.java @@ -0,0 +1,143 @@ +package com.adc.da.sys.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.entity.FeedbackInfoEO; +import com.adc.da.sys.page.FeedbackInfoEOPage; +import com.adc.da.sys.service.IFeedbackInfoEOService; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.UUIDUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + + +@RestController +@RequestMapping("/${restPath}/sys/feedbackInfo") +@Api(description = "|FeedbackInfoEO|") +public class FeedbackInfoEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(FeedbackInfoEOController.class); + + @Autowired + private IFeedbackInfoEOService feedbackInfoEOService; + + @ApiOperation(value = "|FeedbackInfoEO|意见反馈分页查找") + @GetMapping("/page") + /*@RequiresPermissions("sys:feedbackInfo:page")*/ + public ResponseMessage> page(FeedbackInfoEOPage page) throws Exception { + List rows = feedbackInfoEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|FeedbackInfoEO|当前登录人意见反馈分页查找") + @GetMapping("/pageSelf") + public ResponseMessage> pageSelf(FeedbackInfoEOPage page) throws Exception { + String selfId = LoginUserUtil.getUserId(); + page.setSelfId(selfId); + List rows = feedbackInfoEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|FeedbackInfoEO|查询") + @GetMapping("") +// @RequiresPermissions("sys:feedbackInfo:list") + public ResponseMessage> list(FeedbackInfoEOPage page) { + return Result.success(feedbackInfoEOService.queryByList(page)); + } + + @ApiOperation(value = "|FeedbackInfoEO|详情") + @GetMapping("/{id}") +// @RequiresPermissions("sys:feedbackInfo:get") + public ResponseMessage find(@PathVariable String id) { + return Result.success(feedbackInfoEOService.getById(id)); + } + + @ApiOperation(value = "|FeedbackInfoEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + @RequiresPermissions("sys:feedbackInfo:create") + public ResponseMessage create(@RequestBody FeedbackInfoEO feedbackInfoEO) throws Exception { + feedbackInfoEO.setId(UUIDUtils.randomUUID20()); + feedbackInfoEO.setCreationTime(new Date()); + feedbackInfoEO.setModifyTime(new Date()); + feedbackInfoEOService.save(feedbackInfoEO); + return Result.success(feedbackInfoEO); + } + + @ApiOperation(value = "|FeedbackInfoEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) +// @RequiresPermissions("sys:feedbackInfo:update") + public ResponseMessage update(@RequestBody FeedbackInfoEO feedbackInfoEO) throws Exception { + feedbackInfoEOService.updateById(feedbackInfoEO); + return Result.success(feedbackInfoEO); + } + + + + /** + * + * 功能描述: + * + * @auther: renxu + * @date: 2018/12/6 13:57 + */ + @ApiOperation(value = "|FeedbackInfoEO|删除") + @DeleteMapping("/del") +// @RequiresPermissions("sys:feedbackInfo:delete") + public ResponseMessage delete(String id) throws Exception { + feedbackInfoEOService.removeById(id); + return Result.success("1","删除成功",1); + } + /** + * + * 功能描述: 调用更新接口批量删除 + * + * @auther: renxu + * @date: 2018/12/6 13:57 + */ + @ApiOperation(value = "|SarTestItemEO|删除多条数据") + @DeleteMapping("/deleteArr") + // @RequiresPermissions("sys:feedbackInfo:deleteArr") + public ResponseMessage deleteArr(String ids) { + FeedbackInfoEOPage page = new FeedbackInfoEOPage(); + page.setIdlist(ids.split(",")); + feedbackInfoEOService.deleteByPrimaryKeyList(page); + return Result.success("1", "删除成功", 1); + } + + + + @ApiOperation(value = "保存功能") + @PostMapping("/save") +// @RequiresPermissions("sys:feedbackInfo:save") + public ResponseMessage insertFeedbackInfo(FeedbackInfoEO feedBackInfo) throws Exception { + String userId = LoginUserUtil.getUserId(); + FeedbackInfoEO feedbackInfoEO = new FeedbackInfoEO(); + feedbackInfoEO.setUserId(userId); + feedbackInfoEO.setId(UUIDUtils.randomUUID20()); + feedbackInfoEO.setFeedbackInfo(feedBackInfo.getFeedbackInfo()); + feedbackInfoEO.setValidFlag(0); + feedbackInfoEO.setModifyTime(new Date()); + feedbackInfoEO.setCreationTime(new Date()); + feedbackInfoEO.setContentText(feedBackInfo.getContentText()); + boolean result = feedbackInfoEOService.save(feedbackInfoEO); + if(!result){ + return Result.error("保存失败"); + } + return Result.success("true", "提交成功",feedbackInfoEO); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/LinkInfoEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/LinkInfoEOController.java new file mode 100644 index 00000000..67ec504c --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/LinkInfoEOController.java @@ -0,0 +1,110 @@ +package com.adc.da.sys.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.entity.LinkInfoEO; +import com.adc.da.sys.page.LinkInfoEOPage; +import com.adc.da.sys.service.ILinkInfoEOService; +import com.adc.da.util.UUIDUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +@RestController +@RequestMapping("/${restPath}/sys/linkInfo") +@Api(description = "|LinkInfoEO|") +public class LinkInfoEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(LinkInfoEOController.class); + + @Autowired + private ILinkInfoEOService linkInfoEOService; + + @ApiOperation(value = "|LinkInfoEO|分页查询") + @GetMapping("/page") +// @RequiresPermissions("sys:linkInfo:page") + public ResponseMessage> page(LinkInfoEOPage page) throws Exception { + page.setOrderBy("display_seq asc,id"); + List rows = linkInfoEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|LinkInfoEO|查询") + @GetMapping("/getLinkList") +// @RequiresPermissions("sys:linkInfo:list") + public ResponseMessage> list(LinkInfoEOPage page) throws Exception { + page.setOrderBy("display_seq asc,id"); + List getList = linkInfoEOService.queryByList(page); + if (getList != null && !getList.isEmpty()) { + for (LinkInfoEO linkInfoEO : getList) { + if (StringUtils.isEmpty(linkInfoEO.getNewWebSite())) { + linkInfoEO.setNewWebSite(linkInfoEO.getOldWebSite()); + } + } + } + return Result.success(getList); + } + + @ApiOperation(value = "|LinkInfoEO|详情") + @GetMapping("/{id}") + @RequiresPermissions("sys:linkInfo:get") + public ResponseMessage find(@PathVariable String id) throws Exception { + return Result.success(linkInfoEOService.getById(id)); + } + + @ApiOperation(value = "|LinkInfoEO|新增") + @PostMapping("/addLinkInfo") +// @RequiresPermissions("sys:linkInfo:save") + public ResponseMessage create(@RequestBody LinkInfoEO linkInfoEO) throws Exception { + linkInfoEO.setId(UUIDUtils.randomUUID20()); + linkInfoEO.setValidFlag(0); + linkInfoEO.setCreationTime(new Date()); + linkInfoEO.setModifyTime(new Date()); + linkInfoEOService.save(linkInfoEO); + return Result.success("0","新增成功",linkInfoEO); + } + + @ApiOperation(value = "|LinkInfoEO|修改") + @PutMapping("updateLinkInfo") +// @RequiresPermissions("sys:linkInfo:update") + public ResponseMessage update(@RequestBody LinkInfoEO linkInfoEO) throws Exception { + linkInfoEO.setModifyTime(new Date()); + linkInfoEOService.updateById(linkInfoEO); + return Result.success("0","修改成功",linkInfoEO); + } + + @ApiOperation(value = "|LinkInfoEO|删除") + @DeleteMapping("/{id}") + @RequiresPermissions("sys:linkInfo:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + linkInfoEOService.removeById(id); + logger.info("delete from TS_LINK_INFO where id = {}", id); + return Result.success(); + } + + @ApiOperation(value = "|LinkInfoEO|批量删除") + @PutMapping("deleteLinkInfo") +// @RequiresPermissions("sys:linkInfo:update") + public ResponseMessage deleteLinkInfo(String ids) throws Exception { + if (StringUtils.isNotEmpty(ids)) { + String[] idArr = ids.split(","); + List idList = Arrays.asList(idArr); + linkInfoEOService.deleteByIds(idList); + return Result.success("0","删除成功",null); + } else { + return Result.error("删除失败"); + } + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/LoginInfoEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/LoginInfoEOController.java new file mode 100644 index 00000000..62686b53 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/LoginInfoEOController.java @@ -0,0 +1,30 @@ +package com.adc.da.sys.controller; + +import com.adc.da.sys.service.ILoginInfoEOService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Auther: renxu + * @Date: 2018/10/25 20:47 + * @Description: + */ +@RestController +@Api(description="LoginInfoEO") +@RequestMapping("/${restPath}/sys/loginInfoEO") +public class LoginInfoEOController { + @Autowired + ILoginInfoEOService loginInfoEOService; + + @ApiOperation(value = "|Login|计数") + @GetMapping("/count") + public int count(){ + + return loginInfoEOService.count(); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/MenuEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/MenuEOController.java new file mode 100644 index 00000000..f0ba2844 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/MenuEOController.java @@ -0,0 +1,164 @@ +package com.adc.da.sys.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.adc.da.base.web.BaseController; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.entity.MenuEO; +import com.adc.da.sys.page.MenuEOPage; +import com.adc.da.sys.service.IMenuEOService; +import com.adc.da.sys.vo.MenuVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +@RestController +@RequestMapping("/${restPath}/sys/menu") +@Api(description = "菜单管理") +public class MenuEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(MenuEOController.class); + + @Autowired + private IMenuEOService menuEOService; + + + @ApiOperation(value = "|MenuEO|详情") + @GetMapping("/{id}") +// @RequiresPermissions("sys:menu:get") + public ResponseMessage find(@NotNull @PathVariable("id") String id) throws Exception { + return Result.success(BeanUtil.toBean(menuEOService.getById(id), MenuVO.class)); + } + + @ApiOperation(value = "|MenuEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) +// @RequiresPermissions("sys:menu:save") + public ResponseMessage create(@RequestBody MenuVO menuVO) throws Exception { + MenuEO menuEO = menuEOService.insertMenu(BeanUtil.toBean(menuVO,MenuEO.class)); + return Result.success(BeanUtil.toBean(menuEO,MenuVO.class)); + } + + @ApiOperation(value = "|MenuEO|列表 --> 角色对应的菜单") + @GetMapping + /*@RequiresPermissions("sys:menu:list")*/ + public ResponseMessage> list(String roleId) { + List menuVOs=new ArrayList<>(); + List menuEOS = menuEOService.findAll(); + if(menuEOS!=null && !menuEOS.isEmpty()){ + for(MenuEO source:menuEOS){ + menuVOs.add(BeanUtil.toBean(source,MenuVO.class)); + } + } + if(roleId != null && !"".equals(roleId)){ + for (MenuVO menuVO: menuVOs) { + if(menuEOService.isBelong(roleId, menuVO.getId())){ +// 这个字段已经修改 +// menuVO.setBelong(IsBelongEnum.BELONG.getValue()); + menuVO.setChecked(true); + }else{ + menuVO.setChecked(false); + } + } + } + return Result.success(menuVOs); + } + + @ApiOperation(value = "|MenuEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) +// @RequiresPermissions("sys:menu:update") + public ResponseMessage update(@RequestBody MenuVO menuVO) throws Exception { + menuEOService.updateMenu(menuVO); + return Result.success(menuVO); + } + + @ApiOperation(value = "|MenuEO|删除") + @DeleteMapping("/{ids}") +// @RequiresPermissions("sys:menu:delete") + public ResponseMessage delete(@NotNull @PathVariable("ids") String[] ids) throws Exception { + menuEOService.delete(ids); + logger.info("log===>delete from TS_MENU where ids = {}", ids); + return Result.success(); + } + + @ApiOperation(value = "用户菜单列表|MenuEO|") + @GetMapping("/listMenuByUserId/{userId}") +// @RequiresPermissions("sys:menu:listMenuByUserId") + public ResponseMessage> listMenuByUserId(@NotNull @PathVariable("userId") String userId) { + List resultList=new ArrayList<>(); + List menuEOS = menuEOService.listMenuEOByUserId(userId); + if(menuEOS!=null && !menuEOS.isEmpty()){ + for(MenuEO source:menuEOS){ + resultList.add(BeanUtil.toBean(source,MenuVO.class)); + } + } + return Result.success(resultList); + } + + + + @ApiOperation(value = "|MenuEO|查询全部权限菜单") + @GetMapping("/listAllMenu") + /*@RequiresPermissions("sys:menu:list")*/ + public ResponseMessage> listAllMenu(MenuEOPage page) throws Exception { + page.setValidFlag("0"); + page.setOrderBy("is_show,id"); + List getList = menuEOService.queryByAllMenu(page); + return Result.success(getList); + } + + @ApiOperation(value = "|MenuEO|新增") + @PostMapping("/addMenu") + public ResponseMessage addMenu(MenuEO menuEO) throws Exception { + return Result.success("0","新增成功",menuEOService.creatMenu(menuEO)); + } + + @ApiOperation(value = "|MenuEO|修改") + @PutMapping("/updateMenu") + public ResponseMessage updateMenu(MenuEO menuEO) throws Exception { + menuEO.setModifyTime(new Date()); + boolean countUpdate = menuEOService.updateById(menuEO); + if(countUpdate){ + return Result.success("0","修改成功",menuEO); + } else { + return Result.error("修改失败"); + } + } + + @ApiOperation(value = "|MenuEO|删除") + @PutMapping("/deleteMenuById") + /*@RequiresPermissions("lawss:sarMenu:delete")*/ + public ResponseMessage deleteMenuById(String id) throws Exception { + MenuEO menuEO = new MenuEO(); + menuEO.setId(id); + menuEO.setValidFlag(1); + boolean countSuc = menuEOService.updateById(menuEO); + if (countSuc) { + return Result.success("0","删除成功",menuEO); + } else { + return Result.error("删除失败"); + } + + } + + @ApiOperation(value = "|MenuEO|判断是否包含子节点") + @GetMapping("/judgeContentChild") + /*@RequiresPermissions("sys:menu:list")*/ + public ResponseMessage> judgeContentChild(String id) throws Exception { + MenuEOPage page = new MenuEOPage(); + page.setParentId(id); + page.setValidFlag("0"); + List getList = menuEOService.queryByAllMenu(page); + return Result.success(getList); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/OrgEORestController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/OrgEORestController.java new file mode 100644 index 00000000..11876aaf --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/OrgEORestController.java @@ -0,0 +1,352 @@ +package com.adc.da.sys.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.entity.OrgEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.page.OrgEOPage; +import com.adc.da.sys.service.IOrgEOService; +import com.adc.da.sys.service.IUserEOService; +import com.adc.da.sys.vo.OrgVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +@RestController +@RequestMapping("/${restPath}/sys/org") +@Api(description = "组织机构管理") +public class OrgEORestController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(OrgEORestController.class); + + @Autowired + private IOrgEOService orgEOService; + @Autowired + private IUserEOService userEOService; + + /** + * @Author liwenxuan + * @Description 需求可能会变成分页查找+模糊查找(根据类型/用户名称/角色名称/用户状态) + * @Date Administrator 2018/9/17 + * @Param [orgName] + * @return com.adc.da.util.http.ResponseMessage> + **/ + @ApiOperation(value = "组织机构列表|OrgEO|") + @GetMapping("/listOrgByOrgName") +// @RequiresPermissions("sys:org:listMenuByUserId") + public ResponseMessage> listOrgByOrgName(String orgName) { + List orgEOS = orgEOService.listOrgEOByOrgName(orgName); + List result =new ArrayList<>(); + if(orgEOS!=null && !orgEOS.isEmpty()){ + for(OrgEO source:orgEOS){ + result.add(BeanUtil.toBean(source,OrgVO.class)); + } + } + return Result.success(result); + } + + /** + * @Author liwenxuan + * @Description 新增组织机构(入参:部门名称+部门简介+部门表述(不必须填写)) + * 注:判斷條件在前台設置 + * 1.判断部门简称不能为空,不能已经存在 + * 2.先判断返回对象不为空,然后在进行判断shotname + * @Date Administrator 2018/9/17 + * @Param [orgVO] + * @return com.adc.da.util.http.ResponseMessage + **/ + @SuppressWarnings("unchecked") + @ApiOperation(value = "|OrgEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + @RequiresPermissions("sys:org:create") + public ResponseMessage create(@RequestBody OrgVO orgVO) throws Exception { + + return orgEOService.saveBean(BeanUtil.toBean(orgVO,OrgEO.class)); + + } + + + /** + * @Author liwenxuan + * @Description 修改组织机构(前台需要传入id) + * @Date Administrator 2018/9/17 + * @Param [orgVO] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|OrgEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + @RequiresPermissions("sys:org:update") + public ResponseMessage update(@RequestBody OrgVO orgVO) throws Exception { + + return orgEOService.updateBeanById(BeanUtil.toBean(orgVO,OrgEO.class)); + } + /** + * @Author liwenxuan + * @Description //详情,根据id查询组织机构 + * @Date Administrator 2018/9/17 + * @Param [id] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|OrgEO|详情") + @GetMapping("/{id}") +// @RequiresPermissions("sys:org:get") + public ResponseMessage getById(@NotNull @PathVariable("id") String id) throws Exception { + OrgVO orgVO = BeanUtil.toBean(orgEOService.getOrgEOById(id), OrgVO.class); + return Result.success(orgVO); + } + + /** + * @Author liwenxuan + * @Description 删除组织机构 + * 1.当前组织结构下面有子节点不可以删除(逻辑在service里面) + * @Date Administrator 2018/9/17 + * @Param [id] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|OrgEO|删除") + @DeleteMapping("") + @RequiresPermissions("sys:org:delete") + public ResponseMessage delete( String id) throws Exception { + return orgEOService.delete(id); + } + + + @ApiOperation(value = "|OrgEO|获取所有树结构") + @GetMapping("/getTree") +// @RequiresPermissions("sys:org:getTree") + public ResponseMessage> getTree(){ + List eos = orgEOService.selectOrgAllNode(); + return Result.success(eos); + } + + @ApiOperation(value = "|OrgEO|根据传入的orgId获取下层的部门树结构") + @GetMapping("/getChildDept") +// @RequiresPermissions("sys:org:getTree") + public ResponseMessage> getChildDept(String orgId){ + List eos = orgEOService.getChildDept(orgId); + return Result.success(eos); + } + + /** + * @Author liwenxuan + * @Description 删除指定用户的单个组织机构关联 + * @Date Administrator 2018/9/18 + * @Param [userId, orgId] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|OrgEO|删除组织机构下的用户关联") + @DeleteMapping("/{userId}/{orgId}") +// @RequiresPermissions("sys:org:delOrgOfUser") + public ResponseMessage delOrgRelatedUser(@NotNull @PathVariable("userId") String userId, @NotNull @PathVariable("orgId") String orgId){ + return orgEOService.delOrgRelatedUser(userId, orgId); + } + + + /** + * @Author liwenxuan + * @Description 前台传入类型(格式):[{"userId":"QJX2Z8E678","orgId":"5W2J4AQ8KA"}] + * @Date Administrator 2018/9/17 + * @Param [userOrgs] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|OrgEO|给用户设置组织机构") + @PostMapping("/addOrgRelateUsers") + @RequiresPermissions("sys:org:addOrgRelateUsers") + public ResponseMessage addOrgRelatedUser(String userOrgs){ + + return orgEOService.addOrgRelatedUser(userOrgs); + } + + /** + * @Author liwenxuan + * @Description 传入字段是用户表id的String字符串中间用逗号隔开 + * 1.删除的是用户和组织机构表中的数据(是真删除,关系表中没有validflag字段) + * @Date Administrator 2018/9/18 + * @Param [ids] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|OrgEO|批量删除组织机构下的一些用户") + @DeleteMapping("/deleteList/{idList}") + @RequiresPermissions("sys:org:delOrgRelatedUsers") + public ResponseMessage delOrgRelatedUsers(@NotNull @PathVariable("idList") String ids){ + String[] idList=ids.split(","); + if(idList!=null && idList.length>0){ + for(String id:idList){ + orgEOService.delOrgRelatedUserByUserId(id); + } + return Result.success("true","删除成功",1); + } + return Result.error("false","删除失败"); + } + /** + * @Author liwenxuan + * @Description 传入的参数是根节点的id和orgName + * @Date Administrator 2018/9/18 + * @Param [id, userCorpName] + * @return com.adc.da.util.http.ResponseMessage> + **/ + @ApiOperation(value = "|OrgEO|获取树结构") + @GetMapping("/findById") +// @RequiresPermissions("sys:org:findById") + public ResponseMessage> findById(String id, String orgName){ + List eos = orgEOService.findById(id, orgName); +// eos.addAll(eos); 此方法是把两个list合并到一起 + return Result.success(eos); + } + /** + * @Author liwenxuan + * @Description //根据角色名称获取组织机构用户树 + * @Date Administrator 2018/10/25 + * @Param [roleName] + * @return com.adc.da.util.http.ResponseMessage> + **/ + @ApiOperation(value = "|OrgEO|根据角色名称获取组织机构用户树") + @GetMapping("/getTreeByRole") + // @RequiresPermissions("sys:org:getTreeByRole") + public ResponseMessage> getTreeByRole(String roleName){ + Map> map = new HashMap<>(); + //String[] split = roleName.split(","); + //for(int i=0;i treeByRole = orgEOService.getTreeByRole(roleName); + //map.put(i,treeByRole); + //} + return Result.success("true","操作成功",treeByRole); + } + /** + * @Author liwenxuan + * @Description //根据用户获取其所在组织结构下某个角色的用户 + * @Date Administrator 2018/10/25 + * @Param [orgType, roleName] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|OrgEO|根据用户获取其所在组织结构下部门负责人或者科级负责人") + @GetMapping("/getLeaderByUserId") + public ResponseMessage getLeaderByUserId(String userId,String orgType,String roleName){ + List leaderByUserId = orgEOService.getLeaderByUserId(userId,orgType, roleName); + if(leaderByUserId==null || leaderByUserId.size() == 0){ + return Result.success("","此用户未分配组织机构或未获取当前用户所在组织机构的领导id",new OrgEO()); + }else if(leaderByUserId != null && leaderByUserId.size()>1){ + return Result.error("false","此部门或科级存在多个负责人",new OrgEO()); + } + return Result.success("true","操作成功",leaderByUserId.get(0)); + } + /** + * @Author liwenxuan + * @Description //根据角色名称和部门id获取组织结构用户树 + * @Date Administrator 2018/10/25 + * @Param [roleName, orgId] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|OrgEO|根据角色名称和部门id获取组织结构用户树") + @GetMapping("/getTreeByRoleAndOrgId") + public ResponseMessage> getTreeByRoleAndOrgId(String roleName,String orgId){ + List treeByRoleAndOrgId = orgEOService.getTreeByRoleAndOrgId(roleName, orgId); + if(treeByRoleAndOrgId == null){ + return Result.success("true","此部门下没有项目经理",treeByRoleAndOrgId); + } + return Result.success("true","操作成功",treeByRoleAndOrgId); + } + + /** + * @Author liwenxuan + * @Description //流程3:根据角色名称和部门id获取组织结构用户树 + * @Date Administrator 2018/10/25 + * @Param [roleName, orgId] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|OrgEO|流程3:根据角色名称和userId获取组织结构用户树") + @GetMapping("/getTreeByRoleAndOrgIdProcess3") + public ResponseMessage> getTreeByRoleAndOrgIdProcess3(String userId,String roleName){ + //根据用户ID获取用户信息及角色、组织机构信息 + UserEO userWithRoles = userEOService.getUserWithRoles(userId); + //判断此用户是否有对应的组织机构 + if(userWithRoles ==null || userWithRoles.getOrgEOList().size()==0){ + return Result.success("true","此用户没有对应的组织结构",null); + } + //根据角色名称和部门id获取组织结构用户树 + List treeByRoleAndOrgId = orgEOService.getTreeByRoleAndOrgId3(roleName, userWithRoles); + if(treeByRoleAndOrgId == null){ + return Result.success("true","没有此id对应的组织机构",treeByRoleAndOrgId); + } + return Result.success("true","操作成功",treeByRoleAndOrgId); + } + /** + * @Author liwenxuan + * @Description //根据orgType查询查询部及以上组织结构 + * @Date Administrator 2018/11/1 + * @Param [] + * @return java.util.List + **/ + @ApiOperation(value = "|OrgEO|根据orgType查询查询部及以上组织结构") + @GetMapping("/getIdsByorgType") + public ResponseMessage> getIdsByorgType(){ + List list = orgEOService.getIdsByorgType(); + return Result.success(list); + } + @ApiOperation(value = "|OrgEO|根据角色名称和部门id获取用户树") + @GetMapping("/getTreeByRoleAndOrgId1") + public ResponseMessage> getTreeByRoleAndOrgId1(OrgEOPage orgEOPage){ + List treeByRoleAndOrgId1 = orgEOService.getTreeByRoleAndOrgId1(orgEOPage.getRoleName(), orgEOPage.getOrgId()); + + if(treeByRoleAndOrgId1== null || treeByRoleAndOrgId1.isEmpty()){ + return Result.success(getPageInfo(orgEOPage.getPager(), treeByRoleAndOrgId1)); + } + List list = new ArrayList(); + //yuzhong 流程过来的要全展示 + if(!"1".equals(orgEOPage.getProcessFlag())) { + int pageNo = (orgEOPage.getPage() - 1) * orgEOPage.getPageSize(); //每页的起始索引 + Integer sum = treeByRoleAndOrgId1.size(); //记录总数 + orgEOPage.getPager().setRowCount(sum); + if (pageNo + orgEOPage.getPageSize() > sum) { + list = treeByRoleAndOrgId1.subList(pageNo, sum); + } else { + list = treeByRoleAndOrgId1.subList(pageNo, pageNo + orgEOPage.getPageSize()); + } + }else{ + list = treeByRoleAndOrgId1; + } + return Result.success(getPageInfo(orgEOPage.getPager(), list)); + } + + + @ApiOperation(value = "(流程4)根据角色名称和部门id获取人员") + @GetMapping("/getManagerByOrgId") + public ResponseMessage> getManagerByOrgId(String roleName,String orgId){ + List orgEOList = orgEOService.getManagerByOrgId(roleName,orgId); + return Result.success(orgEOList); + } + + @ApiOperation(value = "根据角色id获取组织机构用户树") + @GetMapping("/getTreeByRoleId") + public ResponseMessage> getTreeByRoleId(String roleId){ + Map> map = new HashMap<>(); + List treeByRole = orgEOService.getTreeByRole2(roleId); + return Result.success(treeByRole); + } + + @ApiOperation(value = "|OrgEO|获取子公司结构") + @GetMapping("/getOrgRootTree") +// @RequiresPermissions("sys:org:getTree") + public ResponseMessage> getOrgRootTree()throws Exception{ + + + List list = orgEOService.getOrgRootTree(); + return Result.success(list); + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/RoleEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/RoleEOController.java new file mode 100644 index 00000000..6012f1b3 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/RoleEOController.java @@ -0,0 +1,294 @@ +package com.adc.da.sys.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.adc.da.base.page.Pager; +import com.adc.da.base.web.BaseController; +import com.adc.da.common.ValidFlagEnum; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.constant.IsBelongEnum; +import com.adc.da.sys.entity.RoleEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.entity.UserRoleEO; +import com.adc.da.sys.page.RoleEOPage; +import com.adc.da.sys.service.IRoleEOService; +import com.adc.da.sys.service.IUserEOService; +import com.adc.da.sys.vo.RoleVO; +import com.adc.da.util.LoginUserUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +@RestController +@RequestMapping("/${restPath}/sys/role") +@Api(description = "角色管理") +public class RoleEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(RoleEOController.class); + + @Autowired + private IRoleEOService roleEOService; + + @Autowired + private IUserEOService userService; + + @ApiOperation(value = "|RoleEO|分页查询") + @GetMapping("/page") +// @RequiresPermissions("sys:role:page") + public ResponseMessage> page(Integer pageNo, Integer pageSize, String roleName, String useFlag, String roleType) throws Exception { + RoleEOPage page = new RoleEOPage(); + if (pageNo != null) { + page.setPage(pageNo); + } + if (pageSize != null) { + page.setPageSize(pageSize); + } + if (StringUtils.isNotEmpty(roleName)) { + page.setName("%"+roleName+"%"); + page.setNameOperator("LIKE"); + } + if(StringUtils.isNotEmpty(useFlag)){ + page.setUseFlag(useFlag); + } + if(StringUtils.isNotEmpty(roleType)){ + page.setRoleType(roleType); + } + + page.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()+""); + page.setPager(new Pager()); + page.setOrderBy("modify_time desc"); + List rows = roleEOService.queryByPage(page); + //此处加载用户名称到前台 + if(rows!=null && rows.size()>0){ + for(RoleEO role:rows){ + String userId = role.getOperUser(); + if(userId!=null && !userId.isEmpty()){ + UserEO user = userService.selectByPrimaryKey(userId); + role.setOperUserName(user!=null?user.getUname():null); + } + } + } +// PageInfo mapPage = beanMapper.mapPage(getPageInfo(page.getPager(), rows), RoleVO.class); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|RoleEO|详情") + @GetMapping("/{id}") +// @RequiresPermissions("sys:role:get") + public ResponseMessage getById(@NotNull @PathVariable("id") String id) throws Exception { + RoleEO roleEO = roleEOService.getRoleWithMenus(id); + return Result.success(BeanUtil.toBean(roleEO, RoleVO.class)); + } + + @ApiOperation(value = "|RoleEO|列表") + @GetMapping("") + //@RequiresPermissions("sys:role:list") + public ResponseMessage> list(String userId) { + RoleVO setRole = new RoleVO(); + setRole.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()); + List roleEOList = roleEOService.findAll(setRole); + List resultList =new ArrayList<>(); + if(roleEOList!=null && !roleEOList.isEmpty()){ + for(RoleEO source:roleEOList){ + RoleVO roleVO = BeanUtil.toBean(source, RoleVO.class); + roleVO.setMenusstr(source.getMenuEOIdList()); + roleVO.setMenus(source.getMenuEOList()); + resultList.add(roleVO); + } + } + if (userId != null) { + for (RoleVO roleVO : resultList) { + if (roleEOService.isBelong(userId, roleVO.getRid())) { + roleVO.setBelong(IsBelongEnum.BELONG.getValue()); + } + } + } + return Result.success(resultList); + } + + @ApiOperation(value = "|RoleEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + @RequiresPermissions("sys:role:create") + public ResponseMessage create(@RequestBody RoleVO roleVO) throws Exception { + //TODO 此处调用了登录接口数据 暂时注销 + roleVO.setOprUser(LoginUserUtil.getUserId()); + if(StringUtils.isEmpty(roleVO.getName())){ + return Result.error("角色名称不能为空"); + } + RoleEO map = BeanUtil.toBean(roleVO, RoleEO.class); + logger.info("获取角色相关信息:"+map.getName()); + //判断角色名称不能重复,返回0代表角色名称已经存在,否则进行插入操作返回1 + int i = roleEOService.saveBean(map); + if(i<=0){ + return Result.error("角色名称已经存在"); + } + return Result.success("","新增成功",1); + } + + @ApiOperation(value = "|RoleEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + @RequiresPermissions("sys:role:update") + public ResponseMessage update(@RequestBody RoleVO roleVO) throws Exception { + if(StringUtils.isEmpty(roleVO.getName())){ + return Result.error("角色名称不能为空"); + } + RoleEO map = BeanUtil.toBean(roleVO, RoleEO.class); + //判断角色名称不能重复,返回0代表角色名称已经存在,否则进行修改操作返回1 + int i = roleEOService.updateByPrimaryKeySelective(map); + if(i<=0){ + return Result.error("角色名称已经存在"); + } + return Result.success("","操作成功",1); + + } + + @ApiOperation(value = "|RoleEO|删除") + @DeleteMapping("/{id}") + @RequiresPermissions("sys:role:delete") + public ResponseMessage delete(@NotNull @PathVariable("id") String id) throws Exception { + List list = roleEOService.getUserRoleListByRoleId(id); + // 如果角色有对应用户,则不允许删除 + if (list != null && list.size() > 0) { + return Result.error( "该角色有对应用户,不能删除"); + } + roleEOService.delete(id); + return Result.success("true","操作成功",""); + } + /** + * @Author liwenxuan + * @Description 入参格式修改了,TODO 暂时注掉了中间那段代码 + * @Date Administrator 2018/9/24 + * @Param [ids] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|RoleEO|批量删除") + @DeleteMapping("/deleteList") + @RequiresPermissions("sys:role:deleteList") + public ResponseMessage deleteList( String ids) throws Exception { + String[] idList=ids.split(","); + String saveOrignRoles = ""; + String saveUserRoles = ""; + if(idList!=null && idList.length>0){ + for(String id:idList){ + //原始角色不能删除:orgId查询defaultFlag + RoleEO roleWithMenus = roleEOService.getRoleWithMenus(id); + List list = roleEOService.getUserRoleListByRoleId(id); + // 如果角色有对应用户,则不允许删除 + if(roleWithMenus !=null && roleWithMenus.getIsDefault().equals(1)){ + saveOrignRoles += roleWithMenus.getName() + " "; + } else if (list != null && list.size() > 0) { + saveUserRoles += roleWithMenus.getName() + " "; + } else { + roleEOService.delete(id); + } + /* String loginUserId = SecurityUtils.getSubject().getSession().getAttribute(RequestUtils.LOGIN_USER_ID).toString(); + if(loginUserId != null || loginUserId != ""){ + UserEO getUser = userService.selectRoleMessageByPrimaryKey(loginUserId); + *//*if(getUser != null && ! ("3").equals(getUser.getRoleExtInfo())){ + RoleEO getRole = roleEOService.selectByPrimaryKey(id); + if(!("").equals(getRole.getExtInfo()) && getRole.getExtInfo() != null){ + if(! getRole.getExtInfo().equals(getUser.getRoleExtInfo())){ + return Result.error("您无权限删除该角色"); + } + } + + }*//* + }*/ + } + } + if(StringUtils.isEmpty(saveOrignRoles) && StringUtils.isEmpty(saveUserRoles)){ + return Result.success("true","删除成功",""); + } else { + String msg = ""; + if(StringUtils.isNotEmpty(saveOrignRoles) && StringUtils.isEmpty(saveUserRoles)){ + msg = saveOrignRoles + "为原始角色,不能删除。其余删除成功"; + } else if (StringUtils.isEmpty(saveOrignRoles) && StringUtils.isNotEmpty(saveUserRoles)) { + msg = saveUserRoles + "下有对应用户,不能删除。其余删除成功"; + }else{ + msg = saveOrignRoles + "为原始角色,不能删除。"+ saveUserRoles + "下有对应用户,不能删除。其余删除成功"; + } + return Result.success("true",msg,""); + } + + } + + + @ApiOperation(value = "配置角色菜单|RoleEO|") + @PostMapping("/saveRoleMenu") +// @RequiresPermissions("sys:role:saveRoleMenu") + public ResponseMessage saveRoleMenu(@RequestBody RoleVO roleVO) throws Exception { + String roleIds = roleVO.getRid(); + if(roleIds!=null && roleIds.length()>0){ + String[] roleIdList=roleIds.split(","); + for(int i=0;i> findAll(String userId) { + RoleVO setRole = new RoleVO(); + List roleEOList = roleEOService.findAll(setRole); + List resultList =new ArrayList<>(); + if(roleEOList!=null && !roleEOList.isEmpty()){ + for(RoleEO source:roleEOList){ + RoleVO roleVO = BeanUtil.toBean(source, RoleVO.class); + roleVO.setMenusstr(source.getMenuEOIdList()); + roleVO.setMenus(source.getMenuEOList()); + resultList.add(roleVO); + } + } + return Result.success(resultList); + } + + @ApiOperation(value = "|RoleEO|判断当前登录人是否有购买流程权限") + @GetMapping("/judgeBuyRoleForSearch") + public ResponseMessage judgeBuyRoleForSearch(RoleVO roleVO){ + // 查询“工程师”,“超级管理员”角色id + String roleIdEngin = ""; + String roleIdAdmin = ""; + List getRoleIdEngins = roleEOService.selectByNameAndId(null,"工程师"); + if(getRoleIdEngins != null && getRoleIdEngins.size()>0){ + roleIdEngin = getRoleIdEngins.get(0).getId(); + } + List getRoleIdAdmins = roleEOService.selectByNameAndId(null,"工程师"); + if(getRoleIdAdmins != null && getRoleIdAdmins.size()>0){ + roleIdAdmin = getRoleIdAdmins.get(0).getId(); + } + // 查询当前登录人角色 + String roleIds = roleVO.getRoleIds(); + String[] roleArr = roleIds.split(","); + List roleIdList = Arrays.asList(roleArr); + if(roleIdList != null && roleIdList.size()>0){ + if(roleIdList.contains(roleIdEngin) || roleIdList.contains(roleIdAdmin)){ + return Result.success(roleIds); + } else { + return Result.error("noPermission"); + } + } + return Result.success(); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/RoleSarMenuEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/RoleSarMenuEOController.java new file mode 100644 index 00000000..490569dd --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/RoleSarMenuEOController.java @@ -0,0 +1,153 @@ +package com.adc.da.sys.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.entity.RoleSarMenuEO; +import com.adc.da.sys.page.RoleSarMenuEOPage; +import com.adc.da.sys.service.IRoleSarMenuEOService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +@RestController +@RequestMapping("/${restPath}/sys/roleSarMenu") +@Api(description = "|RoleSarMenuEO|") +public class RoleSarMenuEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(RoleSarMenuEOController.class); + + @Autowired + private IRoleSarMenuEOService roleSarMenuEOService; + + @ApiOperation(value = "|RoleSarMenuEO|分页查询") + @GetMapping("/page") + @RequiresPermissions("sys:roleSarMenu:page") + public ResponseMessage> page(RoleSarMenuEOPage page) throws Exception { + List rows = roleSarMenuEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|RoleSarMenuEO|查询") + @GetMapping("") + /*@RequiresPermissions("sys:roleSarMenu:list")*/ + public ResponseMessage> list(RoleSarMenuEOPage page) throws Exception { + List getList = roleSarMenuEOService.queryByList(page); + //数据中没有根节点的配置 + //查询根目录节点id + List rootIds = roleSarMenuEOService.selectSarMenuRoots(); + if(rootIds != null && !rootIds.isEmpty()){ + for(RoleSarMenuEO roleSarMenuEO : rootIds){ + roleSarMenuEO.setRoleId(page.getRoleId()); + roleSarMenuEO.setSarMenuId(roleSarMenuEO.getId()); + if (!"BUSINESS_STAND".equals(roleSarMenuEO.getSorDivide())) { + getList.add(roleSarMenuEO); + } + } + } + return Result.success(getList); + } + + @ApiOperation(value = "|RoleSarMenuEO|详情") + @GetMapping("/{roleId}") + @RequiresPermissions("sys:roleSarMenu:get") + public ResponseMessage find(@PathVariable String roleId) throws Exception { + return Result.success(roleSarMenuEOService.getById(roleId)); + } + + @ApiOperation(value = "|RoleSarMenuEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + @RequiresPermissions("sys:roleSarMenu:save") + public ResponseMessage create(@RequestBody RoleSarMenuEO roleSarMenuEO) throws Exception { + roleSarMenuEOService.save(roleSarMenuEO); + return Result.success(roleSarMenuEO); + } + + @ApiOperation(value = "|RoleSarMenuEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + @RequiresPermissions("sys:roleSarMenu:update") + public ResponseMessage update(@RequestBody RoleSarMenuEO roleSarMenuEO) throws Exception { + roleSarMenuEOService.updateById(roleSarMenuEO); + return Result.success(roleSarMenuEO); + } + + @ApiOperation(value = "|RoleSarMenuEO|删除") + @DeleteMapping("/{roleId}") + @RequiresPermissions("sys:roleSarMenu:delete") + public ResponseMessage delete(@PathVariable String roleId) throws Exception { + roleSarMenuEOService.removeById(roleId); + logger.info("delete from TS_ROLE_SAR_MENU where roleId = {}", roleId); + return Result.success(); + } + + + @ApiOperation(value = "|RoleSarMenuEO|绑定角色所拥有的节点 id") + @PostMapping("/bindRoleSarMenuId") + public ResponseMessage bindRoleSarMenuId(@RequestBody RoleSarMenuEO roleSarMenuEO) throws Exception { + List sarMenuIds = roleSarMenuEO.getSarMenuIds(); + roleSarMenuEOService.removeById(roleSarMenuEO.getRoleId()); + //查询根目录节点id + List rootIds = roleSarMenuEOService.selectSarMenuRoots(); + String inlandLawsId = ""; + String inlandStandId = ""; + String foreignStandId = ""; + String foreignLawsId = ""; + String BussId = ""; + for (RoleSarMenuEO sarMenuEO :rootIds){ + if(sarMenuEO.getSorDivide().equals("INLAND_LAWS")){ + //国内政策 + inlandLawsId = sarMenuEO.getId(); + + } + if(sarMenuEO.getSorDivide().equals("INLAND_STAND")){ + //国内标准法规 + inlandStandId = sarMenuEO.getId(); + + } + if(sarMenuEO.getSorDivide().equals("FOREIGN_STAND")){ + //国外标准法规 + foreignStandId = sarMenuEO.getId(); + + } + if(sarMenuEO.getSorDivide().equals("FOREIGN_LAWS")){ + //国外政策 + foreignLawsId = sarMenuEO.getId(); + + } + if(sarMenuEO.getSorDivide().equals("BUSINESS_STAND")){ + //国内政策 + BussId = sarMenuEO.getId(); + + } + } + //保存角色的配置,去除根节点 + for (String menuId : sarMenuIds){ + if( menuId.equals(inlandLawsId) || menuId.equals(inlandStandId) || menuId.equals(foreignStandId) || menuId.equals(foreignLawsId) ){ + continue; + } + RoleSarMenuEO sarMenuEO = new RoleSarMenuEO(); + sarMenuEO.setRoleId(roleSarMenuEO.getRoleId()); + sarMenuEO.setSarMenuId(menuId); + roleSarMenuEOService.save(sarMenuEO); + } + return Result.success(); + } + + /* @ApiOperation(value = "|RoleSarMenuEO|查询角色拥有的节点id") + @GetMapping("/{roleId}") + public ResponseMessage findRoleSarMenu(@PathVariable String roleId) throws Exception { + List roleSarMenuEOS = roleSarMenuEOService.findRoleSarMenu(roleId); + return Result.success(roleSarMenuEOService.selectByPrimaryKey(roleId)); + }*/ + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserConfigEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserConfigEOController.java new file mode 100644 index 00000000..b2f155c2 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserConfigEOController.java @@ -0,0 +1,98 @@ +package com.adc.da.sys.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.entity.UserConfigEO; +import com.adc.da.sys.page.UserConfigEOPage; +import com.adc.da.sys.service.IUserConfigEOService; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.UUIDUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; + +@RestController +@RequestMapping("/${restPath}/person/userConfig") +@Api(description = "|UserConfigEO|") +public class UserConfigEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(UserConfigEOController.class); + + @Autowired + private IUserConfigEOService userConfigEOService; + + @ApiOperation(value = "|UserConfigEO|分页查询") + @GetMapping("/page") + //@RequiresPermissions("person:userConfig:page") + public ResponseMessage> page(UserConfigEOPage page) throws Exception { + List rows = userConfigEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|UserConfigEO|查询") + @GetMapping("") + //@RequiresPermissions("person:userConfig:list") + public ResponseMessage> list(UserConfigEOPage page) throws Exception { + return Result.success(userConfigEOService.queryByList(page)); + } + + @ApiOperation(value = "|UserConfigEO|详情") + @GetMapping("/{id}") + //@RequiresPermissions("person:userConfig:get") + public ResponseMessage find(@PathVariable String id) throws Exception { + return Result.success(userConfigEOService.getById(id)); + } + + @ApiOperation(value = "|UserConfigEO|新增") + @PostMapping("/createUserConfig") + //@RequiresPermissions("person:userConfig:save") + public ResponseMessage create(@RequestBody UserConfigEO userConfigEO) throws Exception { + UserConfigEOPage page = new UserConfigEOPage(); + page.setUserId(LoginUserUtil.getUserId()); + page.setConfigType("PAGE_SIZE"); + List userConfigEOList = userConfigEOService.queryByList(page); + if(userConfigEOList.size()>0){ + userConfigEO.setModifyTime(new Date()); + userConfigEO.setId(userConfigEOList.get(0).getId()); + userConfigEOService.updateById(userConfigEO); + } + else { + String userId = LoginUserUtil.getUserId(); + userConfigEO.setId(UUIDUtils.randomUUID20()); + userConfigEO.setUserId(userId); + userConfigEO.setValidFlag(0); + userConfigEO.setCreationTime(new Date()); + userConfigEO.setModifyTime(new Date()); + userConfigEOService.save(userConfigEO); + } + + return Result.success(userConfigEO); + } + + @ApiOperation(value = "|UserConfigEO|修改") + @PutMapping("/updateUserConfig") + //@RequiresPermissions("person:userConfig:update") + public ResponseMessage update(@RequestBody UserConfigEO userConfigEO) throws Exception { + userConfigEO.setModifyTime(new Date()); + userConfigEOService.updateById(userConfigEO); + return Result.success(userConfigEO); + } + + @ApiOperation(value = "|UserConfigEO|删除") + @DeleteMapping("/{id}") + //@RequiresPermissions("person:userConfig:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + userConfigEOService.removeById(id); + logger.info("delete from TS_USER_CONFIG where id = {}", id); + return Result.success(); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserEOController.java new file mode 100644 index 00000000..77f627d8 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserEOController.java @@ -0,0 +1,557 @@ +package com.adc.da.sys.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.adc.da.base.page.Pager; +import com.adc.da.base.web.BaseController; +import com.adc.da.common.ValidFlagEnum; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.entity.RoleEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.page.UserEOPage; +import com.adc.da.sys.service.IOrgEOService; +import com.adc.da.sys.service.IRoleEOService; +import com.adc.da.sys.service.IUserEOService; +import com.adc.da.sys.service.IUserInfoEOService; +import com.adc.da.sys.vo.UserVO; +import com.adc.da.util.LoginUserUtil; +import com.alibaba.fastjson.JSON; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@RestController +@RequestMapping("/${restPath}/sys/user") +@Api(description = "用户管理") +public class UserEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(UserEOController.class); + + @Autowired + private IUserEOService userEOService; + @Autowired + private IOrgEOService orgEOService; + + @Autowired + IUserInfoEOService userInfoEOService; + @Autowired + IRoleEOService roleEOService; + + @ApiOperation(value = "|UserEO|详情") + @GetMapping("/{id}") +// @RequiresPermissions("sys:user:get") + public ResponseMessage getById(@NotNull @PathVariable("id") String id) throws Exception { + UserEO userEO = userEOService.getUserWithRoles(id); + UserVO userVO= new UserVO(); + if(userEO!=null){ + userVO = BeanUtil.toBean(userEO,UserVO.class); + userVO.setRoles(userEO.getRoleEOList()); + userVO.setOrgsstr(userEO.getOrgIdList()); + userVO.setOrgs(userEO.getOrgEOList()); + userVO.setPassword(userEO.getPassword()); + } + return Result.success(userVO); + } + + /** + * @return com.adc.da.util.http.ResponseMessage> + * @Author liwenxuan + * @Description 用户分页 + * @Date Administrator 2018/9/27 + * @Param [pageNo, pageSize, orgId, userType, uname, roleName, disableFlag] + **/ + @ApiOperation(value = "|UserEO|分页查询") + @GetMapping("") + //@RequiresPermissions("sys:user:UserInfoPage") + public ResponseMessage> UserInfoPage(Integer pageNo, Integer pageSize, String orgId, String userType, String uname, String roleId, String disableFlag, String roleName, String account, String processFlag) throws Exception { + UserEOPage page = new UserEOPage(); + if (pageNo != null) { + page.setPage(pageNo); + } + if (pageSize != null) { + page.setPageSize(pageSize); + }else{ + page.setPageSize(Integer.MAX_VALUE); + } + if (StringUtils.isNotEmpty(uname)) { + page.setUname(uname); + } + if (StringUtils.isNotEmpty(userType)) { + page.setUserType(userType); + } + if (StringUtils.isNotEmpty(disableFlag)) { + page.setDisableFlag(disableFlag); + } + if (StringUtils.isNotEmpty(orgId)) { + page.setOrgId(orgId); + } + if (StringUtils.isNotEmpty(roleId)) { + page.setRoleId(roleId); + } + if (StringUtils.isNotEmpty(roleName)) { + page.setRoleName(roleName); + } + if (StringUtils.isNotEmpty(account)) { + page.setAccount(account); + } +// page.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue() + ""); + page.setPager(new Pager()); + List userEOs = userEOService.queryUserInfoByPage(page); +// 根据用户id查找用户的多个角色并放到roleIdList中 + if(processFlag==null || processFlag.isEmpty()) { + for (UserEO userEO : userEOs) { + UserEO userWithRoles = userEOService.getUserWithRolesAll(userEO.getUsid());//查询用户及用户所对应的角色 + if (userWithRoles != null) { + List roleEOList = userWithRoles.getRoleEOList(); + for (RoleEO role : roleEOList) { + String rolename = role.getName(); + String roleId1 = role.getId(); + userEO.getRoleNameList().add(rolename); + userEO.getRoleIdList().add(roleId1); + } + } + } + } + return Result.success(getPageInfo(page.getPager(), userEOs)); + } + + + @ApiOperation(value = "|UserEO|新增") + @PostMapping(value = "/addUser") +// @RequiresPermissions("sys:user:save") + public ResponseMessage create(String userStr) throws Exception { + if (StringUtils.isNotEmpty(userStr)) { + // 解密 + userStr = new StringBuilder(userStr).reverse().toString(); + userStr = new String(Base64.decodeBase64(userStr), StandardCharsets.UTF_8); + System.out.println(userStr); + // 转为对象 +// JSONObject jsonObject=JSONObject.fromObject(userStr); + UserEO userEO = JSON.parseObject(userStr, UserEO.class); +// 修改用户信息 + UserVO userVO= new UserVO(); + if(userEO!=null){ + userVO = BeanUtil.toBean(userEO,UserVO.class); + userVO.setRoles(userEO.getRoleEOList()); + userVO.setOrgsstr(userEO.getOrgIdList()); + userVO.setOrgs(userEO.getOrgEOList()); + userVO.setPassword(userEO.getPassword()); + } + ResponseMessage userVOResponseMessage = userEOService.createOrModifyIf(userVO); + if (userVOResponseMessage.getData() == null) { + return userVOResponseMessage; + } + userEO.setOperUser(LoginUserUtil.getUserId()); + UserEO userEORes = userEOService.saveBean(userEO); + if (userEORes == null) { + return Result.error("操作失败"); + } + //TODO 往个人板块插入数据失败 +// List personConfEOS = personConfEOService.saveConfList(userEO.getUsid()); + return Result.success("true", "操作成功", null); + } else { + return Result.error("操作失败"); + } + + } + + /** + * @return com.adc.da.util.http.ResponseMessage + * @Author liwenxuan + * @Description 修改时同时对用户表、用户角色表关联表、用户组织机构关联表信息修改 + * 前台必传参数:usid、orgId、roleIdList + * @Date Administrator 2018/9/26 + * @Param [userVO] + **/ + @ApiOperation(value = "|UserEO|修改") + @PutMapping(value = "/updateUser") +// @RequiresPermissions("sys:user:modifyUser") + public ResponseMessage update(String userStr) throws Exception { + if (StringUtils.isNotEmpty(userStr)) { + // 解密 + userStr = new StringBuilder(userStr).reverse().toString(); + userStr = new String(Base64.decodeBase64(userStr), StandardCharsets.UTF_8); + // 转为对象 + UserEO userEO = JSON.parseObject(userStr, UserEO.class); +// 修改用户信息 + UserVO userVO= new UserVO(); + if(userEO!=null){ + userVO = BeanUtil.toBean(userEO,UserVO.class); + userVO.setRoles(userEO.getRoleEOList()); + userVO.setOrgsstr(userEO.getOrgIdList()); + userVO.setOrgs(userEO.getOrgEOList()); + userVO.setPassword(userEO.getPassword()); + } + ResponseMessage userVOResponseMessage = userEOService.createOrModifyIf(userVO); + if (userVOResponseMessage.getData() == null) { + return userVOResponseMessage; + } else { + userEO.setRoleIdList(userEO.getRoleIdList()); + userEOService.updateUserEOInfo(userEO); + return Result.success("true", "操作成功", null); + } + } else { + return Result.error("操作失败"); + } + } + + @ApiOperation(value = "|UserEO|删除") + @DeleteMapping("/{ids}") + @RequiresPermissions("sys:user:delete") + public ResponseMessage delete(@NotNull @PathVariable("ids") String[] ids) throws Exception { + int i = userEOService.delete(Arrays.asList(ids)); + if (i == 0) { + return Result.error("删除失败"); + } + return Result.success("true", "删除成功", ""); + } + + @ApiOperation(value = "配置用户角色|UserEO|") + @PostMapping("/saveUserRole") + /*@RequiresPermissions("sys:user:saveUserRole")*/ + public ResponseMessage saveUserRole(@RequestBody UserVO userVO) { + //查询部门负责人id + String mainRoleId=""; + String userIds = userVO.getUsid(); + String[] userIdList = userIds.split(","); + List getRoleId = roleEOService.selectByNameAndId(null,"部门负责人"); + if(getRoleId!=null && getRoleId.size()>0){ + mainRoleId = getRoleId.get(0).getId(); + if(userVO.getRoleIdList().contains(mainRoleId) && userIds != null && userIdList.length>1){ + return Result.error("同一部门下仅允许设置一个部门负责人"); + } else if (userVO.getRoleIdList().contains(mainRoleId) && userIds != null && userIdList.length>0 && userIdList.length<=1) { + List getUser = userEOService.getUserEOBySpecRole(userVO.getOrgId(),userIdList[0]); + if(getUser!=null && getUser.size()>0){ + return Result.error("此部门下,拥有部门负责人角色的用户已经存在"); + } + } + } + if (userIds != null && userIds.length() > 0 && userVO.getRoleIdList()!=null && !userVO.getRoleIdList().isEmpty()) { + // 此处需要维护用户角色--单个用户可以拥有多个角色 + List roleIdList = userVO.getRoleIdList(); + if(roleIdList!=null && !roleIdList.isEmpty()){ + for(String roleId:roleIdList){ + if (StringUtils.isNotEmpty(roleId)) { + // 判断是否为科级负责人,科级负责人角色只能在科级部门 + int SectionFlag = StringUtils.equals(roleId,"YK5P33FZ29TPN2VPDP6E")?1:0; +// int i1 = roleEOService.querySectionCount(roleId); + // 判断是否为部门负责人,部门负责人角色只能在部级部门 +// int i2 = roleEOService.querySectionCount1(roleId); + int SectionFlagOfB = StringUtils.equals(roleId,"GQSBB2N3KURYYC6AUFER")?1:0; + if (SectionFlag == 1) { + // 所选部门角色是否为科级负责人 + // for 循环判断每一个人的部门 + String[] orgIdList = userVO.getOrgId().split(","); + for (int i = 0; i < orgIdList.length; i++) { + String orgId = orgIdList[i]; + UserVO userParame = new UserVO(); + userParame.setOrgId(orgId); + int orgNamebyOrgId = orgEOService.getOrgNamebyOrgId(userParame); + if (orgNamebyOrgId != 1) { + return Result.error("科级负责任人只能创建在科级部门"); + } + } + } + if (SectionFlagOfB == 1) { + // 所选部门角色是否为部门级 + String[] orgIdList = userVO.getOrgId().split(","); + for (int i = 0; i < orgIdList.length; i++) { + String orgId = orgIdList[i]; + UserVO userParame = new UserVO(); + userParame.setOrgId(orgId); + int orgNamebyOrgId = orgEOService.getOrgNamebyOrgId(userParame); + if (orgNamebyOrgId != 2) { + return Result.error("部门负责任人只能创建在部门级部门"); + } + } + } + } + } + } +/* String roleIds = userVO.getRoleId(); + String[] roleIDs = roleIds.split(","); + for (int ii = 0; ii < roleIDs.length; ii++) { + if (StringUtils.isNotEmpty(roleIDs[ii])) { + // 判断是否为科级负责人,科级负责人角色只能在科级部门 + int i1 = roleEOService.querySectionCount(roleIDs[ii]); + // 判断是否为部门负责人,部门负责人角色只能在部级部门 + int i2 = roleEOService.querySectionCount1(roleIDs[ii]); + if (i1 == 1) { + // 所选部门角色是否为科级负责人 + // for 循环判断每一个人的部门 + String[] orgIdList = userVO.getOrgId().split(","); + for (int i = 0; i < orgIdList.length; i++) { + String orgId = orgIdList[i]; + UserVO userParame = new UserVO(); + userParame.setOrgId(orgId); + int orgNamebyOrgId = orgEOService.getOrgNamebyOrgId(userParame); + if (orgNamebyOrgId != 1) { + return Result.error("科级负责任人只能创建在科级部门"); + } + } + } else if (i2 == 1) { + // 所选部门角色是否为部门级 + String[] orgIdList = userVO.getOrgId().split(","); + for (int i = 0; i < orgIdList.length; i++) { + String orgId = orgIdList[i]; + UserVO userParame = new UserVO(); + userParame.setOrgId(orgId); + int orgNamebyOrgId = orgEOService.getOrgNamebyOrgId(userParame); + if (orgNamebyOrgId != 2) { + return Result.error("部门负责任人只能创建在部门级部门"); + } + } + } + } + }*/ + for (int i = 0; i < userIdList.length; i++) { + String userId = userIdList[i]; + UserEO user=new UserEO(); + user.setUsid(userId); + user.setRoleIdList(userVO.getRoleIdList()); + userEOService.saveUserRole(user); + } + } else { + return Result.error("未设置角色信息"); + } + return Result.success("", "操作成功", userVO); + } + + + /** + * @return com.adc.da.util.http.ResponseMessage> + * @Author liwenxuan + * @Description //组织机构分页: + * 根据组织机构和用户的关联表进行中orgId字段作为判断条件进行查询 + * @Date Administrator 2018/9/25 + * @Param [page] + **/ + @ApiOperation(value = "|UserEO|组织机构查询用户") + @GetMapping("/findByOrg") + // @RequiresPermissions("sys:user:queryByOrg") + public ResponseMessage> queryByOrg(UserEOPage page) { + /* if (StringUtils.isNotBlank(page.getUname())) + page.setUname("%" + page.getUname() + "%");*/ +// page.setDisableFlag(UserDisableFlagEnum.disableFlag_TRUE.getValue()); + List userEOs = userEOService.queryUserInfoByPage(page); + PageInfo pageInfo = getPageInfo(page.getPager(), userEOs); + // 根据用户id查找用户的多个角色并放到roleIdList中 + List resultList =new ArrayList<>(); + for (UserEO userEO : userEOs) { + UserEO userWithRoles = userEOService.getUserWithRolesAll(userEO.getUsid());//查询用户及用户所对应的角色 + if(userWithRoles != null){ + List roleEOList = userWithRoles.getRoleEOList(); + for (RoleEO role : roleEOList) { + String rolename = role.getName(); + String roleId1 = role.getId(); + userEO.getRoleNameList().add(rolename); + userEO.getRoleIdList().add(roleId1); + } + } + UserVO userVO = BeanUtil.toBean(userEO, UserVO.class); + userVO.setRoles(userEO.getRoleEOList()); + userVO.setOrgsstr(userEO.getOrgIdList()); + userVO.setOrgs(userEO.getOrgEOList()); + resultList.add(userVO); + } + PageInfo resultPage =new PageInfo<>(); + resultPage.setCount(pageInfo.getCount()); + resultPage.setList(resultList); + resultPage.setOrderBy(pageInfo.getOrderBy()); + resultPage.setPageCount(pageInfo.getPageCount()); + resultPage.setPageNo(pageInfo.getPageNo()); + resultPage.setPageSize(pageInfo.getPageSize()); +// PageInfo mapPage = beanMapper.mapPage(getPageInfo(page.getPager(), userEOs), UserVO.class); + return Result.success(resultPage); + } + + /** + * @return com.adc.da.util.http.ResponseMessage> + * @Author liwenxuan + * @Description 查找未分配组织结构的用户的行数 + * @Date Administrator 2018/9/21 + * @Param [page] + **/ + @ApiOperation(value = "|UserEO|查询未配置组织机构的用户") + @GetMapping("/findBySetOrg") + // @RequiresPermissions("sys:user:findBySetOrg") + public ResponseMessage> findBySetOrg(UserEOPage page) { + page.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue() + ""); + // page.setPager(new Pager()); + List userInfoByPage = userEOService.findUserInfoByPage(page); + PageInfo pageInfo = getPageInfo(page.getPager(), userInfoByPage); + List resultList =new ArrayList<>(); + for (UserEO userEO : userInfoByPage) { + UserEO userWithRoles = userEOService.getUserWithRolesAll(userEO.getUsid());//查询用户及用户所对应的角色 + if(userWithRoles != null){ + List roleEOList = userWithRoles.getRoleEOList(); + for (RoleEO role : roleEOList) { + String rolename = role.getName(); + String roleId1 = role.getId(); + userEO.getRoleNameList().add(rolename); + userEO.getRoleIdList().add(roleId1); + } + UserVO userVO = BeanUtil.toBean(userEO, UserVO.class); + userVO.setRoles(userEO.getRoleEOList()); + userVO.setOrgsstr(userEO.getOrgIdList()); + userVO.setOrgs(userEO.getOrgEOList()); + resultList.add(userVO); + } + } + PageInfo resultPage =new PageInfo<>(); + resultPage.setCount(pageInfo.getCount()); + resultPage.setList(resultList); + resultPage.setOrderBy(pageInfo.getOrderBy()); + resultPage.setPageCount(pageInfo.getPageCount()); + resultPage.setPageNo(pageInfo.getPageNo()); + resultPage.setPageSize(pageInfo.getPageSize()); +// PageInfo mapPage = beanMapper.mapPage(getPageInfo(page.getPager(), userInfoByPage), UserVO.class); + return Result.success(resultPage); + + } + +//通过userId查询关联表,没有orgId的就是没有组织结构的用户 +// 把这些用户对应的信息显示出来 + + /** + * 功能描述: 查询所有用户信息 + * + * @param: [page] + * @return: + * @auther: SYT + * @date: 2018/10/16 8:44 + */ + @ApiOperation(value = "|UserEO|查询") + @GetMapping("/userEoList") + //@RequiresPermissions("sys:user:userEoList") + public ResponseMessage> userEoList(UserEOPage page) throws Exception { + + List userInfoEOList = userEOService.queryUserEoList(page); + return Result.success(userInfoEOList); + } + + /** + * @return com.adc.da.util.http.ResponseMessage> + * @Author liwenxuan + * @Description //查询院领导下面的用户:RoleName可传可不传 + * @Date Administrator 2018/10/31 + * @Param [RoleName] + **/ + @ApiOperation(value = "|UserEO|查询院领导下面的用户") + @GetMapping("/findLeaderByOrgIdAndRoleName") + //@RequiresPermissions("sys:user:findLeaderByOrgIdAndRoleName") + public ResponseMessage> queryByOrgIdAndRoleName(String roleName) { + UserEOPage page = new UserEOPage(); + page.setOrgId("669LUSZYJ99EZ5ZDU84U"); + page.setRoleName(roleName); + List userEOs = userEOService.queryUserInfoByPage(page); + List resultList =new ArrayList<>(); + if(userEOs!=null && !userEOs.isEmpty()){ + for(UserEO source: userEOs){ + UserVO userVO = BeanUtil.toBean(source, UserVO.class); + userVO.setRoles(source.getRoleEOList()); + userVO.setOrgsstr(source.getOrgIdList()); + userVO.setOrgs(source.getOrgEOList()); + resultList.add(userVO); + } + } + return Result.success(resultList); + } + + + /** + * @return com.adc.da.sys.entity.UserEO + * @Author liwenxuan + * @Description //根据roleName获取用户List + * @Date Administrator 2018/11/12 + * @Param [RoleName] + **/ + @ApiOperation(value = "|UserEO|根据roleName获取用户List") + @GetMapping("/getUserListByRoleName") + public ResponseMessage> getUserListByRoleName(String RoleName) { + + List userListByRoleName = userEOService.getUserListByRoleName(RoleName); + if (userListByRoleName == null) { + return Result.error(); + } + return Result.success("", "true", userListByRoleName); + } + + /** + * @return com.adc.da.util.http.ResponseMessage> + * @Author liwenxuan + * @Description //ceshi + * @Date Administrator 2018/11/23 + * @Param [userId] + **/ + @ApiOperation(value = "|UserEO|测试") + @GetMapping("/ceshi") + public ResponseMessage> selectThatOrgUser(String userId) { + List list = userEOService.selectThatOrgUser(userId); + return Result.success("", "", list); + } + + + + + + @ApiOperation(value = "|UserEO|重置密码") + @PostMapping(value = "/resetPassword") + public ResponseMessage resetPassword(String userId) { + //翻转 + userId = new StringBuilder(userId).reverse().toString(); + //解密 + userId = new String(Base64.decodeBase64(userId)); + + int line = userEOService.resetPassword(userId); + if (line == 0) { + return Result.error(); + } else { + return Result.success("true","密码重置为:123456a",""); + } + } + + @ApiOperation(value = "|UserEO|新增固定账号") + @GetMapping(value = "/createSpecialUser") +// @RequiresPermissions("sys:user:save") + public ResponseMessage createSpecialUser(String account) throws Exception { + UserVO userVO = new UserVO(); + userVO.setOperUser(LoginUserUtil.getUserId()); + userVO.setPassword("123456"); + userVO.setAccount(account); + userVO.setOrgId("5W2J4AQ8KA"); + userVO.setDisableFlag(0); + List roleId = new ArrayList<>(); + roleId.add("ZVXUGCP56D"); + userVO.setRoleIdList(roleId); + UserEO userEO=new UserEO(); + if(userVO!=null){ + userEO = BeanUtil.toBean(userVO,UserEO.class); + userEO.setRoleEOList(userVO.getRoles()); + userEO.setOrgIdList(userVO.getOrgsstr()); + userEO.setOrgEOList(userVO.getOrgs()); + userEO.setPassword(userVO.getPassword()); + } + userEO = userEOService.saveBean(userEO); + if (userEO == null) { + return Result.error("操作失败"); + } + //TODO 往个人板块插入数据失败 +// List personConfEOS = personConfEOService.saveConfList(userEO.getUsid()); + return Result.success("true", "操作成功", userVO); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserInfoEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserInfoEOController.java new file mode 100644 index 00000000..4692a62d --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/UserInfoEOController.java @@ -0,0 +1,168 @@ +package com.adc.da.sys.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.common.ValidFlagEnum; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.entity.RoleEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.entity.UserInfoEO; +import com.adc.da.sys.page.UserInfoEOPage; +import com.adc.da.sys.service.IUserEOService; +import com.adc.da.sys.service.IUserInfoEOService; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.UUIDUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +@RestController +@RequestMapping("/${restPath}/person/userInfo") +@Api(description = "|UserInfoEO|") +public class UserInfoEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(UserInfoEOController.class); + + @Autowired + private IUserInfoEOService userInfoEOService; + @Autowired + private IUserEOService userEOService; + + @ApiOperation(value = "|UserInfoEO|分页查询") + @GetMapping("/page") + //@RequiresPermissions("person:userInfo:page") + public ResponseMessage> page(UserInfoEOPage page) throws Exception { + List rows = userInfoEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + + @ApiOperation(value = "|UserInfoEO|查询") + @GetMapping("") + @RequiresPermissions("person:userInfo:list") + public ResponseMessage> list(UserInfoEOPage page) throws Exception { + return Result.success(userInfoEOService.queryByList(page)); + } + + /** + * 刘寅楠 + * @param + * @return com.adc.da.person.entity.UserInfoEO + * @throws Exception + */ + @ApiOperation(value = "查找用户信息接口") + @GetMapping("/getByUserInfoCode") + //@RequiresPermissions("person:userInfo:getByUserInfoCode") + public ResponseMessage getByUserInfoCode() throws Exception { + //获取当前登录人 + String userId= LoginUserUtil.getUserId(); + UserInfoEO userInfoEO =new UserInfoEO(); + userInfoEO.setUserId(userId); + userInfoEO.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()); + UserInfoEO getInfo = userInfoEOService.getUserEOAndInfoEOByUserCode(userInfoEO); + if(getInfo!=null){ + //开始获取用户角色信息 + UserEO user= userEOService.getUserWithRoles(userId); + String userRoles = ""; + if (user!=null && user.getRoleEOList()!=null &&!user.getRoleEOList().isEmpty()) { + for (RoleEO role : user.getRoleEOList()) { + userRoles += role.getName() + ","; + } + // RoleEO role=user.getRoleEOList().get(0); + getInfo.setUserRole(userRoles); + } + } + return Result.success(getInfo); + } + + + /** + * 刘寅楠 + * @param userInfoEO + * @param UserId + * @return + * @throws Exception + */ + @ApiOperation(value = "|UserInfoEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) + // @RequiresPermissions("person:userInfo:save") + public ResponseMessage create(@RequestBody UserInfoEO userInfoEO, String UserId) throws Exception { +// //判断用户必填信息是否为空 +// if(StringUtils.isBlank(userInfoEO.getOfficePhone())){ +// return Result.error("r0018","电话号码不能为空"); +// } +// if(StringUtils.isBlank(userInfoEO.getAddress())){ +// return Result.error("r0019","个人邮箱地址不能为空"); +// } +// if(StringUtils.isBlank(userInfoEO.getMobilePhone())){ +// return Result.error("r0020","手机号码不能为空"); +// } +// if(StringUtils.isBlank(userInfoEO.getFaxAddress())){ +// return Result.error("r0021","传真地址不能为空"); +// } + userInfoEO.setId(UUIDUtils.randomUUID20()); + userInfoEO.setUserId(UserId); + userInfoEOService.save(userInfoEO); + return Result.success(userInfoEO); + } + + + + /* + * @Author liuyinnan + * @Description //修改用户详细信息 + * @Date 19:33 2018/9/20 + * @Param [userInfoEO, restPath] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "保存修改用户信息") + @PostMapping(value = "/updatePersonInfo") + //@RequiresPermissions("person:userInfo:update") + public ResponseMessage update(@RequestBody UserInfoEO userInfoEO) throws Exception { + userInfoEO.setUserId(LoginUserUtil.getUserId()); + /* if(StringUtils.isBlank(userInfoEO.getOfficePhone())){ + return Result.error("r0018","电话号码不能为空"); + } + if(StringUtils.isBlank(userInfoEO.getEmail())){ + return Result.error("r0019","个人邮箱不能为空"); + } + if(StringUtils.isBlank(userInfoEO.getMobilePhone())){ + return Result.error("r0020","手机号码不能为空"); + } + if(StringUtils.isBlank(userInfoEO.getFaxAddress())){ + return Result.error("r0021","传真地址不能为空"); + }*/ + return Result.success(userInfoEOService.updateByUserId(userInfoEO)); + } + + + + @ApiOperation(value = "|UserInfoEO|删除") + @DeleteMapping("/{id}") + @RequiresPermissions("person:userInfo:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + userInfoEOService.removeById(id); + logger.info("delete from TS_USER_INFO where id = {}", id); + return Result.success(); + } + + + + + @ApiOperation(value = "保存用户信息") + @PutMapping("/updateByUserInfo") + public ResponseMessage updateByUserInfo(UserInfoEO userInfoEO)throws Exception{ + String userId= LoginUserUtil.getUserId(); + return userInfoEOService.updateByUserId(userInfoEO); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/controller/WarnTimeEOController.java b/adc-da-sys/src/main/java/com/adc/da/sys/controller/WarnTimeEOController.java new file mode 100644 index 00000000..2bd7b1e2 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/controller/WarnTimeEOController.java @@ -0,0 +1,124 @@ +package com.adc.da.sys.controller; + +import com.adc.da.base.web.BaseController; +import com.adc.da.http.PageInfo; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.ResponseMessageCodeEnum; +import com.adc.da.http.Result; +import com.adc.da.sys.entity.WarnTimeEO; +import com.adc.da.sys.page.WarnTimeEOPage; +import com.adc.da.sys.service.IWarnTimeEOService; +import com.adc.da.util.UUIDUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.List; + +import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE; + +@RestController +@RequestMapping("/${restPath}/sys/warnTime") +@Api(description = "|WarnTimeEO|") +public class WarnTimeEOController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(WarnTimeEOController.class); + + @Autowired + private IWarnTimeEOService warnTimeEOService; + + @ApiOperation(value = "|WarnTimeEO|分页查询") + @GetMapping("/page") +// @RequiresPermissions("sys:warnTime:page") + public ResponseMessage> page(WarnTimeEOPage page) throws Exception { + List rows = warnTimeEOService.queryByPage(page); + return Result.success(getPageInfo(page.getPager(), rows)); + } + + @ApiOperation(value = "|WarnTimeEO|查询") + @GetMapping("") + //@RequiresPermissions("sys:warnTime:list") + public ResponseMessage> list(WarnTimeEOPage page) throws Exception { + return Result.success(warnTimeEOService.queryByList(page)); + } +/** + * @Author liwenxuan + * @Description //用来 + * @Date Administrator 2018/10/14 + * @Param [id] + * @return com.adc.da.util.http.ResponseMessage + **/ + @ApiOperation(value = "|WarnTimeEO|详情") + @GetMapping("/find") + //@RequiresPermissions("sys:warnTime:get") + public ResponseMessage find(WarnTimeEOPage page) throws Exception { + List getList = warnTimeEOService.queryByList(page); + WarnTimeEO warnTimeEO = new WarnTimeEO(); + if (getList != null && getList.size()>0) { + warnTimeEO = getList.get(0); + } + return Result.success("true","操作成功",warnTimeEO); + } + + @ApiOperation(value = "|WarnTimeEO|新增") + @PostMapping(consumes = APPLICATION_JSON_UTF8_VALUE) +// @RequiresPermissions("sys:warnTime:save") + public ResponseMessage create(@RequestBody WarnTimeEO warnTimeEO) throws Exception { + warnTimeEOService.save(warnTimeEO); + return Result.success(warnTimeEO); + } + + @ApiOperation(value = "|WarnTimeEO|修改") + @PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE) +// @RequiresPermissions("sys:warnTime:update") + public ResponseMessage update(@RequestBody WarnTimeEO warnTimeEO) throws Exception { + warnTimeEOService.updateById(warnTimeEO); + return Result.success(warnTimeEO); + } + + @ApiOperation(value = "|WarnTimeEO|删除") + @DeleteMapping("/{id}") +// @RequiresPermissions("sys:warnTime:delete") + public ResponseMessage delete(@PathVariable String id) throws Exception { + warnTimeEOService.removeById(id); + logger.info("delete from TS_WARN_TIME where id = {}", id); + return Result.success(); + } + + + @ApiOperation(value = "|WarnTimeEO|修改") + @PutMapping(value = "/updateSource",consumes = APPLICATION_JSON_UTF8_VALUE) + @RequiresPermissions("sys:warnTime:updateSource") + public ResponseMessage updateSource(@NotNull @RequestBody WarnTimeEO warnTimeEO) throws Exception { + WarnTimeEOPage page=new WarnTimeEOPage(); + List warnTimeEOList=warnTimeEOService.queryByList(page); + if(warnTimeEOList!= null && !warnTimeEOList.isEmpty()){ + if(warnTimeEOList.size()>1){ + WarnTimeEO eo=warnTimeEOList.get(0); + eo.setWarnType(warnTimeEO.getWarnType()); + warnTimeEOService.updateById(eo); + //此处删除多余数据 + for(int i=1;i功能:
    TS_FEEDBACK_INFO FeedbackInfoEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-17
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class FeedbackInfoEO extends BaseEntity { + + private String id; + private String userId; + private String feedbackInfo; + private Integer readFlag; + private Integer validFlag; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + + //新增字段 + private String duty; + private String officePhone; + private String mobilePhone; + private String uname; + private String orgName; + private String contentText; + + public String getContentText() { + return contentText; + } + + public void setContentText(String contentText) { + this.contentText = contentText; + } + + public String getDuty() { + return duty; + } + + public void setDuty(String duty) { + this.duty = duty; + } + + public String getOfficePhone() { + return officePhone; + } + + public void setOfficePhone(String officePhone) { + this.officePhone = officePhone; + } + + public String getMobilePhone() { + return mobilePhone; + } + + public void setMobilePhone(String mobilePhone) { + this.mobilePhone = mobilePhone; + } + + public String getUname() { + return uname; + } + + public void setUname(String uname) { + this.uname = uname; + } + + public String getOrgName() { + return orgName; + } + + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getFeedbackInfo() { + return this.feedbackInfo; + } + + /** **/ + public void setFeedbackInfo(String feedbackInfo) { + this.feedbackInfo = feedbackInfo; + } + + /** **/ + public Integer getReadFlag() { + return this.readFlag; + } + + /** **/ + public void setReadFlag(Integer readFlag) { + this.readFlag = readFlag; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/LinkInfoEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/LinkInfoEO.java new file mode 100644 index 00000000..b87e6d4a --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/LinkInfoEO.java @@ -0,0 +1,117 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; + +import java.util.Date; + +/** + * 功能:TS_LINK_INFO LinkInfoEOEntity
    + * 作者:code generator
    + * 日期: 2020-01-13
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class LinkInfoEO extends BaseEntity { + + private String id; + private String webName; + private String oldWebSite; + private String newWebSite; + private Integer displaySeq; + private Integer isShow; + private Integer validFlag; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date creationTime; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + /** **/ + public String getWebName() { + return this.webName; + } + + /** **/ + public void setWebName(String webName) { + this.webName = webName; + } + + /** **/ + public String getOldWebSite() { + return this.oldWebSite; + } + + /** **/ + public void setOldWebSite(String oldWebSite) { + this.oldWebSite = oldWebSite; + } + + /** **/ + public String getNewWebSite() { + return this.newWebSite; + } + + /** **/ + public void setNewWebSite(String newWebSite) { + this.newWebSite = newWebSite; + } + + /** **/ + public Integer getDisplaySeq() { + return this.displaySeq; + } + + /** **/ + public void setDisplaySeq(Integer displaySeq) { + this.displaySeq = displaySeq; + } + + /** **/ + public Integer getIsShow() { + return this.isShow; + } + + /** **/ + public void setIsShow(Integer isShow) { + this.isShow = isShow; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/LoginInfoEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/LoginInfoEO.java new file mode 100644 index 00000000..3c4391bc --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/LoginInfoEO.java @@ -0,0 +1,148 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; + +import java.util.Date; + +/** + * 功能:TS_LOGIN_INFO LoginInfoEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class LoginInfoEO extends BaseEntity { + + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private String loginAddress; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date loginTime; + private String userId; + private String id; + private int countNum; + private String maxCountDate; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • loginAddress -> login_address
  • + *
  • loginTime -> login_time
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "loginAddress": return "login_address"; + case "loginTime": return "login_time"; + case "userId": return "user_id"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • login_address -> loginAddress
  • + *
  • login_time -> loginTime
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "login_address": return "loginAddress"; + case "login_time": return "loginTime"; + case "user_id": return "userId"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public String getLoginAddress() { + return this.loginAddress; + } + + /** **/ + public void setLoginAddress(String loginAddress) { + this.loginAddress = loginAddress; + } + + /** **/ + public Date getLoginTime() { + return this.loginTime; + } + + /** **/ + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + public int getCountNum() { + return countNum; + } + + public void setCountNum(int countNum) { + this.countNum = countNum; + } + + public String getMaxCountDate() { + return maxCountDate; + } + + public void setMaxCountDate(String maxCountDate) { + this.maxCountDate = maxCountDate; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/MenuEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/MenuEO.java new file mode 100644 index 00000000..1b7d17d8 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/MenuEO.java @@ -0,0 +1,219 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.TreeEntity; + +import java.io.Serializable; +import java.util.Date; + +/** + * 功能:TS_MENU MenuEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class MenuEO extends TreeEntity implements Serializable{ + + private static final long serialVersionUID = 2497292638985614077L; + + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private String remarks; + private String permission; + private Integer isShow; + private String icon; + private String href; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • remarks -> remarks
  • + *
  • permission -> permission
  • + *
  • isShow -> is_show
  • + *
  • icon -> icon
  • + *
  • href -> href
  • + *
  • parentIds -> parent_ids
  • + *
  • parentId -> parent_id
  • + *
  • name -> name
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "remarks": return "remarks"; + case "permission": return "permission"; + case "isShow": return "is_show"; + case "icon": return "icon"; + case "href": return "href"; + case "parentIds": return "parent_ids"; + case "parentId": return "parent_id"; + case "name": return "name"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • remarks -> remarks
  • + *
  • permission -> permission
  • + *
  • is_show -> isShow
  • + *
  • icon -> icon
  • + *
  • href -> href
  • + *
  • parent_ids -> parentIds
  • + *
  • parent_id -> parentId
  • + *
  • name -> name
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "remarks": return "remarks"; + case "permission": return "permission"; + case "is_show": return "isShow"; + case "icon": return "icon"; + case "href": return "href"; + case "parent_ids": return "parentIds"; + case "parent_id": return "parentId"; + case "name": return "name"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public String getRemarks() { + return this.remarks; + } + + /** **/ + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + /** **/ + public String getPermission() { + return this.permission; + } + + /** **/ + public void setPermission(String permission) { + this.permission = permission; + } + + /** **/ + public Integer getIsShow() { + return this.isShow; + } + + /** **/ + public void setIsShow(Integer isShow) { + this.isShow = isShow; + } + + /** **/ + public String getIcon() { + return this.icon; + } + + /** **/ + public void setIcon(String icon) { + this.icon = icon; + } + + /** **/ + public String getHref() { + return this.href; + } + + /** **/ + public void setHref(String href) { + this.href = href; + } + + /** **/ + public String getParentIds() { + return this.parentIds; + } + + /** **/ + public void setParentIds(String parentIds) { + this.parentIds = parentIds; + } + + /** **/ + public String getParentId() { + return this.parentId; + } + + /** **/ + public void setParentId(String parentId) { + this.parentId = parentId; + } + + /** **/ + public String getName() { + return this.name; + } + + /** **/ + public void setName(String name) { + this.name = name; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/OrgEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/OrgEO.java new file mode 100644 index 00000000..2d961ec6 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/OrgEO.java @@ -0,0 +1,311 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 功能:TS_ORG OrgEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class OrgEO extends BaseEntity implements Serializable { + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private Integer isShow; + private String parentIds; + private String pId; + private String shotName; + private String remarks; + private Integer orgDesc; + private String orgType; + private String orgCode; + private String orgName; + private String id; + + //补充字段 + private String ssoId; + private String ssoOrgId; + private String userName; + private String usId; + private String roleId; + private String roleName; + private List parentIdsList; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • isShow -> is_show
  • + *
  • parentIds -> parent_ids
  • + *
  • parentId -> parent_id
  • + *
  • shotName -> shot_name
  • + *
  • remarks -> remarks
  • + *
  • orgDesc -> org_desc
  • + *
  • orgType -> org_type
  • + *
  • orgCode -> org_code
  • + *
  • orgName -> org_name
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "isShow": return "is_show"; + case "parentIds": return "parent_ids"; + case "parentId": return "parent_id"; + case "shotName": return "shot_name"; + case "remarks": return "remarks"; + case "orgDesc": return "org_desc"; + case "orgType": return "org_type"; + case "orgCode": return "org_code"; + case "orgName": return "org_name"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • is_show -> isShow
  • + *
  • parent_ids -> parentIds
  • + *
  • parent_id -> parentId
  • + *
  • shot_name -> shotName
  • + *
  • remarks -> remarks
  • + *
  • org_desc -> orgDesc
  • + *
  • org_type -> orgType
  • + *
  • org_code -> orgCode
  • + *
  • org_name -> orgName
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "is_show": return "isShow"; + case "parent_ids": return "parentIds"; + case "parent_id": return "parentId"; + case "shot_name": return "shotName"; + case "remarks": return "remarks"; + case "org_desc": return "orgDesc"; + case "org_type": return "orgType"; + case "org_code": return "orgCode"; + case "org_name": return "orgName"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + if(modifyTime==null){ + return new Date(); + }else{ + return this.modifyTime; + } + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + if(creationTime == null){ + return new Date(); + }else{ + return this.creationTime; + } + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Integer getIsShow() { + return this.isShow; + } + + /** **/ + public void setIsShow(Integer isShow) { + this.isShow = isShow; + } + + /** **/ + public String getParentIds() { + return this.parentIds; + } + + /** **/ + public void setParentIds(String parentIds) { + this.parentIds = parentIds; + } + + + public String getpId() { + return pId; + } + + public void setpId(String pId) { + this.pId = pId; + } + + /** **/ + public String getShotName() { + return this.shotName; + } + + /** **/ + public void setShotName(String shotName) { + this.shotName = shotName; + } + + /** **/ + public String getRemarks() { + return this.remarks; + } + + /** **/ + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + /** **/ + public Integer getOrgDesc() { + return this.orgDesc; + } + + /** **/ + public void setOrgDesc(Integer orgDesc) { + this.orgDesc = orgDesc; + } + + /** **/ + public String getOrgType() { + return this.orgType; + } + + /** **/ + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + /** **/ + public String getOrgCode() { + return this.orgCode; + } + + /** **/ + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + /** **/ + public String getOrgName() { + return this.orgName; + } + + /** **/ + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + + public String getSsoId() { + return ssoId; + } + + public void setSsoId(String ssoId) { + this.ssoId = ssoId; + } + + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUsId() { + return usId; + } + + public void setUsId(String usId) { + this.usId = usId; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getSsoOrgId() { + return ssoOrgId; + } + + public void setSsoOrgId(String ssoOrgId) { + this.ssoOrgId = ssoOrgId; + } + + public List getParentIdsList() { + return parentIdsList; + } + + public void setParentIdsList(List parentIdsList) { + this.parentIdsList = parentIdsList; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleEO.java new file mode 100644 index 00000000..5fe48c07 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleEO.java @@ -0,0 +1,301 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 功能:TS_ROLE RoleEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class RoleEO extends BaseEntity implements Serializable { + + private static final long serialVersionUID = -1386892031737294731L; + + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private String operUser; + private String extInfo; + private String remarks; + private Integer isDefault; + private Integer useFlag; + private String roleType; + private String name; + private String id; + + private String operUserName; + + private List menuEOList = new ArrayList<>(); + private List menuEOIdList = new ArrayList<>(); + + private String orgUseName; + + private Integer disableFlag; + + private Integer unlockFlag; + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • operUser -> oper_user
  • + *
  • extInfo -> ext_info
  • + *
  • remarks -> remarks
  • + *
  • isDefault -> is_default
  • + *
  • useFlag -> use_flag
  • + *
  • roleType -> role_type
  • + *
  • name -> name
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "disableFlag": return "disable_flag"; + case "unlockFlag": return "unlock_flag"; + case "operUser": return "oper_user"; + case "extInfo": return "ext_info"; + case "remarks": return "remarks"; + case "isDefault": return "is_default"; + case "useFlag": return "use_flag"; + case "roleType": return "role_type"; + case "name": return "name"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • oper_user -> operUser
  • + *
  • ext_info -> extInfo
  • + *
  • remarks -> remarks
  • + *
  • is_default -> isDefault
  • + *
  • use_flag -> useFlag
  • + *
  • role_type -> roleType
  • + *
  • name -> name
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "disable_flag": return "disableFlag"; + case "unlock_flag": return "unlockFlag"; + case "oper_user": return "operUser"; + case "ext_info": return "extInfo"; + case "remarks": return "remarks"; + case "is_default": return "isDefault"; + case "use_flag": return "useFlag"; + case "role_type": return "roleType"; + case "name": return "name"; + case "id": return "id"; + default: return null; + } + } + public RoleEO(){} + public RoleEO(Date modifyTime, Date creationTime, Integer validFlag, String operUser, String extInfo, String remarks, Integer isDefault, Integer useFlag, String roleType, String name, String id, List menuEOList, List menuEOIdList, Integer disableFlag, Integer unlockFlag) { + this.modifyTime = modifyTime; + this.creationTime = creationTime; + this.validFlag = validFlag; + this.operUser = operUser; + this.extInfo = extInfo; + this.remarks = remarks; + this.isDefault = isDefault; + this.useFlag = useFlag; + this.roleType = roleType; + this.name = name; + this.id = id; + this.menuEOList = menuEOList; + this.menuEOIdList = menuEOIdList; + this.disableFlag=disableFlag; + this.unlockFlag=unlockFlag; + } + + /** **/ + public Date getModifyTime() { + if(modifyTime==null){ + return new Date(); + }else{ + return this.modifyTime; + } + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + if(creationTime == null){ + return new Date(); + }else{ + return this.creationTime; + } + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public String getOperUser() { + return this.operUser; + } + + /** **/ + public void setOperUser(String operUser) { + this.operUser = operUser; + } + + public String getExtInfo() { + return extInfo; + } + + public void setExtInfo(String extInfo) { + this.extInfo = extInfo; + } + + /** **/ + public String getRemarks() { + return this.remarks; + } + + /** **/ + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + /** **/ + public Integer getIsDefault() { + return this.isDefault; + } + + /** **/ + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + /** **/ + public Integer getUseFlag() { + return this.useFlag; + } + + /** **/ + public void setUseFlag(Integer useFlag) { + this.useFlag = useFlag; + } + + /** **/ + public String getRoleType() { + return this.roleType; + } + + /** **/ + public void setRoleType(String roleType) { + this.roleType = roleType; + } + + /** **/ + public String getName() { + return this.name; + } + + /** **/ + public void setName(String name) { + this.name = name; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + public List getMenuEOList() { + return menuEOList; + } + + public void setMenuEOList(List menuEOList) { + this.menuEOList = menuEOList; + } + + public List getMenuEOIdList() { + return menuEOIdList; + } + + public void setMenuEOIdList(List menuEOIdList) { + this.menuEOIdList = menuEOIdList; + } + + public RoleEO(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public String getOperUserName() { + return operUserName; + } + + public void setOperUserName(String operUserName) { + this.operUserName = operUserName; + } + + public void setOrgUseName(String orgUseName) { + this.orgUseName =orgUseName; + } + + public String getOrgUseName(){ + return this.orgUseName; + } + + public void setDisableFlag(Integer disableFlag){ + this.disableFlag=disableFlag; + } + + public Integer getDisableFlag(){ + return this.disableFlag; + } + + public void setUnlockFlag(Integer unlockFlag){ + this.unlockFlag=unlockFlag; + } + + public Integer getUnlockFlag(){ + return this.unlockFlag; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleMenuEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleMenuEO.java new file mode 100644 index 00000000..ed79681d --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleMenuEO.java @@ -0,0 +1,67 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; + + +/** + * 功能:TS_ROLE_MENU RoleMenuEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class RoleMenuEO extends BaseEntity { + + private String menuId; + private String roleId; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • menuId -> menu_id
  • + *
  • roleId -> role_id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "menuId": return "menu_id"; + case "roleId": return "role_id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • menu_id -> menuId
  • + *
  • role_id -> roleId
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "menu_id": return "menuId"; + case "role_id": return "roleId"; + default: return null; + } + } + + /** **/ + public String getMenuId() { + return this.menuId; + } + + /** **/ + public void setMenuId(String menuId) { + this.menuId = menuId; + } + + /** **/ + public String getRoleId() { + return this.roleId; + } + + /** **/ + public void setRoleId(String roleId) { + this.roleId = roleId; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleSarMenuEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleSarMenuEO.java new file mode 100644 index 00000000..eadfc16f --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/RoleSarMenuEO.java @@ -0,0 +1,113 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; + +import java.util.List; + + +/** + * 功能:TS_ROLE_SAR_MENU RoleSarMenuEOEntity
    + * 作者:code generator
    + * 日期: 2019-02-19
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class RoleSarMenuEO extends BaseEntity { + + private String roleId; + private String sarMenuId; + private List sarMenuIds; + + private String id; + private String parentId; + private String menuName; + private String sorDivide; + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • roleId -> role_id
  • + *
  • sarMenuId -> sar_menu_id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "roleId": return "role_id"; + case "sarMenuId": return "sar_menu_id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • role_id -> roleId
  • + *
  • sar_menu_id -> sarMenuId
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "role_id": return "roleId"; + case "sar_menu_id": return "sarMenuId"; + default: return null; + } + } + + /** **/ + public String getRoleId() { + return this.roleId; + } + + /** **/ + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + /** **/ + public String getSarMenuId() { + return this.sarMenuId; + } + + /** **/ + public void setSarMenuId(String sarMenuId) { + this.sarMenuId = sarMenuId; + } + + public List getSarMenuIds() { + return sarMenuIds; + } + + public void setSarMenuIds(List sarMenuIds) { + this.sarMenuIds = sarMenuIds; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getMenuName() { + return menuName; + } + + public void setMenuName(String menuName) { + this.menuName = menuName; + } + + public String getSorDivide() { + return sorDivide; + } + + public void setSorDivide(String sorDivide) { + this.sorDivide = sorDivide; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserConfigEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserConfigEO.java new file mode 100644 index 00000000..2c56a3a5 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserConfigEO.java @@ -0,0 +1,145 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; + +import java.util.Date; + +/** + * 功能:TS_USER_CONFIG UserConfigEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserConfigEO extends BaseEntity { + + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private String configContent; + private String configType; + private String userId; + private String id; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • configContent -> config_content
  • + *
  • configType -> config_type
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "configContent": return "config_content"; + case "configType": return "config_type"; + case "userId": return "user_id"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • config_content -> configContent
  • + *
  • config_type -> configType
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "config_content": return "configContent"; + case "config_type": return "configType"; + case "user_id": return "userId"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public String getConfigContent() { + return this.configContent; + } + + /** **/ + public void setConfigContent(String configContent) { + this.configContent = configContent; + } + + /** **/ + public String getConfigType() { + return this.configType; + } + + /** **/ + public void setConfigType(String configType) { + this.configType = configType; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserEO.java new file mode 100644 index 00000000..1337593e --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserEO.java @@ -0,0 +1,385 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 功能:TS_USER UserEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserEO extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 3658632939727891047L; + + private Integer validFlag; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private String operUser; + private String extInfo; + private String workNum; + private String email; + private String userSource; + private String uname; + private String password; + private String account; + private String usid; + // 扩展字段 + private String userType; + private String orgId; + private String orgName; + private String roleId; + private String roleName; + private List roleIdList = new ArrayList<>(); + private List roleNameList = new ArrayList<>(); + private List roleEOList = new ArrayList<>(); + private List orgIdList = new ArrayList<>(); + private List orgEOList = new ArrayList<>(); + private String mobilePhone; + private String officePhone; + private String address; + private String faxAddress; + private Integer disableFlag; + private Integer unlockFlag; + private String userInfoId; + private String orgType; + + private String ssoId; + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • validFlag -> valid_flag
  • + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • operUser -> oper_user
  • + *
  • extInfo -> ext_info
  • + *
  • workNum -> work_num
  • + *
  • email -> email
  • + *
  • userSource -> user_source
  • + *
  • uname -> uname
  • + *
  • password -> password
  • + *
  • account -> account
  • + *
  • usid -> usid
  • + */ + public static String fieldToColumn(String fieldName) { + switch (fieldName) { + case "validFlag": return "valid_flag"; + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "operUser": return "oper_user"; + case "extInfo": return "ext_info"; + case "workNum": return "work_num"; + case "email": return "email"; + case "userSource": return "user_source"; + case "unlockFlag": return "unlock_flag"; + case "uname": return "uname"; + case "password": return "password"; + case "account": return "account"; + case "usid": return "usid"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • valid_flag -> validFlag
  • + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • oper_user -> operUser
  • + *
  • ext_info -> extInfo
  • + *
  • work_num -> workNum
  • + *
  • email -> email
  • + *
  • user_source -> userSource
  • + *
  • uname -> uname
  • + *
  • password -> password
  • + *
  • account -> account
  • + *
  • usid -> usid
  • + */ + public static String columnToField(String columnName) { + switch (columnName) { + case "valid_flag": return "validFlag"; + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "oper_user": return "operUser"; + case "ext_info": return "extInfo"; + case "work_num": return "workNum"; + case "email": return "email"; + case "user_source": return "userSource"; + case "unlock_flag": return "unlockFlag"; + case "uname": return "uname"; + case "password": return "password"; + case "account": return "account"; + case "usid": return "usid"; + default: return null; + } + } + + public Integer getValidFlag() { + return validFlag; + } + + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + public Date getModifyTime() { + if(modifyTime==null){ + return new Date(); + }else{ + return modifyTime; + } + + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public Date getCreationTime() { + if(creationTime == null){ + return new Date(); + }else{ + return creationTime; + } + } + + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + public String getOperUser() { + return operUser; + } + + public void setOperUser(String operUser) { + this.operUser = operUser; + } + + public String getExtInfo() { + return extInfo; + } + + public void setExtInfo(String extInfo) { + this.extInfo = extInfo; + } + + public String getWorkNum() { + return workNum; + } + + public void setWorkNum(String workNum) { + this.workNum = workNum; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getUserSource() { + return userSource; + } + + public void setUserSource(String userSource) { + this.userSource = userSource; + } + + public String getUname() { + return uname; + } + + public void setUname(String uname) { + this.uname = uname; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getUsid() { + return usid; + } + + public void setUsid(String usid) { + this.usid = usid; + } + + public List getRoleIdList() { + return roleIdList; + } + + public void setRoleIdList(List roleIdList) { + this.roleIdList = roleIdList; + } + + public List getRoleEOList() { + return roleEOList; + } + + public void setRoleEOList(List roleEOList) { + this.roleEOList = roleEOList; + } + + public List getOrgIdList() { + return orgIdList; + } + + public void setOrgIdList(List orgIdList) { + this.orgIdList = orgIdList; + } + + public List getOrgEOList() { + return orgEOList; + } + + public void setOrgEOList(List orgEOList) { + this.orgEOList = orgEOList; + } + + public void setUserType(String userType){ + this.userType=userType; + } + + public String getUserType(){ + return this.userType; + } + + public void setOrgName(String orgName){ + this.orgName=orgName; + } + + public String getOrgName(){ + return this.orgName; + } + + public void setOrgId(String orgId){ + this.orgId=orgId; + } + + public String getOrgId(){ + return orgId; + } + + public void setRoleId(String roleId){ + this.roleId=roleId; + } + + public String getRoleId(){ + return this.roleId; + } + + public void setMobilePhone(String mobilePhone){ + this.mobilePhone=mobilePhone; + } + + public String getMobilePhone(){ + return this.mobilePhone; + } + + public void setOfficePhone(String officePhone){ + this.officePhone=officePhone; + } + public String getOfficePhone(){ + return this.officePhone; + } + + public Integer getDisableFlag() { + return disableFlag; + } + + public void setDisableFlag(Integer disableFlag) { + this.disableFlag = disableFlag; + } + + public Integer getUnlockFlag() { + return unlockFlag; + } + + public void setUnlockFlag(Integer unlockFlag) { + this.unlockFlag = unlockFlag; + } + + public void setRoleName(String roleName){ + this.roleName=roleName; + } + + public String getRoleName(){ + return this.roleName; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getFaxAddress() { + return faxAddress; + } + + public void setFaxAddress(String faxAddress) { + this.faxAddress = faxAddress; + } + + public String getUserInfoId() { + return userInfoId; + } + + public void setUserInfoId(String userInfoId) { + this.userInfoId = userInfoId; + } + + public String getSsoId() { + return ssoId; + } + + public void setSsoId(String ssoId) { + this.ssoId = ssoId; + } + + public List getRoleNameList() { + return roleNameList; + } + + public void setRoleNameList(List roleNameList) { + this.roleNameList = roleNameList; + } + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserInfoEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserInfoEO.java new file mode 100644 index 00000000..568b8509 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserInfoEO.java @@ -0,0 +1,389 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 功能:TS_USER_INFO UserInfoEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserInfoEO extends BaseEntity { + + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + //@org.springframework.format.annotation.DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + + private Date creationTime; + private Integer validFlag; + private String signature; + private String faxAddress; + private String address; + private Integer gender; + private String partPost; + private String assistantPost; + private String mainPost; + private String mobilePhone; + private String officePhone; + private String userPic; + private String duty; + private String userId; + private String id; + // 追加字段 + private String account; + private String uName; + private String email; + private String orgName; + private String userInfoId; + private String configType; + private String configContent; + // 追加 + private String userRole; + + public String getUserRole() { + return userRole; + } + + public void setUserRole(String userRole) { + this.userRole = userRole; + } + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • signature -> signature
  • + *
  • faxAddress -> fax_address
  • + *
  • address -> address
  • + *
  • gender -> gender
  • + *
  • partPost -> part_post
  • + *
  • assistantPost -> assistant_post
  • + *
  • mainPost -> main_post
  • + *
  • mobilePhone -> mobile_phone
  • + *
  • officePhone -> office_phone
  • + *
  • userPic -> user_pic
  • + *
  • duty -> duty
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": + return "modify_time"; + case "creationTime": + return "creation_time"; + case "validFlag": + return "valid_flag"; + case "signature": + return "signature"; + case "faxAddress": + return "fax_address"; + case "address": + return "address"; + case "gender": + return "gender"; + case "partPost": + return "part_post"; + case "assistantPost": + return "assistant_post"; + case "mainPost": + return "main_post"; + case "mobilePhone": + return "mobile_phone"; + case "officePhone": + return "office_phone"; + case "userPic": + return "user_pic"; + case "duty": + return "duty"; + case "userId": + return "user_id"; + case "id": + return "id"; + default: + return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • signature -> signature
  • + *
  • fax_address -> faxAddress
  • + *
  • address -> address
  • + *
  • gender -> gender
  • + *
  • part_post -> partPost
  • + *
  • assistant_post -> assistantPost
  • + *
  • main_post -> mainPost
  • + *
  • mobile_phone -> mobilePhone
  • + *
  • office_phone -> officePhone
  • + *
  • user_pic -> userPic
  • + *
  • duty -> duty
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": + return "modifyTime"; + case "creation_time": + return "creationTime"; + case "valid_flag": + return "validFlag"; + case "signature": + return "signature"; + case "fax_address": + return "faxAddress"; + case "address": + return "address"; + case "gender": + return "gender"; + case "part_post": + return "partPost"; + case "assistant_post": + return "assistantPost"; + case "main_post": + return "mainPost"; + case "mobile_phone": + return "mobilePhone"; + case "office_phone": + return "officePhone"; + case "user_pic": + return "userPic"; + case "duty": + return "duty"; + case "user_id": + return "userId"; + case "id": + return "id"; + default: + return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + + /** **/ + public String getFaxAddress() { + return this.faxAddress; + } + + /** **/ + public void setFaxAddress(String faxAddress) { + this.faxAddress = faxAddress; + } + + /** **/ + public String getAddress() { + return this.address; + } + + /** **/ + public void setAddress(String address) { + this.address = address; + } + + /** **/ + public Integer getGender() { + return this.gender; + } + + /** **/ + public void setGender(Integer gender) { + this.gender = gender; + } + + /** **/ + public String getPartPost() { + return this.partPost; + } + + /** **/ + public void setPartPost(String partPost) { + this.partPost = partPost; + } + + /** **/ + public String getAssistantPost() { + return this.assistantPost; + } + + /** **/ + public void setAssistantPost(String assistantPost) { + this.assistantPost = assistantPost; + } + + /** **/ + public String getMainPost() { + return this.mainPost; + } + + /** **/ + public void setMainPost(String mainPost) { + this.mainPost = mainPost; + } + + /** **/ + public String getMobilePhone() { + return this.mobilePhone; + } + + /** **/ + public void setMobilePhone(String mobilePhone) { + this.mobilePhone = mobilePhone; + } + + /** **/ + public String getOfficePhone() { + return this.officePhone; + } + + /** **/ + public void setOfficePhone(String officePhone) { + this.officePhone = officePhone; + } + + /** **/ + public String getUserPic() { + return this.userPic; + } + + /** **/ + public void setUserPic(String userPic) { + this.userPic = userPic; + } + + /** **/ + public String getDuty() { + return this.duty; + } + + /** **/ + public void setDuty(String duty) { + this.duty = duty; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getuName() { + return uName; + } + + public void setuName(String uName) { + this.uName = uName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getOrgName() { + return orgName; + } + + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + public String getUserInfoId() { + return userInfoId; + } + + public void setUserInfoId(String userInfoId) { + this.userInfoId = userInfoId; + } + + public String getConfigType() { + return configType; + } + + public void setConfigType(String configType) { + this.configType = configType; + } + + public String getConfigContent() { + return configContent; + } + + public void setConfigContent(String configContent) { + this.configContent = configContent; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserOrgEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserOrgEO.java new file mode 100644 index 00000000..2f13cc34 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserOrgEO.java @@ -0,0 +1,67 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; + + +/** + * 功能:TS_USER_ORG UserOrgEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserOrgEO extends BaseEntity { + + private String orgId; + private String userId; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • orgId -> org_id
  • + *
  • userId -> user_id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "orgId": return "org_id"; + case "userId": return "user_id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • org_id -> orgId
  • + *
  • user_id -> userId
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "org_id": return "orgId"; + case "user_id": return "userId"; + default: return null; + } + } + + /** **/ + public String getOrgId() { + return this.orgId; + } + + /** **/ + public void setOrgId(String orgId) { + this.orgId = orgId; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserRoleEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserRoleEO.java new file mode 100644 index 00000000..ff52a4f5 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/UserRoleEO.java @@ -0,0 +1,67 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; + + +/** + * 功能:TS_USER_ROLE UserRoleEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserRoleEO extends BaseEntity { + + private String roleId; + private String userId; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • roleId -> role_id
  • + *
  • userId -> user_id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "roleId": return "role_id"; + case "userId": return "user_id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • role_id -> roleId
  • + *
  • user_id -> userId
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "role_id": return "roleId"; + case "user_id": return "userId"; + default: return null; + } + } + + /** **/ + public String getRoleId() { + return this.roleId; + } + + /** **/ + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/entity/WarnTimeEO.java b/adc-da-sys/src/main/java/com/adc/da/sys/entity/WarnTimeEO.java new file mode 100644 index 00000000..d50deb15 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/entity/WarnTimeEO.java @@ -0,0 +1,67 @@ +package com.adc.da.sys.entity; + +import com.adc.da.base.entity.BaseEntity; + + +/** + * 功能:TS_WARN_TIME WarnTimeEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-17
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class WarnTimeEO extends BaseEntity { + + private String id; + private String warnType; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • id -> id
  • + *
  • warnType -> warn_type
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "id": return "id"; + case "warnType": return "warn_type"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • id -> id
  • + *
  • warn_type -> warnType
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "id": return "id"; + case "warn_type": return "warnType"; + default: return null; + } + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + /** **/ + public String getWarnType() { + return this.warnType; + } + + /** **/ + public void setWarnType(String warnType) { + this.warnType = warnType; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/FeedbackInfoEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/FeedbackInfoEOPage.java new file mode 100644 index 00000000..9f56027e --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/FeedbackInfoEOPage.java @@ -0,0 +1,222 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_FEEDBACK_INFO FeedbackInfoEOPage
    + * 作者:code generator
    + * 日期: 2018-09-17
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class FeedbackInfoEOPage extends BasePage { + + private String id; + private String idOperator = "="; + private String userId; + private String userIdOperator = "="; + private String feedbackInfo; + private String feedbackInfoOperator = "="; + private String readFlag; + private String readFlagOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "="; + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + +// 附加字段 + private String uname; + private String orgType; + private String[] idlist; + private String contentText; + private String selfId; + + public String getContentText() { + return contentText; + } + + public void setContentText(String contentText) { + this.contentText = contentText; + } + + public String[] getIdlist() { + return idlist; + } + + public void setIdlist(String[] idlist) { + this.idlist = idlist; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getFeedbackInfo() { + return this.feedbackInfo; + } + + public void setFeedbackInfo(String feedbackInfo) { + this.feedbackInfo = feedbackInfo; + } + + public String getFeedbackInfoOperator() { + return this.feedbackInfoOperator; + } + + public void setFeedbackInfoOperator(String feedbackInfoOperator) { + this.feedbackInfoOperator = feedbackInfoOperator; + } + + public String getReadFlag() { + return this.readFlag; + } + + public void setReadFlag(String readFlag) { + this.readFlag = readFlag; + } + + public String getReadFlagOperator() { + return this.readFlagOperator; + } + + public void setReadFlagOperator(String readFlagOperator) { + this.readFlagOperator = readFlagOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getUname() { + return uname; + } + + public void setUname(String uname) { + this.uname = uname; + } + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public String getSelfId() { + return selfId; + } + + public void setSelfId(String selfId) { + this.selfId = selfId; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/LinkInfoEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/LinkInfoEOPage.java new file mode 100644 index 00000000..05143943 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/LinkInfoEOPage.java @@ -0,0 +1,212 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_LINK_INFO LinkInfoEOPage
    + * 作者:code generator
    + * 日期: 2020-01-13
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class LinkInfoEOPage extends BasePage { + + private String id; + private String idOperator = "="; + private String webName; + private String webNameOperator = "="; + private String oldWebSite; + private String oldWebSiteOperator = "="; + private String newWebSite; + private String newWebSiteOperator = "="; + private String displaySeq; + private String displaySeqOperator = "="; + private String isShow; + private String isShowOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "="; + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + + public String getWebName() { + return this.webName; + } + + public void setWebName(String webName) { + this.webName = webName; + } + + public String getWebNameOperator() { + return this.webNameOperator; + } + + public void setWebNameOperator(String webNameOperator) { + this.webNameOperator = webNameOperator; + } + + public String getOldWebSite() { + return this.oldWebSite; + } + + public void setOldWebSite(String oldWebSite) { + this.oldWebSite = oldWebSite; + } + + public String getOldWebSiteOperator() { + return this.oldWebSiteOperator; + } + + public void setOldWebSiteOperator(String oldWebSiteOperator) { + this.oldWebSiteOperator = oldWebSiteOperator; + } + + public String getNewWebSite() { + return this.newWebSite; + } + + public void setNewWebSite(String newWebSite) { + this.newWebSite = newWebSite; + } + + public String getNewWebSiteOperator() { + return this.newWebSiteOperator; + } + + public void setNewWebSiteOperator(String newWebSiteOperator) { + this.newWebSiteOperator = newWebSiteOperator; + } + + public String getDisplaySeq() { + return this.displaySeq; + } + + public void setDisplaySeq(String displaySeq) { + this.displaySeq = displaySeq; + } + + public String getDisplaySeqOperator() { + return this.displaySeqOperator; + } + + public void setDisplaySeqOperator(String displaySeqOperator) { + this.displaySeqOperator = displaySeqOperator; + } + + public String getIsShow() { + return this.isShow; + } + + public void setIsShow(String isShow) { + this.isShow = isShow; + } + + public String getIsShowOperator() { + return this.isShowOperator; + } + + public void setIsShowOperator(String isShowOperator) { + this.isShowOperator = isShowOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/LoginInfoEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/LoginInfoEOPage.java new file mode 100644 index 00000000..71e18577 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/LoginInfoEOPage.java @@ -0,0 +1,176 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_LOGIN_INFO LoginInfoEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class LoginInfoEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "="; + private String loginAddress; + private String loginAddressOperator = "="; + private String loginTime; + private String loginTime1; + private String loginTime2; + private String loginTimeOperator = "="; + private String userId; + private String userIdOperator = "="; + private String id; + private String idOperator = "="; + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getLoginAddress() { + return this.loginAddress; + } + + public void setLoginAddress(String loginAddress) { + this.loginAddress = loginAddress; + } + + public String getLoginAddressOperator() { + return this.loginAddressOperator; + } + + public void setLoginAddressOperator(String loginAddressOperator) { + this.loginAddressOperator = loginAddressOperator; + } + + public String getLoginTime() { + return this.loginTime; + } + + public void setLoginTime(String loginTime) { + this.loginTime = loginTime; + } + + public String getLoginTime1() { + return this.loginTime1; + } + + public void setLoginTime1(String loginTime1) { + this.loginTime1 = loginTime1; + } + + public String getLoginTime2() { + return this.loginTime2; + } + + public void setLoginTime2(String loginTime2) { + this.loginTime2 = loginTime2; + } + + public String getLoginTimeOperator() { + return this.loginTimeOperator; + } + + public void setLoginTimeOperator(String loginTimeOperator) { + this.loginTimeOperator = loginTimeOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/RoleEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/RoleEOPage.java new file mode 100644 index 00000000..606d6a43 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/RoleEOPage.java @@ -0,0 +1,248 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_ROLE RoleEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class RoleEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String operUser; + private String operUserOperator = "="; + private String extInfo; + private String extInfoOperator = "="; + private String remarks; + private String remarksOperator = "="; + private String isDefault; + private String isDefaultOperator = "="; + private String useFlag; + private String useFlagOperator = "="; + private String roleType; + private String roleTypeOperator = "="; + private String name; + private String nameOperator = "="; + private String id; + private String idOperator = "="; + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getOperUser() { + return this.operUser; + } + + public void setOperUser(String operUser) { + this.operUser = operUser; + } + + public String getOperUserOperator() { + return this.operUserOperator; + } + + public void setOperUserOperator(String operUserOperator) { + this.operUserOperator = operUserOperator; + } + + public String getExtInfo() { + return extInfo; + } + + public void setExtInfo(String extInfo) { + this.extInfo = extInfo; + } + + public String getExtInfoOperator() { + return this.extInfoOperator; + } + + public void setExtInfoOperator(String extInfoOperator) { + this.extInfoOperator = extInfoOperator; + } + + public String getRemarks() { + return this.remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksOperator() { + return this.remarksOperator; + } + + public void setRemarksOperator(String remarksOperator) { + this.remarksOperator = remarksOperator; + } + + public String getIsDefault() { + return this.isDefault; + } + + public void setIsDefault(String isDefault) { + this.isDefault = isDefault; + } + + public String getIsDefaultOperator() { + return this.isDefaultOperator; + } + + public void setIsDefaultOperator(String isDefaultOperator) { + this.isDefaultOperator = isDefaultOperator; + } + + public String getUseFlag() { + return this.useFlag; + } + + public void setUseFlag(String useFlag) { + this.useFlag = useFlag; + } + + public String getUseFlagOperator() { + return this.useFlagOperator; + } + + public void setUseFlagOperator(String useFlagOperator) { + this.useFlagOperator = useFlagOperator; + } + + public String getRoleType() { + return this.roleType; + } + + public void setRoleType(String roleType) { + this.roleType = roleType; + } + + public String getRoleTypeOperator() { + return this.roleTypeOperator; + } + + public void setRoleTypeOperator(String roleTypeOperator) { + this.roleTypeOperator = roleTypeOperator; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNameOperator() { + return this.nameOperator; + } + + public void setNameOperator(String nameOperator) { + this.nameOperator = nameOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/RoleMenuEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/RoleMenuEOPage.java new file mode 100644 index 00000000..e221950b --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/RoleMenuEOPage.java @@ -0,0 +1,51 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + + +/** + * 功能:TS_ROLE_MENU RoleMenuEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class RoleMenuEOPage extends BasePage { + + private String menuId; + private String menuIdOperator = "="; + private String roleId; + private String roleIdOperator = "="; + + public String getMenuId() { + return this.menuId; + } + + public void setMenuId(String menuId) { + this.menuId = menuId; + } + + public String getMenuIdOperator() { + return this.menuIdOperator; + } + + public void setMenuIdOperator(String menuIdOperator) { + this.menuIdOperator = menuIdOperator; + } + + public String getRoleId() { + return this.roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleIdOperator() { + return this.roleIdOperator; + } + + public void setRoleIdOperator(String roleIdOperator) { + this.roleIdOperator = roleIdOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/RoleSarMenuEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/RoleSarMenuEOPage.java new file mode 100644 index 00000000..f042a0db --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/RoleSarMenuEOPage.java @@ -0,0 +1,51 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + + +/** + * 功能:TS_ROLE_SAR_MENU RoleSarMenuEOPage
    + * 作者:code generator
    + * 日期: 2019-02-19
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class RoleSarMenuEOPage extends BasePage { + + private String roleId; + private String roleIdOperator = "="; + private String sarMenuId; + private String sarMenuIdOperator = "="; + + public String getRoleId() { + return this.roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleIdOperator() { + return this.roleIdOperator; + } + + public void setRoleIdOperator(String roleIdOperator) { + this.roleIdOperator = roleIdOperator; + } + + public String getSarMenuId() { + return this.sarMenuId; + } + + public void setSarMenuId(String sarMenuId) { + this.sarMenuId = sarMenuId; + } + + public String getSarMenuIdOperator() { + return this.sarMenuIdOperator; + } + + public void setSarMenuIdOperator(String sarMenuIdOperator) { + this.sarMenuIdOperator = sarMenuIdOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/UserConfigEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserConfigEOPage.java new file mode 100644 index 00000000..b75bc19d --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserConfigEOPage.java @@ -0,0 +1,176 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_USER_CONFIG UserConfigEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserConfigEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String configContent; + private String configContentOperator = "="; + private String configType; + private String configTypeOperator = "="; + private String userId; + private String userIdOperator = "="; + private String id; + private String idOperator = "="; + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getConfigContent() { + return this.configContent; + } + + public void setConfigContent(String configContent) { + this.configContent = configContent; + } + + public String getConfigContentOperator() { + return this.configContentOperator; + } + + public void setConfigContentOperator(String configContentOperator) { + this.configContentOperator = configContentOperator; + } + + public String getConfigType() { + return this.configType; + } + + public void setConfigType(String configType) { + this.configType = configType; + } + + public String getConfigTypeOperator() { + return this.configTypeOperator; + } + + public void setConfigTypeOperator(String configTypeOperator) { + this.configTypeOperator = configTypeOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/UserEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserEOPage.java new file mode 100644 index 00000000..0915cc94 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserEOPage.java @@ -0,0 +1,256 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + + +/** + * 功能:TS_USER UserEOPage
    + * 作者:code generator
    + * 日期: 2017-11-06
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserEOPage extends BasePage { + + private String usid; + private String usidOperator = "="; + private String account; + private String accountOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String password; + private String passwordOperator = "="; + private String uname; + private String unameOperator = "like"; + private String roleName; + private String roleNameOperator = "like"; + private String roleId; + private String roleIdOperator = "="; + private String orgName; + private String orgNameOperator = "="; + private String workNum; + private String workNumOperator ="="; + private String orgId; + private String orgIdOperator = "="; + private String disableFlag; + private String disableFlagOperator = "="; + private String unlockFlag; + private String unlockFLagOperator = "="; + private String userType; + private String userTypeOperator = "="; + private boolean disAdmin=true; + + + + public String getUsid() { + return this.usid; + } + + public void setUsid(String usid) { + this.usid = usid; + } + + public String getUsidOperator() { + return this.usidOperator; + } + + public void setUsidOperator(String usidOperator) { + this.usidOperator = usidOperator; + } + + public String getAccount() { + return this.account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAccountOperator() { + return this.accountOperator; + } + + public void setAccountOperator(String accountOperator) { + this.accountOperator = accountOperator; + } + + public String getValidFlag() { + return validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPasswordOperator() { + return this.passwordOperator; + } + + public void setPasswordOperator(String passwordOperator) { + this.passwordOperator = passwordOperator; + } + + public String getUname() { + return uname; + } + + public void setUname(String uname) { + this.uname = uname; + } + + public String getUnameOperator() { + return this.unameOperator; + } + + public void setUnameOperator(String uameOperator) { + this.unameOperator = unameOperator; + } + + public String getOrgName() { + return orgName; + } + + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + public String getOrgNameOperator() { + return orgNameOperator; + } + + public void setOrgNameOperator(String orgNameOperator) { + this.orgNameOperator = orgNameOperator; + } + + public String getWorkNum() { + return workNum; + } + + public void setWorkNum(String workNum) { + this.workNum = workNum; + } + + public String getWorkNumOperator() { + return workNumOperator; + } + + public void setWorkNumOperator(String workNumOperator) { + this.workNumOperator = workNumOperator; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleIdOperator() { + return roleIdOperator; + } + + public void setRoleIdOperator(String roleIdOperator) { + this.roleIdOperator = roleIdOperator; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public void setDisableFlag(String disableFlag){ + this.disableFlag=disableFlag; + } + + public String getDisableFlag(){ + return this.disableFlag; + } + + public void setDisableFlagOperator(String disableFlagOperator){ + this.disableFlagOperator=disableFlagOperator; + } + + public String getDisableFlagOperator(){ + return this.disableFlagOperator; + } + + public void setUnlockFlag(String unlockFlag){ + this.unlockFlag = unlockFlag; + } + + public String getUnlockFlag(){ + return this.unlockFlag; + } + + public void setUnlockFLagOperator(String unlockFLagOperator){ + this.unlockFLagOperator =unlockFLagOperator; + } + + public String getUnlockFLagOperator(){ + return this.unlockFLagOperator; + } + + public void setUserType(String userType){ + this.userType=userType; + } + public String getUserType(){ + return this.userType; + } + + public String getUserTypeOperator(){ + return this.userTypeOperator; + } + public void setUserTypeOperator(String userTypeOperator){ + this.userTypeOperator=userTypeOperator; + } + + public void setRoleNameOperator(String roleNameOperator){ + this.roleNameOperator=roleNameOperator; + } + public String getRoleNameOperator(){ + return this.roleNameOperator; + } + + public void setOrgId(String orgId){ + this.orgId=orgId; + } + + public String getOrgId(){ + return this.orgId; + } + + public String getOrgIdOperator() { + return orgIdOperator; + } + + public void setOrgIdOperator(String orgIdOperator) { + this.orgIdOperator = orgIdOperator; + } + + public boolean isDisAdmin() { + return disAdmin; + } + + public void setDisAdmin(boolean disAdmin) { + this.disAdmin = disAdmin; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/UserInfoEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserInfoEOPage.java new file mode 100644 index 00000000..ef8e60a0 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserInfoEOPage.java @@ -0,0 +1,339 @@ +package com.adc.da.sys.page; + + +import com.adc.da.base.page.BasePage; + +/** + * 功能:TS_USER_INFO UserInfoEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserInfoEOPage extends BasePage { + + private String modifyTime; + private String modifyTime1; + private String modifyTime2; + private String modifyTimeOperator = "="; + private String creationTime; + private String creationTime1; + private String creationTime2; + private String creationTimeOperator = "="; + private String validFlag; + private String validFlagOperator = "="; + private String signature; + private String signatureOperator = "="; + private String faxAddress; + private String faxAddressOperator = "="; + private String address; + private String addressOperator = "="; + private String gender; + private String genderOperator = "="; + private String partPost; + private String partPostOperator = "="; + private String assistantPost; + private String assistantPostOperator = "="; + private String mainPost; + private String mainPostOperator = "="; + private String mobilePhone; + private String mobilePhoneOperator = "="; + private String officePhone; + private String officePhoneOperator = "="; + private String userPic; + private String userPicOperator = "="; + private String duty; + private String dutyOperator = "="; + private String userId; + private String userIdOperator = "="; + private String id; + private String idOperator = "="; + + public String getModifyTime() { + return this.modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getModifyTime1() { + return this.modifyTime1; + } + + public void setModifyTime1(String modifyTime1) { + this.modifyTime1 = modifyTime1; + } + + public String getModifyTime2() { + return this.modifyTime2; + } + + public void setModifyTime2(String modifyTime2) { + this.modifyTime2 = modifyTime2; + } + + public String getModifyTimeOperator() { + return this.modifyTimeOperator; + } + + public void setModifyTimeOperator(String modifyTimeOperator) { + this.modifyTimeOperator = modifyTimeOperator; + } + + public String getCreationTime() { + return this.creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getCreationTime1() { + return this.creationTime1; + } + + public void setCreationTime1(String creationTime1) { + this.creationTime1 = creationTime1; + } + + public String getCreationTime2() { + return this.creationTime2; + } + + public void setCreationTime2(String creationTime2) { + this.creationTime2 = creationTime2; + } + + public String getCreationTimeOperator() { + return this.creationTimeOperator; + } + + public void setCreationTimeOperator(String creationTimeOperator) { + this.creationTimeOperator = creationTimeOperator; + } + + public String getValidFlag() { + return this.validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getValidFlagOperator() { + return this.validFlagOperator; + } + + public void setValidFlagOperator(String validFlagOperator) { + this.validFlagOperator = validFlagOperator; + } + + public String getSignature() { + return this.signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + + public String getSignatureOperator() { + return this.signatureOperator; + } + + public void setSignatureOperator(String signatureOperator) { + this.signatureOperator = signatureOperator; + } + + public String getFaxAddress() { + return this.faxAddress; + } + + public void setFaxAddress(String faxAddress) { + this.faxAddress = faxAddress; + } + + public String getFaxAddressOperator() { + return this.faxAddressOperator; + } + + public void setFaxAddressOperator(String faxAddressOperator) { + this.faxAddressOperator = faxAddressOperator; + } + + public String getAddress() { + return this.address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getAddressOperator() { + return this.addressOperator; + } + + public void setAddressOperator(String addressOperator) { + this.addressOperator = addressOperator; + } + + public String getGender() { + return this.gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getGenderOperator() { + return this.genderOperator; + } + + public void setGenderOperator(String genderOperator) { + this.genderOperator = genderOperator; + } + + public String getPartPost() { + return this.partPost; + } + + public void setPartPost(String partPost) { + this.partPost = partPost; + } + + public String getPartPostOperator() { + return this.partPostOperator; + } + + public void setPartPostOperator(String partPostOperator) { + this.partPostOperator = partPostOperator; + } + + public String getAssistantPost() { + return this.assistantPost; + } + + public void setAssistantPost(String assistantPost) { + this.assistantPost = assistantPost; + } + + public String getAssistantPostOperator() { + return this.assistantPostOperator; + } + + public void setAssistantPostOperator(String assistantPostOperator) { + this.assistantPostOperator = assistantPostOperator; + } + + public String getMainPost() { + return this.mainPost; + } + + public void setMainPost(String mainPost) { + this.mainPost = mainPost; + } + + public String getMainPostOperator() { + return this.mainPostOperator; + } + + public void setMainPostOperator(String mainPostOperator) { + this.mainPostOperator = mainPostOperator; + } + + public String getMobilePhone() { + return this.mobilePhone; + } + + public void setMobilePhone(String mobilePhone) { + this.mobilePhone = mobilePhone; + } + + public String getMobilePhoneOperator() { + return this.mobilePhoneOperator; + } + + public void setMobilePhoneOperator(String mobilePhoneOperator) { + this.mobilePhoneOperator = mobilePhoneOperator; + } + + public String getOfficePhone() { + return this.officePhone; + } + + public void setOfficePhone(String officePhone) { + this.officePhone = officePhone; + } + + public String getOfficePhoneOperator() { + return this.officePhoneOperator; + } + + public void setOfficePhoneOperator(String officePhoneOperator) { + this.officePhoneOperator = officePhoneOperator; + } + + public String getUserPic() { + return this.userPic; + } + + public void setUserPic(String userPic) { + this.userPic = userPic; + } + + public String getUserPicOperator() { + return this.userPicOperator; + } + + public void setUserPicOperator(String userPicOperator) { + this.userPicOperator = userPicOperator; + } + + public String getDuty() { + return this.duty; + } + + public void setDuty(String duty) { + this.duty = duty; + } + + public String getDutyOperator() { + return this.dutyOperator; + } + + public void setDutyOperator(String dutyOperator) { + this.dutyOperator = dutyOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/UserOrgEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserOrgEOPage.java new file mode 100644 index 00000000..b8222422 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserOrgEOPage.java @@ -0,0 +1,51 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + + +/** + * 功能:TS_USER_ORG UserOrgEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserOrgEOPage extends BasePage { + + private String orgId; + private String orgIdOperator = "="; + private String userId; + private String userIdOperator = "="; + + public String getOrgId() { + return this.orgId; + } + + public void setOrgId(String orgId) { + this.orgId = orgId; + } + + public String getOrgIdOperator() { + return this.orgIdOperator; + } + + public void setOrgIdOperator(String orgIdOperator) { + this.orgIdOperator = orgIdOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/UserRoleEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserRoleEOPage.java new file mode 100644 index 00000000..4bf046fc --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/UserRoleEOPage.java @@ -0,0 +1,51 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + + +/** + * 功能:TS_USER_ROLE UserRoleEOPage
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class UserRoleEOPage extends BasePage { + + private String roleId; + private String roleIdOperator = "="; + private String userId; + private String userIdOperator = "="; + + public String getRoleId() { + return this.roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleIdOperator() { + return this.roleIdOperator; + } + + public void setRoleIdOperator(String roleIdOperator) { + this.roleIdOperator = roleIdOperator; + } + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserIdOperator() { + return this.userIdOperator; + } + + public void setUserIdOperator(String userIdOperator) { + this.userIdOperator = userIdOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/page/WarnTimeEOPage.java b/adc-da-sys/src/main/java/com/adc/da/sys/page/WarnTimeEOPage.java new file mode 100644 index 00000000..8ec99ef1 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/page/WarnTimeEOPage.java @@ -0,0 +1,51 @@ +package com.adc.da.sys.page; + +import com.adc.da.base.page.BasePage; + + +/** + * 功能:TS_WARN_TIME WarnTimeEOPage
    + * 作者:code generator
    + * 日期: 2018-09-17
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class WarnTimeEOPage extends BasePage { + + private String id; + private String idOperator = "="; + private String warnType; + private String warnTypeOperator = "="; + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOperator() { + return this.idOperator; + } + + public void setIdOperator(String idOperator) { + this.idOperator = idOperator; + } + + public String getWarnType() { + return this.warnType; + } + + public void setWarnType(String warnType) { + this.warnType = warnType; + } + + public String getWarnTypeOperator() { + return this.warnTypeOperator; + } + + public void setWarnTypeOperator(String warnTypeOperator) { + this.warnTypeOperator = warnTypeOperator; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IFeedbackInfoEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IFeedbackInfoEOService.java new file mode 100644 index 00000000..50159a28 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IFeedbackInfoEOService.java @@ -0,0 +1,17 @@ +package com.adc.da.sys.service; + +import com.adc.da.http.ResponseMessage; +import com.adc.da.sys.entity.FeedbackInfoEO; +import com.adc.da.sys.page.FeedbackInfoEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IFeedbackInfoEOService extends IService { + + public List queryByPage(FeedbackInfoEOPage page); + + public List queryByList(FeedbackInfoEOPage page); + + public ResponseMessage deleteByPrimaryKeyList(FeedbackInfoEOPage page); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/ILinkInfoEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/ILinkInfoEOService.java new file mode 100644 index 00000000..9f241bda --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/ILinkInfoEOService.java @@ -0,0 +1,16 @@ +package com.adc.da.sys.service; + +import com.adc.da.sys.entity.LinkInfoEO; +import com.adc.da.sys.page.LinkInfoEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface ILinkInfoEOService extends IService { + + public List queryByPage(LinkInfoEOPage page); + + public List queryByList(LinkInfoEOPage page); + + public int deleteByIds(List idList); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/ILoginInfoEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/ILoginInfoEOService.java new file mode 100644 index 00000000..b4fcf380 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/ILoginInfoEOService.java @@ -0,0 +1,18 @@ +package com.adc.da.sys.service; + +import com.adc.da.sys.entity.LoginInfoEO; +import com.adc.da.sys.page.LoginInfoEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface ILoginInfoEOService extends IService { + + public List queryByPage(LoginInfoEOPage page); + + public List queryByList(LoginInfoEOPage page); + + public int saveBean(LoginInfoEO loginInfoEO); + + public int count(); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IMenuEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IMenuEOService.java new file mode 100644 index 00000000..7622c495 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IMenuEOService.java @@ -0,0 +1,32 @@ +package com.adc.da.sys.service; + +import com.adc.da.sys.entity.MenuEO; +import com.adc.da.sys.page.MenuEOPage; +import com.adc.da.sys.vo.MenuVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IMenuEOService extends IService { + + public List queryByList(MenuEOPage page); + + public MenuEO insertMenu(MenuEO menuEO); + + public void updateMenu(MenuVO menuVO); + + public void delete(String[] ids); + + public List listMenuEOByUserId(String userId); + + public List findAll(); + + public boolean isBelong(String roleId, String menuId); + + public List listMenuEOByRoleId(String roleId); + + public List queryByAllMenu(MenuEOPage page); + + public MenuEO creatMenu(MenuEO menuEO); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IOrgEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IOrgEOService.java new file mode 100644 index 00000000..6637d2da --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IOrgEOService.java @@ -0,0 +1,78 @@ +package com.adc.da.sys.service; + +import com.adc.da.http.ResponseMessage; +import com.adc.da.sys.entity.OrgEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.page.OrgEOPage; +import com.adc.da.sys.vo.UserVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.LinkedList; +import java.util.List; + +public interface IOrgEOService extends IService { + + + public List listOrgEOByOrgName(String orgName); + + public OrgEO getOrgEOByNameAndPid(String orgName, String pId); + + public List getOrgEOByPid(String pId); + + public ResponseMessage saveBean(OrgEO orgEO); + + public OrgEO getOrgEOById(String id); + + public ResponseMessage delete(String id); + + public LinkedList selectOrgAllNode(); + + public List getChildDept(String orgId); + + public LinkedList getTree(); + +// public void addNodes(LinkedList rootNodes, int i); + + public ResponseMessage updateBeanById(OrgEO orgEO); + + public ResponseMessage delOrgRelatedUser(String userId, String orgId); + + public ResponseMessage addOrgRelatedUser(String userOrgs); + + public int delOrgRelatedUserByUserId(String usId); + + public List findById(String id, String orgName); + + public List getTreeByRole(String roleName); + + public List getLeaderByUserId(String userId, String orgType, String roleName); + + public List getTreeByRoleAndOrgId(String roleName, String orgId); + + public List getTreeByRoleNameAndOrgId(String roleName, String orgId); + + public List getIdsByorgType(); + + public List getAllOrgbyOrgId(String orgId); + + public int getOrgNamebyOrgId(UserVO userVO); + + public List getTreeByRoleAndOrgId1(String roleName, String orgId); + + public List getTreeByRoleAndOrgId3(String roleName, UserEO userEO); + + public int getOrgbyOrgId1(String orgId); + + public List getManagerByOrgId(String roleName, String orgId); + + public List queryOrgByList(String orgName); + + public List getTreeByRole2(String roleId); + + public OrgEO getOrgInfoByOrgId(String OrgId); + + public OrgEO getOrgParentInfoOrgId(OrgEO orgEO); + + public List getOrgRootTree(); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IRoleEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IRoleEOService.java new file mode 100644 index 00000000..0a183788 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IRoleEOService.java @@ -0,0 +1,43 @@ +package com.adc.da.sys.service; + +import com.adc.da.sys.entity.RoleEO; +import com.adc.da.sys.entity.UserRoleEO; +import com.adc.da.sys.page.RoleEOPage; +import com.adc.da.sys.vo.RoleVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IRoleEOService extends IService { + + public List queryByPage(RoleEOPage page); + + public List queryByList(RoleEOPage page); + + public int saveBean(RoleEO sysRoleEO); + + public int updateByPrimaryKeySelective(RoleEO roleEO); + + public RoleEO getRoleWithMenus(String id); + + public List getSysRoleListByUserId(String userId); + + public void delete(String roleId); + + public List findAll(RoleVO setRole); + + public List getUserRoleListByRoleId(String roleId); + + public RoleEO saveRoleMenu(RoleEO roleEO); + + public boolean isBelong(String userId, String roleId); + + public int querySectionCount(String roleId); + + public int querySectionCount1(String roleId); + + public List selectByNameAndId(String id, String name); + + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IRoleSarMenuEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IRoleSarMenuEOService.java new file mode 100644 index 00000000..b84df62a --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IRoleSarMenuEOService.java @@ -0,0 +1,23 @@ +package com.adc.da.sys.service; + +import com.adc.da.sys.entity.RoleSarMenuEO; +import com.adc.da.sys.page.RoleSarMenuEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IRoleSarMenuEOService extends IService { + + public List queryByPage(RoleSarMenuEOPage page); + + public List queryByList(RoleSarMenuEOPage page); + + public List findRoleSarMenu(String roleId); + + public String queryBusinessStandRootId(String SOR_DIVIDE); + + public List selectSarMenuRoots(); + + public int insertSubMenu (RoleSarMenuEO roleSarMenuEO); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserConfigEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserConfigEOService.java new file mode 100644 index 00000000..567b2af3 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserConfigEOService.java @@ -0,0 +1,17 @@ +package com.adc.da.sys.service; + +import com.adc.da.sys.entity.UserConfigEO; +import com.adc.da.sys.page.UserConfigEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IUserConfigEOService extends IService { + + public List queryByPage(UserConfigEOPage page); + + public List queryByList(UserConfigEOPage page); + + public int createPageConfig (String userId); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserEOService.java new file mode 100644 index 00000000..1818f2d0 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserEOService.java @@ -0,0 +1,73 @@ +package com.adc.da.sys.service; + +import com.adc.da.base.page.BasePage; +import com.adc.da.http.ResponseMessage; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.page.UserEOPage; +import com.adc.da.sys.vo.UserVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IUserEOService extends IService { + + public UserEO saveBean(UserEO userEO); + + public UserEO getUserByLoginName(String userName, String usid); + + public void updatePassword(String usid, String oldPassword, String newPassword); + + public List queryUserInfoByPage(BasePage basePage); + + public void updateUserEOInfo(UserEO userEO); + + public int delete(List ids); + + public UserEO getUserWithRoles(String id); + + public UserEO getUserWithRolesAll(String id); + + public int saveUserRole(UserEO userEO); + + public UserEO saveUserOrg(UserEO userEO); + + public int updateUserOrg(UserEO userEO); + + public UserEO selectOrgByPrimaryKey(String usid); + + public UserEO selectRoleMessageByPrimaryKey(String usid); + + + public int resetPassword(String userId); + + public UserEO selectByUnameAndPwd(UserEO userEO); + + public List queryByOrg(BasePage basePage); + + public List queryByPageAndParams(UserEOPage page); + + public List findUserInfoByPage(BasePage basePage); + + public List selectThatOrgUser(String userId); + + public List queryUserEoList(UserEOPage page); + + public List queryUserInfoByWordNum(String workNum); + + public UserEO selectByPrimaryKey(String userId); + + public List getUserListByRoleName(String RoleName); + + public ResponseMessage createOrModifyIf(UserVO userVO); + + + public List getUserEOBySpecRole(String orgId, String userId); + + public List selectAllUserInfo(); + + public UserEO getOrgIdByUserId(String userId); + + public UserEO getUserByLoginNameNotDeleted(String userName); + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserInfoEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserInfoEOService.java new file mode 100644 index 00000000..3a5eb452 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserInfoEOService.java @@ -0,0 +1,21 @@ +package com.adc.da.sys.service; + +import com.adc.da.http.ResponseMessage; +import com.adc.da.sys.entity.UserInfoEO; +import com.adc.da.sys.page.UserInfoEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IUserInfoEOService extends IService { + + public List queryByPage(UserInfoEOPage page); + + public List queryByList(UserInfoEOPage page); + + public UserInfoEO getUserEOAndInfoEOByUserCode(UserInfoEO userInfoEO); + + public ResponseMessage updateByUserId(UserInfoEO userInfo); + + public int updateByPrimaryKey(UserInfoEO userInfoEO); +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserRoleEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserRoleEOService.java new file mode 100644 index 00000000..f9e2efac --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IUserRoleEOService.java @@ -0,0 +1,7 @@ +package com.adc.da.sys.service; + +import com.adc.da.sys.entity.UserRoleEO; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface IUserRoleEOService extends IService { +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/IWarnTimeEOService.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/IWarnTimeEOService.java new file mode 100644 index 00000000..fd16baf2 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/IWarnTimeEOService.java @@ -0,0 +1,15 @@ +package com.adc.da.sys.service; + +import com.adc.da.sys.entity.WarnTimeEO; +import com.adc.da.sys.page.WarnTimeEOPage; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface IWarnTimeEOService extends IService { + + public List queryByPage(WarnTimeEOPage page); + + public List queryByList(WarnTimeEOPage page); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/FeedbackInfoEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/FeedbackInfoEOServiceImpl.java new file mode 100644 index 00000000..c7662975 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/FeedbackInfoEOServiceImpl.java @@ -0,0 +1,61 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.dao.FeedbackInfoEODao; +import com.adc.da.sys.entity.FeedbackInfoEO; +import com.adc.da.sys.page.FeedbackInfoEOPage; +import com.adc.da.sys.service.IFeedbackInfoEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + + +/** + *
    + * 功能:TS_FEEDBACK_INFO FeedbackInfoEOService
    + * 作者:code generator
    + * 日期: 2018-09-17
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("feedbackInfoEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +@Slf4j +public class FeedbackInfoEOServiceImpl extends ServiceImpl implements IFeedbackInfoEOService { + + + @Override + public List queryByPage(FeedbackInfoEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + @Override + public List queryByList(FeedbackInfoEOPage page) { + return this.baseMapper.queryByList(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + public ResponseMessage deleteByPrimaryKeyList(FeedbackInfoEOPage page) { + FeedbackInfoEO feedbackInfoEO = new FeedbackInfoEO(); + feedbackInfoEO.setValidFlag(1); + feedbackInfoEO.setModifyTime(new Date()); + for (String id : page.getIdlist()) { + feedbackInfoEO.setId(id); + this.baseMapper.updateById(feedbackInfoEO); + } + return Result.success("1", "删除成功", feedbackInfoEO); + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/LinkInfoEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/LinkInfoEOServiceImpl.java new file mode 100644 index 00000000..b31d6d26 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/LinkInfoEOServiceImpl.java @@ -0,0 +1,50 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.sys.dao.LinkInfoEODao; +import com.adc.da.sys.entity.LinkInfoEO; +import com.adc.da.sys.page.LinkInfoEOPage; +import com.adc.da.sys.service.ILinkInfoEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +/** + * + *
    + * 功能:TS_LINK_INFO LinkInfoEOService
    + * 作者:code generator
    + * 日期: 2020-01-13
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("linkInfoEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class LinkInfoEOServiceImpl extends ServiceImpl implements ILinkInfoEOService { + + + @Override + public List queryByPage(LinkInfoEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(LinkInfoEOPage page) { + return this.baseMapper.queryByList(page); + } + + public int deleteByIds(@Param("idList") List idList){ + return this.baseMapper.deleteByIds(idList); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/LoginInfoEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/LoginInfoEOServiceImpl.java new file mode 100644 index 00000000..dc03a6e3 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/LoginInfoEOServiceImpl.java @@ -0,0 +1,63 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.sys.dao.LoginInfoEODao; +import com.adc.da.sys.entity.LoginInfoEO; +import com.adc.da.sys.page.LoginInfoEOPage; +import com.adc.da.sys.service.ILoginInfoEOService; +import com.adc.da.util.UUIDUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + +/** + * + *
    + * 功能:TS_ROLE RoleEOService
    + * 作者:code generator
    + * 日期: 2017-11-06
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("loginInfoEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class LoginInfoEOServiceImpl extends ServiceImpl implements ILoginInfoEOService { + + @Override + public List queryByPage(LoginInfoEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(LoginInfoEOPage page) { + return this.baseMapper.queryByList(page); + } + + /** + * @Author liwenxuan + * @Description 新增 + * @Date Administrator 2018/9/26 + * @Param [sysRoleEO] + * @return int + **/ + public int saveBean(LoginInfoEO loginInfoEO) { + loginInfoEO.setId(UUIDUtils.randomUUID20()); + loginInfoEO.setCreationTime(new Date()); + loginInfoEO.setModifyTime(new Date()); + loginInfoEO.setLoginTime(new Date()); + return this.baseMapper.insert(loginInfoEO); + } + + public int count(){ + return this.baseMapper.count(); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/MenuEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/MenuEOServiceImpl.java new file mode 100644 index 00000000..0664f328 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/MenuEOServiceImpl.java @@ -0,0 +1,166 @@ +package com.adc.da.sys.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.adc.da.base.entity.TreeEntity; +import com.adc.da.base.page.BasePage; +import com.adc.da.common.ValidFlagEnum; +import com.adc.da.sys.dao.MenuEODao; +import com.adc.da.sys.entity.MenuEO; +import com.adc.da.sys.page.MenuEOPage; +import com.adc.da.sys.service.IMenuEOService; +import com.adc.da.sys.vo.MenuVO; +import com.adc.da.util.UUIDUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + +/** + * + *
    + * 功能:TS_MENU MenuEOService
    + * 作者:code generator
    + * 日期: 2017-11-06
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("menuEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class MenuEOServiceImpl extends ServiceImpl implements IMenuEOService { + + + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(MenuEOPage page) { + return this.baseMapper.queryByList(page); + } + + /** + * 添加菜单 构建菜单树 + */ + public MenuEO insertMenu(MenuEO menuEO){ + menuEO.setId(UUIDUtils.randomUUID10()); + menuEO.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()); + menuEO.setCreationTime(new Date()); + menuEO.setModifyTime(new Date()); + TreeEntity parent = menuEO.getParent(); + if (parent != null) { + menuEO.setParentId(parent.getId()); + menuEO.setParentIds(parent.getParentIds() + parent.getId() + ","); + } + this.baseMapper.insert(menuEO); + return menuEO; + } + + /** + * 更新菜单 + * + * @param menuVO + * 菜单VO对象 + */ + public void updateMenu(MenuVO menuVO){ + // 处理当前节点 + // 构建菜单 + menuVO.setModifyTime(new Date()); + String oldParentId = menuVO.getParentId(); + String oldParentIds = menuVO.getParentIds(); + MenuVO parentMenu = menuVO.getParent(); + if (parentMenu != null) { + menuVO.setParentId(parentMenu.getId()); + menuVO.setParentIds(parentMenu.getParentIds() + parentMenu.getId() + ","); + } + // 处理所有的子节点 + // 1 判断父节点是否移动到其他节点 + if (oldParentId != null && !oldParentId.equals(menuVO.getParentId())) { + // 1 获取要修改的当前节点的所有子节点 + List childMenus = this.baseMapper.getChildMenus(menuVO.getId()); + // 2 修改所有子节点的ParentIds为当前节点的parentIds + parentId + for (MenuEO childMenu : childMenus) { + childMenu.setParentIds(childMenu.getParentIds().replace(oldParentIds, menuVO.getParentIds())); + // 更新到数据库 + this.baseMapper.updateById(childMenu); + } + } + // 修改当前节点 + this.baseMapper.updateById(BeanUtil.toBean(menuVO,MenuEO.class)); + + } + + /** + * 逻辑删除菜单及其子菜单,物理删除菜单及其子菜单与角色的关联 + * + * @param ids + * 待删除的所有菜单ID + */ + public void delete(String[] ids) { + this.baseMapper.deleteMenuLogic(ids); + this.baseMapper.deleteRoleMenus(ids); + } + + /** + * 获取用户的所有菜单 + * + * @param userId + * 用户ID + */ + @Transactional(readOnly = true, rollbackFor = Throwable.class) + public List listMenuEOByUserId(String userId) { + return this.baseMapper.listMenuEOByUserId(userId); + } + + /** + * 获取所有的菜单 + * + * @return 所有菜单 + */ + @Transactional(readOnly = true, rollbackFor = Throwable.class) + public List findAll() { + return this.baseMapper.findAll(); + } + + /** + * 判定菜单是否属于角色 + * + * @param roleId + * 角色ID + * @param menuId + * 菜单ID + * @return true -> 菜单属于角色 + */ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public boolean isBelong(String roleId, String menuId) { + int count = this.baseMapper.isBelong(roleId, menuId); + return count > 0; + } + + /** + * 获取角色对应的所有菜单 + * + * @param roleId + * 角色ID + * @return 角色对应的所有菜单 + */ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List listMenuEOByRoleId(String roleId) { + return this.baseMapper.listMenuEOByRoleID(roleId); + } + + public List queryByAllMenu(MenuEOPage page){ + return this.baseMapper.queryByAllMenu(page); + } + + public MenuEO creatMenu(MenuEO menuEO){ + menuEO.setId(UUIDUtils.randomUUID20()); + menuEO.setValidFlag(0); + menuEO.setCreationTime(new Date()); + menuEO.setModifyTime(new Date()); + this.baseMapper.insert(menuEO); + return menuEO; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/OrgEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/OrgEOServiceImpl.java new file mode 100644 index 00000000..d875b440 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/OrgEOServiceImpl.java @@ -0,0 +1,540 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.common.ValidFlagEnum; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.dao.OrgEODao; +import com.adc.da.sys.entity.OrgEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.entity.UserOrgEO; +import com.adc.da.sys.page.UserEOPage; +import com.adc.da.sys.service.IOrgEOService; +import com.adc.da.sys.service.IUserEOService; +import com.adc.da.sys.vo.UserVO; +import com.adc.da.util.UUIDUtils; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +@Service("orgEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class OrgEOServiceImpl extends ServiceImpl implements IOrgEOService { + + + List splitParentIds = null; + + + @Autowired + private IUserEOService userEOService; + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List listOrgEOByOrgName(String orgName) { + return this.baseMapper.listOrgEOByOrgName(orgName); + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public OrgEO getOrgEOByNameAndPid(String orgName, String pId) { + return this.baseMapper.getOrgEOByNameAndPid(orgName, pId); + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List getOrgEOByPid(String pId) { + return this.baseMapper.getOrgEOByPid(pId); + } + + /** + * @return com.adc.da.util.http.ResponseMessage + * @Author liwenxuan + * @Description + * @Date Administrator 2018/9/21 + * @Param [orgEO] + **/ + public ResponseMessage saveBean(OrgEO orgEO) { + + String orgName = orgEO.getOrgName(); + String shotName = orgEO.getShotName(); + String getpId = orgEO.getpId(); + // String id = orgEO.getId();//id在这里为空,只是为了使用getOrgEOByShotNameAndPidAndId方法填进去的,真能坑,谁让你设置值的,你设置空好不好 + String id = null; + + if (StringUtils.isEmpty(orgName)) { + return Result.error("组织机构名不能为空"); + } else if (this.baseMapper.getOrgEOByorgNameAndPidAndId(orgName, getpId, id) != null) { + return Result.error("组织机构名称不能重复"); + } + + if (StringUtils.isEmpty(shotName)) { + return Result.error("组织机构简称不能为空"); + } else if (this.baseMapper.getOrgEOByShotNameAndPidAndId(shotName, getpId, id) != null) { + return Result.error("组织机构简称不能重复"); + } +// 向ParentIds中添加用都逗号隔开的所有祖先id + if (StringUtils.isNotEmpty(orgEO.getParentIds())) { + orgEO.setParentIds(orgEO.getParentIds() + "," + orgEO.getpId()); + } else { + orgEO.setParentIds(orgEO.getpId()); + } + + orgEO.setId(UUIDUtils.randomUUID20()); + orgEO.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()); + orgEO.setIsShow(0); + orgEO.setCreationTime(new Date()); + orgEO.setModifyTime(new Date()); + int line = this.baseMapper.insert(orgEO); + if (line > 0) { + return Result.success("true", "新增成功", orgEO); + } else { + return Result.error("false", "新增失败"); + } + } + + /** + * 组织机构详情 + */ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public OrgEO getOrgEOById(String id) { + return this.baseMapper.getOrgEOById(id); + } + + /** + * 删除组织机构 + * + * @return + */ + public ResponseMessage delete(String id) { + List list = this.baseMapper.getOrgEOByPid(id); +// 如果该组织机构下有子机构,则不允许删除 + if (list != null && !list.isEmpty()) { + return Result.error("该组织机构下有子机构,不能删除"); + } +//根据orgId查询组织结构下面的用户并删除关联关系 + UserEOPage userEOPage = new UserEOPage(); + userEOPage.setOrgId(id); + List userEOS = userEOService.queryUserInfoByPage(userEOPage); + if(userEOS.size()>0){ + for (UserEO userEO:userEOS){ + this.baseMapper.deleteUserOrgByOrgId(userEO.getOrgId()); + } + } + int line = this.baseMapper.deleteLogic(id); + if (line > 0) { + return Result.success("true", "操作成功", ""); + } else { + return Result.error("操作失败"); + } + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public LinkedList selectOrgAllNode() { + LinkedList rootNodes = this.baseMapper.selectOrgAllNode(); + return rootNodes; + } + + public List getChildDept(String orgId) { + return this.baseMapper.getChildDept(orgId); + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public LinkedList getTree() { + LinkedList rootNodes = this.baseMapper.selectRootNode(); + addNodes(rootNodes, 0); + return rootNodes; + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public void addNodes(LinkedList rootNodes, int i) { + if (i < rootNodes.size() || rootNodes.size() == 1) { + OrgEO orgEO = rootNodes.get(i); + LinkedList nodes = this.baseMapper.selectNodeByPid(orgEO.getId()); + if (nodes != null) { + rootNodes.addAll(nodes); + } + if (rootNodes.size() > 1) { + addNodes(rootNodes, ++i); + } + } + } + + /** + * @return com.adc.da.util.http.ResponseMessage + * @Author liwenxuan + * @Description 修改组织机构简称和名称不能为空也不可以重复 + * @Date Administrator 2018/9/18 + * @Param [orgEO] + **/ + public ResponseMessage updateBeanById(OrgEO orgEO) { + + String orgName = orgEO.getOrgName(); + String shotName = orgEO.getShotName(); + String getpId = orgEO.getpId(); + String id = orgEO.getId(); + + if (StringUtils.isEmpty(orgName)) { + return Result.error("组织机构名不能为空"); + } else if (this.baseMapper.getOrgEOByorgNameAndPidAndId(orgName, getpId, id) != null) { + return Result.error("组织机构名称不能重复"); + } + + if (StringUtils.isEmpty(shotName)) { + return Result.error("组织机构简称不能为空"); + } else if (this.baseMapper.getOrgEOByShotNameAndPidAndId(shotName, getpId, id) != null) { + return Result.error("组织机构简称不能重复"); + } + + //向ParentIds中添加用都逗号隔开的所有祖先id 本条pid:orgEO.getpId() 上一条ParentIds:orgEO.getParentIds() + /*if (StringUtils.isNotEmpty(orgEO.getParentIds())) { + orgEO.setParentIds(orgEO.getParentIds() + "," + + orgEO.getpId()); + } else { + orgEO.setParentIds(orgEO.getpId()); + }*/ + orgEO.setModifyTime(new Date()); + int line = this.baseMapper.updateById(orgEO); + if (line > 0) { + return Result.success("true", "操作成功", ""); + } else { + return Result.error("操作失败"); + } + } + + public ResponseMessage delOrgRelatedUser(String userId, String orgId) { + UserOrgEO userOrgEO = new UserOrgEO(); + userOrgEO.setUserId(userId); + userOrgEO.setOrgId(orgId); + int i = this.baseMapper.delOrgRelatedUser(userOrgEO); + if (i > 0) { + return Result.success("", "操作成功", 1); + } + return Result.error("操作失败"); + } + + public ResponseMessage addOrgRelatedUser(String userOrgs) { + List userOrgEOs = JSON.parseArray(userOrgs, UserOrgEO.class); + + int i = this.baseMapper.addOrgRelatedUsers(userOrgEOs); + if (i > 0) { + return Result.success("", "操作成功", 1); + } + return Result.error("操作失败"); + } + + public int delOrgRelatedUserByUserId(String usId) { + return this.baseMapper.delOrgRelatedUserByUserId(usId); + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List findById(String id, String orgName) { + LinkedList rootNodes = new LinkedList(); + OrgEO orgEO = new OrgEO(); + orgEO.setId(id); + orgEO.setOrgName(orgName); + rootNodes.add(orgEO); + addNodes(rootNodes, 0); + return rootNodes; + } + + public List getList() { + List orgEOList = this.baseMapper.getOrgListOfSSO(); + return orgEOList; + } + + + + + /** + * @return java.util.List + * @Author liwenxuan + * @Description //根据角色名称,查找该角色的用户(用于流程中心)+据用户查找其组织结构,筛选出唯一的组织结构 + * 把查询出来的组织结构放到了一个里面 + * @Date Administrator 2018/10/24 + * @Param [roleName] + **/ + public List getTreeByRole(String roleName) { + List treeByRole1 = this.baseMapper.getTreeByRole1(roleName); + List treeByRole2 = this.baseMapper.getTreeByRole2(roleName); + List resList = new ArrayList(); + List resultList = new ArrayList(); + if(treeByRole2!=null && !treeByRole2.isEmpty()){ + for(OrgEO orgEO : treeByRole2){ + resList.add(orgEO.getId()); + OrgEO org = this.baseMapper.getOrgEOById(orgEO.getId()); + if(org.getParentIds()!=null && !org.getParentIds().isEmpty()){ + String parentIds[] = org.getParentIds().split(","); + List parentIdList = Arrays.asList(parentIds); + resList.addAll(parentIdList); + } + } + } + HashSet h = new HashSet(resList); + resList.clear(); + resList.addAll(h); + if(resList!=null && !resList.isEmpty()){ + for(String id : resList){ + OrgEO org = this.baseMapper.getOrgEOById(id); + resultList.add(org); + } + } + treeByRole1.addAll(resultList); + return treeByRole1; + } + + public List getLeaderByUserId(String userId, String orgType, String roleName) { + List arrayListId = new ArrayList<>(); + //通过当前用户id获取用户所在组织结构的本级及上级的组织机构 + OrgEO leaderByUserId1 = this.baseMapper.getLeaderByUserId1(userId); + //如果此登录的用户组织机构为空,返回Controller此用户未分配组织机构 + if (leaderByUserId1 == null) { + return null; + } + String parentIds = leaderByUserId1.getParentIds(); + if (parentIds != null) { + this.splitParentIds = Arrays.asList(parentIds.split(",")); + arrayListId.addAll(splitParentIds); + } + String id = leaderByUserId1.getId(); + arrayListId.add(id); + //获取当前用户所在组织机构的领导id + List leaderByUserId2 = this.baseMapper.getLeaderByUserId2(orgType, arrayListId); + if(leaderByUserId2 != null && leaderByUserId2.size()>1){ + List eoList = new ArrayList<>(); + for (int i = 0;i<3;i++){ + OrgEO orgEO = new OrgEO(); + orgEO.setUsId("占位符"); + eoList.add(orgEO); + } + return eoList; + } +// 未获取当前用户所在组织机构的领导id + if (leaderByUserId2 == null || leaderByUserId2.isEmpty()) { + return null; + } + +// 返回当前组织下的负责人 + List leaderByUserId3 = this.baseMapper.getLeaderByUserId3(roleName, leaderByUserId2.get(0)); + return leaderByUserId3; + + + } + /** + * @Author liwenxuan + * @Description //根据角色名称和部门id获取组织结构用户树 + * @Date Administrator 2018/10/31 + * @Param [roleName, orgId] + * @return java.util.List + **/ + public List getTreeByRoleAndOrgId(String roleName, String orgId) { + List ids = new ArrayList<>(); + //liwenxuan:1.根据orgId查询下面的orgId集合 + List orgIds = this.baseMapper.getTreeByRoleAndOrgId1(orgId); + if(orgIds.size()!=0){ + ids.addAll(orgIds); + } + ids.add(orgId); + + //liwenxuan:2.根据下面的orgId集合查询组织机构 + //查询组织机构ids下面所对应组织机构 + List treeByRoleAndOrgId2 = this.baseMapper.getTreeByRoleAndOrgId2(ids); + //liwenxuan:根据组织机构ids查询用户 + List treeByRoleAndOrgId3 = this.baseMapper.getTreeByRoleAndOrgId3(roleName, treeByRoleAndOrgId2); + if(treeByRoleAndOrgId3.size()==0){ + return null; + } + //把两个组织机构集合和用户集合放到一起 + treeByRoleAndOrgId2.addAll(treeByRoleAndOrgId3); + return treeByRoleAndOrgId2; + } + + /** + * @Author liwenxuan + * @Description //根据roleName和orgId查询用户 + * @Date Administrator 2018/10/31 + * @Param [roleName, orgId] + * @return java.util.List + **/ + public List getTreeByRoleNameAndOrgId(String roleName, String orgId) { + List Ids = new ArrayList<>(); + //liwenxuan:根据orgId获取其所在的组织结构 + List Id1 = this.baseMapper.getTreeByRoleAndOrgId1(orgId); + if(Id1.size() !=0 ){ + Ids.addAll(Id1); + } + Ids.add(orgId); + //查询组织机构ids下面所对应的用户 + List treeByRoleAndOrgId2 = this.baseMapper.getTreeByRoleAndOrgId2(Ids); + //liwenxuan:根据组织机构ids查询用户 + return this.baseMapper.getTreeByRoleAndOrgId3(roleName, treeByRoleAndOrgId2); + } + //根据orgType查询查询部及以上组织结构 + public List getIdsByorgType(){ + return this.baseMapper.getIdsByorgType(); + } + + //根据orgId查找此组织结构(通过id 和 parentIds) + public List getAllOrgbyOrgId(String orgId){ +// 定义一个装有整个分支组织结构id集合 + List idList = new ArrayList(); +// 装入该节点id及以上parentId + OrgEO allOrgbyOrgId = this.baseMapper.getAllOrgbyOrgId(orgId); + if(allOrgbyOrgId !=null){ + idList.add(allOrgbyOrgId.getId()); + //TODO 此处可能存在返回的allOrgbyOrgId可能为null,因此在getParentIds时存在空指针异常 + List list = Arrays.asList(allOrgbyOrgId.getParentIds().split(",")); + idList.addAll(list); + } +// 装入该节点以下id + List orgIds = this.baseMapper.getTreeByRoleAndOrgId1(orgId); + idList.addAll(orgIds); + return idList; + } + // 根据orgId查找组织机构属于什么类型 + public int getOrgNamebyOrgId(UserVO userVO){ + if(StringUtils.isNotEmpty(userVO.getOrgId())){ + OrgEO allOrgbyOrgId = this.baseMapper.getAllOrgbyOrgId(userVO.getOrgId()); + String orgType = allOrgbyOrgId.getOrgType(); + if( orgType !=null && orgType.equals("FAMILY")){ + return 1; + } else if(orgType !=null && orgType.equals("DEPART")){ + return 2; + } + } + return 0; + } + + /** + * @Author liwenxuan + * @Description //流程四 获得责任部门中的项目经理 + * @Date Administrator 2018/11/8 + * @Param [roleName, orgId] + * @return java.util.List + **/ + public List getTreeByRoleAndOrgId1(String roleName, String orgId) { + List ids = new ArrayList<>(); + //liwenxuan:1.根据orgId查询下面的orgId集合 + List orgIds = this.baseMapper.getTreeByRoleAndOrgId1(orgId); + if(orgIds.size()!=0){ + ids.addAll(orgIds); + } + ids.add(orgId); + //liwenxuan:2.根据下面的orgId集合查询组织机构 + //查询组织机构ids下面所对应组织机构 + List treeByRoleAndOrgId2 = this.baseMapper.getTreeByRoleAndOrgId2(ids); + //liwenxuan:根据组织机构ids查询用户 + List treeByRoleAndOrgId3 = this.baseMapper.getTreeByRoleAndOrgId3(roleName, treeByRoleAndOrgId2); + if(treeByRoleAndOrgId3.size()==0){ + return null; + } + return treeByRoleAndOrgId3; + } + + + /** + * @Author liwenxuan + * @Description //流程三:根据角色名称和部门id获取组织结构用户树 + * @Date Administrator 2018/10/31 + * @Param [roleName, orgId] + * @return java.util.List + **/ + public List getTreeByRoleAndOrgId3(String roleName, UserEO userEO) { + List ids = new ArrayList<>(); +//取orgIds + String id = userEO.getOrgEOList().get(0).getId(); + String parentIds = userEO.getOrgEOList().get(0).getParentIds(); + if(parentIds !=null && !parentIds.isEmpty()){ + String[] split = parentIds.split(","); + List list = Arrays.asList(split); + ids.addAll(list); + ids.add(id); + } + //liwenxuan:2.根据下面的orgId集合查询组织机构 + //查询组织机构ids下面所对应组织机构 + List treeByRoleAndOrgId2 = this.baseMapper.getTreeByRoleAndOrgId2(ids); + //liwenxuan:根据组织机构ids查询用户 + List treeByRoleAndOrgId3 = this.baseMapper.getTreeByRoleAndOrgId3(roleName, treeByRoleAndOrgId2); + if(treeByRoleAndOrgId3.size()==0){ + return null; + } + //把两个组织机构集合和用户集合放到一起 + treeByRoleAndOrgId2.addAll(treeByRoleAndOrgId3); + return treeByRoleAndOrgId2; + } + + /** + * @Author liwenxuan + * @Description //判断此orgId所对应的组织结构是否为科级部门或者是部级部门 + * @Date Administrator 2018/11/11 + * @Param [orgId] + * @return java.util.List + **/ + public int getOrgbyOrgId1(String orgId){ + + OrgEO allOrgbyOrgId = this.baseMapper.getAllOrgbyOrgId(orgId); + String orgType = allOrgbyOrgId.getOrgType(); + if(orgType.equals("FAMILY")){ + return 1; + } + if(orgType.equals("DEPART")){ + return 2; + } + return 0; + } + + + + + public List getManagerByOrgId(String roleName, String orgId){ + return this.baseMapper.getManagerByOrgId(roleName,orgId); + } + + public List queryOrgByList(String orgName){ + return this.baseMapper.queryOrgByList(orgName); + } + + public List getTreeByRole2(String roleId) { + List treeByRole1 = this.baseMapper.getTreeByRole3(roleId); + List treeByRole2 = this.baseMapper.getTreeByRole4(roleId); + List resList = new ArrayList(); + List resultList = new ArrayList(); + if(treeByRole2!=null && !treeByRole2.isEmpty()){ + for(OrgEO orgEO : treeByRole2){ + resList.add(orgEO.getId()); + OrgEO org = this.baseMapper.getOrgEOById(orgEO.getId()); + if(org.getParentIds()!=null && !org.getParentIds().isEmpty()){ + String parentIds[] = org.getParentIds().split(","); + List parentIdList = Arrays.asList(parentIds); + resList.addAll(parentIdList); + } + } + } + HashSet h = new HashSet(resList); + resList.clear(); + resList.addAll(h); + if(resList!=null && !resList.isEmpty()){ + for(String id : resList){ + OrgEO org = this.baseMapper.getOrgEOById(id); + resultList.add(org); + } + } + treeByRole1.addAll(resultList); + return treeByRole1; + } + + public OrgEO getOrgInfoByOrgId(String OrgId) { + + return this.baseMapper.getOrgInfoByOrgId(OrgId); + } + + public OrgEO getOrgParentInfoOrgId(OrgEO orgEO) { + + return this.baseMapper.getOrgParentInfoOrgId(orgEO); + } + + public List getOrgRootTree(){ + return this.baseMapper.getOrgRootTree(); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/RoleEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/RoleEOServiceImpl.java new file mode 100644 index 00000000..4c545a17 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/RoleEOServiceImpl.java @@ -0,0 +1,182 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.common.ValidFlagEnum; +import com.adc.da.sys.dao.RoleEODao; +import com.adc.da.sys.entity.RoleEO; +import com.adc.da.sys.entity.UserRoleEO; +import com.adc.da.sys.page.RoleEOPage; +import com.adc.da.sys.service.IOrgEOService; +import com.adc.da.sys.service.IRoleEOService; +import com.adc.da.sys.vo.RoleVO; +import com.adc.da.util.UUIDUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + +/** + * + *
    + * 功能:TS_ROLE RoleEOService
    + * 作者:code generator
    + * 日期: 2017-11-06
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("roleEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class RoleEOServiceImpl extends ServiceImpl implements IRoleEOService { + + + @Autowired + private IOrgEOService orgEOService; + + + @Override + public List queryByPage(RoleEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(RoleEOPage page) { + return this.baseMapper.queryByList(page); + } + + /** + * @Author liwenxuan + * @Description 新增 + * @Date Administrator 2018/9/26 + * @Param [sysRoleEO] + * @return int + **/ + public int saveBean(RoleEO sysRoleEO) { + sysRoleEO.setId(UUIDUtils.randomUUID20()); + sysRoleEO.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()); + sysRoleEO.setCreationTime(new Date()); + sysRoleEO.setModifyTime(new Date()); +//TODO 从session中取用户id保存到OperUser中 +// String userId= LoginUserUtil.getUserId(); +// sysRoleEO.setOperUser(userId); + //判断角色名称不能重复,返回0代表角色名称已经存在,否则进行插入操作返回1 + List roleEOS = this.baseMapper.selectByNameAndId(sysRoleEO.getId(),sysRoleEO.getName()); + if(roleEOS!=null && !roleEOS.isEmpty()){ + return 0; + } + return this.baseMapper.insert(sysRoleEO); + } + /** + * @Author liwenxuan + * @Description 修改角色名称、状态、角色描述 + * @Date Administrator 2018/9/26 + * @Param [roleEO] + * @return int + **/ + public int updateByPrimaryKeySelective(RoleEO roleEO){ + roleEO.setModifyTime(new Date()); + //判断角色名称不能重复,返回0代表角色名称已经存在,否则进行修改操作返回1 + List roleEOS = this.baseMapper.selectByNameAndId(roleEO.getId(),roleEO.getName()); + if(roleEOS!=null && !roleEOS.isEmpty()){ + return 0; + } + // TODO 从session中取用户id保存到OperUser中 +// String userId= LoginUserUtil.getUserId(); +// roleEO.setOperUser(userId);// + return this.baseMapper.updateById(roleEO); + } + + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public RoleEO getRoleWithMenus(String id) { + return this.baseMapper.getRoleWithMenus(id); + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List getSysRoleListByUserId(String userId) { + return this.baseMapper.getRoleListByUserId(userId); + } + + /* + * @Transactional(readOnly = true) public PageInfo page(PageInfo + * pageInfo, String roleName) { return dao.page(pageInfo, roleName); } + */ + + /** + * 删除角色及角色菜单关联(角色有对应用户则不能被删除) + */ + public void delete(String roleId) { + this.baseMapper.deleteLogic(roleId); + this.baseMapper.deleteRoleMenuByRoleId(roleId); + + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List findAll(RoleVO setRole) { + return this.baseMapper.findAll(setRole); + } + + /** + * 查询角色所对应的用户 + */ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List getUserRoleListByRoleId(String roleId) { + return this.baseMapper.getUserRoleListByRoleId(roleId); + } + + /** + * 设置角色菜单关联 + */ + public RoleEO saveRoleMenu(RoleEO roleEO) { + if (roleEO.getMenuEOIdList()!=null && !roleEO.getMenuEOIdList().isEmpty()) { + this.baseMapper.deleteRoleMenuByRoleId(roleEO.getId()); + for (String menuId : roleEO.getMenuEOIdList()) { + this.baseMapper.saveRoleMenu(roleEO.getId(), menuId); + } + } + return roleEO; + } + + /** + * 判断角色是否属于相应用户 + */ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public boolean isBelong(String userId, String roleId) { + int count = this.baseMapper.isBelong(userId, roleId); + return count > 0; + } + + /** + * @Author liwenxuan + * @Description //查找科级负责人 + * @Date Administrator 2018/11/8 + * @Param + * @return + **/ + public int querySectionCount(String roleId){ + return this.baseMapper.querySectionCount(roleId); + } + + /** + * @Author liwenxuan + * @Description //查找部门负责人 + * @Date Administrator 2018/11/8 + * @Param + * @return + **/ + public int querySectionCount1(String roleId){ + return this.baseMapper.querySectionCount1(roleId); + } + + public List selectByNameAndId(String id, String name){ + return this.baseMapper.selectByNameAndId(id,name); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/RoleSarMenuEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/RoleSarMenuEOServiceImpl.java new file mode 100644 index 00000000..d1823cea --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/RoleSarMenuEOServiceImpl.java @@ -0,0 +1,59 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.sys.dao.RoleSarMenuEODao; +import com.adc.da.sys.entity.RoleSarMenuEO; +import com.adc.da.sys.page.RoleSarMenuEOPage; +import com.adc.da.sys.service.IRoleSarMenuEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +/** + * + *
    + * 功能:TS_ROLE_SAR_MENU RoleSarMenuEOService
    + * 作者:code generator
    + * 日期: 2019-02-19
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("roleSarMenuEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class RoleSarMenuEOServiceImpl extends ServiceImpl implements IRoleSarMenuEOService { + + @Override + public List queryByPage(RoleSarMenuEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(RoleSarMenuEOPage page) { + return this.baseMapper.queryByList(page); + } + + public List findRoleSarMenu(String roleId) { + return this.baseMapper.findRoleSarMenu(roleId); + } + + public String queryBusinessStandRootId(String SOR_DIVIDE) { + return this.baseMapper.queryBusinessStandRootId(SOR_DIVIDE); + } + + public List selectSarMenuRoots() { + return this.baseMapper.selectSarMenuRoots(); + } + + public int insertSubMenu (RoleSarMenuEO roleSarMenuEO){ + return this.baseMapper.insertSubMenu(roleSarMenuEO); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserConfigEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserConfigEOServiceImpl.java new file mode 100644 index 00000000..6dfa9727 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserConfigEOServiceImpl.java @@ -0,0 +1,59 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.sys.dao.UserConfigEODao; +import com.adc.da.sys.entity.UserConfigEO; +import com.adc.da.sys.page.UserConfigEOPage; +import com.adc.da.sys.service.IUserConfigEOService; +import com.adc.da.util.UUIDUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + + +/** + * + *
    + * 功能:TS_USER_CONFIG UserConfigEOService
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("userConfigEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class UserConfigEOServiceImpl extends ServiceImpl implements IUserConfigEOService { + + + @Override + public List queryByPage(UserConfigEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(UserConfigEOPage page) { + return this.baseMapper.queryByList(page); + } + + public int createPageConfig (String userId){ + UserConfigEO userConfigEO = new UserConfigEO(); + userConfigEO.setUserId(userId); + userConfigEO.setId(UUIDUtils.randomUUID20()); + userConfigEO.setValidFlag(0); + userConfigEO.setCreationTime(new Date()); + userConfigEO.setModifyTime(new Date()); + userConfigEO.setConfigType("PAGE_SIZE"); + userConfigEO.setConfigContent("10"); + return this.baseMapper.insert(userConfigEO); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserEOServiceImpl.java new file mode 100644 index 00000000..2008c0c1 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserEOServiceImpl.java @@ -0,0 +1,458 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.common.ValidFlagEnum; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.constant.UserSourceEnum; +import com.adc.da.sys.dao.OrgEODao; +import com.adc.da.sys.dao.UserEODao; +import com.adc.da.sys.dao.UserInfoEODao; +import com.adc.da.sys.entity.OrgEO; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.entity.UserInfoEO; +import com.adc.da.sys.entity.UserOrgEO; +import com.adc.da.sys.page.UserEOPage; +import com.adc.da.sys.service.IOrgEOService; +import com.adc.da.sys.service.IRoleEOService; +import com.adc.da.sys.service.IUserEOService; +import com.adc.da.sys.vo.UserVO; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.PasswordUtils; +import com.adc.da.util.UUIDUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * + *
    + * 功能:TS_USER UserEOService
    + * 作者:code generator
    + * 日期: 2017-11-06
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("userEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class UserEOServiceImpl extends ServiceImpl implements IUserEOService { + + @Autowired + private UserInfoEODao userInfoEODao; + @Autowired + private OrgEODao orgEODao; + @Autowired + private IRoleEOService roleEOService; + @Autowired + private IOrgEOService orgEOService; + + String usid = null; + + + @Transactional(rollbackFor = Exception.class) + public UserEO saveBean(UserEO userEO) { + userEO.setUsid(UUIDUtils.randomUUID20()); + userEO.setValidFlag(ValidFlagEnum.VALID_TRUE.getValue()); + userEO.setCreationTime(new Date(System.currentTimeMillis())); + userEO.setModifyTime(new Date(System.currentTimeMillis())); + userEO.setPassword(PasswordUtils.encryptPassword(userEO.getPassword())); + userEO.setUserSource(UserSourceEnum.LOCAL_USER.getValue()); + if(userEO.getExtInfo() != null){ + userEO.setExtInfo(userEO.getExtInfo()); + }else{ + userEO.setExtInfo(""); + } + this.baseMapper.insert(userEO); + //TODO 此处需要维护用户的组织机构 + if(StringUtils.isNotEmpty(userEO.getOrgId())){ + this.baseMapper.saveUserOrg(userEO.getUsid(),userEO.getOrgId()); + } + // 此处需要维护用户角色--单个用户可以拥有多个角色 +/* if(StringUtils.isNotEmpty(userEO.getRoleId())){ + String roleIds = userEO.getRoleId(); + String[] split = roleIds.split(","); + for(int i=0;i + * date: 2018/9/15 16:10 + */ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List queryUserInfoByPage(BasePage basePage){ + int rowCount = this.baseMapper.queryUserInfoByCount(basePage); + basePage.getPager().setRowCount(rowCount); + return this.baseMapper.queryUserInfoByPage(basePage); + } + + + @Transactional(readOnly = false, rollbackFor = Exception.class) + public void updateUserEOInfo(UserEO userEO){ + Date nowTime=new Date(); + userEO.setModifyTime(nowTime); + // 此处修复当用户点击新增后再次点击编辑时导致当前用户的密码被重置为明文的上一次新增用户的密码导致其登录失败 + userEO.setPassword(null); + int i = this.baseMapper.updateById(userEO); +// 修改用户权限 +/* if (StringUtils.isNotEmpty(userEO.getRoleId())) { + this.saveUserRole(userEO); + }*/ + this.baseMapper.deleteUserRoleByUsid(userEO.getUsid()); + if(userEO.getRoleIdList()!=null && !userEO.getRoleIdList().isEmpty()){ + for(String roleId:userEO.getRoleIdList()){ + this.baseMapper.saveUserRole(userEO.getUsid(),roleId); + } + } +// 更新组织机构 + if (!userEO.getOrgId().isEmpty()) { + updateUserOrg(userEO); + } + //此处维护用户的相关电话信息 + if(StringUtils.isNotEmpty(userEO.getOfficePhone())||StringUtils.isNotEmpty(userEO.getMobilePhone())){ + if(userEO.getUserInfoId()!=null && !userEO.getUserInfoId().isEmpty()){ + UserInfoEO userInfoEO = new UserInfoEO(); + userInfoEO.setId(userEO.getUserInfoId()); + userInfoEO.setUserId(userEO.getUsid()); + userInfoEO.setModifyTime(nowTime); + userInfoEO.setMobilePhone(userEO.getMobilePhone()); + userInfoEO.setOfficePhone(userEO.getOfficePhone()); + userInfoEODao.updateByPrimaryKey(userInfoEO); + }else{ + UserInfoEO userInfoEO=new UserInfoEO(); + userInfoEO.setId(UUIDUtils.randomUUID20()); + userInfoEO.setUserId(userEO.getUsid()); + userInfoEO.setCreationTime(nowTime); + userInfoEO.setModifyTime(nowTime); + userInfoEO.setMobilePhone(userEO.getMobilePhone()); + userInfoEO.setOfficePhone(userEO.getOfficePhone()); + userInfoEODao.insert(userInfoEO); + } + } + } + + + /** + * 删除用户及用户角色关联 + */ + public int delete(List ids) { + int i = this.baseMapper.deleteLogicInBatch(ids); +// 删除用户角色和组织机构的关系 + int i1 = this.baseMapper.deleteUserRoleByUsidInBatch(ids); + int i2 = this.baseMapper.deleteUserOrgByUsidInBatch(ids); +// + if( i>0 ){ + return 1; + } + return 0; + } + + /** + * 查询用户及用户所对应的角色 + */ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public UserEO getUserWithRoles(String id) { + return this.baseMapper.getUserWithRoles(id); + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public UserEO getUserWithRolesAll(String id) { + return this.baseMapper.getUserWithRolesAll(id); + } + + /** + * 设置用户角色关联 + */ + public int saveUserRole(UserEO userEO) { + if (userEO.getRoleIdList() !=null && !userEO.getRoleIdList().isEmpty()) { + this.baseMapper.deleteUserRoleByUsid(userEO.getUsid()); + List roleIdList = userEO.getRoleIdList(); +// String roleIds = userEO.getRoleId(); +// String[] split = roleIds.split(","); +// for(int i=0;i0){ + return orgEODao.updateUserOrg(userOrgEO); + } + return orgEODao.addOrgRelatedUser(userOrgEO); + } + + /** + * 根据当前登录用户id查询个人信息及部门 + * @param usid + * @return + */ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public UserEO selectOrgByPrimaryKey(String usid){ + return this.baseMapper.selectOrgByPrimaryKey(usid); + } + + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public UserEO selectRoleMessageByPrimaryKey(String usid){ + return this.baseMapper.selectRoleMessageByPrimaryKey(usid); + } + + public int resetPassword(String userId) { + UserEO userEO = new UserEO(); + userEO.setUsid(userId); + userEO.setPassword(PasswordUtils.encryptPassword("123456a")); + return this.baseMapper.updateById(userEO); + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public UserEO selectByUnameAndPwd(UserEO userEO){ + return this.baseMapper.selectByUnameAndPwd(userEO); + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List queryByOrg(BasePage basePage) { + int rowCount = this.baseMapper.queryByCount(basePage); + basePage.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(basePage); + } + + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List queryByPageAndParams(UserEOPage page) { + int rowCount = this.baseMapper.queryByOrgCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByOrg(page); + } + + /** + * @Author liwenxuan + * @Description 组织机构查询未配置人员信息 + * @Date Administrator 2018/9/21 + * @Param [basePage] + * @return java.util.List + **/ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public List findUserInfoByPage(BasePage basePage){ + //liwenxuan:查找未分配组织结构的用户的行数 + int rowCount = this.baseMapper.findBySetOrgCount(basePage); + basePage.getPager().setRowCount(rowCount); + //liwenxuan:查询未分配组织机构人员信息 + return this.baseMapper.findBySetOrg(basePage); + } + + /** + * 根据用户id查找该用户所在的部门下的用户 + * @MethodName:selectThatOrgUser + * @author: DuYunbao + * @param:[userId] + * @return:java.util.List + * date: 2018/10/10 10:36 + */ + public List selectThatOrgUser(String userId) { + List orgIdList = new ArrayList<>(); + List userIdList = new ArrayList<>(); + String nowUserId = LoginUserUtil.getUserId(); +// 通过userId获取OrgId + String orgId = this.baseMapper.selectOrgByUserId(userId); +// 获取其所在的组织机构分支orgIdList + if(orgId !=null){ + List orgIdList1 = orgEODao.getTreeByRoleAndOrgId1(orgId); + orgIdList.addAll(orgIdList1); + orgIdList.add(orgId); + } +// 通过orgIdList获得其组织机构下的所有用户 + if(orgIdList.size() != 0){ + List allUser = orgEODao.getLeaderByUserId4(orgIdList); + + for (OrgEO leaderByUser:allUser) { + String usId = leaderByUser.getUsId(); + if(!nowUserId.equals(leaderByUser.getUsId())){ + userIdList.add(usId); + } + } + } + return userIdList; + } + + + public List queryUserEoList(UserEOPage page) { + page.setValidFlag("0"); + return this.baseMapper.queryUserEoList(page); + } + + /*** + * 根据工号获取用户信息 + * @MethodName:queryUserInfoByWordNum + * @author: zhangyanduan + * @param:[workNum] + * @return:java.util.List + * date: 2018/10/25 16:21 + */ + public List queryUserInfoByWordNum(String workNum){ + return this.baseMapper.selectUserByWorkNum(workNum); + } + + /*** + * 根据用户ID获取用户信息 + * @MethodName:selectByPrimaryKey + * @author: zhangyanduan + * @param:[userId] + * @return:com.adc.da.sys.entity.UserEO + * date: 2018/11/1 21:17 + */ + @Transactional(readOnly = true, rollbackFor = Exception.class) + public UserEO selectByPrimaryKey(String userId) { + return this.baseMapper.get(userId); + } + + + /** + * @Author liwenxuan + * @Description //根据roleName获取用户List + * @Date Administrator 2018/11/12 + * @Param [RoleName] + * @return com.adc.da.sys.entity.UserEO + **/ + public List getUserListByRoleName(String RoleName){ + return this.baseMapper.getUserListByRoleName(RoleName); + } + + /** + * @Author liwenxuan + * @Description //用户管理的新增和编辑 + * @Date Administrator 2018/11/13 + * @Param + * @return + **/ + public ResponseMessage createOrModifyIf(UserVO userVO) { + if(userVO.getRoleIdList()!=null && !userVO.getRoleIdList().isEmpty()){ + List roleIdList = userVO.getRoleIdList(); + if(roleIdList!=null && !roleIdList.isEmpty()) { + for (String roleId : roleIdList) { + // 判断是否为科级负责人,科级负责人角色只能在科级部门 + int i1 = roleEOService.querySectionCount(roleId); + // 判断是否为部门负责人,部门负责人角色只能在部级部门 + int i2 = roleEOService.querySectionCount1(roleId); + if (i1 == 1) { +// 所选部门角色是否为科级负责人 + int orgNamebyOrgId = orgEOService.getOrgNamebyOrgId(userVO); + if (orgNamebyOrgId != 1) { + return Result.error("科级负责任人只能创建在科级部门"); + } + } else if (i2 == 1) { +// 所选部门角色是否为部门级 + int orgNamebyOrgId = orgEOService.getOrgNamebyOrgId(userVO); + if (orgNamebyOrgId != 2) { + return Result.error("部门负责任人只能创建在部门级部门"); + } + } + } + } + } + this.usid = userVO.getUsid(); + if(this.usid==null || this.usid.equals("")){ + this.usid = null; + } + if (StringUtils.isBlank(userVO.getAccount())) { + return Result.error("登录名不能为空"); + } else if (this.getUserByLoginName(userVO.getAccount(),this.usid) != null) { + return Result.error("账号已存在"); + } + return Result.success("","",userVO); + } + + public List getUserEOBySpecRole(String orgId, String userId){ + return this.baseMapper.getUserEOBySpecRole(orgId,userId); + } + + + /** + * 获取所有用户信息进行用户信息匹配 + * @return + */ + public List selectAllUserInfo(){ + return this.baseMapper.selectAllUserInfoBySSO(); + } + + @Transactional(readOnly = true, rollbackFor = Exception.class) + public UserEO getOrgIdByUserId(String userId){ + return this.baseMapper.getOrgIdByUserId(userId); + } + + // 根据account获取未逻辑删除的UserEO + @Transactional(readOnly = true) + public UserEO getUserByLoginNameNotDeleted(String userName) { + UserEO userEO = this.baseMapper.getUserEOByAccountNotDeleted(userName); + return userEO; + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserInfoEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserInfoEOServiceImpl.java new file mode 100644 index 00000000..7ddacbc1 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserInfoEOServiceImpl.java @@ -0,0 +1,101 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.sys.dao.UserEODao; +import com.adc.da.sys.dao.UserInfoEODao; +import com.adc.da.sys.entity.UserEO; +import com.adc.da.sys.entity.UserInfoEO; +import com.adc.da.sys.page.UserInfoEOPage; +import com.adc.da.sys.service.IUserInfoEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +/** + * + *
    + * 功能:TS_USER_INFO UserInfoEOService
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("userInfoEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class UserInfoEOServiceImpl extends ServiceImpl implements IUserInfoEOService { + + + @Autowired + private UserEODao userEODao; + + public UserEODao getUserEODao() { + return userEODao; + } + + @Override + public List queryByPage(UserInfoEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(UserInfoEOPage page) { + return this.baseMapper.queryByList(page); + } + + /** + * @Author liuyinnan + * @Description 根据用户ID获取用户信息 + * @Date 19:19 2018/9/26 + * @Param [userId] + * @return com.adc.da.person.entity.UserInfoEO + **/ + public UserInfoEO getUserEOAndInfoEOByUserCode(UserInfoEO userInfoEO){ + //TODO 此处优化代码逻辑,首先判断参数是否为空或为null,如果为null则不执行下方的查询逻辑 + if(userInfoEO != null ){ + UserInfoEO getInfo = this.baseMapper.getUserInfoByUserId(userInfoEO); + UserEO userEO= userEODao.selectOrgByPrimaryKey(userInfoEO.getUserId()); + if(userEO !=null){ + getInfo.setAccount(userEO.getAccount()); + getInfo.setEmail(userEO.getEmail()); + getInfo.setuName(userEO.getUname()); + } + return getInfo; + }else{ + return new UserInfoEO(); + } + } + + + + + public ResponseMessage updateByUserId(UserInfoEO userInfo){ + int i =this.baseMapper.updateByUserId(userInfo); + + + // 只负责修改个人邮箱 + UserEO userEO = new UserEO(); + userEO.setUsid(userInfo.getUserId()); + userEO.setEmail(userInfo.getEmail()); + int userEO1=userEODao.updateById(userEO); + return Result.success("0","修改成功"); + } + + // liwenxuan:修改用户详细信息 + public int updateByPrimaryKey(UserInfoEO userInfoEO){ + return this.baseMapper.updateByPrimaryKey(userInfoEO); + } +} + + diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserRoleEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserRoleEOServiceImpl.java new file mode 100644 index 00000000..7830cb0a --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/UserRoleEOServiceImpl.java @@ -0,0 +1,24 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.sys.dao.UserRoleEODao; +import com.adc.da.sys.entity.UserRoleEO; +import com.adc.da.sys.service.IUserRoleEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + + +/** + * + *
    + * 功能:TR_USER_ROLE UserRoleEOService
    + * 作者:code generator
    + * 日期: 2017-11-07
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("userRoleEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class UserRoleEOServiceImpl extends ServiceImpl implements IUserRoleEOService { + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/WarnTimeEOServiceImpl.java b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/WarnTimeEOServiceImpl.java new file mode 100644 index 00000000..4ee0622d --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/service/impl/WarnTimeEOServiceImpl.java @@ -0,0 +1,43 @@ +package com.adc.da.sys.service.impl; + +import com.adc.da.base.page.BasePage; +import com.adc.da.sys.dao.WarnTimeEODao; +import com.adc.da.sys.entity.WarnTimeEO; +import com.adc.da.sys.page.WarnTimeEOPage; +import com.adc.da.sys.service.IWarnTimeEOService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +/** + * + *
    + * 功能:TS_WARN_TIME WarnTimeEOService
    + * 作者:code generator
    + * 日期: 2018-09-17
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +@Service("warnTimeEOService") +@Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) +public class WarnTimeEOServiceImpl extends ServiceImpl implements IWarnTimeEOService { + + @Override + public List queryByPage(WarnTimeEOPage page) { + Integer rowCount = this.queryByCount(page); + page.getPager().setRowCount(rowCount); + return this.baseMapper.queryByPage(page); + } + + public int queryByCount(BasePage page) { + return this.baseMapper.queryByCount(page); + } + + @Override + public List queryByList(WarnTimeEOPage page) { + return this.baseMapper.queryByList(page); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/vo/MenuVO.java b/adc-da-sys/src/main/java/com/adc/da/sys/vo/MenuVO.java new file mode 100644 index 00000000..55a10a97 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/vo/MenuVO.java @@ -0,0 +1,100 @@ +package com.adc.da.sys.vo; + +import java.util.Date; + +public class MenuVO extends TreeVO { + + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private Object remarks; + private String permission; + private Integer isShow; + private String icon; + private String href; + // 扩展字段 + private String extInfo; + private boolean checked; + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public Date getCreationTime() { + return creationTime; + } + + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + public Integer getValidFlag() { + return validFlag; + } + + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + public Object getRemarks() { + return remarks; + } + + public void setRemarks(Object remarks) { + this.remarks = remarks; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public Integer getIsShow() { + return isShow; + } + + public void setIsShow(Integer isShow) { + this.isShow = isShow; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } + + public String getExtInfo() { + return extInfo; + } + + public void setExtInfo(String extInfo) { + this.extInfo = extInfo; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } +} \ No newline at end of file diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/vo/TreeVO.java b/adc-da-sys/src/main/java/com/adc/da/sys/vo/TreeVO.java new file mode 100644 index 00000000..9378087d --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/vo/TreeVO.java @@ -0,0 +1,70 @@ +package com.adc.da.sys.vo; + +import java.util.List; + +public abstract class TreeVO { + + protected String id; + protected String name; + protected String parentId; // 所有父级编号 + protected String parentIds; // 所有父级编号 + protected T parent; // 父级编号 + protected List childList; + protected Integer delFlag; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getParentIds() { + return parentIds; + } + + public void setParentIds(String parentIds) { + this.parentIds = parentIds; + } + + public T getParent() { + return parent; + } + + public void setParent(T parent) { + this.parent = parent; + } + + public List getChildList() { + return childList; + } + + public void setChildList(List childList) { + this.childList = childList; + } + + public Integer getDelFlag() { + return delFlag; + } + + public void setDelFlag(Integer delFlag) { + this.delFlag = delFlag; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/sys/vo/UserVO.java b/adc-da-sys/src/main/java/com/adc/da/sys/vo/UserVO.java new file mode 100644 index 00000000..702fac4d --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/sys/vo/UserVO.java @@ -0,0 +1,331 @@ +package com.adc.da.sys.vo; + +import com.adc.da.sys.entity.OrgEO; +import com.adc.da.sys.entity.RoleEO; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class UserVO { + + private Integer validFlag; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private String operUser; + private String extInfo; + private String workNum; + private String email; + private String userSource; + private String uname; + private String password; + private String account; + private String usid; + // 扩展字段 + private List rolesstr = new ArrayList<>(); + private List roles = new ArrayList<>(); + private List orgsstr = new ArrayList<>(); + private List orgs = new ArrayList<>(); + private List roleIdList = new ArrayList<>(); + private List roleNameList = new ArrayList<>(); + private String orgId; + private String orgName; + private String rname; + private String roleId; + private String roleName; + private Integer disableFlag; + private Integer unlockFlag; + private String userType; + private String mobilePhone; + private String officePhone; + private String address; + private String faxAddress; + private String userInfoId; + private List roleEOList = new ArrayList<>(); + private List orgIdList = new ArrayList<>(); + private List orgEOList = new ArrayList<>(); + private String orgType; + + public String getUserInfoId() { + return userInfoId; + } + + public void setUserInfoId(String userInfoId) { + this.userInfoId = userInfoId; + } + + public Integer getValidFlag() { + return validFlag; + } + + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public Date getCreationTime() { + return creationTime; + } + + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + public String getOperUser() { + return operUser; + } + + public void setOperUser(String operUser) { + this.operUser = operUser; + } + + public String getExtInfo() { + return extInfo; + } + + public void setExtInfo(String extInfo) { + this.extInfo = extInfo; + } + + public String getWorkNum() { + return workNum; + } + + public void setWorkNum(String workNum) { + this.workNum = workNum; + } + + public List getRolesstr() { + return rolesstr; + } + + public void setRolesstr(List rolesstr) { + this.rolesstr = rolesstr; + } + + public List getOrgsstr() { + return orgsstr; + } + + public void setOrgsstr(List orgsstr) { + this.orgsstr = orgsstr; + } + + public List getOrgs() { + return orgs; + } + + public void setOrgs(List orgs) { + this.orgs = orgs; + } + + public String getRname() { + return rname; + } + + public void setRname(String rname) { + this.rname = rname; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getUserSource() { + return userSource; + } + + public void setUserSource(String userSource) { + this.userSource = userSource; + } + + public String getUname() { + return uname; + } + + public void setUname(String uname) { + this.uname = uname; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getUsid() { + return usid; + } + + public void setUsid(String usid) { + this.usid = usid; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + if(roles!=null &&roles.size()>0){ + List roleNameList=new ArrayList(); + for(RoleEO role:roles){ + roleNameList.add(role.getName()); + } + this.rolesstr=roleNameList; + } + } + + public void setDisableFlag(Integer disableFlag){ + this.disableFlag=disableFlag; + } + + public Integer getDisableFlag(){ + return this.disableFlag; + } + + public void setUnlockFlag(Integer unlockFlag){ + this.unlockFlag=unlockFlag; + } + + public Integer getUnlockFlag(){ + return this.unlockFlag; + } + + public void setUserType(String userType){ + this.userType=userType; + } + + public String getUserType(){ + return this.userType; + } + + public void setOrgId(String orgId){ + this.orgId=orgId; + } + + public String getOrgId(){ + return this.orgId; + } + + public void setOrgName(String orgName){ + this.orgName=orgName; + } + + public String getOrgName(){ + return this.orgName; + } + + public void setRoleId(String roleId){ this.roleId=roleId;} + + public String getRoleId(){return this.roleId;} + + public String getRoleName(){return this.roleName;} + + public void setRoleName(String roleName){this.roleName=roleName;} + + public String getMobilePhone() { + return mobilePhone; + } + + public void setMobilePhone(String mobilePhone) { + this.mobilePhone = mobilePhone; + } + + public String getOfficePhone() { + return officePhone; + } + + public void setOfficePhone(String officePhone) { + this.officePhone = officePhone; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getFaxAddress() { + return faxAddress; + } + + public void setFaxAddress(String faxAddress) { + this.faxAddress = faxAddress; + } + + public List getRoleIdList() { + return roleIdList; + } + + public void setRoleIdList(List roleIdList) { + this.roleIdList = roleIdList; + } + + public List getRoleNameList() { + return roleNameList; + } + + public void setRoleNameList(List roleNameList) { + this.roleNameList = roleNameList; + } + + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public List getRoleEOList() { + return roleEOList; + } + + public void setRoleEOList(List roleEOList) { + this.roleEOList = roleEOList; + } + + public List getOrgIdList() { + return orgIdList; + } + + public void setOrgIdList(List orgIdList) { + this.orgIdList = orgIdList; + } + + public List getOrgEOList() { + return orgEOList; + } + + public void setOrgEOList(List orgEOList) { + this.orgEOList = orgEOList; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/config/GetHttpSessionConfigurator.java b/adc-da-sys/src/main/java/com/adc/da/websocket/config/GetHttpSessionConfigurator.java new file mode 100644 index 00000000..95c82c87 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/config/GetHttpSessionConfigurator.java @@ -0,0 +1,28 @@ +package com.adc.da.websocket.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpSession; +import javax.websocket.HandshakeResponse; +import javax.websocket.server.HandshakeRequest; +import javax.websocket.server.ServerEndpointConfig; +import javax.websocket.server.ServerEndpointConfig.Configurator; +import java.util.Enumeration; + +public class GetHttpSessionConfigurator extends Configurator { + private static final Logger logger = LoggerFactory.getLogger(GetHttpSessionConfigurator.class); + + @Override + public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { + HttpSession httpSession=(HttpSession) request.getHttpSession(); + Enumeration attributeNames = httpSession.getAttributeNames(); + logger.info("---------------------------GetHttpSessionConfigurator--------------------------------"); + while (attributeNames.hasMoreElements()){ + String s = attributeNames.nextElement(); + logger.info("建立session时的属性为:"+s+" 参数为:"+httpSession.getAttribute(s)); + } + logger.info("---------------------------GetHttpSessionConfigurator--------------------------------"); + sec.getUserProperties().put(HttpSession.class.getName(),httpSession); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/config/SpringWebSocketConfig.java b/adc-da-sys/src/main/java/com/adc/da/websocket/config/SpringWebSocketConfig.java new file mode 100644 index 00000000..40645429 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/config/SpringWebSocketConfig.java @@ -0,0 +1,25 @@ +package com.adc.da.websocket.config; + +import com.adc.da.websocket.handler.SpringWebSocketHandler; +import com.adc.da.websocket.interceptor.SpringWebSocketHandlerInterceptor; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import org.springframework.web.socket.handler.TextWebSocketHandler; + + +/*@Configuration +@EnableWebSocket*/ +public class SpringWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry.addHandler(webSocketHandler(),"/websocket/socketServer").addInterceptors(new SpringWebSocketHandlerInterceptor()).setAllowedOrigins("*"); + registry.addHandler(webSocketHandler(), "/sockjs/socketServer").addInterceptors(new SpringWebSocketHandlerInterceptor()).setAllowedOrigins("*").withSockJS(); + } + +// @Bean + public TextWebSocketHandler webSocketHandler(){ + return new SpringWebSocketHandler(); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/config/WebSocketConfig.java b/adc-da-sys/src/main/java/com/adc/da/websocket/config/WebSocketConfig.java new file mode 100644 index 00000000..571c580d --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/config/WebSocketConfig.java @@ -0,0 +1,15 @@ +package com.adc.da.websocket.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfig { + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/constant/SocketMesTypeEnum.java b/adc-da-sys/src/main/java/com/adc/da/websocket/constant/SocketMesTypeEnum.java new file mode 100644 index 00000000..b7d3f0cc --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/constant/SocketMesTypeEnum.java @@ -0,0 +1,26 @@ +package com.adc.da.websocket.constant; + + +public enum SocketMesTypeEnum{ + + PROCESS_MESSAGE("process", "流程消息"); + + private String value; + private String text; + + + private SocketMesTypeEnum(String value, String text) { + this.value = value; + this.text = text; + } + + public String getValue() { + return value; + } + + public String getText() { + return text; + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/controller/webSocketController.java b/adc-da-sys/src/main/java/com/adc/da/websocket/controller/webSocketController.java new file mode 100644 index 00000000..9f2b598e --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/controller/webSocketController.java @@ -0,0 +1,39 @@ +package com.adc.da.websocket.controller; + + +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; +import com.adc.da.websocket.entity.WebSocketMessage; +import com.adc.da.websocket.service.WebSocketServer; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("/${restPath}/webSocketCol") +@Api(description = "webSocket测试") +public class webSocketController { + + @Autowired +// public WebSocketService webSocketService; + public WebSocketServer webSocketServer; + + @ApiOperation(value = "|webSocket|发送消息给特定用户") + @GetMapping("/sendMessage") + public ResponseMessage sendMessage(String userId, WebSocketMessage message){ +// webSocketService.sendMessageToUser(userId,message); + webSocketServer.sendMessage(userId,message); + List userList =new ArrayList(); + userList.add(userId); + webSocketServer.sendMessageOfUserList(userList,message); + return Result.success("001","发送成功"); + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/entity/WebSocketBean.java b/adc-da-sys/src/main/java/com/adc/da/websocket/entity/WebSocketBean.java new file mode 100644 index 00000000..c0f3e112 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/entity/WebSocketBean.java @@ -0,0 +1,57 @@ +package com.adc.da.websocket.entity; + +import java.util.concurrent.atomic.AtomicInteger; +import javax.websocket.Session; + +/*** + *webcocketBean对象 + * date: 2018/12/6 18:26 + */ +public class WebSocketBean { + + /** + * 连接session对象 + */ + private Session session; + + /*** + * socket绑定的用户信息 + */ + private String userId; + + /** + * 连接错误次数 + */ + private AtomicInteger erroerLinkCount = new AtomicInteger(0); + + public int getErroerLinkCount() { + // 线程安全,以原子方式将当前值加1,注意:这里返回的是自增前的值 + return erroerLinkCount.getAndIncrement(); + } + + public void cleanErrorNum() + { + // 清空计数 + erroerLinkCount = new AtomicInteger(0); + } + + public Session getSession() { + return session; + } + + public void setSession(Session session) { + this.session = session; + } + + public void setErroerLinkCount(AtomicInteger erroerLinkCount) { + this.erroerLinkCount = erroerLinkCount; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/entity/WebSocketMessage.java b/adc-da-sys/src/main/java/com/adc/da/websocket/entity/WebSocketMessage.java new file mode 100644 index 00000000..19eafcfb --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/entity/WebSocketMessage.java @@ -0,0 +1,36 @@ +package com.adc.da.websocket.entity; + +import java.io.Serializable; + +public class WebSocketMessage implements Serializable{ + + private String message; + + private String type; + + private String businessId; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/handler/SpringWebSocketHandler.java b/adc-da-sys/src/main/java/com/adc/da/websocket/handler/SpringWebSocketHandler.java new file mode 100644 index 00000000..9c7a817f --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/handler/SpringWebSocketHandler.java @@ -0,0 +1,121 @@ +package com.adc.da.websocket.handler; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.socket.*; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SpringWebSocketHandler extends TextWebSocketHandler { + + private static final Map users;//这个会出现性能问题,最好用Map来存储,key用userid + private static final Logger logger = LoggerFactory.getLogger(SpringWebSocketHandler.class); + + static { + users = new HashMap(); + } + + public SpringWebSocketHandler() { + super(); + } + + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + // TODO Auto-generated method stub + System.out.println("connect to the websocket success......当前数量:" + users.size()); + //此处获取用户session中的userId + String userId = (String) session.getAttributes().get("WEBSOCKET_USERID"); + users.put(userId, session); + //这块会实现自己业务,比如,当用户登录后,会把离线消息推送给用户 + //TextMessage returnMessage = new TextMessage("你将收到的离线"); + //session.sendMessage(returnMessage); + + super.afterConnectionEstablished(session); + } + + @Override + public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { + String userId = (String) session.getAttributes().get("WEBSOCKET_USERID"); + logger.info(userId+": 发送了:"+message.toString()); + super.handleMessage(session, message); + } + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { + super.handleTextMessage(session, message); + } + + @Override + protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception { + super.handlePongMessage(session, message); + } + + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { + super.handleTransportError(session, exception); + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { + logger.debug("websocket connection closed......"); + String userId = (String) session.getAttributes().get("WEBSOCKET_USERID"); + logger.info("用户" + userId + "已退出!"); + users.remove(userId); + logger.info("剩余在线用户" + users.size()); + } + + @Override + public boolean supportsPartialMessages() { + return super.supportsPartialMessages(); + } + + /** + * 给某个用户发送消息 + * + * @param userId + * @param message + */ + public void sendMessageToUser(String userId, TextMessage message) { + logger.info("----------------------------------webSocket-----------------"); + if (users.containsKey(userId)) { + WebSocketSession user = users.get(userId); + if (user.isOpen()) { + try { + user.sendMessage(message); + } catch (IOException e) { + logger.error("给"+userId+"用户推送消息时发生异常:" + e.getMessage(), e); + } + } + } + } + + /** + * 给某个用户发送消息 + * + * @param userIdList + * @param message + */ + public void sendMessageToUsers(List userIdList, TextMessage message) { + if (userIdList != null && !userIdList.isEmpty()) { + for (String userId : userIdList) { + if (users.containsKey(userId)) { + WebSocketSession user = users.get(userId); + if (user.isOpen()) { + try { + user.sendMessage(message); + } catch (IOException e) { + logger.error("给"+userId+"用户推送消息时发生异常:" + e.getMessage(), e); + } + } + } + } + } + + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/interceptor/SpringWebSocketHandlerInterceptor.java b/adc-da-sys/src/main/java/com/adc/da/websocket/interceptor/SpringWebSocketHandlerInterceptor.java new file mode 100644 index 00000000..2c3d17b4 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/interceptor/SpringWebSocketHandlerInterceptor.java @@ -0,0 +1,36 @@ +package com.adc.da.websocket.interceptor; + +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; + +import javax.servlet.http.HttpSession; +import java.util.Map; + +public class SpringWebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor { + + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { + // TODO Auto-generated method stub + if (request instanceof ServletServerHttpRequest) { + ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; + HttpSession session = servletRequest.getServletRequest().getSession(false); + if (session != null) { + //使用userName区分WebSocketHandler,以便定向发送消息 + String userId = (String) session.getAttribute("LOGIN_USER_ID"); + if (userId==null) { + userId="default-system"; + } + attributes.put("WEBSOCKET_USERID",userId); + } + } + return super.beforeHandshake(request, response, wsHandler, attributes); + } + + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { + super.afterHandshake(request, response, wsHandler, ex); + } +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/service/WebSocketServer.java b/adc-da-sys/src/main/java/com/adc/da/websocket/service/WebSocketServer.java new file mode 100644 index 00000000..bc03304b --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/service/WebSocketServer.java @@ -0,0 +1,59 @@ +package com.adc.da.websocket.service; + +import com.adc.da.websocket.entity.WebSocketMessage; + +import javax.websocket.EndpointConfig; +import javax.websocket.Session; +import java.util.List; + + +public interface WebSocketServer { + /** + * 连接建立成功调用的方法 + * @param session session 对象 + */ + public void onOpen(Session session, EndpointConfig config); + + /** + * 断开连接方法 + */ + public void onClose(Session session); + + /** + * 收到客户端消息后调用的方法 + * @param session session 对象 + * @param message 返回客户端的消息 + */ + public void onMessage(Session session, String message); + + /** + * 发生异常时触发的方法 + * @param session session 对象 + * @param throwable 抛出的异常 + */ + public void onError(Session session,Throwable throwable); + + /** + * 向单个客户端发送消息 + * @param userId 用户ID对象 + * @param message 发送给客户端的消息 + */ + public void sendMessage(String userId, WebSocketMessage message); + + /*** + * 向多个用户发送消息 + * @MethodName:sendMessageOfUserList + * @author: zhangyanduan + * @param:[userList, message] + * @return:void + * date: 2018/12/17 15:04 + */ + public void sendMessageOfUserList(List userList,WebSocketMessage message); + + /** + * 向所有在线用户群发消息 + * @param message 发送给客户端的消息 + */ + public void batchSendMessage(String message); + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/service/WebSocketService.java b/adc-da-sys/src/main/java/com/adc/da/websocket/service/WebSocketService.java new file mode 100644 index 00000000..94b1f2c3 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/service/WebSocketService.java @@ -0,0 +1,44 @@ +package com.adc.da.websocket.service; + + +import com.adc.da.websocket.handler.SpringWebSocketHandler; +import org.springframework.web.socket.TextMessage; + +import java.util.List; + +//@Service("webSocketService") +public class WebSocketService { + +// @Bean//这个注解会从Spring容器拿出Bean + public SpringWebSocketHandler infoHandler() { + return new SpringWebSocketHandler(); + } + + + /*** + * 向某用户推送消息 + * @MethodName:sendMessageToUser + * @author: DuYunbao + * @param:[userId, messageText] + * @return:void + * date: 2018/11/30 14:49 + */ + public void sendMessageToUser(String userId,String messageText){ + +// infoHandler().sendMessageToUser(userId,new TextMessage(messageText)); + } + + /*** + * 同时向多个用户推送统一消息 + * @MethodName:sendMessageToUserList + * @author: DuYunbao + * @param:[userList, messageText] + * @return:void + * date: 2018/11/30 14:50 + */ + public void sendMessageToUserList(List userList,String messageText){ + infoHandler().sendMessageToUsers(userList,new TextMessage(messageText)); + } + + +} diff --git a/adc-da-sys/src/main/java/com/adc/da/websocket/service/WebsocketServerImpl.java b/adc-da-sys/src/main/java/com/adc/da/websocket/service/WebsocketServerImpl.java new file mode 100644 index 00000000..99c9f754 --- /dev/null +++ b/adc-da-sys/src/main/java/com/adc/da/websocket/service/WebsocketServerImpl.java @@ -0,0 +1,140 @@ +package com.adc.da.websocket.service; + +import com.adc.da.websocket.config.GetHttpSessionConfigurator; +import com.adc.da.websocket.entity.WebSocketBean; +import com.adc.da.websocket.entity.WebSocketMessage; +import com.alibaba.fastjson.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpSession; +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@ServerEndpoint(value = "/websocket/socketServer/{userId}",configurator= GetHttpSessionConfigurator.class) +@Component("webSocketService") +public class WebsocketServerImpl implements WebSocketServer { + + private static final Logger logger = LoggerFactory.getLogger(WebsocketServerImpl.class); + + /** + * 错误最大重试次数 + */ + private static final int MAX_ERROR_NUM = 10; + + /** + * 用来存放每个客户端对应的webSocket对象。 + */ + private static Map webSocketInfo; + + static + { + // concurrent包的线程安全map + webSocketInfo = new ConcurrentHashMap(); + } + + @OnOpen + public void onOpen(@PathParam(value = "userId") String userId, Session session, EndpointConfig config) { +// 如果是session没有激活的情况,就是没有请求获取或session,这里可能会取出空,需要实际业务处理 + HttpSession httpSession= (HttpSession) config.getUserProperties().get(HttpSession.class.getName()); + if(httpSession != null) + { + logger.info("获取到httpsession" + httpSession.getId()); +// String userId = (String) httpSession.getAttribute(RequestUtils.LOGIN_USER_ID); + Enumeration attributeNames = httpSession.getAttributeNames(); + while(attributeNames.hasMoreElements()){ + String s = attributeNames.nextElement(); + logger.info("建立session时的属性为:"+s+" 参数为:"+httpSession.getAttribute(s)); + } + logger.info("--------websocket 打开链接 当前用户为:"+userId); + }else { + logger.error("未获取到httpsession"); + } + + // 连接成功当前对象放入websocket对象集合 + WebSocketBean bean = new WebSocketBean(); + bean.setSession(session); + webSocketInfo.put(userId,bean); + + logger.info("客户端连接服务器session id :"+session.getId()+",当前连接数:" + webSocketInfo.size()); + } + + @Override + public void onOpen(Session session, EndpointConfig config) { + logger.info("-------------------------此处仅为实现其接口即可-----------------------------------"); + } + + @OnClose + @Override + public void onClose(Session session) { + // 客户端断开连接移除websocket对象 + webSocketInfo.remove(session.getId()); + logger.info("客户端断开连接,当前连接数:" + webSocketInfo.size()); + } + + @OnMessage + @Override + public void onMessage(Session session, String message) { + logger.info("客户端 session id: "+session.getId()+",消息:" + message); + + // 此方法为客户端给服务器发送消息后进行的处理,可以根据业务自己处理,这里返回页面 +// sendMessage(session, "服务端返回" + message); + } + + @OnError + @Override + public void onError(Session session, Throwable throwable) { + logger.error("发生错误"+ throwable.getMessage(),throwable); + } + + @Override + public void sendMessage(String userId, WebSocketMessage webSocketMessage) { + String message = JSONObject.toJSONString(webSocketMessage); + try { + WebSocketBean webSocketBean = webSocketInfo.get(userId); + if(webSocketBean != null){ + webSocketBean.getSession().getBasicRemote().sendText(message); + webSocketBean.cleanErrorNum(); + }else{ + logger.info("用户:"+userId+" 当前不在线!"); + } + } catch (Exception e) { + logger.error("发送消息失败"+ e.getMessage(),e); + try { + int errorNum = webSocketInfo.get(userId).getErroerLinkCount(); + // 小于最大重试次数重发 + if (errorNum <= MAX_ERROR_NUM) { + sendMessage(userId, webSocketMessage); + } else { + logger.error("发送消息失败超过最大次数"); + // 清空错误计数 + webSocketInfo.get(userId).cleanErrorNum(); + } + }catch (Exception e1){ + logger.error(e1.getMessage(),e1); + } + } + } + + @Override + public void sendMessageOfUserList(List userList, WebSocketMessage message) { + if(userList !=null && !userList.isEmpty()){ + for(String userId:userList){ + sendMessage(userId, message); + } + } + } + + @Override + public void batchSendMessage(String message) { + // 不做操作 + } + + +} diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/att/AttFileEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/att/AttFileEOMapper.xml new file mode 100644 index 00000000..04f4a809 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/att/AttFileEOMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + id, file_name, old_file_name, file_suffix, file_path, valid_flag, creation_time, modify_time + + + + CREATE TABLE ${tableName} ( + "ID" VARCHAR2(100 CHAR) NOT NULL PRIMARY KEY, + "FILE_NAME" VARCHAR2(255 CHAR) NULL , + "OLD_FILE_NAME" VARCHAR2(255 CHAR) NULL , + "FILE_SUFFIX" VARCHAR2(30 CHAR) NULL , + "FILE_PATH" VARCHAR2(255 CHAR) NULL , + "VALID_FLAG" NUMBER(1) NULL , + "CREATION_TIME" DATE NULL , + "MODIFY_TIME" DATE NULL + ) + LOGGING + NOCOMPRESS + NOCACHE + + + + + + + where 1=1 + + + and id ${idOperator} #{id} + + + and file_name ${fileNameOperator} #{fileName} + + + and old_file_name ${oldFileNameOperator} #{oldFileName} + + + and file_suffix ${fileSuffixOperator} #{fileSuffix} + + + and file_path ${filePathOperator} #{filePath} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + + + + + + insert into ${tableName}() + values (#{id, jdbcType=VARCHAR}, #{fileName, jdbcType=VARCHAR}, #{oldFileName, jdbcType=VARCHAR}, #{fileSuffix, jdbcType=VARCHAR}, #{filePath, jdbcType=VARCHAR}, #{validFlag, jdbcType=INTEGER}, #{creationTime, jdbcType=TIMESTAMP}, #{modifyTime, jdbcType=TIMESTAMP}) + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonCollectEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonCollectEOMapper.xml new file mode 100644 index 00000000..e0084ffb --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonCollectEOMapper.xml @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + modify_time, creation_time, valid_flag, collect_res_id, collect_info_uri, collect_title, collect_type, user_id, id + + + + + + where 1=1 + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and valid_flag = #{validFlag} + + + and collect_res_id ${collectResIdOperator} #{collectResId} + + + and collect_info_uri ${collectInfoUriOperator} #{collectInfoUri} + + + and collect_title like concat(concat('%',#{collectTitle}),'%') + + + and collect_type ${collectTypeOperator} #{collectType} + + + and collect_type IN + + #{collectTypeItem} + + + + + and user_id ${userIdOperator} #{userId} + + + and id ${idOperator} #{id} + + + + + + where 1=1 + + + and TS_PERSON_COLLECT.modify_time ${modifyTimeOperator} #{modifyTime} + + + and TS_PERSON_COLLECT.modify_time >= #{modifyTime1} + + + and TS_PERSON_COLLECT.modify_time <= #{modifyTime2} + + + and TS_PERSON_COLLECT.creation_time ${creationTimeOperator} #{creationTime} + + + and TS_PERSON_COLLECT.creation_time >= #{creationTime1} + + + and TS_PERSON_COLLECT.creation_time <= #{creationTime2} + + + and TS_PERSON_COLLECT.valid_flag = #{validFlag} + + + and TS_PERSON_COLLECT.collect_res_id ${collectResIdOperator} #{collectResId} + + + and TS_PERSON_COLLECT.collect_info_uri ${collectInfoUriOperator} #{collectInfoUri} + + + and ( + CASE TS_PERSON_COLLECT.collect_type + WHEN 'INLAND_STAND' THEN + DECODE ( + SAR_STANDARDS_INFO.STAND_YEAR, + NULL, + SAR_STANDARDS_INFO.stand_name || ' (' || td1.DIC_TYPE_NAME || ' ' || SAR_STANDARDS_INFO.stand_number || ')', + SAR_STANDARDS_INFO.stand_name || ' (' || td1.DIC_TYPE_NAME || ' ' || SAR_STANDARDS_INFO.stand_number || '-' || SAR_STANDARDS_INFO.stand_year|| ')' + ) + WHEN 'FOREIGN_STAND' THEN + DECODE ( + SAR_STANDARDS_INFO.STAND_YEAR, + NULL, + SAR_STANDARDS_INFO.stand_name || ' (' || td1.DIC_TYPE_NAME || ' ' || SAR_STANDARDS_INFO.stand_number || ')', + SAR_STANDARDS_INFO.stand_name || ' (' || td1.DIC_TYPE_NAME || ' ' || SAR_STANDARDS_INFO.stand_number || '-' || SAR_STANDARDS_INFO.stand_year|| ')' + ) + WHEN 'BUSINESS_STAND' THEN + DECODE ( + SAR_BUSSIONESS_STAND.STAND_YEAR, + NULL, + SAR_BUSSIONESS_STAND.stand_name || ' (' || td2.DIC_TYPE_NAME || ' ' || SAR_BUSSIONESS_STAND.stand_code || ')', + SAR_BUSSIONESS_STAND.stand_name || ' (' || td2.DIC_TYPE_NAME || ' ' || SAR_BUSSIONESS_STAND.stand_code || '-' || SAR_BUSSIONESS_STAND.stand_year|| ')' + ) + ELSE + TS_PERSON_COLLECT.collect_title + END + ) like concat(concat('%',#{collectTitle}),'%') + + + and TS_PERSON_COLLECT.collect_type ${collectTypeOperator} #{collectType} + + + and TS_PERSON_COLLECT.collect_type IN + + #{collectTypeItem} + + + + + and TS_PERSON_COLLECT.user_id ${userIdOperator} #{userId} + + + and TS_PERSON_COLLECT.id ${idOperator} #{id} + + + + + + + + insert into TS_PERSON_COLLECT() + values (#{modifyTime, jdbcType=TIMESTAMP}, #{creationTime, jdbcType=TIMESTAMP}, #{validFlag, jdbcType=INTEGER}, + #{collectResId, jdbcType=VARCHAR}, #{collectInfoUri, jdbcType=VARCHAR}, #{collectTitle, jdbcType=VARCHAR}, + #{collectType, jdbcType=VARCHAR}, #{userId, jdbcType=VARCHAR}, #{id, jdbcType=VARCHAR}) + + + + + + insert into TS_PERSON_COLLECT + + modify_time, + creation_time, + valid_flag, + collect_res_id, + collect_info_uri, + collect_title, + collect_type, + user_id, + id, + + + #{modifyTime, jdbcType=TIMESTAMP}, + #{creationTime, jdbcType=TIMESTAMP}, + #{validFlag, jdbcType=INTEGER}, + #{collectResId, jdbcType=VARCHAR}, + #{collectInfoUri, jdbcType=VARCHAR}, + #{collectTitle, jdbcType=VARCHAR}, + #{collectType, jdbcType=VARCHAR}, + #{userId, jdbcType=VARCHAR}, + #{id, jdbcType=VARCHAR}, + + + + + + update TS_PERSON_COLLECT + set modify_time = #{modifyTime}, + creation_time = #{creationTime}, + valid_flag = #{validFlag}, + collect_res_id = #{collectResId}, + collect_info_uri = #{collectInfoUri}, + collect_title = #{collectTitle}, + collect_type = #{collectType}, + user_id = #{userId} + where id = #{id} + + + + + update TS_PERSON_COLLECT + + + modify_time = #{modifyTime}, + + + creation_time = #{creationTime}, + + + valid_flag = #{validFlag}, + + + collect_res_id = #{collectResId}, + + + collect_info_uri = #{collectInfoUri}, + + + collect_title = #{collectTitle}, + + + collect_type = #{collectType}, + + + user_id = #{userId}, + + + where id = #{id} + + + + + + + + delete from TS_PERSON_COLLECT + where id = #{value} + + + + + + + + + + + + + + + + + + + + + delete from TS_PERSON_COLLECT + + + "ID" IN + + #{item} + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonConfEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonConfEOMapper.xml new file mode 100644 index 00000000..98fd8926 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonConfEOMapper.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + modify_time, creation_time, valid_flag, display_seq, module_code, module_name, user_id, id + + + + + where 1=1 + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and display_seq ${displaySeqOperator} #{displaySeq} + + + and module_code ${moduleCodeOperator} #{moduleCode} + + + and module_name ${moduleNameOperator} #{moduleName} + + + and user_id ${userIdOperator} #{userId} + + + and id ${idOperator} #{id} + + + + + + + + insert into TS_PERSON_CONF() + values (#{modifyTime, jdbcType=TIMESTAMP}, #{creationTime, jdbcType=TIMESTAMP}, #{validFlag, jdbcType=INTEGER}, #{displaySeq, jdbcType=INTEGER}, #{moduleCode, jdbcType=VARCHAR}, #{moduleName, jdbcType=VARCHAR}, #{userId, jdbcType=VARCHAR}, #{id, jdbcType=VARCHAR}) + + + + + + insert into TS_PERSON_CONF + + modify_time, + creation_time, + valid_flag, + display_seq, + module_code, + module_name, + user_id, + id, + + + #{modifyTime, jdbcType=TIMESTAMP}, + #{creationTime, jdbcType=TIMESTAMP}, + #{validFlag, jdbcType=INTEGER}, + #{displaySeq, jdbcType=INTEGER}, + #{moduleCode, jdbcType=VARCHAR}, + #{moduleName, jdbcType=VARCHAR}, + #{userId, jdbcType=VARCHAR}, + #{id, jdbcType=VARCHAR}, + + + + + + update TS_PERSON_CONF + set modify_time = #{modifyTime}, + creation_time = #{creationTime}, + valid_flag = #{validFlag}, + display_seq = #{displaySeq}, + module_code = #{moduleCode}, + module_name = #{moduleName}, + user_id = #{userId} + where id = #{id} + + + + + update TS_PERSON_CONF + + + modify_time = #{modifyTime}, + + + creation_time = #{creationTime}, + + + valid_flag = 1, + + + display_seq = #{displaySeq}, + + + module_code = #{moduleCode}, + + + module_name = #{moduleName}, + + + user_id = #{userId}, + + + where id = #{id} + + + + + + + + delete from TS_PERSON_CONF + where id = #{value} + + + + + + + + + + + + + + insert into TS_PERSON_CONF + + modify_time, + creation_time, + valid_flag, + display_seq, + module_code, + module_name, + user_id, + id, + where valid_flag = 0 + + + + + + + + + + + + + + + + update TS_PERSON_CONF + + + modify_time = #{modifyTime}, + + + valid_flag = #{validFlag}, + + + display_seq = #{displaySeq}, + + + where 1=1 + + and module_code = #{moduleCode} + + + and user_id = #{userId} + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonCookiesEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonCookiesEOMapper.xml new file mode 100644 index 00000000..3115b52d --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonCookiesEOMapper.xml @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + modify_time, creation_time, valid_flag, res_uri, res_id, res_title, cookie_type, user_id, id + + + + + where 1=1 + + + and TS_PERSON_COOKIES.modify_time ${modifyTimeOperator} #{modifyTime} + + + and TS_PERSON_COOKIES.modify_time >= #{modifyTime1} + + + and TS_PERSON_COOKIES.modify_time <= #{modifyTime2} + + + and TS_PERSON_COOKIES.creation_time ${creationTimeOperator} #{creationTime} + + + and TS_PERSON_COOKIES.creation_time >= #{creationTime1} + + + and TS_PERSON_COOKIES.creation_time <= #{creationTime2} + + + and TS_PERSON_COOKIES.valid_flag ${validFlagOperator} #{validFlag} + + + and TS_PERSON_COOKIES.res_uri ${resUriOperator} #{resUri} + + + and TS_PERSON_COOKIES.res_id ${resIdOperator} #{resId} + + + and TS_PERSON_COOKIES.res_title ${resTitleOperator} #{resTitle} + + + and TS_PERSON_COOKIES.cookie_type ${cookieTypeOperator} #{cookieType} + + + and TS_PERSON_COOKIES.user_id ${userIdOperator} #{userId} + + + and TS_PERSON_COOKIES.id ${idOperator} #{id} + + + + + + + + insert into TS_PERSON_COOKIES() + values (#{modifyTime, jdbcType=TIMESTAMP}, #{creationTime, jdbcType=TIMESTAMP}, #{validFlag, jdbcType=INTEGER}, + #{resUri, jdbcType=VARCHAR}, #{resId, jdbcType=VARCHAR}, #{resTitle, jdbcType=VARCHAR}, + #{cookieType, jdbcType=VARCHAR}, #{userId, jdbcType=VARCHAR}, #{id, jdbcType=VARCHAR}) + + + + + + insert into TS_PERSON_COOKIES + + modify_time, + creation_time, + valid_flag, + res_uri, + res_id, + res_title, + cookie_type, + user_id, + id, + + + #{modifyTime, jdbcType=TIMESTAMP}, + #{creationTime, jdbcType=TIMESTAMP}, + #{validFlag, jdbcType=INTEGER}, + #{resUri, jdbcType=VARCHAR}, + #{resId, jdbcType=VARCHAR}, + #{resTitle, jdbcType=VARCHAR}, + #{cookieType, jdbcType=VARCHAR}, + #{userId, jdbcType=VARCHAR}, + #{id, jdbcType=VARCHAR}, + + + + + + update TS_PERSON_COOKIES + set modify_time = #{modifyTime}, + creation_time = #{creationTime}, + valid_flag = #{validFlag}, + res_uri = #{resUri}, + res_id = #{resId}, + res_title = #{resTitle}, + cookie_type = #{cookieType}, + user_id = #{userId} + where id = #{id} + + + + + + update TS_PERSON_COOKIES + + + modify_time = #{modifyTime}, + + + creation_time = #{creationTime}, + + + valid_flag = #{validFlag}, + + + res_uri = #{resUri}, + + + res_id = #{resId}, + + + res_title = #{resTitle}, + + + cookie_type = #{cookieType}, + + + user_id = #{userId}, + + + where id = #{id} + + + + + + + update TS_PERSON_COOKIES + set + valid_flag = 1 where user_id = #{userId} + + + + + + + + delete from TS_PERSON_COOKIES + where id = #{value} + + + + + + + + + + + + + + + + + + + + + + + update TS_PERSON_COOKIES + set + valid_flag = 1 + where id=#{id} + + and user_id=#{userId} + + + + + + + update TS_PERSON_COOKIES + set valid_flag = 1 + where id = #{id} + + + + + + + + + + + + + + + + UPDATE TS_PERSON_COOKIES SET valid_flag = 1 + + + "ID" IN + + #{item} + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonMsgEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonMsgEOMapper.xml new file mode 100644 index 00000000..ac7ecdad --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonMsgEOMapper.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + modify_time, creation_time, valid_flag, read_flag, msg_content, msg_title, user_id, id,processnum + + + + + where 1=1 + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and read_flag ${readFlagOperator} #{readFlag} + + + and msg_content ${msgContentOperator} #{msgContent} + + + and msg_title ${msgTitleOperator} concat(concat('%',#{msgTitle}),'%') + + + and user_id ${userIdOperator} #{userId} + + + and id ${idOperator} #{id} + + + and processnum ${processnumOperator} #{processnum} + + + + + + + + insert into TS_PERSON_MSG() + values (#{modifyTime, jdbcType=TIMESTAMP}, #{creationTime, jdbcType=TIMESTAMP}, #{validFlag, jdbcType=INTEGER}, #{readFlag, jdbcType=INTEGER}, #{msgContent, jdbcType=VARCHAR}, #{msgTitle, jdbcType=VARCHAR}, #{userId, jdbcType=VARCHAR}, #{id, jdbcType=VARCHAR}, #{processnum, jdbcType=VARCHAR}) + + + + + + insert into TS_PERSON_MSG + + modify_time, + creation_time, + valid_flag, + read_flag, + msg_content, + msg_title, + user_id, + id, + processnum, + + + #{modifyTime, jdbcType=TIMESTAMP}, + #{creationTime, jdbcType=TIMESTAMP}, + #{validFlag, jdbcType=INTEGER}, + #{readFlag, jdbcType=INTEGER}, + #{msgContent, jdbcType=VARCHAR}, + #{msgTitle, jdbcType=VARCHAR}, + #{userId, jdbcType=VARCHAR}, + #{id, jdbcType=VARCHAR}, + #{processnum, jdbcType=VARCHAR}, + + + + + + update TS_PERSON_MSG + set modify_time = #{modifyTime}, + creation_time = #{creationTime}, + valid_flag = #{validFlag}, + read_flag = #{readFlag}, + msg_content = #{msgContent}, + msg_title = #{msgTitle}, + user_id = #{userId}, + processnum = #{processnum} + where id = #{id} + + + + + update TS_PERSON_MSG + + + modify_time = #{modifyTime}, + + + creation_time = #{creationTime}, + + + valid_flag = #{validFlag}, + + + read_flag = #{readFlag}, + + + msg_content = #{msgContent}, + + + msg_title = #{msgTitle}, + + + user_id = #{userId}, + + + processnum = #{processnum}, + + + where id = #{id} + + + + + + + + delete from TS_PERSON_MSG + where id = #{value} + + + + + + + + + + + + + + + + + + + UPDATE TS_PERSON_SHARE SET valid_flag = 1 + + + "ID" IN + + #{item} + + + + + + + UPDATE TS_PERSON_MSG SET valid_flag = 1 + + + "ID" IN + + #{item} + + + + + + + UPDATE TS_PERSON_MSG SET read_flag = 1 + + + "ID" IN + + #{item} + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonNoteEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonNoteEOMapper.xml new file mode 100644 index 00000000..a73458b9 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonNoteEOMapper.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + modify_time, creartion_time, valid_flag, res_type, res_id, collect_id, user_id, id + + + + + where 1=1 + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creartion_time ${creartionTimeOperator} #{creartionTime} + + + and creartion_time >= #{creartionTime1} + + + and creartion_time <= #{creartionTime2} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and note_content ${noteContentOperator} #{noteContent} + + + and res_type ${resTypeOperator} #{resType} + + + and res_id ${resIdOperator} #{resId} + + + and collect_id ${collectIdOperator} #{collectId} + + + and user_id ${userIdOperator} #{userId} + + + and id ${idOperator} #{id} + + + + + + + + insert into TS_PERSON_NOTE() + values (#{modifyTime, jdbcType=TIMESTAMP}, #{creartionTime, jdbcType=TIMESTAMP}, #{validFlag, jdbcType=INTEGER}, + #{noteContent, jdbcType=VARCHAR}, #{resType, jdbcType=VARCHAR}, #{resId, jdbcType=VARCHAR}, + #{collectId, jdbcType=VARCHAR}, #{userId, jdbcType=VARCHAR}, #{id, jdbcType=VARCHAR}) + + + + + + insert into TS_PERSON_NOTE + + modify_time, + creartion_time, + valid_flag, + note_content, + res_type, + res_id, + collect_id, + user_id, + id, + + + #{modifyTime, jdbcType=TIMESTAMP}, + #{creartionTime, jdbcType=TIMESTAMP}, + #{validFlag, jdbcType=INTEGER}, + #{noteContent, jdbcType=VARCHAR}, + #{resType, jdbcType=VARCHAR}, + #{resId, jdbcType=VARCHAR}, + #{collectId, jdbcType=VARCHAR}, + #{userId, jdbcType=VARCHAR}, + #{id, jdbcType=VARCHAR}, + + + + + + update TS_PERSON_NOTE + set modify_time = #{modifyTime}, + creartion_time = #{creartionTime}, + valid_flag = #{validFlag}, + note_content = #{noteContent}, + res_type = #{resType}, + res_id = #{resId}, + collect_id = #{collectId}, + user_id = #{userId} + where id = #{id} + + + + + + update TS_PERSON_NOTE + + + modify_time = #{modifyTime}, + + + creartion_time = #{creartionTime}, + + + valid_flag = #{validFlag}, + + + note_content = #{noteContent}, + + + res_type = #{resType}, + + + res_id = #{resId}, + + + collect_id = #{collectId}, + + + user_id = #{userId}, + + + where id = #{id} + + + + + + + + delete from TS_PERSON_NOTE + where id = #{value} + + + + + + + + + + + + + + + update TS_PERSON_NOTE set note_Content =#{noteContent} where collect_Id = #{collectId,jdbcType=VARCHAR} and id = #{id} and valid_flag = 0 + + + + + + + + + update TS_PERSON_NOTE + set + valid_flag=1 + where id = #{id} and collect_id=#{collectId,jdbcType=VARCHAR} + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonSearchEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonSearchEOMapper.xml new file mode 100644 index 00000000..97c7fead --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonSearchEOMapper.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + modify_time, creation_time, valid_flag, search_content, user_id, id + + + + + where 1=1 + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and search_content ${searchContentOperator} concat(concat('%',#{searchContent}),'%') + + + and user_id ${userIdOperator} #{userId} + + + and id ${idOperator} #{id} + + + + + + + + insert into TS_PERSON_SEARCH() + values (#{modifyTime, jdbcType=TIMESTAMP}, #{creationTime, jdbcType=TIMESTAMP}, #{validFlag, jdbcType=INTEGER}, #{searchContent, jdbcType=VARCHAR}, #{userId, jdbcType=VARCHAR}, #{id, jdbcType=VARCHAR}) + + + + + + insert into TS_PERSON_SEARCH + + modify_time, + creation_time, + valid_flag, + search_content, + user_id, + id, + + + #{modifyTime, jdbcType=TIMESTAMP}, + #{creationTime, jdbcType=TIMESTAMP}, + #{validFlag, jdbcType=INTEGER}, + #{searchContent, jdbcType=VARCHAR}, + #{userId, jdbcType=VARCHAR}, + #{id, jdbcType=VARCHAR}, + + + + + + update TS_PERSON_SEARCH + set modify_time = #{modifyTime}, + creation_time = #{creationTime}, + valid_flag = #{validFlag}, + search_content = #{searchContent}, + user_id = #{userId} + where id = #{id} + + + + + update TS_PERSON_SEARCH + + + modify_time = #{modifyTime}, + + + creation_time = #{creationTime}, + + + valid_flag = #{validFlag}, + + + search_content = #{searchContent}, + + + user_id = #{userId}, + + + where id = #{id} + + + + + + + + delete from TS_PERSON_SEARCH + where id = #{value} + + + + + + + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonShareEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonShareEOMapper.xml new file mode 100644 index 00000000..42d27738 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/person/PersonShareEOMapper.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + modify_time, creation_time, valid_flag,f_valid_flag, read_flag, res_title, res_uri, res_id, res_type, share_user_id, recipient_id, id + + + + + where 1=1 + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and f_valid_flag ${validFlagOperator} #{fvalidFlag} + + + and f_valid_flag ${fvalidFlagOperator} #{fvalidFlag} + + + and res_title ${resTitleOperator} concat(concat('%',#{resTitle}),'%') + + + and res_uri ${resUriOperator} #{resUri} + + + and res_id ${resIdOperator} #{resId} + + + and res_type ${resTypeOperator} #{resType} + + + and share_user_id ${shareUserIdOperator} #{shareUserId} + + + and recipient_id ${recipientIdOperator} #{recipientId} + + + and id ${idOperator} #{id} + + + + + + + + insert into TS_PERSON_SHARE() + values (#{modifyTime, jdbcType=TIMESTAMP}, #{creationTime, jdbcType=TIMESTAMP}, #{validFlag, jdbcType=INTEGER},#{fvalidFlag, jdbcType=INTEGER}, #{readFlag, jdbcType=INTEGER}, #{resTitle, jdbcType=VARCHAR}, #{resUri, jdbcType=VARCHAR}, #{resId, jdbcType=VARCHAR}, #{resType, jdbcType=VARCHAR}, #{shareUserId, jdbcType=VARCHAR}, #{recipientId, jdbcType=VARCHAR}, #{id, jdbcType=VARCHAR}) + + + + + + insert into TS_PERSON_SHARE + + modify_time, + creation_time, + valid_flag, + f_valid_flag, + read_flag, + res_title, + res_uri, + res_id, + res_type, + share_user_id, + recipient_id, + id, + + + #{modifyTime, jdbcType=TIMESTAMP}, + #{creationTime, jdbcType=TIMESTAMP}, + #{validFlag, jdbcType=INTEGER}, + #{fvalidFlag, jdbcType=INTEGER}, + #{readFlag, jdbcType=INTEGER}, + #{resTitle, jdbcType=VARCHAR}, + #{resUri, jdbcType=VARCHAR}, + #{resId, jdbcType=VARCHAR}, + #{resType, jdbcType=VARCHAR}, + #{shareUserId, jdbcType=VARCHAR}, + #{recipientId, jdbcType=VARCHAR}, + #{id, jdbcType=VARCHAR}, + + + + + + update TS_PERSON_SHARE + set modify_time = #{modifyTime}, + creation_time = #{creationTime}, + valid_flag = #{validFlag}, + read_flag = #{readFlag}, + res_title = #{resTitle}, + res_uri = #{resUri}, + res_id = #{resId}, + res_type = #{resType}, + share_user_id = #{shareUserId}, + recipient_id = #{recipientId} + where id = #{id} + + + + + update TS_PERSON_SHARE + + + modify_time = #{modifyTime}, + + + creation_time = #{creationTime}, + + + valid_flag = #{validFlag}, + + + read_flag = #{readFlag}, + + + res_title = #{resTitle}, + + + res_uri = #{resUri}, + + + res_id = #{resId}, + + + res_type = #{resType}, + + + share_user_id = #{shareUserId}, + + + recipient_id = #{recipientId}, + + + where id = #{id} + + + + + + + + delete from TS_PERSON_SHARE + where id = #{value} + + + + + + + + + + + + UPDATE TS_PERSON_SHARE SET valid_flag = 1 + + + "ID" IN + + #{item} + + + + + + + UPDATE TS_PERSON_SHARE SET f_valid_flag = 1 + + + "ID" IN + + #{item} + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/FeedbackInfoEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/FeedbackInfoEOMapper.xml new file mode 100644 index 00000000..6087eee7 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/FeedbackInfoEOMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + TFI.id, TFI.user_id, TFI.feedback_info, TFI.read_flag, TFI.valid_flag, TFI.creation_time, TFI.modify_time,TFI.content_text + ,TUI.duty AS duty,TUI.office_phone AS officePhone,TUI.mobile_phone AS mobilePhone,TU.uname AS uname,tor.ORG_NAME AS orgName + + + + id, user_id, feedback_info, read_flag, valid_flag, creation_time, modify_time + + + + + where 1=1 and TFI.valid_flag =0 + + + and id ${idOperator} #{id} + + + and TFI.user_id = #{selfId} + + + and feedback_info ${feedbackInfoOperator} #{feedbackInfo} + + + and read_flag ${readFlagOperator} #{readFlag} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and UNAME like '%${uname}%' + + + and ORG_TYPE = #{orgType} + + + + + + + + + + + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/LinkInfoEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/LinkInfoEOMapper.xml new file mode 100644 index 00000000..b6fc2999 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/LinkInfoEOMapper.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + id, web_name, old_web_site, new_web_site, display_seq, is_show, valid_flag, creation_time, modify_time + + + + + where 1=1 + + + and id ${idOperator} #{id} + + + and web_name ${webNameOperator} #{webName} + + + and old_web_site ${oldWebSiteOperator} #{oldWebSite} + + + and new_web_site ${newWebSiteOperator} #{newWebSite} + + + and display_seq ${displaySeqOperator} #{displaySeq} + + + and is_show ${isShowOperator} #{isShow} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + + + + + + + + + + + + + delete from TS_LINK_INFO + where id in + + #{item} + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/LoginInfoEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/LoginInfoEOMapper.xml new file mode 100644 index 00000000..a9b93b08 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/LoginInfoEOMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + modify_time, creation_time, login_address, login_time, user_id, id + + + + + where 1=1 + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and login_address ${loginAddressOperator} #{loginAddress} + + + and login_time ${loginTimeOperator} #{loginTime} + + + and login_time >= #{loginTime1} + + + and login_time <= #{loginTime2} + + + and user_id ${userIdOperator} #{userId} + + + and id ${idOperator} #{id} + + + + + + + + + + + + + + + + + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/MenuEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/MenuEOMapper.xml new file mode 100644 index 00000000..41e1c2d7 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/MenuEOMapper.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + id, valid_flag, name, parent_id, parent_ids, href, icon, is_show, permission, remarks,modify_time, creation_time + + + + + where 1=1 + + + and id ${idOperator} #{id} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and name ${nameOperator} #{name} + + + and parent_id ${parentIdOperator} #{parentId} + + + and parent_ids ${parentIdsOperator} #{parentIds} + + + and href ${hrefOperator} #{href} + + + and icon ${iconOperator} #{icon} + + + and is_show ${isShowOperator} #{isShow} + + + and permission ${permissionOperator} #{permission} + + + and remarks ${remarksOperator} #{remarks} + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + + + + UPDATE TS_MENU set valid_flag = ${@com.adc.da.util.constant.DeleteFlagEnum@DELETE.getValue()} + WHERE id in + + #{id} + + + + + + DELETE FROM TS_ROLE_MENU where MENU_ID in + + #{id} + + or MENU_ID in ( + select ID from TS_MENU where + + PARENT_IDS like '%'||#{id}||'%' + + ) + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/OrgEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/OrgEOMapper.xml new file mode 100644 index 00000000..07470641 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/OrgEOMapper.xml @@ -0,0 +1,733 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, valid_flag, org_name, org_desc,org_code,parent_id, parent_ids, is_show, remarks,shot_name,sso_id,sso_org_id,creation_time,modify_time + + + + + TS_ORG.id, TS_ORG.valid_flag, TS_ORG.org_name, TS_ORG.org_desc,TS_ORG.org_code,TS_ORG.parent_id, TS_ORG.parent_ids, TS_ORG.is_show, TS_ORG.remarks,TS_ORG.shot_name + + + + TS_ORG.id, TS_ORG.valid_flag, TS_ORG.org_name, TS_ORG.org_desc,TS_ORG.org_code,TS_ORG.parent_id, TS_ORG.parent_ids, TS_ORG.is_show, TS_ORG.remarks,TS_ORG.shot_name,TS_ORG.org_type + + + + + where 1=1 + + + and id ${idOperator} #{id} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and org_name ${nameOperator} #{orgName} + + + and org_desc ${orgDescOperator} #{orgDesc} + + + and org_code ${orgCodeOperator} #{orgCode} + + + and org_type ${orgTypeOperator} #{orgType} + + + and parent_id ${parentIdOperator} #{pId} + + + and parent_ids ${parentIdsOperator} #{parentIds} + + + and is_show ${isShowOperator} #{isShow} + + + and remarks ${remarksOperator} #{remarks} + + + + + + update TS_ORG + set valid_flag = 1 + where id = #{id} + + + + + update TS_ORG + + + valid_flag = #{validFlag}, + + + org_name = #{orgName}, + + + parent_id = #{pId}, + + + parent_ids = #{parentIds}, + + + org_desc = #{orgDesc}, + + + org_code = #{orgCode}, + + + org_type = #{orgType}, + + + is_show = #{isShow}, + + + remarks = #{remarks}, + + + shot_name = #{shotName}, + + + sso_id = #{ssoId} + + + sso_org_id = #{ssoOrgId} + + + where id = #{id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM TS_USER_ORG WHERE USER_ID = #{userId} AND ORG_ID = #{orgId} + + + DELETE FROM TS_USER_ORG WHERE USER_ID = #{usId} + + + + insert into TS_USER_ORG + ( + user_id, + org_id + ) SELECT A.* + FROM ( + + SELECT + #{item.userId,jdbcType=VARCHAR}, + #{item.orgId,jdbcType=VARCHAR} + FROM DUAL + + )A + + + insert into TS_USER_ORG + (user_id,org_id) + values + (#{userId,jdbcType=VARCHAR}, + #{orgId,jdbcType=VARCHAR}) + + + update TS_USER_ORG + set org_id = #{orgId} + where user_id = #{userId} + + + + DELETE FROM TS_USER_ORG WHERE ORG_ID = #{orgId} + + + + + + + + + insert into TS_ORG + + id, + valid_flag, + org_name, + org_desc, + org_code, + org_type, + parent_id, + parent_ids, + is_show, + remarks, + creation_time, + modify_time, + shot_name, + sso_id, + sso_org_id + + + #{id}, + #{validFlag}, + #{orgName}, + #{orgDesc}, + #{orgCode}, + #{orgType}, + #{pId}, + #{parentIds}, + #{isShow}, + #{remarks}, + #{creationTime}, + #{modifyTime}, + #{shotName}, + #{ssoOrgId} + + + + + + update TS_ORG + + + valid_flag = #{validFlag}, + + + org_name = #{orgName}, + + + parent_id = #{pId}, + + + parent_ids = #{parentIds}, + + + org_desc = #{orgDesc}, + + + org_code = #{orgCode}, + + + org_type = #{orgType}, + + + is_show = #{isShow}, + + + remarks = #{remarks}, + + + shot_name = #{shotName}, + + + modify_time = #{modifyTime}, + + + sso_id = #{ssoId}, + + + sso_org_id = #{ssoOrgId}, + + + where id = #{id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/RoleEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/RoleEOMapper.xml new file mode 100644 index 00000000..2cd5931f --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/RoleEOMapper.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, valid_flag,role_type, is_default, name, remarks, ext_info,use_flag,oper_user,creation_time,modify_time + + + + r.*, m.id as m_id, + m.valid_flag as m_validFlag, + m.name as m_name, + m.parent_id as m_parentId, + m.parent_ids as m_parentIds, + m.href as m_href, + m.icon as m_icon, + m.is_show as m_isShow, + m.permission as m_permission, + m.remarks as m_remarks + + + + + where 1=1 + + + and id ${idOperator} #{id} + + + and role_type ${roleTypeOperator} #{roleType} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and is_default ${isDefaultOperator} #{isDefault} + + + and name ${nameOperator} #{name} + + + and remarks ${remarksOperator} #{remarks} + + + and use_flag = #{useFlag} + + + + + + + select SEQ_TS_ROLE.nextval as idfrom dual + + update TS_ROLE + set `valid_flag`= 0 + where `id` = #{id} + + + + + + + + + + update TS_ROLE + set valid_flag = 1 + where id = #{roleId} + + + + delete from TS_ROLE_MENU rm + where rm.role_id = #{roleId} + + + + + + + + + + + + + + + insert into TS_ROLE_MENU(role_id,menu_id) values (#{roleId}, #{menuId}) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/RoleSarMenuEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/RoleSarMenuEOMapper.xml new file mode 100644 index 00000000..182e0203 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/RoleSarMenuEOMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + role_id, sar_menu_id + + + + + where 1=1 + + + and role_id ${roleIdOperator} #{roleId} + + + and sar_menu_id ${sarMenuIdOperator} #{sarMenuId} + + + + + + + insert into TS_ROLE_SAR_SUB_MENU() + values (#{roleId, jdbcType=VARCHAR}, #{sarMenuId, jdbcType=VARCHAR}) + + + + + + + + + + + + + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserConfigEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserConfigEOMapper.xml new file mode 100644 index 00000000..14032a40 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserConfigEOMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + modify_time, creation_time, valid_flag, config_content, config_type, user_id, id + + + + + where 1=1 + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and config_content ${configContentOperator} #{configContent} + + + and config_type ${configTypeOperator} #{configType} + + + and user_id ${userIdOperator} #{userId} + + + and id ${idOperator} #{id} + + + + + + + + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserEOMapper.xml new file mode 100644 index 00000000..faea55b4 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserEOMapper.xml @@ -0,0 +1,615 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + usid, account, valid_flag, password, uname, ext_info,email,work_num,creation_time,modify_time,oper_user,user_source,disable_flag,unlock_flag,user_type + + + + usid, account, valid_flag, password, uname, ext_info,email,work_num,creation_time,modify_time,oper_user,user_source,disable_flag,unlock_flag,user_type,sso_id + + + + + + u.*, r.id as id, + r.valid_flag as r_validFlag, + r.is_default as isDefault, + r.name as name, + r.remarks as remarks, + r.ext_info as r_extInfo, + r.is_default as isDefault, + ORG.id AS org_id, + ORG.ORG_NAME AS org_name, + ORG.ORG_DESC AS org_desc, + ORG.ORG_CODE AS org_code, + ORG.ORG_TYPE AS org_type, + ORG.PARENT_ID AS org_parent_id, + ORG.REMARKS AS org_remarks, + ORG.IS_SHOW AS org_isshow, + ORG.valid_flag AS org_validFlag, + ORG.PARENT_IDS AS org_parentIds + + + + where 1=1 + + + and usid ${usidOperator} #{usid} + + + and account ${accountOperator} #{account} + + + and password ${passwordOperator} #{password} + + + and uname ${unameOperator} #{uname} + + + and work_num ${workNumOperator} #{workNum} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and disable_flag ${disableFlagOperator} #{disableFlag} + + + and unlock_flag ${unlockFlagOperator} #{unlockFlag} + + + and user_type ${userTypeOperator} #{userType} + + + + + + where 1=1 AND TU.valid_flag=0 + + + and TU.usid ${usidOperator} #{usid} + + + and TU.account like concat(concat('%',#{account}),'%') + + + and TU.password ${passwordOperator} #{password} + + + and TU.uname ${unameOperator} concat(concat('%',#{uname}),'%') + + + and TU.work_num ${workNumOperator} ${workNum} + + + and TU.valid_flag ${validFlagOperator} #{validFlag} + + + and TU.disable_flag ${disableFlagOperator} #{disableFlag} + + + and TU.unlock_flag ${unlockFlagOperator} #{unlockFlag} + + + and TU.user_type ${userTypeOperator} #{userType} + + + and TUO.ORG_ID ${orgIdOperator} #{orgId} + + + and TUR.role_ID ${roleIdOperator} #{roleId} + + + and tr.name ${roleNameOperator} #{roleName} + + + and TU.usid != 'WY8J26MH23' + + + + + + update TS_USER + + password = #{newPassword} + + where usid = #{usid} + + + + update TS_USER + + uname = #{uname} + + where usid = #{usid} + + + + + + insert into TS_USER_ROLE(user_id,role_id) values (#{usid}, #{roleId}) + + + + insert into TS_USER_ORG(user_id,org_id) values (#{usid}, #{orgId}) + + + + delete from + TS_USER_ROLE + where user_id = #{usid} + + + + delete from + TS_USER_ORG + where user_id = #{usid} + + + + update TS_USER + set valid_flag = 1 + where usid in + + #{usid} + + + + + delete from TS_USER_ROLE + where user_id in + + #{usid} + + + + + delete from TS_USER_ORG + where user_id in + + #{usid} + + + + + + + + + + + + + + + update TS_USER + set + password = #{password} + where usid = #{usid} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into TS_USER + + usid, + account, + valid_flag, + password, + uname, + ext_info, + email, + work_num, + creation_time, + modify_time, + oper_user, + user_source, + disable_flag, + unlock_flag, + user_type, + sso_id + + + #{usid}, + #{account}, + #{validFlag}, + #{password}, + #{uname}, + #{extInfo}, + #{email}, + #{workNum}, + #{creationTime}, + #{modifyTime}, + #{operUser}, + #{userSource}, + #{disableFlag}, + #{unlockFlag}, + #{userType}, + #{ssoId}, + + + + + + + + + + + + + + + + + + + + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserInfoEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserInfoEOMapper.xml new file mode 100644 index 00000000..20bb217a --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserInfoEOMapper.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + modify_time, creation_time, valid_flag, signature, fax_address, address, gender, part_post, assistant_post, main_post, mobile_phone, + office_phone, user_pic, duty, user_id, id + + + + + where 1=1 + + + and modify_time ${modifyTimeOperator} #{modifyTime} + + + and modify_time >= #{modifyTime1} + + + and modify_time <= #{modifyTime2} + + + and creation_time ${creationTimeOperator} #{creationTime} + + + and creation_time >= #{creationTime1} + + + and creation_time <= #{creationTime2} + + + and valid_flag ${validFlagOperator} #{validFlag} + + + and signature ${signatureOperator} #{signature} + + + and fax_address ${faxAddressOperator} #{faxAddress} + + + and address ${addressOperator} #{address} + + + and gender ${genderOperator} #{gender} + + + and part_post ${partPostOperator} #{partPost} + + + and assistant_post ${assistantPostOperator} #{assistantPost} + + + and main_post ${mainPostOperator} #{mainPost} + + + and mobile_phone ${mobilePhoneOperator} #{mobilePhone} + + + and office_phone ${officePhoneOperator} #{officePhone} + + + and user_pic ${userPicOperator} #{userPic} + + + and duty ${dutyOperator} #{duty} + + + and user_id ${userIdOperator} #{userId} + + + and id ${idOperator} #{id} + + + + + + + update TS_USER_INFO + + + modify_time = #{modifyTime}, + + + creation_time = #{creationTime}, + + + valid_flag = #{validFlag}, + + + signature = #{signature}, + + + fax_address = #{faxAddress}, + + + address = #{address}, + + + gender = #{gender}, + + + part_post = #{partPost}, + + + assistant_post = #{assistantPost}, + + + main_post = #{mainPost}, + + + mobile_phone = #{mobilePhone}, + + + office_phone = #{officePhone}, + + + user_pic = #{userPic}, + + + duty = #{duty}, + + + user_id = #{userId}, + + + where id = #{id} + + + + + + + + + + + + + + + + + update TS_USER_INFO + set + + fax_address = '', + + + office_phone = '', + + + fax_address=#{faxAddress}, + + + office_phone=#{officePhone}, + + mobile_phone=#{mobilePhone}, + signature=#{signature,jdbcType=VARCHAR}, + user_pic=#{userPic,jdbcType=VARCHAR}, + valid_flag=0 + where user_id=#{userId} + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserRoleEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserRoleEOMapper.xml new file mode 100644 index 00000000..fc45f2d1 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/UserRoleEOMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + user_id, role_id + + + + + where 1=1 + + + and `user_id` ${userIdOperator} #{userId} + + + and `role_id` ${roleIdOperator} #{roleId} + + + + diff --git a/adc-da-sys/src/main/resources/mybatis/mapper/sys/WarnTimeEOMapper.xml b/adc-da-sys/src/main/resources/mybatis/mapper/sys/WarnTimeEOMapper.xml new file mode 100644 index 00000000..fda14542 --- /dev/null +++ b/adc-da-sys/src/main/resources/mybatis/mapper/sys/WarnTimeEOMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + id, warn_type + + + + + where 1=1 + + + and id ${idOperator} #{id} + + + and warn_type ${warnTypeOperator} #{warnType} + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..393390d0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,302 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.3.0.RELEASE + + + + com.adc + foton-slrs-system-rest + 3.0.0 + pom + + + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.8 + 2.3.2.RELEASE + 4.1.2 + 2.10.0 + 1.1.20 + 3.2.0 + 1.4.2 + 3.8.3 + 2.3.0 + 1.2.73 + + + + adc-da-main + adc-da-base + adc-da-sys + adc-da-jwtLogin + + + + + adc + http://60.247.58.121:8182/nexus/content/groups/public + + true + + + true + + + + maven-ali + http://maven.aliyun.com/nexus/content/groups/public// + + true + + + true + always + fail + + + + + + + + + + + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-mail + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-websocket + + + org.apache.commons + commons-lang3 + 3.10 + + + commons-io + commons-io + 2.6 + + + com.google.guava + guava + 28.1-jre + + + com.google.guava + failureaccess + 1.0.1 + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 2.0.2 + + + javassist + org.javassist + + + guava + com.google.guava + + + + + + + org.apache.shiro + shiro-spring + ${shiro.version} + + + org.apache.shiro + shiro-ehcache + ${shiro.version} + + + slf4j-api + org.slf4j + + + + + + + com.auth0 + java-jwt + ${jwt.version} + + + + + com.baomidou + mybatis-plus-generator + ${mybatisPlus_version} + + + org.freemarker + freemarker + 2.3.30 + + + com.baomidou + mybatis-plus-boot-starter + ${mybatisPlus_version} + + + + com.oracle.database.jdbc + ojdbc8 + 19.6.0.0 + + + mysql + mysql-connector-java + 8.0.16 + + + org.projectlombok + lombok + 1.18.12 + + + + com.alibaba + druid + ${druid_version} + + + + com.alibaba + druid-spring-boot-starter + ${druid_version} + + + + + cn.hutool + hutool-all + 5.3.10 + + + + + com.alibaba + fastjson + ${fastJson.version} + + + + + joda-time + joda-time + 2.10.1 + + + + + cn.afterturn + easypoi-spring-boot-starter + ${easypoi_version} + + + cn.afterturn + easypoi-base + ${easypoi_version} + + + guava + com.google.guava + + + + + cn.afterturn + easypoi-web + ${easypoi_version} + + + cn.afterturn + easypoi-annotation + ${easypoi_version} + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + org.springframework.amqp + spring-rabbit-test + test + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + \ No newline at end of file